DM FFA KillAchiemenets

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

  1. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Доброго времени суток, хочу сделать на дм штуку, чтобы при убийстве своего, фраг считался в достижения.

    Предположил, что
    ловим: HookEvent("player_death", OnPlayerDeath, EventHookMode_Pre);
    меняем ему команду перед смерью, если номера команд совпадают
    далее возвращаем в предыдущую команду.

    Как-то нагрузка большевата, возможна ли реализация с минимальными нагрузками?
     
  2. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Именно. Достижения по оружиям считают убийства противников. Своих же не считает.
     
  3. AlmazON

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

    Сообщения:
    4.590
    Симпатии:
    1.995
    Мда, тогда может и никак, только хитрить. По нативам пройдись, может есть что для установки достижений и всё такое.
    Так то функционал достижений заключён в клиенте, а с сервера лишь считывает. Без нативов только и выдавать стандартным достижениям то, что они хотят для "начала записи".
     
    TolikCorp нравится это.
  4. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Тут кое-чего наваял. Компилируется без ошибок, осталось проверить, будет ли работать воще)))
    PHP:
    #include <cstrike>
    #pragma semicolon 1

    new g_ClientTeam[MAXPLAYERS+1];

    public 
    OnPluginStart()
    {
        
    HookEvent("player_hurt",  OnPlayerDeath);
        
    HookEvent("player_spawn"PlayerSpawnEventHookMode_Post);
    }

    public 
    OnPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client=GetClientOfUserId(GetEventInt(event"userid"));
        if (
    client)
            if(
    GetClientHealth(client) < 1)
            {
                new 
    attacker=GetClientOfUserId(GetEventInt(event"attacker"));
                if(
    IsPlayerAlive(attacker))
                    if(
    g_ClientTeam[client]>=CS_TEAM_T && g_ClientTeam[attacker]>=CS_TEAM_T)
                        if(
    g_ClientTeam[client]==g_ClientTeam[attacker])
                            if (
    g_ClientTeam[attacker]==CS_TEAM_T)
                            {
                                
    CS_SwitchTeam(clientCS_TEAM_CT);
                            }
                            else if (
    g_ClientTeam[attacker]==CS_TEAM_CT)
                            {
                                
    CS_SwitchTeam(clientCS_TEAM_T);
                            }
                    
            }
    }
    public 
    Action:PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client=GetClientOfUserId(GetEventInt(event"userid"));
        if(
    IsValidClient(client))
        {
            
    g_ClientTeam[client]=GetClientTeam(client);
        }
    }
    public 
    OnClientDisconnect(client)
    {
        
    g_ClientTeam[client]=-1;
    }    

    bool:IsValidClient(client)
    {
        if (!(
    client && client <= MaxClients)) return false;  
        if (!
    IsClientInGame(client)) return false;
        if (
    IsFakeClient(client)) return false;
        return 
    true;
    }
    Отлов игрока позаимствовал у Root
     
    Последнее редактирование: 24 июл 2014
  5. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    А дефайн вооот тут: #include <cstrike>
    PHP:
    #define CS_TEAM_NONE        0    /**< No team yet. */
    #define CS_TEAM_SPECTATOR    1    /**< Spectators. */
    #define CS_TEAM_T             2    /**< Terrorists. */
    #define CS_TEAM_CT            3    /**< Counter-Terrorists. */
    Добавлено через 2 минуты
    Тут сообщение 2013 года. https://forums.alliedmods.net/showthread.php?t=220020

    Добавлено через 57 минут
    И да, заметь, я sourcemod не подключал)
     
    Последнее редактирование: 24 июл 2014
  6. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Я забыл упомянуть, что я использую игру КСГО и стандартный дм, где респавн работает адекватно очень.
     
  7. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Картина в листе игроков конечно жесть)))

    Добавлено через 2 минуты
    Заимствовал только https://forums.alliedmods.net/showpost.php?p=1984501&postcount=7 , далее на вскидку писал.
    Нет, не раз. Только в том случае надо сменить, чтобы за тимкилл дали очки достижения в игре.
    А с таймером хитро придумано)))
     
    Последнее редактирование: 24 июл 2014
  8. AlmazON

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

    Сообщения:
    4.590
    Симпатии:
    1.995
    Ладно, это не важно. Так какие результаты?
    Мой то код работает, но не факт, что достижения его воспримут "всерьёз".
    Учитывая, что нужен респавн... :-D
    А в твоём коде просто перебрасывает за другую команду (правильность кода не учитывал)... разве не так? КТ станет Т, а т - КТ, вот и всё. :yes:
     
  9. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Достижения восприняли всерьез.

    Добавлено через 11 минут
    Оппа))
    L 07/24/2014 - 22:58:26: [SM] Native "GetClientTeam" reported: Client 17 is not in game
    L 07/24/2014 - 22:58:26: [SM] Displaying call stack trace for plugin "custom_plugins/csgo_dm_ffa_achiements.smx":
    L 07/24/2014 - 22:58:26: [SM] [0] Line 20, C:\Users\Anatoly\Desktop\scripting\csgo_dm_ffa_achiements.txt::CPT()
    L 07/24/2014 - 22:58:26: [SM] [1] Line 15, C:\Users\Anatoly\Desktop\scripting\csgo_dm_ffa_achiements.txt::Return()

    PHP:
    #include <cstrike> 
    #pragma semicolon 1
    public OnPluginStart() HookEvent("player_hurt"OnPlayerDeath); 
    public 
    OnPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast

        new 
    attacker GetClientOfUserId(GetEventInt(event"attacker")), client GetClientOfUserId(GetEventInt(event"userid")); 
        if (
    client <= MaxClients && IsClientInGame(client) && !IsFakeClient(client) && GetClientHealth(client) < && GetClientTeam(attacker) == GetClientTeam(client) && attacker != client
        { 
            
    CPT(client); 
            
    CreateTimer(0.0, Return, clientTIMER_FLAG_NO_MAPCHANGE); 
        } 

    public 
    Action:Return(Handle:timerany:client

        
    CPT(client); 
        
    CS_RespawnPlayer(client); 

    CPT(client

        switch (
    GetClientTeam(client)) 
        { 
            case 
    2CS_SwitchTeam(client3); 
            case 
    3CS_SwitchTeam(client2); 
        } 
    }  
    Добавил проверку:
    PHP:
    #include <cstrike> 
    #pragma semicolon 1
    public OnPluginStart() HookEvent("player_hurt"OnPlayerDeath); 
    public 
    OnPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast

        new 
    attacker GetClientOfUserId(GetEventInt(event"attacker")), client GetClientOfUserId(GetEventInt(event"userid")); 
        if (
    client <= MaxClients && IsClientInGame(client) && !IsFakeClient(client) && GetClientHealth(client) < && GetClientTeam(attacker) == GetClientTeam(client) && attacker != client
        { 
            
    CPT(client); 
            
    CreateTimer(0.0, Return, clientTIMER_FLAG_NO_MAPCHANGE); 
        } 

    public 
    Action:Return(Handle:timerany:client

        
    CPT(client); 
        
    CS_RespawnPlayer(client); 

    CPT(client

        if (
    IsClientInGame(client))
            switch (
    GetClientTeam(client)) 
            { 
                case 
    2CS_SwitchTeam(client3); 
                case 
    3CS_SwitchTeam(client2); 
            } 
    }  
     
    Последнее редактирование: 24 июл 2014
  10. AlmazON

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

    Сообщения:
    4.590
    Симпатии:
    1.995
    Я ж тебе рабочий пример скидывал, а не релиз плагина)
    PHP:
    #include <cstrike>  
    #pragma semicolon 1 
    public OnPluginStart() HookEvent("player_hurt"OnPlayerDeath);  
    public 
    OnPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)  
    {  
        new 
    attacker GetClientOfUserId(GetEventInt(event"attacker")), client GetClientOfUserId(GetEventInt(event"userid"));  
        if (
    client <= MaxClients && IsClientInGame(client) && !IsFakeClient(client) && GetClientHealth(client) < && GetClientTeam(attacker) == GetClientTeam(client) && attacker != client)  
        {  
            
    CPT(client);  
            
    CreateTimer(0.0, Return, clientTIMER_FLAG_NO_MAPCHANGE);  
        }  
    }  
    public 
    Action:Return(Handle:timerany:client)  
    {
        if (
    client <= MaxClients && IsClientInGame(client))
        {
            
    CPT(client);
            
    CS_RespawnPlayer(client);
        }
    }  
    CPT(client)  
    {  
        switch (
    GetClientTeam(client))  
        {  
            case 
    2CS_SwitchTeam(client3);  
            case 
    3CS_SwitchTeam(client2);  
        }  
     
  11. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Я к тому, что вроде бы куда уж еще проверок. Мгновения же...

    Добавлено через 11 часов 58 минут
    Итак, небольшая поправка:
    Был конфликт с ботами, они не спавнились.
    Добавил проверки и закомментировал функцию респавна, т.к. проблем при спавне в CSGO не наблюдается при любых условиях смены команд.
    PHP:
    #include <cstrike> 
    #pragma semicolon 1
    public OnPluginStart() HookEvent("player_hurt"OnPlayerDeath); 
    public 
    OnPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast

        new 
    attacker GetClientOfUserId(GetEventInt(event"attacker")), client GetClientOfUserId(GetEventInt(event"userid")); 
        if (
    client <= MaxClients && IsClientInGame(client)&& IsClientInGame(attacker) && !IsFakeClient(client) && !IsFakeClient(attacker) && GetClientHealth(client) < && GetClientTeam(attacker) == GetClientTeam(client) && attacker != client
        { 
            
    CPT(client); 
            
    CreateTimer(0.0, Return, clientTIMER_FLAG_NO_MAPCHANGE); 
        } 

    public 
    Action:Return(Handle:timerany:client

        if (
    client <= MaxClients && IsClientInGame(client)) 
        {
            
    CPT(client); 
            
    //CS_RespawnPlayer(client); 
        
    }

    CPT(client

        switch (
    GetClientTeam(client)) 
        { 
            case 
    2CS_SwitchTeam(client3); 
            case 
    3CS_SwitchTeam(client2); 
        } 
    }  
     
    Последнее редактирование: 25 июл 2014