CS Zombie Panic

CS Zombie Panic 1.4.1

Нет прав для скачивания
Сообщения
1,487
Реакции
1,480
Помог
2 раз(а)
в HL такой звук у него даже по телу, вроде как
Проверил - по телу нормальный, а вот по ящиках,стенах,и других обьектах - как и по металу.
Я могу ошибаться,но звук по ящиках,которые ломаються - должен быть правильный... ( вроде как и тот,что по телу,тупой звук )))

Если нет,то очень странно,что за всю историю так и не было такого исправления.( по сути как и всегда - кому оно то надо... )
 
Сообщения
141
Реакции
329
Проверил - по телу нормальный, а вот по ящиках,стенах,и других обьектах - как и по металу.
Я могу ошибаться,но звук по ящиках,которые ломаються - должен быть правильный... ( вроде как и тот,что по телу,тупой звук )))

Если нет,то очень странно,что за всю историю так и не было такого исправления.( по сути как и всегда - кому оно то надо... )
В Half-Life так же. Как по мне, никакой ошибки тут нет, звук издает сама монтировка, она металлическая, логично, что при ударе об твердую поверхность она издает металлический звук)
 
Сообщения
1,487
Реакции
1,480
Помог
2 раз(а)
логично, что при ударе об твердую поверхность она издает металлический звук)
Оно то так,но если взять монтировку и ударить по дереву вот так вот в реале - звук будет уже не по металлу
Ну да ладно уже...Это всё формальности )
 
  • Нравится
Реакции: ZTE
Сообщения
141
Реакции
329
На Gamebanana создал категорию для карт: Zombie Panic [Counter-Strike 1.6] [Maps] (gamebanana.com)
Туда буду публиковать оригинальные карты из мода HL: Zombie Panic!, которые не были добавлены в ресурсы мода.
 
Сообщения
141
Реакции
329
Открыт более производительный сервер в Чехии: 185.91.116.39:27027
 
Сообщения
141
Реакции
329
Если кому нужен код, который чуть улучшает поведение ботов:

Код:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <reapi>
#include <xs>

#include <zombiepanic>
#include <zombiepanic_utils>
#include <api_custom_weapons>

#define PLUGIN "[Zombie Panic] Bot Fixes"
#define AUTHOR "1.0.0"

new Float:g_flPlayerLastThink[MAX_PLAYERS + 1];

new CW:g_iCwSwipeHandler;
new CW:g_iCwCrowbarHandler;
new CW:g_iCwGrenadeHandler;
new CW:g_iCwSatchelHandler;

public plugin_init() {
    register_plugin(PLUGIN, ZP_VERSION, AUTHOR);

    g_iCwSwipeHandler = CW_GetHandler(ZP_WEAPON_SWIPE);
    g_iCwCrowbarHandler = CW_GetHandler(ZP_WEAPON_CROWBAR);
    g_iCwGrenadeHandler = CW_GetHandler(ZP_WEAPON_GRENADE);
    g_iCwSatchelHandler = CW_GetHandler(ZP_WEAPON_SATCHEL);

    RegisterHam(Ham_Touch, "weaponbox", "OnWeaponBoxTouch", .Post = 0);
    RegisterHam(Ham_Player_PreThink, "player", "OnPlayerPreThink_Post", .Post = 1);
}

public OnWeaponBoxTouch(this, pToucher) {
    if (!UTIL_IsPlayer(pToucher)) {
        return HAM_IGNORED;
    }

    if (!is_user_bot(pToucher)) {
        return HAM_IGNORED;
    }

    if (!is_user_alive(pToucher)) {
        return HAM_IGNORED;
    }

    for (new iSlot = 0; iSlot < 6; ++iSlot) {
        new pItem = get_member(this, m_WeaponBox_rgpPlayerItems, iSlot);
        if (pItem == -1) {
            continue;
        }

        if (get_member(pToucher, m_rgpPlayerItems, iSlot) != -1) {
            return HAM_SUPERCEDE;
        }

        new CW:iCwHandler = CW_GetHandlerByEntity(pItem);
        if (iCwHandler == g_iCwGrenadeHandler) {
            return HAM_SUPERCEDE;
        }

        if (iCwHandler == g_iCwSatchelHandler) {
            return HAM_SUPERCEDE;
        }

        new iClip = get_member(pItem, m_Weapon_iClip);
        new iPrimaryAmmoId = get_member(pItem, m_Weapon_iPrimaryAmmoType);
        new iBpAmmo = get_member(pToucher, m_rgAmmo, iPrimaryAmmoId);

        if (!iClip && !iBpAmmo) {
            return HAM_SUPERCEDE;
        }
    }

    return HAM_HANDLED;
}

