DM FFA KillAchiemenets

TolikCorp

Участник
Сообщения
874
Реакции
334
Доброго времени суток, хочу сделать на дм штуку, чтобы при убийстве своего, фраг считался в достижения.

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

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

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Мда, тогда может и никак, только хитрить. По нативам пройдись, может есть что для установки достижений и всё такое.
Так то функционал достижений заключён в клиенте, а с сервера лишь считывает. Без нативов только и выдавать стандартным достижениям то, что они хотят для "начала записи".
 

TolikCorp

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

new g_ClientTeam[MAXPLAYERS+1];

public OnPluginStart()
{
    HookEvent("player_hurt",  OnPlayerDeath);
    HookEvent("player_spawn", PlayerSpawn, EventHookMode_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(client, CS_TEAM_CT);
                        }
                        else if (g_ClientTeam[attacker]==CS_TEAM_CT)
                        {
                            CS_SwitchTeam(client, CS_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
 
Последнее редактирование:

TolikCorp

Участник
Сообщения
874
Реакции
334
А дефайн вооот тут: #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 не подключал)
 
Последнее редактирование:

TolikCorp

Участник
Сообщения
874
Реакции
334
Я забыл упомянуть, что я использую игру КСГО и стандартный дм, где респавн работает адекватно очень.
 

TolikCorp

Участник
Сообщения
874
Реакции
334
Картина в листе игроков конечно жесть)))

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

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Заимствовал только
Ладно, это не важно. Так какие результаты?
Мой то код работает, но не факт, что достижения его воспримут "всерьёз".
с таймером хитро придумано
Учитывая, что нужен респавн... :-D
А в твоём коде просто перебрасывает за другую команду (правильность кода не учитывал)... разве не так? КТ станет Т, а т - КТ, вот и всё. :yes:
 

TolikCorp

Участник
Сообщения
874
Реакции
334
Достижения восприняли всерьез.

Добавлено через 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 (0 < client <= MaxClients && IsClientInGame(client) && !IsFakeClient(client) && GetClientHealth(client) < 1 && GetClientTeam(attacker) == GetClientTeam(client) && attacker != client) 
    { 
        CPT(client); 
        CreateTimer(0.0, Return, client, TIMER_FLAG_NO_MAPCHANGE); 
    } 
} 
public Action:Return(Handle:timer, any:client) 
{ 
    CPT(client); 
    CS_RespawnPlayer(client); 
} 
CPT(client) 
{ 
    switch (GetClientTeam(client)) 
    { 
        case 2: CS_SwitchTeam(client, 3); 
        case 3: CS_SwitchTeam(client, 2); 
    } 
}

Добавил проверку:
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 (0 < client <= MaxClients && IsClientInGame(client) && !IsFakeClient(client) && GetClientHealth(client) < 1 && GetClientTeam(attacker) == GetClientTeam(client) && attacker != client) 
    { 
        CPT(client); 
        CreateTimer(0.0, Return, client, TIMER_FLAG_NO_MAPCHANGE); 
    } 
} 
public Action:Return(Handle:timer, any:client) 
{ 
    CPT(client); 
    CS_RespawnPlayer(client); 
} 
CPT(client) 
{ 
    if (IsClientInGame(client))
        switch (GetClientTeam(client)) 
        { 
            case 2: CS_SwitchTeam(client, 3); 
            case 3: CS_SwitchTeam(client, 2); 
        } 
}
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Я ж тебе рабочий пример скидывал, а не релиз плагина)
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 (0 < client <= MaxClients && IsClientInGame(client) && !IsFakeClient(client) && GetClientHealth(client) < 1 && GetClientTeam(attacker) == GetClientTeam(client) && attacker != client)  
    {  
        CPT(client);  
        CreateTimer(0.0, Return, client, TIMER_FLAG_NO_MAPCHANGE);  
    }  
}  
public Action:Return(Handle:timer, any:client)  
{
	if (0 < client <= MaxClients && IsClientInGame(client))
	{
		CPT(client);
		CS_RespawnPlayer(client);
	}
}  
CPT(client)  
{  
    switch (GetClientTeam(client))  
    {  
        case 2: CS_SwitchTeam(client, 3);  
        case 3: CS_SwitchTeam(client, 2);  
    }
 

TolikCorp

Участник
Сообщения
874
Реакции
334
Я к тому, что вроде бы куда уж еще проверок. Мгновения же...

Добавлено через 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 (0 < client <= MaxClients && IsClientInGame(client)&& IsClientInGame(attacker) && !IsFakeClient(client) && !IsFakeClient(attacker) && GetClientHealth(client) < 1 && GetClientTeam(attacker) == GetClientTeam(client) && attacker != client) 
    { 
        CPT(client); 
        CreateTimer(0.0, Return, client, TIMER_FLAG_NO_MAPCHANGE); 
    } 
} 
public Action:Return(Handle:timer, any:client) 
{ 
    if (0 < client <= MaxClients && IsClientInGame(client)) 
    {
        CPT(client); 
        //CS_RespawnPlayer(client); 
    }
} 
CPT(client) 
{ 
    switch (GetClientTeam(client)) 
    { 
        case 2: CS_SwitchTeam(client, 3); 
        case 3: CS_SwitchTeam(client, 2); 
    } 
}
 
Последнее редактирование:
Сверху Снизу