#include <amxmodx>
#include <fakemeta>
#include <engine>
#include <hamsandwich>
#define PLUGIN "Saved ya"
#define VERSION "1.0"
#define AUTHOR "EFFEX"
#define MIN_DISTANCE 500
#define MIN_PLAYERS 3
#define MAX_DELAY 2
#if !defined MAX_NAME_LENGTH
#define MAX_NAME_LENGTH 32
#endif
const Float:CHECK_DELAY = 0.5
new g_iPlayerCloseEnemyID[MAX_NAME_LENGTH + 1]
new g_iLastTimeSeen[MAX_NAME_LENGTH + 1]
new g_iUserWeapon[MAX_NAME_LENGTH + 1]
new Float:g_fUserCheckDelay[MAX_NAME_LENGTH + 1]
new g_mMessageSayText
new pCvarDeathMatchMod
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
pCvarDeathMatchMod = register_cvar("sy_deathmatch_support", "0")
g_mMessageSayText = get_user_msgid("SayText")
RegisterHam(Ham_TakeDamage, "player", "ham_PlayerTakeDamage_Pre", 0)
RegisterHam(Ham_Killed, "player", "ham_PlayerKilled_Post", 1)
}
public ham_PlayerKilled_Post(iVictim, iAttacker, iShouldGibs)
{
if(!is_user_connected(iAttacker) || !is_user_connected(iVictim) || (iVictim == iAttacker))
return HAM_IGNORED
if(get_user_team(iAttacker) == get_user_team(iVictim)
|| (g_iUserWeapon[iAttacker] == CSW_HEGRENADE)
|| hasObjectInTheWay(iAttacker, iVictim))
return HAM_IGNORED
new iMateID = g_iPlayerCloseEnemyID[iVictim]
if(iMateID == iAttacker)
return HAM_IGNORED
if(iMateID && is_user_alive(iMateID))
{
new szMateName[MAX_NAME_LENGTH], szVictimName[MAX_NAME_LENGTH], szKillerName[MAX_NAME_LENGTH]
get_user_name(iVictim, szVictimName, charsmax(szVictimName))
get_user_name(iMateID, szMateName, charsmax(szMateName))
get_user_name(iAttacker, szKillerName, charsmax(szKillerName))
sendColoredMessage(iMateID, "^x04** %s megmentett %s megölésével! **", szKillerName, szVictimName)
sendColoredMessage(iAttacker, "^x04** Megmentetted %s -t, %s megölésével! **", szMateName, szVictimName)
g_iPlayerCloseEnemyID[iVictim] = 0
}
return HAM_IGNORED
}
public ham_PlayerTakeDamage_Pre(iVictim, iInflictor, iAttacker, Float:fDamage, iDamageBits)
{
if(!is_user_connected(iAttacker) || !is_user_connected(iVictim) || (iVictim == iAttacker))
return HAM_IGNORED
if(hasObjectInTheWay(iAttacker, iVictim))
return HAM_IGNORED
if(iDamageBits & (1 << 24)) // he Damage
{
g_iUserWeapon[iAttacker] = CSW_HEGRENADE
return HAM_IGNORED
}
else g_iUserWeapon[iAttacker] = get_user_weapon(iAttacker)
static Float:fOrigin[3]
entity_get_vector(iAttacker, EV_VEC_origin, fOrigin)
if(is_visible(iVictim, iAttacker) && is_in_viewcone(iVictim, fOrigin, 1))
return HAM_IGNORED
g_iLastTimeSeen[iAttacker] = get_systime()
g_iPlayerCloseEnemyID[iAttacker] = iVictim
return HAM_IGNORED
}
public client_PreThink(id)
{
if(!is_user_alive(id) && get_pcvar_num(pCvarDeathMatchMod))
return
static iPlayers[MAX_NAME_LENGTH], iSysTime;iSysTime = get_systime()
new iNum
get_players(iPlayers, iNum, "a")
if(iNum < MIN_PLAYERS) // at least 2 players in a team (so one of them could be saved)
return
static Float:fCheckDelay;fCheckDelay = get_gametime()
if((fCheckDelay - g_fUserCheckDelay[id]) <= CHECK_DELAY)
return
static Float:fUserOrigin[3]
entity_get_vector(id, EV_VEC_origin, fUserOrigin)
for(new i, iPlayer, bool:bIsTooClose = false, Float:fOrigin[3];i < iNum;i++)
{
iPlayer = iPlayers[i]
if((iPlayer == id) || (get_user_team(iPlayer) == get_user_team(id)))
continue
if((get_user_weapon(id) == CSW_KNIFE) && (get_user_weapon(iPlayer) == CSW_KNIFE))
continue // maybe having some fun making knife vs knife duel? ^^
entity_get_vector(iPlayer, EV_VEC_origin, fOrigin)
bIsTooClose = bool:(get_distance_f(fUserOrigin, fOrigin) <= MIN_DISTANCE)
if(is_visible(id, iPlayer) && is_in_viewcone(id, fOrigin, 1) && bIsTooClose)
{
g_iLastTimeSeen[id] = iSysTime
g_iPlayerCloseEnemyID[id] = iPlayer
}
}
if(g_iPlayerCloseEnemyID[id])
{
if((iSysTime - g_iLastTimeSeen[id]) >= MAX_DELAY)
{
g_iLastTimeSeen[id] = 0
g_iPlayerCloseEnemyID[id] = 0
}
}
g_fUserCheckDelay[id] = fCheckDelay
}
sendColoredMessage(const id, const input[], any:...)
{
static szMsg[192]
vformat(szMsg, 190, input, 3)
message_begin(MSG_ONE_UNRELIABLE, g_mMessageSayText, .player = id)
write_byte(id)
write_string(szMsg)
message_end()
}
bool:hasObjectInTheWay(iAttacker, iVictim)
{
static Float:fAttackerOrigin[3], Float:fVictimOrigin[3]
pev(iAttacker, pev_origin, fAttackerOrigin)
pev(iVictim, pev_origin, fVictimOrigin)
static tr, Float:fFraction
engfunc(EngFunc_TraceLine, fVictimOrigin, fAttackerOrigin, 1, -1, tr)
get_tr2(tr, TR_flFraction, fFraction)
return bool:(fFraction != 1.0)
}