[CS: Source] Knife DM

Тема в разделе "Новые плагины", создана пользователем R1KO, 2 июн 2013.

  1. R1KO

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

    Сообщения:
    6.004
    Симпатии:
    2.994
    Knife DeathMatch


    Простой плагин для Knife DM, который включает в себя:
    1. Автоматическое возрождение игроков при смерти
    2. Расстворение трупов после смерти
    3. Защиту при появлении игрока


    Cvar`s:
    sm_knife_dm_spawn_hp "35" - Сколько HP будет у игрока при спавне.
    sm_knife_dm_respawn_delay "1.0" - Через сколько секунд после смерти игрок возродится.
    sm_knife_dm_protect_time "1.0" - Сколько секунд длится защита игрока при возрождении.
    sm_knife_dm_remove_radgoll "1" - Удалять ли трупы после смерти.
    sm_knife_dm_remove_radgoll_delay "1.0" - Через сколько секунд после смерти удалять труп.

    Рекомендуется использование только на картах 35hp_ т.к. нет запрета оружия.

    Писал для себя, выложил, может кому понадобится.

    P.S.Если заметите баги/ошибки/недочеты или есть пожелания/предложения -> отпишитесь в этой теме.

    --------------------------
    Update 8.01.2014
    Update 22.07.2014
     

    Вложения:

    • knife_dm.sp
      Размер файла:
      5,5 КБ
      Просмотров:
      118
    • knife_dm.smx
      Размер файла:
      7,1 КБ
      Просмотров:
      94
    Последнее редактирование: 16 сен 2014
    Fabiio, hellgu, ZloyMonah и 5 другим нравится это.
  2. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Knife DM v1.0

    Исходники?!?!?!?!? :angry2:
    (lysis не предлагать)
     
  3. R1KO

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

    Сообщения:
    6.004
    Симпатии:
    2.994
    Re: Knife DM v1.0

    KorDen, надеюсь найдут баги и т.д., вот когда исправлю - выложу.
    Для тебя же там ничего нового нет. :-D
     
  4. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Knife DM v1.0

    R1KO, эх, не понимаешь ты духа GPL.. Баги публично находить гораздо лучше и активнее, потому что тогда плагин проще создавать, чем когда вслепую говорить буду, где у тебя там глюк или что...
     
  5. R1KO

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

    Сообщения:
    6.004
    Симпатии:
    2.994
    Re: Knife DM v1.0

    KorDen, добавил
     
    KorDen нравится это.
  6. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Knife DM v1.0

    Вроде работает уже некоторое время (вместо CSS:DM), ошибок критичных пока не было (хотя было один раз Invalid timer handle в KillTimerS, но вроде не повторялось, из-за чего - не уловил...), отлично :D
    Единственное - я добавил переменную cssdm_version для корректной классификации в мониторингах, которые просматривают переменные
    Теперь еще переписать dm_equipment, убрав функции расширения и можно вообще CSS:DM заменять полностью ;)
     
    trueattack, R1KO и максимка27 нравится это.
  7. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
    Re: Knife DM v1.0

    1. Если получаешь команду игрока несколько раз, сохраняй ее в переменную
    PHP:
    // Вместо
    if (GetClientTeam(client) == 2)
    {
        
    // Code...
    }
    else if (
    GetClientTeam(client) == 3)
    {
        
    // Code...
    }

    // Сделать
    new team GetClientTeam(client);
    if (
    team == 2)
    {
        
    // Code...
    }
    else if (
    team == 3)
    {
        
    // Code...
    }

    // Или
    switch (GetClientTeam(client))
    {
        case 
    2:
        {
            
    // Code...
        
    }
        case 
    3:
        {
            
    // Code...
        
    }
    }
    2. Не вижу смысла проверок при спавне игрока на наличие в какой либо команде, если игрок возрождается, то он уже в команде, тем более один и тот же цвет игроку делаешь, независимо от команды

    3. Если игрок умер и вышел, то удаления трупа уже не будет, т.к. проверяется в игре ли он

    4. В таймере не нужно проверять валидность игрока, т.к. ID этого игрока не изменяется, то есть если ты передал в таймере client (2), то при исполнении таймера ID (2) так и останется

    5. Если игрок был за террористов и перешел за спецназ или наоборот, то таймер оживления не сработает

    6. В блоке f_Respawn утечка должна быть, думаю я

    7. Многие return'ы необязательны, лишний груз
     
    R1KO нравится это.
  8. R1KO

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

    Сообщения:
    6.004
    Симпатии:
    2.994
    Re: Knife DM v1.0

    Исправлю.
    Цвет не один и тот же. Насколько я помню как только игрок вошел на сервер тоже вызывается спавн, надо проверить.

    Тоже исправлю.
    Буду разбиратся

    Добавлено через 49 секунд
    Так и планирую.
     
    Последнее редактирование: 26 июн 2013
  9. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Knife DM v1.0

    Скажи это валвам :D Вроде сейчас исправлено и не может быть (хотя не факт что 100% не случается), но было время когда player_spawn вызывался при входе игрока на сервер и при переходе его в спектры :-D Именно поэтому лучше все же эти проверки делать...
     
    R1KO нравится это.
  10. R1KO

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

    Сообщения:
    6.004
    Симпатии:
    2.994
    Re: Knife DM v1.0

    По крайней мере на в34 так. На стиме не проверял спавн. Приеду домой - проверю всё и возобновлю работы над плагином.
     
  11. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
    Re: Knife DM v1.0

    Действительно, *** евент =)
    PHP:
    #include <sourcemod>

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

    public 
    Event_OnPlayerSpawn(Handle:event, const String:name[], bool:silent)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));

        
    PrintToServer("Client Spawned = %N (%d)"clientclient);
        
    PrintToServer("In Game = %s"IsClientInGame(client) ? "YES" "NO");
        
    PrintToServer("Alive = %s"IsPlayerAlive(client) ? "YES" "NO");
        
    PrintToServer("TEAM = %d"GetClientTeam(client));
    }
     
  12. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Knife DM v1.0

    Тэкс.. Короче вот моя более-менее улучшенная версия, правда вырезан код растворения трупа, труп просто удаляется (добавить несложно)

    Передача ragdoll из OnClientDeath в датапаке сделана для будущего расширения на полноценный DM, поскольку если время исчезновения трупа больше, чем время респавна, труп не будет исчезать (m_hRagdoll будет -1, ведь клиент уже появился заново и старый рэгдолл не связан с ним)
    Плюс по идее исправлена ошибка убийства уже не существующего таймера
     

    Вложения:

    • knife_dm.sp
      Размер файла:
      3,4 КБ
      Просмотров:
      19
    R1KO нравится это.
  13. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
    Re: Knife DM v1.0

    KorDen
    1. В player_spawn разве есть team?

    2. В f_Respawn делать client > 0 не нужно

    3. Вместо if (team == 2 || team == 3) проще сделать if (GetEventInt(event, "team") > 1)

    4. Проверки IsValidEntity и client > 0 вместе не нужны, думаю
     
    R1KO и KorDen нравится это.
  14. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Knife DM v1.0

    Думай голова, думай :)
    Код:
    L 06/26/2013 - 13:00:30: [SM] Native "AcceptEntityInput" reported: Entity 131 (131) is not a CBaseEntity
    L 06/26/2013 - 13:00:30: [SM] Displaying call stack trace for plugin "knife_dm.smx":
    L 06/26/2013 - 13:00:30: [SM]   [0]  Line 82, knife_dm.sp::f_Dissolve()
    Я тоже "думал", оказалось недодумал.... Хотя в принципе ты прав, >0 можно убрать...

    С player_spawn да, намудрил... Хотел GetClientTeam, но мозг написал как до этого в OnPlayerTeam...
     
  15. R1KO

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

    Сообщения:
    6.004
    Симпатии:
    2.994
    Re: Knife DM v1.0

    KorDen, а никак нельзя решить проблему, что когда время таймера на спав меньше времени на расстворение то трупы не расстворяются?
     
  16. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    Re: Knife DM v1.0

    Я же как раз и написал такую версию, вроде должна работать корректно, разве нет?
    Вот уже более откорректированная версия, вроде эта проблема не должна быть
     

    Вложения:

    • knife_dm.sp
      Размер файла:
      3,3 КБ
      Просмотров:
      15
    R1KO нравится это.
  17. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
    Re: Knife DM v1.0

    KorDen
    1. В OnPlayerTeam лучше проверить предыдущую команду игрока перед удалением таймеров

    2. В OnPlayerSpawn и OnPlayerTeam, думаю, лучше вставить условие (if (client > 0)) и уже потом что-то делать с клиентом

    3. Приставка Action в OnPlayerDeath необязательна

    4. В ProtectTimer_CallBack и f_Respawn необязательно проверять, в игре ли клиент, если клиент выйдет, таймер удалится
     
    R1KO нравится это.
  18. R1KO

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

    Сообщения:
    6.004
    Симпатии:
    2.994
    Re: Knife DM v1.0

    Какой смысл ?
     
    Последнее редактирование: 28 июн 2013
  19. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
    Re: Knife DM v1.0

    R1KO
    Игрок зашел (Команда = 0), перешел в наблюдение (Команда = 1), условие > 1, то есть выполнится удаление таймеров => зачем проверять таймера, если они не существуют даже
     
    R1KO нравится это.
  20. R1KO

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

    Сообщения:
    6.004
    Симпатии:
    2.994
    Re: Knife DM v1.0

    так ?

    PHP:
    #pragma semicolon 1
    #include <sourcemod>
    #include <cstrike>
    #include <sdktools>

    new Handle:Timer_Respawn[MAXPLAYERS+1] = {INVALID_HANDLE, ... },
        
    Handle:Timer_Dissolve[MAXPLAYERS+1] = {INVALID_HANDLE, ... },
        
    Handle:Timer_Protect[MAXPLAYERS+1] = {INVALID_HANDLE, ... };

    public 
    Plugin:myinfo 
    {
        
    name "Knife DeathMatch",
        
    author "R1KO, remake by KorDen",
        
    version "1.0",
        
    url "http://dev.sky-play.ru"
    };

    public 
    OnPluginStart()
    {
        
    CreateConVar("cssdm_version""2.1.6-compat""Fake cvar for monitors"FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
        
    HookEvent("player_death"OnPlayerDeath);
        
    HookEvent("player_spawn"OnPlayerSpawn);
        
    HookEvent("player_team"OnPlayerTeam);
    }

    public 
    OnPlayerTeam(Handle:event, const String:name[], bool:silent)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));
        if (
    client 0)
        {
            new 
    team GetEventInt(event"team");
            if (
    team && GetEventInt(event"oldteam") > 0)
                
    Timer_Respawn[client] = CreateTimer(1.0f_Respawnclient);
            else
                
    KillTimerS(client);
        }
    }

    public 
    OnPlayerSpawn(Handle:event, const String:name[], bool:silent)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid")), team=GetClientTeam(client);
        if (
    client 0)
        {
            
    SetEntProp(clientProp_Data"m_takedamage"0);
            if (
    team == 2SetNewColor(client2557575200);
            else if (
    team==3SetNewColor(client7575255200);
            
    Timer_Protect[client] = CreateTimer(1.0ProtectTimer_CallBackclient);
        }
    }

    public 
    Action:ProtectTimer_CallBack(Handle:timerany:client)
    {
        if (
    IsClientInGame(client) && IsPlayerAlive(client))
        {
            
    SetEntProp(clientProp_Data"m_takedamage"2);
            
    SetNewColor(client255255255255);
        }
        
    Timer_Protect[client] = INVALID_HANDLE;
    }

    SetNewColor(clientrgba)
    {
        
    SetEntityRenderMode(clientRENDER_TRANSCOLOR);
        
    SetEntityRenderColor(clientrgba);
    }

    public 
    OnPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));
        if (
    IsValidEntity(client) && IsClientInGame(client))
        {
            new 
    ragdoll GetEntPropEnt(clientProp_Send"m_hRagdoll");
            if(
    ragdoll>0)
            {
                new 
    Handle:datapack INVALID_HANDLE;
                
    Timer_Dissolve[client] = CreateDataTimer(2.0f_DissolvedatapackTIMER_FLAG_NO_MAPCHANGE);
                
    WritePackCell(datapackragdoll);
                
    WritePackCell(datapackclient);
                
    ResetPack(datapack);
            }
        }
        
    Timer_Respawn[client] = CreateTimer(3.0f_Respawnclient);
    }

    public 
    Action:f_Dissolve(Handle:timerHandle:datapack)
    {
        new 
    ragdoll=ReadPackCell(datapack);
        new 
    client=ReadPackCell(datapack);
        if(
    IsValidEntity(ragdoll))
            
    AcceptEntityInput(ragdoll"kill");
        
    Timer_Dissolve[client] = INVALID_HANDLE;
    }

    public 
    Action:f_Respawn(Handle:timerany:client)
    {
        
    Timer_Respawn[client] = INVALID_HANDLE;
        if (
    IsClientInGame(client) && !IsPlayerAlive(client))
            
    CS_RespawnPlayer(client);
    }

    public 
    OnClientDisconnect(client)
        
    KillTimerS(client);

    KillTimerS(client)
    {
        if (
    Timer_Respawn[client] != INVALID_HANDLE)
        {
            
    KillTimer(Timer_Respawn[client]);
            
    Timer_Respawn[client] = INVALID_HANDLE;
        }
        if (
    Timer_Dissolve[client] != INVALID_HANDLE)
        {
            
    KillTimer(Timer_Dissolve[client]);
            
    Timer_Dissolve[client] = INVALID_HANDLE;
        }
        if (
    Timer_Protect[client] != INVALID_HANDLE)
        {
            
    KillTimer(Timer_Protect[client]);
            
    Timer_Protect[client] = INVALID_HANDLE;
        }
    }