const MAX_NAME_SIZE = 32;
native csstats_set_user_value(index, ident, value);
native csstats_get_user_value(index, ident);
native aes_add_player_exp(id,exp,override = 0);
new Float:g_playerDamage[MAX_PLAYERS + 1][MAX_PLAYERS + 1];
new HookChain:g_deathNoticePostHook;
register_plugin("KiLL Assist", "poka_4to_beta", "PRoSToTeM@"); // edited by neugomon
// if(!is_regamedll() || !is_rehlds())
// set_fail_state("Needs CS ReGameDLL and ReHLDS");
RegisterHookChain(RG_CBasePlayer_Spawn, "OnPlayerSpawn_Post", true);
RegisterHookChain(RG_CBasePlayer_TakeDamage, "OnPlayerTakeDamage_Post", true);
RegisterHookChain(RG_CSGameRules_DeathNotice, "OnDeathNotice", false);
DisableHookChain((g_deathNoticePostHook = RegisterHookChain(RG_CSGameRules_DeathNotice, "OnDeathNotice_Post", true)));
public client_connect(playerEntIndex)
arrayset(_:g_playerDamage[playerEntIndex], 0, sizeof(g_playerDamage[]));
public OnPlayerSpawn_Post(playerEntIndex)
for(new i = 1; i <= MAX_PLAYERS; i++)
g_playerDamage[i][playerEntIndex] = 0.0;
public OnPlayerTakeDamage_Post(playerEntIndex, inflictorEntIndex, attackerEntIndex, Float:damage, damageType)
attackerEntIndex != playerEntIndex &&
is_user_connected(attackerEntIndex) &&
rg_is_player_can_takedamage(attackerEntIndex, playerEntIndex)
) g_playerDamage[attackerEntIndex][playerEntIndex] += damage;
public OnDeathNotice(victimEntIndex, killerEntIndex, inflictorEntIndex)
killerEntIndex != victimEntIndex &&
is_user_connected(killerEntIndex) &&
rg_is_player_can_takedamage(killerEntIndex, victimEntIndex)
new bestAttackerEntIndex = 0;
for (new i = 1, Float:maxDamage; i <= MAX_PLAYERS; i++) {
if (g_playerDamage[i][victimEntIndex] > maxDamage) {
maxDamage = g_playerDamage[i][victimEntIndex];
bestAttackerEntIndex = i;
// Assistant must have more damage than killer
bestAttackerEntIndex != killerEntIndex &&
is_user_connected(bestAttackerEntIndex) &&
rg_is_player_can_takedamage(bestAttackerEntIndex, victimEntIndex) &&
get_member(bestAttackerEntIndex, m_iTeam) != TEAM_SPECTATOR
new name1[MAX_NAME_SIZE], name2[MAX_NAME_SIZE], name[MAX_NAME_SIZE];
get_entvar(killerEntIndex, var_netname, name1, charsmax(name1));
get_entvar(bestAttackerEntIndex, var_netname, name2, charsmax(name2));
rg_add_account(bestAttackerEntIndex, MONEY);
set_entvar(bestAttackerEntIndex, var_frags, Float:get_entvar(bestAttackerEntIndex, var_frags) + 1.0);
csstats_set_user_value(bestAttackerEntIndex, 0, csstats_get_user_value(bestAttackerEntIndex, 0) + 1);
aes_add_player_exp(bestAttackerEntIndex, 1);
// TODO: cut nicknames if big length (> 14) and add ...
// TODO: UTF-8 cut correctly
if(strlen(name1) + strlen(name2) > 28) {
formatex(name, charsmax(name), "%.14s + %.14s", name1, name2);
formatex(name, charsmax(name), "%s + %s", name1, name2);
message_begin(MSG_ALL, SVC_UPDATEUSERINFO);
write_byte(killerEntIndex - 1);
write_long(get_user_userid(killerEntIndex));
for(new i = 0; i < 16; i++)
EnableHookChain(g_deathNoticePostHook);
public OnDeathNotice_Post(victimEntIndex, killerEntIndex, inflictorEntIndex)
rh_update_user_info(killerEntIndex);
DisableHookChain(g_deathNoticePostHook);