public OnPlayerPreThink_Post(pPlayer) {
    if (!is_user_alive(pPlayer)) {
        return HAM_IGNORED;
    }
 
    if (!is_user_bot(pPlayer)) {
        return HAM_IGNORED;
    }

    if (g_flPlayerLastThink[pPlayer] && get_gametime() - g_flPlayerLastThink[pPlayer] < 1.0) {
        return HAM_IGNORED;
    }

    new pActiveItem = get_member(pPlayer, m_pActiveItem);
    if (pActiveItem == -1) {
        return HAM_IGNORED;
    }

    new iClip = get_member(pActiveItem, m_Weapon_iClip);
    new iPrimaryAmmoId = get_member(pActiveItem, m_Weapon_iPrimaryAmmoType);
    new iBpAmmo = get_member(pPlayer, m_rgAmmo, iPrimaryAmmoId);

    if (!iClip && !iBpAmmo) {
        new iSlot = -1;

        for (new _iSlot = 0; _iSlot < 6; ++_iSlot) {
            new bool:bNewFound = false;

            new pItem = get_member(pPlayer, m_rgpPlayerItems, _iSlot);
            while (pItem != -1) {
                if (pItem == pActiveItem) {
                    iSlot = _iSlot;
                    break;
                }

                pItem = get_member(pItem, m_pNext);
            }

            if (bNewFound) {
                iSlot = _iSlot;
                break;
            }
        }

        if (iSlot != -1) {
            if (!iClip && !iBpAmmo) {
                rg_drop_items_by_slot(pPlayer, InventorySlotType:iSlot);
            }
        }
    } else {
        new CW:iCwHandler = CW_GetHandlerByEntity(pActiveItem);
        if (iCwHandler == g_iCwSwipeHandler || iCwHandler == g_iCwCrowbarHandler) {
            static Float:vecOrigin[3];
            pev(pPlayer, pev_origin, vecOrigin);

            new pEnemy = FindPlayerNearby(vecOrigin, 128.0, ZP_Player_IsZombie(pPlayer) ? ZP_HUMAN_TEAM : ZP_ZOMBIE_TEAM);
            if (pEnemy != -1) {
                CW_PrimaryAttack(pActiveItem);
            }
        }

        if (!ZP_Player_IsZombie(pPlayer)) {
            static Float:flMaxSpeed;
            pev(pPlayer, pev_maxspeed, flMaxSpeed);

            static Float:vecOrigin[3];
            pev(pPlayer, pev_origin, vecOrigin);

            if (flMaxSpeed <= ZP_ZOMBIE_SPEED && FindPlayerNearby(vecOrigin, 256.0, ZP_ZOMBIE_TEAM) != -1 && random(100) < 30) {
                ZP_Player_Panic(pPlayer);
            }
        }
    }

    g_flPlayerLastThink[pPlayer] = get_gametime();

    return HAM_HANDLED;
}

FindPlayerNearby(const Float:vecOrigin[3], Float:flRange, iTeam = -1) {
    for (new pPlayer = 1; pPlayer <= MaxClients; ++pPlayer) {
        if (!is_user_connected(pPlayer)) {
            continue;
        }

        if (!is_user_alive(pPlayer)) {
            continue;
        }

        new iPlayerTeam = get_member(pPlayer, m_iTeam);
        if (iTeam != -1 && iTeam != iPlayerTeam) {
            continue;
        }

        static Float:vecPlayerOrigin[3];
        pev(pPlayer, pev_origin, vecPlayerOrigin);

        if (xs_vec_distance(vecOrigin, vecPlayerOrigin) <= flRange) {
            return pPlayer;
        }
    }

    return -1;
}
Плагин подключайте в разделе core (перед entities).

P.S: В релиз не пойдет, ибо костыль.
 
Последнее редактирование:
Сообщения
141
Реакции
329
Обновляю API, по большей части события. Буду благодарен советам по добавлению событий, возможно, кому-то что-то нужно.

