Block Weapon Drop

Тема в разделе "Запросы", создана пользователем L.E.O.N, 13 апр 2014.

  1. L.E.O.N

    L.E.O.N Source.org.ua

    Сообщения:
    105
    Симпатии:
    3
    Ищу плагин (если он есть конечно ) Block Weapon Drop

    Описание : Запрет выкидывания всего оружие кроме скаут

    P.S. Если не там создал сори . И если кто то может написать такой Буду благодарен
     
  2. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.971
    Симпатии:
    2.977
    PHP:
    #pragma semicolon 1
    #include <sourcemod>
    #include <cstrike>

    public Action:CS_OnCSWeaponDrop(clientweaponIndex)
    {
        
    decl String:sWeapon[64];
        
    GetEntityClassname(weaponIndexsWeaponsizeof(sWeapon));
        if(
    StrEqual(sWeapon[7], "scout")) return Plugin_Continue;
         return 
    Plugin_Handled;
    }
     
    L.E.O.N нравится это.
  3. L.E.O.N

    L.E.O.N Source.org.ua

    Сообщения:
    105
    Симпатии:
    3
    А еще вопрос как сделать чтобы при смерти у игрока выпадало оружие ?
     
  4. L.E.O.N

    L.E.O.N Source.org.ua

    Сообщения:
    105
    Симпатии:
    3
    Из за кода вверху оно не выпадает а мне надо чтобы выбросить нельзя а вот после смерти выпадало
     
  5. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.971
    Симпатии:
    2.977
    L.E.O.N, Попробуй так:
    PHP:
    #pragma semicolon 1
    #include <sourcemod>
    #include <cstrike>

    public Action:CS_OnCSWeaponDrop(clientweaponIndex)
    {
        if(
    IsPlayerAlive(client))
        {
            
    decl String:sWeapon[64];
            
    GetEntityClassname(weaponIndexsWeaponsizeof(sWeapon));
            if(
    StrEqual(sWeapon[7], "scout")) return Plugin_Continue;
            else return 
    Plugin_Handled;
        }
        return 
    Plugin_Continue;
    }
     
  6. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.961
    R1KO, я почти также пробовал и твой вариант сейчас - разницы нет. Оружие выпадает из рук игрока ещё как бы ДО его фактической смерти.
    В таком событии не ловит IsPlayerAlive(client) - всегда жив и всё.
    Опять же вспоминаю кнопки:
    // These defines are for client button presses.
    #define IN_ATTACK (1 << 0)
    #define IN_JUMP (1 << 1)
    #define IN_DUCK (1 << 2)
    #define IN_FORWARD (1 << 3)
    #define IN_BACK (1 << 4)
    #define IN_USE (1 << 5)
    #define IN_CANCEL (1 << 6)
    #define IN_LEFT (1 << 7)
    #define IN_RIGHT (1 << 8)
    #define IN_MOVELEFT (1 << 9)
    #define IN_MOVERIGHT (1 << 10)
    #define IN_ATTACK2 (1 << 11)
    #define IN_RUN (1 << 12)
    #define IN_RELOAD (1 << 13)
    #define IN_ALT1 (1 << 14)
    #define IN_ALT2 (1 << 15)
    #define IN_SCORE (1 << 16) /**< Used by client.dll for when scoreboard is held down */
    #define IN_SPEED (1 << 17) /**< Player is holding the speed key */
    #define IN_WALK (1 << 18) /**< Player holding walk key */
    #define IN_ZOOM (1 << 19) /**< Zoom key for HUD zoom */
    #define IN_WEAPON1 (1 << 20) /**< weapon defines these bits */
    #define IN_WEAPON2 (1 << 21) /**< weapon defines these bits */
    #define IN_BULLRUSH (1 << 22)
    #define IN_GRENADE1 (1 << 23) /**< grenade 1 */
    #define IN_GRENADE2 (1 << 24) /**< grenade 2 */
    #define IN_ATTACK3 (1 << 25)
    Но нет такой, а это бы решило проблему со смертью.
     
  7. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.971
    Симпатии:
    2.977
    AlmazON, можно делать pre хук смерти игрока, ставить его глобальный бул в true, и в public Action:CS_OnCSWeaponDrop(client, weaponIndex) проверять бул, а при спавне обратно бул в false
     
  8. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.961
    Как он вообще правильно пишется? new lock[MAXPLAYERS+1];, например?
    Оффтоп
     
  9. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.971
    Симпатии:
    2.977
    Оффтоп



    L.E.O.N,
    PHP:
    #pragma semicolon 1
    #include <sourcemod>
    #include <cstrike>

    new bool:g_bIsAlive[MAXPLAYERS+1];

    public 
    OnPluginStart()
    {
        
    HookEvent("player_death"Event_OnPlayerDeathEventHookMode_Pre);
        
    HookEvent("player_spawn"Event_OnPlayerSpawn);
    }

    public 
    Event_OnPlayerDeath(Handle:hEvent, const String:name[], bool:dontBroadcast)
    {
        
    g_bIsAlive[GetClientOfUserId(GetEventInt(hEvent"userid"))] = false;
    }

    public 
    Event_OnPlayerSpawn(Handle:hEvent, const String:name[], bool:dontBroadcast)
    {
        
    g_bIsAlive[GetClientOfUserId(GetEventInt(hEvent"userid"))] = true;
    }


    public 
    Action:CS_OnCSWeaponDrop(iClientweaponIndex)
    {
        if(
    g_bIsAlive[iClient])
        {
            
    decl String:sWeapon[64];
            
    GetEntityClassname(weaponIndexsWeaponsizeof(sWeapon));
            if(
    StrEqual(sWeapon[7], "scout")) return Plugin_Continue;
            else return 
    Plugin_Handled;
        }
        return 
    Plugin_Continue;
    }
     
    L.E.O.N нравится это.
  10. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.961
    R1KO, почти также делал. Твоё тоже не работает.
     
  11. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.971
    Симпатии:
    2.977
    AlmazON, можно попробыватьSDKHooks_DropWeapon ?
     
  12. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.961
    Оффтоп
    Проверял у себя свой и твой, почему не работает.
    Тест код:
    PHP:
    #include <cstrike>

    new bool:g_bIsAlive[MAXPLAYERS+1];

    public 
    OnPluginStart()
    {
        
    HookEvent("player_death"Event_OnPlayerDeathEventHookMode_Pre);
        
    HookEvent("player_spawn"Event_OnPlayerSpawn);
    }

    public 
    Event_OnPlayerDeath(Handle:hEvent, const String:name[], bool:dontBroadcast)
    {
        
    g_bIsAlive[GetClientOfUserId(GetEventInt(hEvent"userid"))] = false;
        
    PrintToChatAll("Dead!!! g_bIsAlive = %d."g_bIsAlive[GetClientOfUserId(GetEventInt(hEvent"userid"))]);
    }

    public 
    Event_OnPlayerSpawn(Handle:hEvent, const String:name[], bool:dontBroadcast)
    {
        
    g_bIsAlive[GetClientOfUserId(GetEventInt(hEvent"userid"))] = true;
    }


    public 
    Action:CS_OnCSWeaponDrop(iClientweaponIndex)
    {
        if(
    g_bIsAlive[iClient])
        {
            
    PrintToChatAll("Drop!!! g_bIsAlive = %d."g_bIsAlive[iClient]);
            
    decl String:sWeapon[64];
            
    GetEntityClassname(weaponIndexsWeaponsizeof(sWeapon));
            if(
    StrEqual(sWeapon[7], "scout")) return Plugin_Continue;
            else return 
    Plugin_Handled;
        }
        return 
    Plugin_Continue;
    }
    Итого видим:
    [​IMG]
    Судя по моим тестам, оружие "дропается" даже перед смертью с EventHookMode_Pre.
     
    Последнее редактирование: 17 июн 2014
  13. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.971
    Симпатии:
    2.977
    AlmazON, а если так:
    PHP:
    #include <cstrike>

    new bool:g_bIsAlive[MAXPLAYERS+1];

    public 
    OnPluginStart()
    {
        
    HookEvent("player_death"Event_OnPlayerDeathEventHookMode_Pre);
        
    HookEvent("player_spawn"Event_OnPlayerSpawn);
    }

    public 
    Event_OnPlayerDeath(Handle:hEvent, const String:name[], bool:dontBroadcast)
    {
        new 
    iClient GetClientOfUserId(GetEventInt(hEvent"userid"));
        if(
    iClientg_bIsAlive[iClient] = false;
        
    PrintToChat(iClient"Dead!!! g_bIsAlive = %d."g_bIsAlive[iClient]);
    }

    public 
    Event_OnPlayerSpawn(Handle:hEvent, const String:name[], bool:dontBroadcast)
    {
        new 
    iClient GetClientOfUserId(GetEventInt(hEvent"userid"));
        if(
    iClientg_bIsAlive[iClient] = true;
        
    PrintToChat(iClient"Spawn!!! g_bIsAlive = %d."g_bIsAlive[iClient]);
    }

    public 
    Action:CS_OnCSWeaponDrop(iClientweaponIndex)
    {
        if(
    g_bIsAlive[iClient])
        {
            
    PrintToChat(iClient"Drop!!! g_bIsAlive = %d."g_bIsAlive[iClient]);
            
    decl String:sWeapon[64];
            
    GetEntityClassname(weaponIndexsWeaponsizeof(sWeapon));
            if(
    StrEqual(sWeapon[7], "scout")) return Plugin_Continue;
            else return 
    Plugin_Handled;
        }
        return 
    Plugin_Continue;
    }
     
  14. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.961
    R1KO, Drop = 1, Dead = 0. Теперь просто данные о смертях ботов в чате не вижу, лишь свои.
    Я даже просто переменной new g_bIsAlive; блокировал, как общей для всех, создавая "окно" (с хуком смерти ДО - 0 и ПОСЛЕ - 1). Но "дропается" прежде, чем игрок умирает.
     
  15. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.971
    Симпатии:
    2.977
    Прикольно, чё...
     
  16. L.E.O.N

    L.E.O.N Source.org.ua

    Сообщения:
    105
    Симпатии:
    3
    OoO то что надо Спасибо !
     
  17. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.971
    Симпатии:
    2.977
    Может лучше было бы:
    PHP:
    GetEventInt(event"health")
     
  18. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.961
    ...если при 1 спавне от ботов не оставалось оружия. Вот это да. :)

    Добавлено через 26 минут
    L.E.O.N, заметил ошибку в логах от плагина.
    Вот, этот вариант исправлен
    заодно и короче:
    PHP:
    #include <cstrike> 

    new bool:lock[MAXPLAYERS+1]; 

    public 
    OnPluginStart() 

        
    HookEvent("player_hurt"PlayerHurtEventHookMode_PostNoCopy); 
        
    HookEvent("player_spawn"PlayerSpawnEventHookMode_PostNoCopy); 


    public 
    PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast

        if (
    GetEventInt(event"health") < 1lock[GetClientOfUserId(GetEventInt(event"userid"))] = false


    public 
    PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcastlock[GetClientOfUserId(GetEventInt(event"userid"))] = true;

    public 
    Action:CS_OnCSWeaponDrop(clientindex

        if (
    IsClientInGame(client) && lock[client]) 
        { 
            
    decl String:weapon[25]; 
            
    GetEntityClassname(indexweaponsizeof(weapon)); 
            if(
    StrEqual(weapon[7], "scout")) return Plugin_Continue
            else return 
    Plugin_Handled
        } 
        return 
    Plugin_Continue

    Если игрок умирает от противника - оружие остаётся. Если его убить мгновенно, например, через админку - оружие исчезает вместе с убитым.
    Просто выбросить оружие по прежнему нельзя, кроме scout'а.
    Минус вообще такого кода, как и просто при обычной блокировке - нельзя купить основное оружие, если оно уже есть. Да и пистолеты не сменить.
     
    Последнее редактирование: 18 июн 2014
    L.E.O.N нравится это.
  19. L.E.O.N

    L.E.O.N Source.org.ua

    Сообщения:
    105
    Симпатии:
    3
    СпС . Этот плагин мне для Deathrun сервера . чтобы игроки не могли выкидывать оружие в спавн зонах,взял оружку и не*** выкидывать
     
  20. Niver

    Niver

    Сообщения:
    4
    Симпатии:
    0
    Привет. Можно как нибудь сделать, что бы при выбросе скаута. Скаут исчезал через не значительное промежуток времени. Убирал только тот скаут, который выбросил игрок.