DeathMatch_Beta

Тема в разделе "Программирование / Скриптинг", создана пользователем R1KO, 29 июн 2013.

  1. R1KO

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

    Сообщения:
    5.975
    Симпатии:
    2.982
    Хочу переписать DM. Чтобы не обсуждать это дело здесь (т.к. это немного другой плагин), предлагаю делать этот тут.

    Что имеется на данный момент:
    1. Автоматическое возрождение игроков при смерти (с задержкой в пол секунды)
    2. Удаление трупов после смерти
    3. Защиту при появлении игрока
    4. Удаление зон покупки оружия.
    5. Автоматическое пополнение патронов.

    Что планируется добавить:
    1. Меню оружия при спавне.
    2. Удаление оружия при выбрасывании и смерти.
    3. Автоматический баланс игроков.
    4. Запрет конца раунда.
    5. Удаление заложников.

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

    Последняя на данный момент версия кода:

    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, ... };
        
    new 
    Handle:g_Dissolve_Enabled INVALID_HANDLE,
        
    Handle:g_NoBuyZone_Enabled INVALID_HANDLE;

    new 
    bool:g_dissolve_enabled,
        
    bool:g_nobuyzone_enabled,
        
    bool:g_spawn_protect;

    new 
    g_ActiveWepOffs = -1;

    public 
    Plugin:myinfo 
    {
        
    name "DeathMatch",
        
    author "R1KO & KorDen",
        
    version "1.0",
        
    url "http://hlmod.ru"
    };

    public 
    OnPluginStart()
    {
        
    CreateConVar("cssdm_version""2.1.6-compat""Fake cvar for monitors"FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
        
    g_Dissolve_Enabled CreateConVar("dm_dissolve_enabled""1""Включить/Выключить расстворение трупов.");
        
    g_NoBuyZone_Enabled CreateConVar("dm_nobuyzone_enabled""1""Включить/Выключить запрет зон закупок.");
        
    g_Spawn_Protect CreateConVar("dm_spawn_protect""1.0""Время защиты игрока при спавне (0 - отключено).");
        
    HookEvent("player_death"OnPlayerDeath);
        
    HookEvent("player_spawn"OnPlayerSpawn);
        
    HookEvent("player_team"OnPlayerTeam);
        
    g_ActiveWepOffs FindSendPropOffs("CCSPlayer""m_hActiveWeapon"); 
        if (
    g_ActiveWepOffs 0
        { 
            
    HookEvent("weapon_reload"Event_CheckDepleted); 
            
    HookEvent("weapon_fire_on_empty"Event_CheckDepleted); 
        }
    }

    public 
    OnMapStart()
    {
        
    //---------------
        
    g_dissolve_enabled  GetConVarBool(g_Dissolve_Enabled);
        
    g_nobuyzone_enabled GetConVarBool(g_NoBuyZone_Enabled);
        
    g_spawn_protect GetConVarFloat(g_Spawn_Protect);

        
    //----------------
        
    if(g_nobuyzone_enabled)
        {
            new 
    = -1;
            while ((
    FindEntityByClassname(i"func_buyzone")) != -1)
            {
                if (
    IsValidEntity(i)) AcceptEntityInput(i"Kill");
        }


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

        new 
    client GetClientOfUserId(GetEventInt(event"userid")); 
        new 
    entity GetEntDataEnt2(clientg_ActiveWepOffs); 
        if (
    entity 0SetEntProp(clientProp_Data"m_iAmmo"2004GetEntProp(entityProp_Data"m_iPrimaryAmmoType")); 


    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 1)
                
    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"));
        if (
    client 0)
        {
            if(
    g_spawn_protect 0)
            {
                
    SetEntProp(clientProp_Data"m_takedamage"0);
                
    team GetClientTeam(client);
                if (
    team == 2SetNewColor(client2557575200);
                else if (
    team==3SetNewColor(client7575255200);
                
    Timer_Protect[client] = CreateTimer(g_spawn_protectProtectTimer_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;
        
    KillTimer(Timer_Protect[client]);
    }

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

    public 
    OnPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));
        if(
    g_dissolve_enabled)
        {
            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;
        
    KillTimer(Timer_Dissolve[client]);
    }

    public 
    Action:f_Respawn(Handle:timerany:client)
    {
        
    //Timer_Respawn[client] = INVALID_HANDLE;
        
    KillTimer(Timer_Respawn[client]);
        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;
        }
    }

    Свои пожелания/предложения/обнаруженные баги отписывать ниже.
     
    Последнее редактирование: 25 окт 2015
    KorDen и максимка27 нравится это.
  2. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    1. Удаление зон покупок
    PHP:
    public OnMapStart()
    {
        new 
    = -1;
        while ((
    FindEntityByClassname(i"func_buyzone")) != -1)
        {
            if (
    IsValidEntity(i))
            {
                
    AcceptEntityInput(i"Kill");
            }
        }
    }

    2. Значения переменные получи при старте карты и сохрани их, затем используй

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

    4. При возрождении игрока рано получаешь команду игрока

    5. Остальное в старой теме, исправь
     
    Серый™ и R1KO нравится это.
  3. KorDen

    KorDen Atra esterní ono thelduin! Ньюсмейкер

    Сообщения:
    2.194
    Симпатии:
    1.398
    Из планов:
    "Меню оружия при спавне."
    Предлагаю переписать CSS:DM Equipment - нужно оставить такое же меню

    "Автоматическое пополнение патронов."
    У меня уже есть, хотя там есть нюансы (для оптимизации всем оружиям дается 200 патронов, меньше проверок, а смысла в них ведь нет, и так бесконечные же фактически) но в целом я могу переписать полноценно.

    "Удаление оружия при выбрасывании и смерти."
    Можно взять из скажем Weapon Cleanup код

    "Автоматический баланс игроков."
    Опять же, есть плагины баланса на DM.

    "Запрет конца раунда."
    Не надо. На большинстве DM стоит Stripper: Source и он с этой задачей справляется гораздо лучше.

    Вообще я хотел бы чтобы такой DM был модульный, а не монолитным плагином. Монолит уже есть на AM, и это выглядит бредово.
    Если сделать модульную систему - тогда можно будет как раз делать кобинации, например, для Knife DM - только ядро, для каких-то других модов - скажем aim_ - без модуля оружия и так далее.

    Стоит сделать отключение дезинтеграции трупов, так как скажем на моем x64 сервере это уже отход от оптимизации
    Стоит оптимизировать код в плане получения значений переменных etc
     
    R1KO нравится это.
  4. R1KO

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

    Сообщения:
    5.975
    Симпатии:
    2.982
    1. Сделал
    2. Есть
    3. Вроде сделал.
    4. Исправил
     
    Последнее редактирование: 7 июл 2013
  5. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    Создаешь глобальную переменную, при старте плагина получаешь значение (GetConVarFloat, Bool, Int, String) переменной (CreateConVar), приравниваешь (Твой квар = полученный результат), используешь уже глобальную переменную затем
     
    R1KO нравится это.
  6. R1KO

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

    Сообщения:
    5.975
    Симпатии:
    2.982
    Буду благодарен.

    Хочу вынуть эти функции из плагинов, оптимизировать, добавить/убрать кое-что.
    Соглашусь, хотя вообще сам не блокирую конец раунда, мне и так номрально. Это я так, для народа.

    Когда всё будет хорошо работать, можно разделить, как SMAC.

    Для этого есть квар.

    эм..))

    Добавлено через 8 минут
    Непонимаю зачем.


    ---------------------------------
    Обновил код.

    Добавлено через 21 минуту
    Удалене оружия (галимый вариант):

    PHP:
    public OnPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));
        new 
    String:weapon[64];
        if ( 
    IsValidEdict(client) && IsValidEntity(client) )
        {
            
    GetEdictClassname(clientweaponsizeof(weapon));
            if ( ( 
    StrContains(weapon"weapon_") != -|| StrContains(weapon"item_") != -) && GetEntDataEnt2(ig_WeaponParent) == -)
            
    RemoveEdict(client);

        }    
        return 
    Plugin_Continue;
    }
     
    Последнее редактирование: 29 июн 2013
  7. KorDen

    KorDen Atra esterní ono thelduin! Ньюсмейкер

    Сообщения:
    2.194
    Симпатии:
    1.398
    Нужно уже изначально закладыать, иначе тогда это ничем не будет отличаться от уже существующих плагинов, если все равно надо будет ковыряться и разделять
     
  8. R1KO

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

    Сообщения:
    5.975
    Симпатии:
    2.982
    KorDen, на какие части предлагаешь разбить ?
     
  9. SenatoR

    SenatoR Модератор

    Сообщения:
    714
    Симпатии:
    270
    Предлагаю сделать 2-3 основных модуля.
    1)Модуль удаления всего и вся (Пленты,заложники,оружие,рагдолы)
    2)Сам дематч
    3)Модуль оружия
     
    KorDen и R1KO нравится это.
  10. KorDen

    KorDen Atra esterní ono thelduin! Ньюсмейкер

    Сообщения:
    2.194
    Симпатии:
    1.398
    Базовое пополнение патронов. Два нюанса:
    1) Пополняются сразу до 200, даже если это AWP с 30 патронами в запасе. Фактически ведь не важно, но некоторых напрягает... Зато оптимизация на высоте :D
    2) Патроны не пополняются, если перезарядка идет при опустошении боймы (пополняется только когда перезарядка через R). Если кончились патроны, можно стрельнуть из пустого оружия (что многие не догадываются сделать) - тут же пополнятся.

    Для исправления #2 в оригинале сделана целая куча кода OnPlayerRunCmd, что мне ужасно не нравится по вполне понятным причинам, хотя в принципе можно и реализовать тот метод, но немного проще...

    Собственно сам плагин:
    PHP:
    #include <sourcemod>
    new g_ActiveWepOffs = -1;
    public 
    OnPluginStart()
    {
        
    g_ActiveWepOffs FindSendPropOffs("CCSPlayer""m_hActiveWeapon");
        if (
    g_ActiveWepOffs 0)
        {
            
    HookEvent("weapon_reload"Event_CheckDepleted);
            
    HookEvent("weapon_fire_on_empty"Event_CheckDepleted);
        }
    }
    public 
    Event_CheckDepleted(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));
        new 
    entity GetEntDataEnt2(clientg_ActiveWepOffs);
        if (
    entity 0)
            
    SetEntProp(clientProp_Data"m_iAmmo"2004GetEntProp(entityProp_Data"m_iPrimaryAmmoType"));
    }
     
    R1KO нравится это.
  11. R1KO

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

    Сообщения:
    5.975
    Симпатии:
    2.982
    KorDen, добавил в 1-й пост.
     
  12. KorDen

    KorDen Atra esterní ono thelduin! Ньюсмейкер

    Сообщения:
    2.194
    Симпатии:
    1.398
    Кстати, я так подумал.. Если действительно разорачивать модульный DeathMatch - может сделать в BitBucket или GitHub?
    Мне больше нравится битбакет (hg удобнее по мне, гитхаб ведь только гит.)
    Поэтому думаю стоит нам сделать объединенный репозиторий. Пришлите (to DoK и R1KO) мне в личку (или в стим) ваши email, я скину вам инвайты (чтобы больше юзеров для репозитория получить на будущее, и расскажу что можно будет делать интересного. Думаю будет гораздо удобнее.
    Кстати рико, добавь меня в стиме (или у тебя его нет? Тогда джаббер или в крайнем случае аська)


    UPD:
    [[​IMG]
    НУ ТОЧНО, БИТБАКЕТ НАШЕ ВСЕ :DDDD
     
    R1KO нравится это.
  13. R1KO

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

    Сообщения:
    5.975
    Симпатии:
    2.982
    Ахах.. стим акк отдал, остального тоже нет)))
    Ладно, попробую найти себе новый стим.
     
  14. максимка27

    максимка27

    Сообщения:
    517
    Симпатии:
    170
    KorDen, его акк vak забанил :D
     
  15. SenatoR

    SenatoR Модератор

    Сообщения:
    714
    Симпатии:
    270
    В скайп пиши... снабдим тебя стимом
     
    R1KO нравится это.
  16. KorDen

    KorDen Atra esterní ono thelduin! Ньюсмейкер

    Сообщения:
    2.194
    Симпатии:
    1.398
    Прикинул, что с такими идеями можно и серьезный модульный DM забацать :)
    Поэтому решил (заодно буду углубляться в системы контроля версий) создать репозиторий - http://hg.sky-play.ru/cs-s-deathmatch-lite - пока там выложены самые простейшие версии ядра (на базе Knife DM), пополнения патронов и DM Bonus. Постепенно думаю вырастем до действительно серьезной системы :)
     
    Серый™ и R1KO нравится это.
  17. R1KO

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

    Сообщения:
    5.975
    Симпатии:
    2.982
    Забыл еще вот что, спавн игрока должен быть на разных точках, файлы из обычного дм можно заюзать, если файла нет - стандартные точки.
     
  18. SenatoR

    SenatoR Модератор

    Сообщения:
    714
    Симпатии:
    270
    Про форварды и нативы не забывайте только, иначе хрень у вас получится.
     
  19. KorDen

    KorDen Atra esterní ono thelduin! Ньюсмейкер

    Сообщения:
    2.194
    Симпатии:
    1.398
    Смотря что брать - не все нужно/имеет смысл делать в нативах... Я хочу постараться плагины сделать как можно более простыми и не зависимыми - таким образом например DM Bonus и автопополнение патронов фактически может без проблем работать и на паблике, и так далее. Там где действительно нужно - они будут, но таких мест на мой взгляд очень мало. Или есть какие-то конкретные идеи?
     
    R1KO нравится это.
  20. SenatoR

    SenatoR Модератор

    Сообщения:
    714
    Симпатии:
    270
    Нет, идей на тему дм у меня нету.
    Никогда не интересовался данным модом.
    Мб чуть позже подкину код с одним из вариантов воскрешения.