Из уже существующих:
Код:
forward ZP_Fw_PlayerJoined(pPlayer); // Вызывается, когда игрок вошел в игру
forward ZP_Fw_PlayerPanic(pPlayer); // Вызывается, когда игрок активировал панику
forward ZP_Fw_PlayerZombieVision(pPlayer, bool:bValue); // Вызывается, когда игрок включил или выключил зомби-видение
forward ZP_Fw_PlayerAimItem(pPlayer, pItem); // Вызывается, когда игрок наводит прицел на подбираемый предмет
forward ZP_Fw_PlayerInfected(pPlayer, pInfector); // Вызывается после заражения игрока
forward ZP_Fw_PlayerTransformationDeath(pPlayer); // Вызывается перед смертью игрока во время превращения в зомби
forward ZP_Fw_PlayerTransformed(pPlayer); // Вызывается, когда зараженный игрок превратился в зомби
forward ZP_Fw_PlayerEquiped(pPlayer); // Вызывается, после выдачи игроку экипировки (после спавна)
forward ZP_Fw_PlayerSpeedUpdated(pPlayer); // Вызывается после обновления максимальной скорости игрока
forward ZP_Fw_PlayerCharacterUpdated(pPlayer); // Вызывается после обновления персонажа игрока
forward ZP_Fw_PlayerModelUpdated(pPlayer); // Вызываетя после обновлении модели игрока
forward ZP_Fw_NewRound(); // Вызываетя после запуска нового раунда
forward ZP_Fw_RoundStarted(); // Вызывается после начала раунда
forward ZP_Fw_RoundEnd(iWinnerTeam); // Вызывается после завершения раунда
forward ZP_Fw_ZombieLivesChanged(iLives); // Вызывается после изменении количества жизней зомби
 
Последнее редактирование:
Сообщения
141
Реакции
329
Веду разработку следующей версии (1.4.0), в нее будет добавлен (но отключен по умолчанию) плагин, который улучшает ботов, так же исправлены некоторые проблемы с режимом наблюдения, добавлена возможность наследование персонажей (использования ресурсов одного персонажа в другом без явного указания) и некоторые улучшения в балансе

Значительные изменения получил и тестовый сервер, куда было добавлено много плагинов администрирования и голосований, система рангов и несколько персонажей для разнообразия.

Поиграть в следующую версию уже можно на тестовом сервере: 185.91.116.39:27027

Обратите внимание, что это новый адрес, старый сервер будет закрыт в конце месяца в связи с плохой производительностью и повышением тарифов.

Всем, кто внес свой вклад в развитие проекта предлагаю бесплатную VIP'ку на сервере, для получения VIP и подробностей пишите в личку.
 
Последнее редактирование:
Сообщения
192
Реакции
148
Помог
1 раз(а)
Псс, holster анимация не работает...
 
Сообщения
141
Реакции
329
Ruby, В Counter-Strike, к сожалению, не реализована возможность проигрывать holster-анимацию, я конечно заложил это в коде, но найду ли я решение в итоге как-то вернуть эту механику - не знаю. В Counter-Strike Holster является мгновенным событием перед событием Deploy.
 
Сообщения
192
Реакции
148
Помог
1 раз(а)
Hedgehog Fog, ну, Holster и Deploy можно заблочить.
Как вариант блочить Deploy (CanDeploy) + в client_command получать пушку на которую нужно сменить "weapon_" и менять в PostFrame/Think/Task хз крч.
 
Последнее редактирование:
Сообщения
141
Реакции
329
Ruby, Да, надо будет глянуть, спасибо.
 
Сообщения
192
Реакции
148
Помог
1 раз(а)
Hedgehog Fog,
Код:
#include <amxmodx>
#include <reapi>

#define ANIM                    3
#define ANIM_TIME                27.0 / 50.0

public plugin_init( )
{
    RegisterHookChain( RG_CBasePlayerWeapon_CanDeploy, "CWeapon__CanDeploy_Pre", false );
}

public CWeapon__CanDeploy_Pre( const pItem )
{
    new pPlayer = get_member( pItem, m_pPlayer );
    new pActiveItem = get_member( pPlayer, m_pActiveItem );

    if ( is_nullent( pActiveItem ) || get_entvar( pActiveItem, var_impulse ) <= 0 || pItem == pActiveItem )
        return HC_CONTINUE;

    //if ( rg_get_iteminfo( pItem, ItemInfo_iWeight) < rg_get_iteminfo( pActiveItem, ItemInfo_iWeight ) )
    //    return HC_CONTINUE;

    if ( get_entvar( pActiveItem, var_iuser1 ) == true )
    {
        set_entvar( pActiveItem, var_iuser1, false );
        return HC_CONTINUE;
    }

    SetHookChainReturn( ATYPE_INTEGER, 0 );

    UTIL_SendWeaponAnim( pPlayer, 3 );

    new iParams[ 2 ]; iParams[ 0 ] = pPlayer, iParams[ 1 ] = pItem;
    SetThink( pActiveItem, "CWeapon__Think", iParams, sizeof iParams );

    set_entvar( pActiveItem, var_iuser1, true );
    set_entvar( pActiveItem, var_nextthink, get_gametime( ) + ANIM_TIME );
    set_member( pPlayer, m_flNextAttack, ANIM_TIME );

    server_print( "CanDeploy" );
    server_print( "pActiveItem %i | pItem %i", pActiveItem, pItem );

    return HC_SUPERCEDE;
}

