Hello im editing some plugin to add extra damage on zombies but its not working and no error coming out. What i must do to get this work?
Maby ExecuteHam (Ham_TakeDamage)? The point is to deal more damage to zombies when they burning if not or end of burn damage return to normal.
code im add is:
Whole plugin:
sorry heere is log:
Maby ExecuteHam (Ham_TakeDamage)? The point is to deal more damage to zombies when they burning if not or end of burn damage return to normal.
code im add is:
PHP:
public fw_PlayerTakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
if (victim == attacker || !is_user_alive(attacker))
return HAM_IGNORED;
if (task_exists(victim+TASK_BURN))
{
SetHamParamFloat(4, damage * get_pcvar_float(cvar_grenade_fire_crit));
}
return HAM_IGNORED;
}
PHP:
#include <amxmodx>
#include <fun>
#include <fakemeta>
#include <hamsandwich>
#include <xs>
#include <amx_settings_api>
#include <cs_weap_models_api>
#include <cs_ham_bots_api>
#include <zp50_core>
#define LIBRARY_NEMESIS "zp50_class_nemesis"
#include <zp50_class_nemesis>
#include <zp50_items>
#define LIBRARY_GRENADE_FROST "zp50_grenade_frost"
#include <zp50_grenade_frost>
#define LIBRARY_GRENADE_FIRE "zp50_grenade_fire"
#include <zp50_grenade_fire>
#define LIBRARY_NEMESIS "zp50_class_nemesis"
#include <zp50_class_nemesis>
// Settings file
new const ZP_SETTINGS_FILE[] = "zombieplague.ini"
// Default sounds
new const sound_grenade_fire_explode[][] = { "zombie_plague/grenade_explode.wav" }
new const sound_grenade_fire_player[][] = { "zombie_plague/zombie_burn3.wav" , "zombie_plague/zombie_burn4.wav" , "zombie_plague/zombie_burn5.wav" , "zombie_plague/zombie_burn6.wav" , "zombie_plague/zombie_burn7.wav" }
#define MODEL_MAX_LENGTH 64
#define SOUND_MAX_LENGTH 64
#define SPRITE_MAX_LENGTH 64
// Models
new g_model_grenade_fire[MODEL_MAX_LENGTH] = "models/zombie_plague/v_grenade_fire.mdl"
// Sprites
new g_sprite_grenade_trail[SPRITE_MAX_LENGTH] = "sprites/laserbeam.spr"
new g_sprite_grenade_ring[SPRITE_MAX_LENGTH] = "sprites/shockwave.spr"
new g_sprite_grenade_fire[SPRITE_MAX_LENGTH] = "sprites/flame.spr"
new g_sprite_grenade_smoke[SPRITE_MAX_LENGTH] = "sprites/black_smoke3.spr"
new Array:g_sound_grenade_fire_explode
new Array:g_sound_grenade_fire_player
// Explosion radius for custom grenades
const Float:NADE_EXPLOSION_RADIUS = 240.0
// HACK: pev_ field used to store custom nade types and their values
const PEV_NADE_TYPE = pev_flTimeStepSound
const NADE_TYPE_NAPALM = 2222
#define TASK_BURN 100
#define ID_BURN (taskid - TASK_BURN)
#define MAXPLAYERS 32
// Custom Forwards
enum _:TOTAL_FORWARDS
{
FW_USER_BURN_PRE = 0
}
new g_Forwards[TOTAL_FORWARDS]
new g_ForwardResult
new g_BurningDuration[MAXPLAYERS+1]
new g_MsgDamage
new g_trailSpr, g_exploSpr, g_flameSpr, g_smokeSpr
new cvar_grenade_fire_duration, cvar_grenade_fire_damage, cvar_grenade_fire_crit, cvar_grenade_fire_slowdown, cvar_grenade_fire_hudicon, cvar_grenade_fire_explosion
public plugin_init()
{
register_plugin("[ZP] Grenade: Fire", ZP_VERSION_STRING, "ZP Dev Team")
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
RegisterHamBots(Ham_Killed, "fw_PlayerKilled")
register_forward(FM_SetModel, "fw_SetModel")
RegisterHam(Ham_Think, "grenade", "fw_ThinkGrenade")
g_MsgDamage = get_user_msgid("Damage")
cvar_grenade_fire_duration = register_cvar("zp_grenade_fire_duration", "10")
cvar_grenade_fire_damage = register_cvar("zp_grenade_fire_damage", "1.15")
cvar_grenade_fire_crit = register_cvar("zp_grenade_fire_crit", "1.15")
cvar_grenade_fire_slowdown = register_cvar("zp_grenade_fire_slowdown", "0.5")
cvar_grenade_fire_hudicon = register_cvar("zp_grenade_fire_hudicon", "1")
cvar_grenade_fire_explosion = register_cvar("zp_grenade_fire_explosion", "0")
g_Forwards[FW_USER_BURN_PRE] = CreateMultiForward("zp_fw_grenade_fire_pre", ET_CONTINUE, FP_CELL)
}
public plugin_precache()
{
// Initialize arrays
g_sound_grenade_fire_explode = ArrayCreate(SOUND_MAX_LENGTH, 1)
g_sound_grenade_fire_player = ArrayCreate(SOUND_MAX_LENGTH, 1)
// Load from external file
amx_load_setting_string_arr(ZP_SETTINGS_FILE, "Sounds", "GRENADE FIRE EXPLODE", g_sound_grenade_fire_explode)
amx_load_setting_string_arr(ZP_SETTINGS_FILE, "Sounds", "GRENADE FIRE PLAYER", g_sound_grenade_fire_player)
// If we couldn't load custom sounds from file, use and save default ones
new index
if (ArraySize(g_sound_grenade_fire_explode) == 0)
{
for (index = 0; index < sizeof sound_grenade_fire_explode; index++)
ArrayPushString(g_sound_grenade_fire_explode, sound_grenade_fire_explode[index])
// Save to external file
amx_save_setting_string_arr(ZP_SETTINGS_FILE, "Sounds", "GRENADE FIRE EXPLODE", g_sound_grenade_fire_explode)
}
if (ArraySize(g_sound_grenade_fire_player) == 0)
{
for (index = 0; index < sizeof sound_grenade_fire_player; index++)
ArrayPushString(g_sound_grenade_fire_player, sound_grenade_fire_player[index])
// Save to external file
amx_save_setting_string_arr(ZP_SETTINGS_FILE, "Sounds", "GRENADE FIRE PLAYER", g_sound_grenade_fire_player)
}
// Load from external file, save if not found
if (!amx_load_setting_string(ZP_SETTINGS_FILE, "Weapon Models", "GRENADE FIRE", g_model_grenade_fire, charsmax(g_model_grenade_fire)))
amx_save_setting_string(ZP_SETTINGS_FILE, "Weapon Models", "GRENADE FIRE", g_model_grenade_fire)
if (!amx_load_setting_string(ZP_SETTINGS_FILE, "Grenade Sprites", "TRAIL", g_sprite_grenade_trail, charsmax(g_sprite_grenade_trail)))
amx_save_setting_string(ZP_SETTINGS_FILE, "Grenade Sprites", "TRAIL", g_sprite_grenade_trail)
if (!amx_load_setting_string(ZP_SETTINGS_FILE, "Grenade Sprites", "RING", g_sprite_grenade_ring, charsmax(g_sprite_grenade_ring)))
amx_save_setting_string(ZP_SETTINGS_FILE, "Grenade Sprites", "RING", g_sprite_grenade_ring)
if (!amx_load_setting_string(ZP_SETTINGS_FILE, "Grenade Sprites", "FIRE", g_sprite_grenade_fire, charsmax(g_sprite_grenade_fire)))
amx_save_setting_string(ZP_SETTINGS_FILE, "Grenade Sprites", "FIRE", g_sprite_grenade_fire)
if (!amx_load_setting_string(ZP_SETTINGS_FILE, "Grenade Sprites", "SMOKE", g_sprite_grenade_smoke, charsmax(g_sprite_grenade_smoke)))
amx_save_setting_string(ZP_SETTINGS_FILE, "Grenade Sprites", "SMOKE", g_sprite_grenade_smoke)
// Precache sounds
new sound[SOUND_MAX_LENGTH]
for (index = 0; index < ArraySize(g_sound_grenade_fire_explode); index++)
{
ArrayGetString(g_sound_grenade_fire_explode, index, sound, charsmax(sound))
precache_sound(sound)
}
for (index = 0; index < ArraySize(g_sound_grenade_fire_player); index++)
{
ArrayGetString(g_sound_grenade_fire_player, index, sound, charsmax(sound))
precache_sound(sound)
}
// Precache models
precache_model(g_model_grenade_fire)
g_trailSpr = precache_model(g_sprite_grenade_trail)
g_exploSpr = precache_model(g_sprite_grenade_ring)
g_flameSpr = precache_model(g_sprite_grenade_fire)
g_smokeSpr = precache_model(g_sprite_grenade_smoke)
}
public plugin_natives()
{
register_library("zp50_grenade_fire")
register_native("zp_grenade_fire_get", "native_grenade_fire_get")
register_native("zp_grenade_fire_set", "native_grenade_fire_set")
set_module_filter("module_filter")
set_native_filter("native_filter")
}
public module_filter(const module[])
{
if (equal(module, LIBRARY_NEMESIS))
return PLUGIN_HANDLED;
return PLUGIN_CONTINUE;
}
public native_filter(const name[], index, trap)
{
if (!trap)
return PLUGIN_HANDLED;
return PLUGIN_CONTINUE;
}
public native_grenade_fire_get(plugin_id, num_params)
{
new id = get_param(1)
if (!is_user_alive(id))
{
log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
return false;
}
return task_exists(id+TASK_BURN);
}
public fw_PlayerTakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
if (victim == attacker || !is_user_alive(attacker))
return HAM_IGNORED;
if (task_exists(victim+TASK_BURN))
{
SetHamParamFloat(4, damage * get_pcvar_float(cvar_grenade_fire_crit));
}
return HAM_IGNORED;
}
public native_grenade_fire_set(plugin_id, num_params)
{
new id = get_param(1)
if (!is_user_alive(id))
{
log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
return false;
}
new set = get_param(2)
// End fire
if (!set)
{
// Not burning
if (!task_exists(id+TASK_BURN))
return true;
// Get player origin
static origin[3]
get_user_origin(id, origin)
// Smoke sprite
message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
write_byte(TE_SMOKE) // TE id
write_coord(origin[0]) // x
write_coord(origin[1]) // y
write_coord(origin[2]-50) // z
write_short(g_smokeSpr) // sprite
write_byte(random_num(15, 20)) // scale
write_byte(random_num(10, 20)) // framerate
message_end()
// Task not needed anymore
remove_task(id+TASK_BURN)
return true;
}
// Set on fire
return set_on_fire(id);
}
public zp_fw_core_cure_post(id, attacker)
{
// Stop burning
remove_task(id+TASK_BURN)
g_BurningDuration[id] = 0
// Set custom grenade model
cs_set_player_view_model(id, CSW_HEGRENADE, g_model_grenade_fire)
}
public zp_fw_core_infect(id, attacker)
{
// Remove custom grenade model
cs_reset_player_view_model(id, CSW_HEGRENADE)
}
// Ham Player Killed Forward
public fw_PlayerKilled(victim, attacker, shouldgib)
{
// Stop burning
remove_task(victim+TASK_BURN)
g_BurningDuration[victim] = 0
}
public client_disconnected(id)
{
// Stop burning
remove_task(id+TASK_BURN)
g_BurningDuration[id] = 0
}
// Forward Set Model
public fw_SetModel(entity, const model[])
{
// We don't care
if (strlen(model) < 8)
return;
// Narrow down our matches a bit
if (model[7] != 'w' || model[8] != '_')
return;
// Get damage time of grenade
static Float:dmgtime
pev(entity, pev_dmgtime, dmgtime)
// Grenade not yet thrown
if (dmgtime == 0.0)
return;
// Grenade's owner is zombie?
if (zp_core_is_zombie(pev(entity, pev_owner)))
return;
// HE Grenade
if (model[9] == 'h' && model[10] == 'e')
{
// Give it a glow
fm_set_rendering(entity, kRenderFxGlowShell, 200, 0, 0, kRenderNormal, 16)
// And a colored trail
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW) // TE id
write_short(entity) // entity
write_short(g_trailSpr) // sprite
write_byte(10) // life
write_byte(10) // width
write_byte(200) // r
write_byte(0) // g
write_byte(0) // b
write_byte(200) // brightness
message_end()
// Set grenade type on the thrown grenade entity
set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_NAPALM)
}
}
// Ham Grenade Think Forward
public fw_ThinkGrenade(entity)
{
// Invalid entity
if (!pev_valid(entity)) return HAM_IGNORED;
// Get damage time of grenade
static Float:dmgtime
pev(entity, pev_dmgtime, dmgtime)
// Check if it's time to go off
if (dmgtime > get_gametime())
return HAM_IGNORED;
// Not a napalm grenade
if (pev(entity, PEV_NADE_TYPE) != NADE_TYPE_NAPALM)
return HAM_IGNORED;
fire_explode(entity);
// Keep the original explosion?
if (get_pcvar_num(cvar_grenade_fire_explosion))
{
set_pev(entity, PEV_NADE_TYPE, 0)
return HAM_IGNORED;
}
// Get rid of the grenade
engfunc(EngFunc_RemoveEntity, entity)
return HAM_SUPERCEDE;
}
// Fire Grenade Explosion
fire_explode(ent)
{
// Get origin
static Float:origin[3]
pev(ent, pev_origin, origin)
// Override original HE grenade explosion?
if (!get_pcvar_num(cvar_grenade_fire_explosion))
{
// Make the explosion
create_blast2(origin)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_DLIGHT)
engfunc(EngFunc_WriteCoord, origin[0])
engfunc(EngFunc_WriteCoord, origin[1])
engfunc(EngFunc_WriteCoord, origin[2])
write_byte(38)//Radius
write_byte(200) // r
write_byte(100) // g
write_byte(0) // b
write_byte(8) //Life
write_byte(32)
message_end()
// Fire nade explode sound
static sound[SOUND_MAX_LENGTH]
ArrayGetString(g_sound_grenade_fire_explode, random_num(0, ArraySize(g_sound_grenade_fire_explode) - 1), sound, charsmax(sound))
emit_sound(ent, CHAN_WEAPON, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
}
// Collisions
new victim = -1
while ((victim = engfunc(EngFunc_FindEntityInSphere, victim, origin, NADE_EXPLOSION_RADIUS)) != 0)
{
// Only effect alive zombies
if (!is_user_alive(victim) || !zp_core_is_zombie(victim))
continue;
set_on_fire(victim)
}
}
set_on_fire(victim)
{
// Allow other plugins to decide whether player should be burned or not
ExecuteForward(g_Forwards[FW_USER_BURN_PRE], g_ForwardResult, victim)
if (g_ForwardResult >= PLUGIN_HANDLED)
return false;
// Heat icon?
if (get_pcvar_num(cvar_grenade_fire_hudicon))
{
message_begin(MSG_ONE_UNRELIABLE, g_MsgDamage, _, victim)
write_byte(0) // damage save
write_byte(0) // damage take
write_long(DMG_BURN) // damage type
write_coord(0) // x
write_coord(0) // y
write_coord(0) // z
message_end()
}
// Reduced duration for Nemesis
if (LibraryExists(LIBRARY_NEMESIS, LibType_Library) && zp_class_nemesis_get(victim))
{
// fire duration (nemesis)
g_BurningDuration[victim] += get_pcvar_num(cvar_grenade_fire_duration)
}
else
{
// fire duration (zombie)
g_BurningDuration[victim] += get_pcvar_num(cvar_grenade_fire_duration) * 5
}
// Set burning task on victim
remove_task(victim+TASK_BURN)
set_task(0.2, "burning_flame", victim+TASK_BURN, _, _, "b")
return true;
}
// Burning Flames
public burning_flame(taskid)
{
// Get player origin and flags
static origin[3]
get_user_origin(ID_BURN, origin)
new flags = pev(ID_BURN, pev_flags)
// In water or burning stopped
if ((flags & FL_INWATER) || g_BurningDuration[ID_BURN] < 1)
{
// Smoke sprite
message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
write_byte(TE_SMOKE) // TE id
write_coord(origin[0]) // x
write_coord(origin[1]) // y
write_coord(origin[2]-50) // z
write_short(g_smokeSpr) // sprite
write_byte(random_num(15, 20)) // scale
write_byte(random_num(10, 20)) // framerate
message_end()
// Task not needed anymore
remove_task(taskid)
return;
}
// Nemesis Class loaded?
if (!LibraryExists(LIBRARY_NEMESIS, LibType_Library) || !zp_class_nemesis_get(ID_BURN))
{
// Randomly play burning zombie scream sounds
if (random_num(1, 20) == 1)
{
static sound[SOUND_MAX_LENGTH]
ArrayGetString(g_sound_grenade_fire_player, random_num(0, ArraySize(g_sound_grenade_fire_player) - 1), sound, charsmax(sound))
emit_sound(ID_BURN, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
}
// Fire slow down
if ((flags & FL_ONGROUND) && get_pcvar_float(cvar_grenade_fire_slowdown) > 0.0)
{
static Float:velocity[3]
pev(ID_BURN, pev_velocity, velocity)
xs_vec_mul_scalar(velocity, get_pcvar_float(cvar_grenade_fire_slowdown), velocity)
set_pev(ID_BURN, pev_velocity, velocity)
}
}
// Get player's health
new health = get_user_health(ID_BURN)
// Take damage from the fire
if (health - floatround(health / get_pcvar_float(cvar_grenade_fire_damage), floatround_ceil) > 0)
set_user_health(ID_BURN, health - floatround(health / get_pcvar_float(cvar_grenade_fire_damage), floatround_ceil))
// Flame sprite
message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
write_byte(TE_SPRITE) // TE id
write_coord(origin[0]+random_num(-5, 5)) // x
write_coord(origin[1]+random_num(-5, 5)) // y
write_coord(origin[2]+random_num(-10, 10)) // z
write_short(g_flameSpr) // sprite
write_byte(random_num(5, 10)) // scale
write_byte(200) // brightness
message_end()
// Colored Aura
message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
write_byte(TE_DLIGHT) // TE id
write_coord(origin[0]) // x
write_coord(origin[1]) // y
write_coord(origin[2]) // z
write_byte(15) // radius
write_byte(255) // r
write_byte(100) // g
write_byte(10) // b
write_byte(2) // life
write_byte(0) // decay rate
message_end()
// Decrease burning duration counter
g_BurningDuration[ID_BURN]--
}
// Fire Grenade: Fire Blast
create_blast2(const Float:origin[3])
{
// Smallest ring
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, origin, 0)
write_byte(TE_BEAMCYLINDER) // TE id
engfunc(EngFunc_WriteCoord, origin[0]) // x
engfunc(EngFunc_WriteCoord, origin[1]) // y
engfunc(EngFunc_WriteCoord, origin[2]) // z
engfunc(EngFunc_WriteCoord, origin[0]) // x axis
engfunc(EngFunc_WriteCoord, origin[1]) // y axis
engfunc(EngFunc_WriteCoord, origin[2]+385.0) // z axis
write_short(g_exploSpr) // sprite
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(4) // life
write_byte(60) // width
write_byte(0) // noise
write_byte(200) // red
write_byte(100) // green
write_byte(0) // blue
write_byte(200) // brightness
write_byte(0) // speed
message_end()
// Medium ring
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, origin, 0)
write_byte(TE_BEAMCYLINDER) // TE id
engfunc(EngFunc_WriteCoord, origin[0]) // x
engfunc(EngFunc_WriteCoord, origin[1]) // y
engfunc(EngFunc_WriteCoord, origin[2]) // z
engfunc(EngFunc_WriteCoord, origin[0]) // x axis
engfunc(EngFunc_WriteCoord, origin[1]) // y axis
engfunc(EngFunc_WriteCoord, origin[2]+470.0) // z axis
write_short(g_exploSpr) // sprite
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(4) // life
write_byte(60) // width
write_byte(0) // noise
write_byte(200) // red
write_byte(50) // green
write_byte(0) // blue
write_byte(200) // brightness
write_byte(0) // speed
message_end()
// Largest ring
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, origin, 0)
write_byte(TE_BEAMCYLINDER) // TE id
engfunc(EngFunc_WriteCoord, origin[0]) // x
engfunc(EngFunc_WriteCoord, origin[1]) // y
engfunc(EngFunc_WriteCoord, origin[2]) // z
engfunc(EngFunc_WriteCoord, origin[0]) // x axis
engfunc(EngFunc_WriteCoord, origin[1]) // y axis
engfunc(EngFunc_WriteCoord, origin[2]+555.0) // z axis
write_short(g_exploSpr) // sprite
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(4) // life
write_byte(60) // width
write_byte(0) // noise
write_byte(200) // red
write_byte(0) // green
write_byte(0) // blue
write_byte(200) // brightness
write_byte(0) // speed
message_end()
}
// Set entity's rendering type (from fakemeta_util)
stock fm_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16)
{
static Float:color[3]
color[0] = float(r)
color[1] = float(g)
color[2] = float(b)
set_pev(entity, pev_renderfx, fx)
set_pev(entity, pev_rendercolor, color)
set_pev(entity, pev_rendermode, render)
set_pev(entity, pev_renderamt, float(amount))
}
stock UTIL_SetRendering(iPlayer, iFx = 0, iRed = 255, iGreen = 255, iBlue = 255, iRender = 0, Float: flAmount = 16.0)
{
static Float: flColor[3];
flColor[0] = float(iRed);
flColor[1] = float(iGreen);
flColor[2] = float(iBlue);
set_pev(iPlayer, pev_renderfx, iFx);
set_pev(iPlayer, pev_rendercolor, flColor);
set_pev(iPlayer, pev_rendermode, iRender);
set_pev(iPlayer, pev_renderamt, flAmount);
}
9 Фев 2023
Код:
L 02/09/2023 - 21:00:43: [AMXX] Displaying debug trace (plugin "zp50_grenade_fire.amxx", version "1.0")
L 02/09/2023 - 21:00:43: [AMXX] Run time error 10: native error (native "get_pcvar_num")
L 02/09/2023 - 21:00:43: [AMXX] [0] zp50_grenade_fire.sma::fire_explode (line 365)
L 02/09/2023 - 21:00:43: [AMXX] [1] zp50_grenade_fire.sma::fw_ThinkGrenade (line 343)