Junior Member
|
03-09-2024
, 07:23
Problem with armor calculation Ham_TakeDamage
|
#1
|
Hey, for the past few days, I've been struggling to implement the functionality in my plugin that reads real damage inflicted by players and adds it to a table, excluding damage dealt to armor. I've noticed that I should use pev_dmg_take, but no matter how hard I try, I can't seem to get it to work. I also attempted to use the client_damage event, but with no success.
Is there somebody who knows how to do that?
PHP Code:
#include <amxmodx>
#include <hamsandwich>
#define PLUGIN "Display Damage"
#define VERSION "1.0"
#define AUTHOR "unknown"
#define MAX_PLAYERS 32
new pCvarAllowCommand
new pCvarDisplayAttacksOnly
new pCvarAliveOnly
new pCvarExcludeBots
enum
{
iTaken,
iReceived
}
const MAX_HEALTH = 100
new g_iHits[MAX_PLAYERS + 1][MAX_PLAYERS + 1]
new g_iDamage[MAX_PLAYERS + 1][MAX_PLAYERS + 1]
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
pCvarDisplayAttacksOnly = register_cvar("dmg_display_attacksonly", "1")
pCvarAliveOnly = register_cvar("dmg_cmd_alive_only", "1")
pCvarAllowCommand = register_cvar("dmg_cmd_allow", "1")
pCvarExcludeBots = register_cvar("dmg_exclude_bots", "0")
register_logevent("logevent_roundend",2,"1=Round_End")
RegisterHam(Ham_TakeDamage, "player", "ham_TakeDamage_Post", 0)
RegisterHam(Ham_Spawn, "player", "ham_PlayerSpawn", 1)
}
public ham_PlayerSpawn(id)
{
for (new i; i < sizeof g_iHits; i++)
{
arrayset(g_iHits[i], 0, sizeof g_iHits[])
}
for (new i; i < sizeof g_iDamage; i++)
{
arrayset(g_iDamage[i], 0, sizeof g_iDamage[])
}
}
public ham_TakeDamage_Post(iVictim, iInflictor, iAttacker, Float:fDamage, iDamageBits)
{
if(!is_user_connected(iAttacker) || !is_user_connected(iVictim))
return HAM_IGNORED
g_iHits[iAttacker][iVictim]++
new iDamage = FloatRound(fDamage), iVictimHealth = get_user_health(iVictim);
g_iDamage[iAttacker][iVictim] += iDamage
return HAM_IGNORED;
}
public FloatRound(Float:value)
{
return (value >= 0.0) ? floatround(value, floatround_floor) : -floatround(-value, floatround_floor);
}
public logevent_roundend()
{
new iPlayers[MAX_PLAYERS], iNum
get_players(iPlayers, iNum)
for(new i;i < iNum;i++)
{
displayDamage(iPlayers[i])
}
}
public displayDamage(id)
{
new iPlayers[MAX_PLAYERS], iNum
if (get_pcvar_num(pCvarExcludeBots))
get_players(iPlayers, iNum, "ch")
else
get_players(iPlayers, iNum, "h")
new team = get_user_team(id)
for(new i, iPlayer, szName[MAX_PLAYERS], iDmg[1],iHit[1];i < iNum;i++)
{
iPlayer = iPlayers[i]
if(iPlayer == id || get_user_team(iPlayer) == team)
continue
iHit[0] = g_iHits[id][iPlayer] // Hit Done
if(get_pcvar_num(pCvarDisplayAttacksOnly) && (!iHit[0]))
continue
iDmg[0] = g_iDamage[id][iPlayer] // Damage Done
get_user_name(iPlayer, szName, charsmax(szName))
// Shorten szName if longer than 16 characters
copy(szName, min(strlen(szName), 16), szName)
new user_health;
if (is_user_alive(iPlayer)) {
user_health = get_user_health(iPlayer)
} else {
user_health = 0
}
ChatColor(id, " ^x01[^x04%i^x01 dmg / ^x04%i^x01 hits] - ^x03%s^x01 (^x04%i^x01 HP)", min(iDmg[0], MAX_HEALTH), iHit[0], szName, user_health)
}
}
ChatColor(const id, const input[], any:...)
{
static mMessageSayText
if(!mMessageSayText)
{
mMessageSayText = get_user_msgid("SayText")
}
new iCount = 1, iPlayers[MAX_PLAYERS]
static szMessage[192]
vformat(szMessage, charsmax(szMessage), input, 3)
replace_all(szMessage, charsmax(szMessage), "!g", "^4")
replace_all(szMessage, charsmax(szMessage), "!y", "^1")
replace_all(szMessage, charsmax(szMessage), "!t", "^3")
if(id) iPlayers[0] = id
else get_players(iPlayers, iCount, "ch")
for (new i, player; i < iCount; i++)
{
message_begin(MSG_ONE_UNRELIABLE, mMessageSayText, _, (player = iPlayers[i]))
write_byte(player)
write_string(szMessage)
message_end()
}
}
|
|