public CWeapon__Think( const pActiveItem, const iParams[ 2 ] )
{
    if ( is_nullent( pActiveItem ) || !is_user_alive( iParams[ 0 ] ) )
    {
        SetThink( pActiveItem, "" );
        return;
    }

    if ( is_nullent( iParams[ 1 ] ) )
    {
        rg_switch_weapon( iParams[ 0 ], pActiveItem );
        SetThink( pActiveItem, "" );
        return;
    }

    server_print( "Think" );

    rg_switch_weapon( iParams[ 0 ], iParams[ 1 ] );
    SetThink( pActiveItem, "" );
}

stock UTIL_SendWeaponAnim( pPlayer, iAnim )
{
    set_entvar( pPlayer, var_weaponanim, iAnim );

    message_begin( MSG_ONE, SVC_WEAPONANIM, _, pPlayer );
    write_byte( iAnim );
    write_byte( 0 );
    message_end( );
}
Что-то типа того, но нужно сделать чтобы подобранная пушка у которой ItemInfo_iWeight меньше чем у активной не бралась в руки и дроп поправить. Сейчас у меня нет времени...
Код:
#include <amxmodx>
#include <reapi>

#define ANIM                    3
#define ANIM_TIME                27.0 / 50.0

public plugin_init( )
{
    RegisterHookChain( RG_CBasePlayerWeapon_CanDeploy, "CWeapon__CanDeploy_Pre", false );

    register_clcmd( "drop", "Command__Drop" );
}

public Command__Drop( const pPlayer )
{
    if ( !is_user_alive( pPlayer ) )
        return;

    new pActiveItem = get_member( pPlayer, m_pActiveItem );
    if ( is_nullent( pActiveItem ) || get_entvar( pActiveItem, var_impulse ) <= 0 )
        return;

    set_entvar( pActiveItem, var_iuser2, true );
}

public CWeapon__CanDeploy_Pre( const pItem )
{
    new pPlayer = get_member( pItem, m_pPlayer );
    new pActiveItem = get_member( pPlayer, m_pActiveItem );

    if ( is_nullent( pActiveItem ) || get_entvar( pActiveItem, var_impulse ) <= 0 || pItem == pActiveItem )
        return HC_CONTINUE;

    //if ( rg_get_iteminfo( pItem, ItemInfo_iWeight) < rg_get_iteminfo( pActiveItem, ItemInfo_iWeight ) )
    //    return HC_CONTINUE;

    if ( get_entvar( pActiveItem, var_iuser1 ) == true )
    {
        set_entvar( pActiveItem, var_iuser1, false );
        return HC_CONTINUE;
    }

    if ( get_entvar( pActiveItem, var_iuser2 ) == true )
    {
        set_entvar( pActiveItem, var_iuser2, false );
        set_entvar( pItem, var_iuser3, true );
        return HC_CONTINUE;
    }

    if ( get_entvar( pItem, var_iuser3 ) == true )
    {
        set_entvar( pItem, var_iuser3, false );
        return HC_CONTINUE;
    }

    SetHookChainReturn( ATYPE_INTEGER, 0 );

    UTIL_SendWeaponAnim( pPlayer, 3 );

    new iParams[ 2 ]; iParams[ 0 ] = pPlayer, iParams[ 1 ] = pItem;
    SetThink( pActiveItem, "CWeapon__Think", iParams, sizeof iParams );

    set_entvar( pActiveItem, var_iuser1, true );
    set_entvar( pActiveItem, var_nextthink, get_gametime( ) + ANIM_TIME );
    set_member( pPlayer, m_flNextAttack, ANIM_TIME );

    server_print( "CanDeploy" );
    server_print( "pActiveItem %i | pItem %i", pActiveItem, pItem );

    return HC_SUPERCEDE;
}

public CWeapon__Think( const pActiveItem, const iParams[ 2 ] )
{
    if ( is_nullent( pActiveItem ) || !is_user_alive( iParams[ 0 ] ) )
    {
        SetThink( pActiveItem, "" );
        return;
    }

    if ( is_nullent( iParams[ 1 ] ) )
    {
        rg_switch_weapon( iParams[ 0 ], pActiveItem );
        SetThink( pActiveItem, "" );
        return;
    }

    server_print( "Think" );

    rg_switch_weapon( iParams[ 0 ], iParams[ 1 ] );
    SetThink( pActiveItem, "" );
}

stock UTIL_SendWeaponAnim( pPlayer, iAnim )
{
    set_entvar( pPlayer, var_weaponanim, iAnim );

    message_begin( MSG_ONE, SVC_WEAPONANIM, _, pPlayer );
    write_byte( iAnim );
    write_byte( 0 );
    message_end( );
}
 
Последнее редактирование:
Сообщения
141
Реакции
329
Заходите побегать, кто свободен: 185.91.116.39:27027
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу