CSDM Spec Switch ReAPI

Сообщения
2,723
Реакции
2,997
Помог
60 раз(а)
Оттестируйте плагин на CSDM сервере. Нужен ли такой вообще?!
Переброс игрока в спектаторы и обратно по нажатию M.
Код:
const Float: FLOOD_TIMEOUT = 2.0;

#define VERSION "0.0.1"

#include <amxmodx>
#include <reapi>

new TeamName: g_iPlayerLastTeam[MAX_CLIENTS];
new Float: g_fPlayerLastChooseTime[MAX_CLIENTS];
new bool: g_bSpectator[MAX_CLIENTS];

public plugin_init()
{
register_plugin("CSDM Spec Switch ReAPI", VERSION, "wopox1337");

// RegisterHookChain(RG_CSGameRules_FPlayerCanRespawn, "CSGameRules_FPlayerCanRespawn_Pre", .post = false);
RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn_Pre", .post = false);

register_clcmd("chooseteam", "Player__SpecSwitch");
}

public Player__SpecSwitch(const pPlayerId)
{
if((get_gametime() - g_fPlayerLastChooseTime[pPlayerId]) < FLOOD_TIMEOUT)
{
client_print(pPlayerId, print_center, "Вы не можете так быстро менять команду!");
return PLUGIN_HANDLED;
}

g_fPlayerLastChooseTime[pPlayerId] = get_gametime();

new TeamName: iTeam;

if(is_user_alive(pPlayerId))
{
switch(g_iPlayerLastTeam[pPlayerId] = get_member(pPlayerId, m_iTeam))
{
case TEAM_TERRORIST, TEAM_CT:
{
iTeam = TEAM_SPECTATOR;
}
}

Player__SilentKill(pPlayerId);

set_entvar(pPlayerId, var_effects, EF_NODRAW);
rg_set_user_team(pPlayerId, .team = iTeam);

g_bSpectator[pPlayerId] = true;
}
else
{
iTeam = g_iPlayerLastTeam[pPlayerId];

rg_set_user_team(pPlayerId, .team = iTeam);
rg_round_respawn(pPlayerId);

g_bSpectator[pPlayerId] = false;
}

return PLUGIN_HANDLED;
}

/* при mp_forcerespawn не будет срабатывать FCanPlayerRespawn. для меня не очевидно
public CSGameRules_FPlayerCanRespawn_Pre(const pPlayerId)
{
if(g_bSpectator[pPlayerId])
{
SetHookChainReturn(ATYPE_INTEGER, false);
}

// log_amx("CSGameRules_FPlayerCanRespawn");
// return HC_CONTINUE;
}
*/

public CBasePlayer_Spawn_Pre(const pPlayerId)
{
if(g_bSpectator[pPlayerId])
{
return HC_SUPERCEDE;
}

return HC_CONTINUE;
}

public client_putinserver(pPlayerId)
{
g_iPlayerLastTeam[pPlayerId] = TEAM_UNASSIGNED;
}

const g_iMsgDeathMsg = 83;
stock Player__SilentKill(pPlayerId)
{
new iMsgBlockState = get_msg_block(g_iMsgDeathMsg);
set_msg_block(g_iMsgDeathMsg, BLOCK_ONCE);
user_kill(pPlayerId, flag = 1);
set_msg_block(g_iMsgDeathMsg, iMsgBlockState);
}
 
Сообщения
2,723
Реакции
2,997
Помог
60 раз(а)
Vaqtincha,
Код:
public CBasePlayer_Spawn_Pre(const pPlayerId)
{ // Если игрок назначен как наблюдатель
if(g_bSpectator[pPlayerId])
{
return HC_SUPERCEDE;
}

return HC_CONTINUE;
}


ПОЧЕМУ ИМЕННО ТАК?
Если я правильно понял, то:
1) ReGameDLL player.cpp#L3657
Тут проверяется значение квара mp_forcerespawn. и выставляется m_fDeadTime + forcerespawn.value
и сразу же респавнит, не узнав значение функции FPlayerCanRespawn сразу выходит из функции по return.
2) И как раз таки до момента проверки FPlayerCanRespawn не доходит. ReGameDLL player.cpp#L3668
 
Последнее редактирование:
Сообщения
528
Реакции
465
Предупреждения
16
Помог
9 раз(а)
wopox1337, Спектатора спавнит не должно. Пробуй ставит
rg_set_user_team(pPlayerId, .team = iTeam);
до килл
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу