Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
Hình như cái đó của CSS thì phải cho vô ko có tác dụngNgười ta không thích thì lock. Amxmodx có hỗ trợ weapon_restrict trong server đấy nhưng không nhớ rõ viết vào file nào.
@dark_one: Việc cl_corpsestay cũng giống w cách ông nói ở trên thôi. Nhưng tại sao k hiệu nghiệm , tôi ko biết / cl_corpsestay là config của client....bỏ vào config.cfg sem sao...Hic...
#include <amxmodx>
#include <hamsandwich>
public plugin_ini()
{
register_plugin("Test","1.0","Dias")
RegisterHam(Ham_TakeDamage, "player", "fw_takedmg")
}
public fw_takedmg(attacker, victim, inflictor, Float:damage)
{
client_print(attacker, print_chat, "Take Damage")
}
....Ai pro cái TakeDamage hướng dẫn nào.
---------------------------------------------
PHP:#include <amxmodx> #include <hamsandwich> public plugin_ini() { register_plugin("Test","1.0","Dias") RegisterHam(Ham_TakeDamage, "player", "fw_takedmg") } public fw_takedmg(attacker, victim, inflictor, Float:damage) { client_print(attacker, print_chat, "Take Damage") }
Tại sao trong game, khi bắn trúng ai đó nó ko hiện chữ TakeDamage nhỉ....
fw_takedmg(victim, inflictor, attacker, Float:damage, damagetype)
đây mới chỉ reg ham takedamage cho player thôiAi pro cái TakeDamage hướng dẫn nào.
---------------------------------------------
Tại sao trong game, khi bắn trúng ai đó nó ko hiện chữ TakeDamage nhỉPHP:#include <amxmodx> #include <hamsandwich> public plugin_ini() { register_plugin("Test","1.0","Dias") RegisterHam(Ham_TakeDamage, "player", "fw_takedmg") } public fw_takedmg(attacker, victim, inflictor, Float:damage) { client_print(attacker, print_chat, "Take Damage") }....
#include <amxmodx>
#include <hamsandwich
new g_hamczbots, cvar_botquota
public plugin_init()
{
register_plugin("Test TakeDamage","1.0","NST ^^")
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
//RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)
cvar_botquota = get_cvar_pointer("bot_quota")
}
// reg Ham_TakeDamage cho czbot
public client_putinserver(id)
{
if (is_user_bot(id) && !g_hamczbots && cvar_botquota)
{
set_task(0.1, "register_ham_czbots", id)
}
}
public register_ham_czbots(id)
{
// Make sure it's a CZ bot and it's still connected
if (g_hamczbots || !is_user_connected(id) || !get_pcvar_num(cvar_botquota))
return;
RegisterHamFromEntity(Ham_TakeDamage, id, "fw_TakeDamage")
//RegisterHamFromEntity(Ham_Spawn, id, "fw_PlayerSpawn_Post", 1)
// Ham forwards for CZ bots succesfully registered
g_hamczbots = true
}
// fw_TakeDamage
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
client_print(0, print_chat, "[%i] Take Damage [%i]", attacker, victim)
}
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <fun>
#include <fakemeta_util>
#include <zombieplague>
#include <engine>
#include <hamsandwich>
new Float:cl_pushangle[33][3]
new g_svd[33]
new g_m203_loaded[33]
new g_ammo[33]
new g_itemid
new g_hegren
/// new MaxPlayers
new g_MaxPlayers
//cvar of weapon
new cvar_trail ,cvar_radius ,cvar_damage , cvar_bonus ,cvar_reload ,cvar_remove , cvar_zoom , cvar_recoil , cvar_dmg_multi, cvar_speed, cvar_knockback
//message :D
new g_msgDeathMsg
new g_msgScoreInfo
new gMsgID
new g_hasZoom[33]
// Explode spr
new m_iTrail;
// TRail of Grenade
new xplode;
new Float:zoom_delay[33]
//weapon model
new V_MODEL[64] = "models/v_svdex.mdl"
new P_MODEL[64] = "models/p_svdex.mdl"
new W_MODEL[64] = "models/w_svdex.mdl"
new W_NADE[64] = "models/grenade.mdl"
//sound for weapon :D thanks Duy Linh
new const fire_sound[][] = {"weapons/svd-1.wav"}
new const sound_exp[][] = {"weapons/svdex-exp.wav"}
#define ICON_HIDE 0
#define ICON_SHOW 1
//weapon cost
const weapon_cost = 40
const m203_cost = 2
const m_fInReload = 54
public plugin_init() {
register_plugin("[ZP] Extra Item : SVDEX","0.1","Teobrvt1995")
register_event("DeathMsg","player_die","abd")
register_event("CurWeapon","checkWeapon","be","1=1")
RegisterHam(Ham_Killed, "player", "player_die")
RegisterHam(Ham_Spawn, "player", "player_spawn")
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
//register m203 nade touch:D
register_touch("m203_nade", "*", "m203_touch")
//register forawrd
register_forward(FM_CmdStart, "forward_CmdStart")
register_forward(FM_SetModel, "forward_setmodel")
//nax player
g_MaxPlayers = get_maxplayers()
//register the cvar
cvar_knockback = register_cvar("zp_svd_knock", "2")
cvar_speed = register_cvar("zp_svd_speed", "3.0")
cvar_recoil = register_cvar("zp_svd_recoil", "0.2")
cvar_dmg_multi = register_cvar("zp_svd_dmg_multi", "8")
cvar_trail = register_cvar("zp_svd_trail","1")
cvar_radius = register_cvar("zp_svd_rad","300")
cvar_damage = register_cvar("zp_svd_dmg","2000")
cvar_bonus = register_cvar("zp_svd_bonus","2")
cvar_reload = register_cvar("zp_svd_reloadtime","3.0")
cvar_remove = register_cvar("zp_svd_remove","0")
cvar_zoom = register_cvar("zp_svd_zoom", "1")
// register extra item
g_itemid = zp_register_extra_item("SVDEX",weapon_cost,ZP_TEAM_HUMAN)
g_hegren = zp_register_extra_item("M203 for SVDEX",m203_cost, ZP_TEAM_HUMAN)
//message for weapon
g_msgDeathMsg = get_user_msgid("DeathMsg")
g_msgScoreInfo = get_user_msgid ( "ScoreInfo" )
gMsgID = get_user_msgid("StatusIcon")
// for recoil and sound weapon :D
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_ak47", "fw_primary_attack")
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_ak47", "fw_primary_attack_post",1)
//when player are reloading...
RegisterHam(Ham_Weapon_Reload, "weapon_ak47", "fw_weapon_reload")
//enable pick up the weapon
RegisterHam(Ham_Item_AddToPlayer, "weapon_ak47", "fw_weapon_pickup")
}
//precache sound and model...
public plugin_precache()
{
m_iTrail = precache_model("sprites/smoke.spr")
xplode = precache_model("sprites/zerogxplode.spr")
precache_sound("weapons/svdex-shoot2.wav")
for(new i = 0; i < sizeof sound_exp; i++)
precache_sound(sound_exp[i])
for(new i = 0; i < sizeof fire_sound; i++)
precache_sound(fire_sound[i])
precache_model(V_MODEL)
precache_model(P_MODEL)
precache_model(W_MODEL)
precache_model(W_NADE)
}
public zp_user_infected_post(id) /// Forward when user is infected
{
if(g_svd[id])
ammo_hud(id,0)
g_svd[id] = false
g_ammo[id] = 0
}
public client_connect(id)
{
g_svd[id] = 0
g_m203_loaded[id] = 1
g_ammo[id] = 0
}
//death/...
public player_die(id)
{
if(g_svd[id])
ammo_hud(id,0)
g_ammo[id] = 0
g_svd[id] = 0
return PLUGIN_CONTINUE
}
//for recoil and sound...
public fw_primary_attack(ent)
{
new id = pev(ent,pev_owner)
pev(id,pev_punchangle,cl_pushangle[id])
return HAM_IGNORED
}
public fw_primary_attack_post(ent)
{
new id = pev(ent,pev_owner)
new clip, ammo
new weap = get_user_weapon( id, clip, ammo )
if( weap == CSW_AK47 && g_svd[id])
{
new Float:push[3]
pev(id,pev_punchangle,push)
xs_vec_sub(push,cl_pushangle[id],push)
xs_vec_mul_scalar(push,get_pcvar_float(cvar_recoil),push)
xs_vec_add(push,cl_pushangle[id],push)
set_pev(id,pev_punchangle,push)
if( clip > 0)
{
ExecuteHamB(Ham_Weapon_PlayEmptySound, ent)
for(new i = 0; i < sizeof fire_sound; i++)
emit_sound(id, CHAN_AUTO, fire_sound[i], 1.0, ATTN_NORM, 0, PITCH_NORM)
}
}
return HAM_IGNORED
}
//when player reload ...
public fw_weapon_reload(ent)
{
new id = pev(ent, pev_owner)
new button = pev(id, pev_button)
if(g_svd[id] && g_hasZoom[id] && button&IN_RELOAD)
{
g_ammo[id] = 0
g_hasZoom[id] = false
cs_set_user_zoom(id, CS_RESET_ZOOM, 0)
}
return HAM_IGNORED
}
//player pick up the weapon...
public fw_weapon_pickup(svd, id)
{
if( is_valid_ent(svd) && is_user_connected(id) && entity_get_int(svd, EV_INT_impulse) == 1995)
{
// Update
g_svd[id] = true
// BP ammo
cs_set_user_bpammo(id, CSW_AK47, pev(svd, pev_iuser2))
// Reset weapon options
entity_set_int(svd, EV_INT_impulse, 0)
return HAM_HANDLED
}
return HAM_IGNORED
}
public player_spawn(id) // When player is respawn (But it the same when roudn start...So I :P )
{
if ( get_pcvar_num(cvar_remove) == 1 && g_svd[id] )
{
ammo_hud(id,0)
g_svd[id] = false
g_ammo[id] = 0
}
}
//set P and W model
public checkModel(id)
{
if ( zp_get_user_zombie(id) )
return PLUGIN_HANDLED
new szWeapID = read_data(2)
if ( szWeapID == CSW_AK47 && g_svd[id])
{
set_pev(id, pev_viewmodel2, V_MODEL)
set_pev(id, pev_weaponmodel2, P_MODEL)
}
return PLUGIN_HANDLED
}
public checkWeapon(id)
{
new plrClip, plrAmmo, plrWeapId
plrWeapId = get_user_weapon(id, plrClip , plrAmmo)
if (plrWeapId == CSW_AK47 && g_svd[id])
{
checkModel(id)
new Ent = get_weapon_ent(id,plrWeapId)
new Float:N_Speed
if(Ent)
{
N_Speed = get_pcvar_float(cvar_speed)
new Float:Delay = get_pdata_float( Ent, 46, 4) * N_Speed
if (Delay > 0.0) {
set_pdata_float( Ent, 46, Delay, 4)
}
}
}
else
{
return PLUGIN_CONTINUE
}
return PLUGIN_HANDLED
}
// Create W class for weapon :D
public forward_setmodel(Entity, const Model [])
{
// Entity is not valid
if (!is_valid_ent(Entity))
return FMRES_IGNORED
// Not ak47
if(!equal(Model, "models/w_ak47.mdl"))
return FMRES_IGNORED;
// Get classname
static szClassName[33]
entity_get_string(Entity, EV_SZ_classname, szClassName, charsmax(szClassName))
// Not a Weapon box
if ( !equal ( szClassName, "weaponbox" ) )
return FMRES_IGNORED
// Some vars
static iOwner, iStoredAkID
// Get owner
iOwner = entity_get_edict(Entity, EV_ENT_owner)
// Get drop weapon index
iStoredAkID = find_ent_by_owner(-1, "weapon_ak47", Entity)
// Entity classname is weaponbox, and ak47 was founded
if(g_svd[iOwner] && is_valid_ent(iStoredAkID))
{
// Setting weapon options
entity_set_int(iStoredAkID, EV_INT_impulse, 1995)
// Reset user vars
g_svd [ iOwner ] = false
entity_set_model(Entity, W_MODEL)
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}
//someone has bought our extra item...
public zp_extra_item_selected(player, itemid)
{
if (itemid == g_hegren)
{
if(!g_svd[player])
{
client_print(player, print_chat, "[TEO] you need have a SVDEX first")
zp_set_user_ammo_packs(player, zp_get_user_ammo_packs(player)+ m203_cost )
return;
}
ammo_hud(player,0);
g_ammo[player] += 5
client_print(player,print_chat, "You bought 5 nade for SVDEX");
ammo_hud(player,1);
}
if(itemid == g_itemid)
{
if(g_svd[player] && user_has_weapon(player, CSW_AK47))
{
client_print(player, print_chat, "[TEO]You already have a SVDEX")
zp_set_user_ammo_packs(player, zp_get_user_ammo_packs(player)+ weapon_cost )
return;
}
fm_give_item(player,"weapon_ak47")
fm_give_item(player,"ammo_9mm")
client_print(player,print_chat,"[TEO] You Bought a SVDEX, Time to hunt Zombie ")
client_print(player, print_chat, "[TEO] Press key E to zoom and ATTACK2 to launch the nade")
g_svd[player] = true
g_ammo[player] = 5
ammo_hud(player,1)
cs_set_user_bpammo(player, CSW_AK47, 90)
}
}
//when player press key Attack2 or E
public forward_CmdStart(id, uc_handle, seed)
{
new button = get_uc(uc_handle, UC_Buttons)
new ent = find_ent_by_owner(-1, "weapon_ak47", id)
new fInReload = get_pdata_int(ent, m_fInReload, 4)
if(is_user_alive(id) && !zp_get_user_zombie(id) && get_user_weapon(id) == CSW_AK47 && g_svd[id])
{
if(entity_get_int(id, EV_INT_button) & IN_ATTACK2)
{
launch_nade(id)
return FMRES_IGNORED
}
if (button & IN_USE)
{
set_pev(id, pev_button, button &~ IN_USE)
if (get_gametime() - zoom_delay[id] >= 0.5 && !fInReload && get_pcvar_num(cvar_zoom))
{
if (g_hasZoom[id])
{
g_hasZoom[id] = false
cs_set_user_zoom(id, CS_RESET_ZOOM, 0)
}
else
{
g_hasZoom[id] = true
cs_set_user_zoom(id, CS_SET_AUGSG552_ZOOM, 0)
}
zoom_delay[id] = get_gametime()
}
}
}
return FMRES_IGNORED
}
//dmg multipler
public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
if ( is_user_alive( attacker ) && get_user_weapon(attacker) == CSW_AK47 && g_svd[attacker] )
{
SetHamParamFloat(4, damage * get_pcvar_float( cvar_dmg_multi ) )
}
}
//m203 fire...
public launch_nade(id)
{
if(g_svd[id] == 0 || g_m203_loaded[id] == 0 || !(is_user_alive(id)))
return PLUGIN_CONTINUE
if(g_ammo[id] == 0)
{
client_print(id, print_center, "[TEO] You dont have more nade")
return PLUGIN_CONTINUE
}
entity_set_int(id, EV_INT_weaponanim, 3)
new Float: Origin[3], Float: Velocity[3], Float: vAngle[3], Ent
entity_get_vector(id, EV_VEC_origin , Origin)
entity_get_vector(id, EV_VEC_v_angle, vAngle)
Origin[2] = Origin[2] + 10
Ent = create_entity("info_target")
if (!Ent) return PLUGIN_HANDLED
entity_set_string(Ent, EV_SZ_classname, "m203_nade")
entity_set_model(Ent, W_NADE)
//set size
new Float:MinBox[3] = {-1.0, -1.0, -1.0}
new Float:MaxBox[3] = {1.0, 1.0, 1.0}
entity_set_vector(Ent, EV_VEC_mins, MinBox)
entity_set_vector(Ent, EV_VEC_maxs, MaxBox)
entity_set_origin(Ent, Origin)
entity_set_vector(Ent, EV_VEC_angles, vAngle)
entity_set_int(Ent, EV_INT_effects, 2)
entity_set_int(Ent, EV_INT_solid, 1)
entity_set_int(Ent, EV_INT_movetype, 10)
entity_set_edict(Ent, EV_ENT_owner, id)
VelocityByAim(id, 2500 , Velocity)
entity_set_vector(Ent, EV_VEC_velocity ,Velocity)
//sound when lauch...
emit_sound(id,CHAN_VOICE,"weapons/svdex-shoot2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
g_m203_loaded[id] = 0
ammo_hud(id,0)
g_ammo[id]--
ammo_hud(id,1)
new parm[1]
parm[0] = Ent
if(get_pcvar_num(cvar_trail))
set_task(0.2, "grentrail",id,parm,1)
parm[0] = id
set_task(get_pcvar_float(cvar_reload), "m203_reload",id+9910,parm,1)
client_print(id, print_center, "[TEO]reloading")
return PLUGIN_CONTINUE
}
public m203_reload(parm[])
{
g_m203_loaded[parm[0]] = 1
}
//when m203 nade touch something...
public m203_touch(Nade, Other)
{
if(!pev_valid(Nade))
return
// Get it's origin
static Float:origin[3]
pev(Nade, pev_origin, origin)
// Explosion
engfunc ( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, origin, 0)
write_byte (TE_EXPLOSION)
engfunc(EngFunc_WriteCoord, origin[0]) // Position X
engfunc(EngFunc_WriteCoord, origin[1]) // Position Y
engfunc(EngFunc_WriteCoord, origin[2]) // Position Z
write_short (xplode) // Sprite index
write_byte (40) // Scale
write_byte (30) // Frame rate
write_byte (0) // Flags
message_end ()
new id = pev(Nade, pev_owner)
for(new i = 0; i < sizeof sound_exp; i++)
emit_sound(id,CHAN_VOICE,sound_exp[i], 1.0, ATTN_NORM, 0, PITCH_NORM)
// Owner
static owner ; owner = pev(Nade, pev_owner)
// Make a loop
for(new i = 1; i < g_MaxPlayers;i++)
{
//not alive
if (!is_user_alive(i))
continue
// Godmode
if (get_user_godmode(i) == 1)
continue
// Human/Survivor
if (!zp_get_user_zombie(i) || zp_get_user_survivor(i))
continue
// Get victims origin
static Float:origin2 [3]
pev(i, pev_origin, origin2)
// Get distance between those origins
static Float:distance_f ; distance_f = get_distance_f(origin, origin2)
// Convert distnace to non-float
static distance ; distance = floatround(distance_f)
// Radius
static radius ; radius = get_pcvar_num(cvar_radius)
// We are in damage radius
if ( distance <= radius )
{
// Fake damage
fakedamage(i, "grenade", 0.0, DMG_BLAST)
// Max damage
static maxdmg ; maxdmg = get_pcvar_num(cvar_damage)
// Normal dmg
new Damage
Damage = maxdmg - floatround(floatmul(float(maxdmg), floatdiv(float(distance), float(radius))))
// Calculate health
new health = get_user_health(i)
// We have at least 1 hp
if(health - Damage >= 1)
{
// New health
set_user_health(i, health - Damage)
make_knockback(i, origin, get_pcvar_float(cvar_knockback) * Damage)
}
else
{
// We must die
death_message(owner,i,"grenade",1)
// I hope they'll not find the bodies....
origin2 [ 2 ] -= 45.0
}
}
}
// Breakable
static ClassName[32]
pev(Other, pev_classname, ClassName, charsmax(ClassName))
if(equal(ClassName,"func_breakable"))
{
// Entity health
static Float:health
health = entity_get_float(Other, EV_FL_health)
if (health <= get_pcvar_num(cvar_damage))
{
// Break it
force_use(owner, Other)
}
}
// Remove grenade
engfunc(EngFunc_RemoveEntity, Nade)
}
// Death message
public death_message(Killer, Victim, const Weapon[], ScoreBoard)
{
// Block death msg
set_msg_block(g_msgDeathMsg, BLOCK_SET)
ExecuteHamB(Ham_Killed, Victim, Killer, 2)
set_msg_block(g_msgDeathMsg, BLOCK_NOT)
// Death
make_deathmsg(Killer, Victim, 0, Weapon)
// Ammo packs
zp_set_user_ammo_packs(Killer, zp_get_user_ammo_packs(Killer) + get_pcvar_num(cvar_bonus))
// Update score board
if ( ScoreBoard )
{
message_begin(MSG_BROADCAST, g_msgScoreInfo)
write_byte( Killer ) // id
write_short(pev(Killer, pev_frags)) // frags
write_short(cs_get_user_deaths(Killer)) // deaths
write_short(0) // class?
write_short(get_user_team(Killer)) // team
message_end()
message_begin(MSG_BROADCAST, g_msgScoreInfo)
write_byte(Victim) // id
write_short(pev(Victim, pev_frags)) // frags
write_short(cs_get_user_deaths(Victim)) // deaths
write_short(0) // class?
write_short(get_user_team(Victim)) // team
message_end()
}
}
ammo_hud(id, sw)
{
new s_sprite[33]
format(s_sprite,32,"number_%d",g_ammo[id])
if(sw)
{
message_begin( MSG_ONE, gMsgID, {0,0,0}, id )
write_byte( ICON_SHOW ) // status
write_string( s_sprite ) // sprite name
write_byte( 0 ) // red
write_byte( 150 ) // green
write_byte( 0 ) // blue
message_end()
}
else
{
message_begin( MSG_ONE, gMsgID, {0,0,0}, id )
write_byte( ICON_HIDE ) // status
write_string( s_sprite ) // sprite name
write_byte( 0 ) // red
write_byte( 160 ) // green
write_byte( 0 ) // blue
message_end()
}
}
public grentrail(parm[])
{
new gid = parm[0]
if (gid)
{
message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
write_byte( TE_BEAMFOLLOW )
write_short(gid) // entity
write_short(m_iTrail) // model
write_byte( 10 ) // life
write_byte( 5 ) // width
write_byte( 255 ) // r, g, b
write_byte( 255 ) // r, g, b
write_byte( 255 ) // r, g, b
write_byte( 100 ) // brightness
message_end() // move PHS/PVS data sending into here (SEND_ALL, SEND_PVS, SEND_PHS)
}
}
//knock back...
public make_knockback ( Victim, Float:origin [ 3 ], Float:maxspeed )
{
// Get and set velocity
new Float:fVelocity[3];
kickback ( Victim, origin, maxspeed, fVelocity)
entity_set_vector( Victim, EV_VEC_velocity, fVelocity);
return (1);
}
//stock...
stock get_weapon_ent(id,wpnid=0,wpnName[]="")
{
// who knows what wpnName will be
static newName[24];
// need to find the name
if(wpnid) get_weaponname(wpnid,newName,23);
// go with what we were told
else formatex(newName,23,"%s",wpnName);
// prefix it if we need to
if(!equal(newName,"weapon_",7))
format(newName,23,"weapon_%s",newName);
return fm_find_ent_by_owner(get_maxplayers(),newName,id);
}
stock kickback( ent, Float:fOrigin[3], Float:fSpeed, Float:fVelocity[3])
{
// Find origin
new Float:fEntOrigin[3];
entity_get_vector( ent, EV_VEC_origin, fEntOrigin );
// Do some calculations
new Float:fDistance[3];
fDistance[0] = fEntOrigin[0] - fOrigin[0];
fDistance[1] = fEntOrigin[1] - fOrigin[1];
fDistance[2] = fEntOrigin[2] - fOrigin[2];
new Float:fTime = (vector_distance( fEntOrigin,fOrigin ) / fSpeed);
fVelocity[0] = fDistance[0] / fTime;
fVelocity[1] = fDistance[1] / fTime;
fVelocity[2] = fDistance[2] / fTime;
return (fVelocity[0] && fVelocity[1] && fVelocity[2]);
}
for(new i = 0; i < sizeof sound_exp; i++)
emit_sound(id,CHAN_VOICE,sound_exp[i], 1.0, ATTN_NORM, 0, PITCH_NORM)
. // Fake damage
fakedamage(i, "grenade", 0.0, DMG_BLAST)
// Max damage
static maxdmg ; maxdmg = get_pcvar_num(cvar_damage)
// Normal dmg
new Damage
Damage = maxdmg - floatround(floatmul(float(maxdmg), floatdiv(float(distance), float(radius))))
// Calculate health
new health = get_user_health(i)
// We have at least 1 hp
if(health - Damage >= 1)
{
// New health
set_user_health(i, health - Damage)
make_knockback(i, origin, get_pcvar_float(cvar_knockback) * Damage)
}
else
{
// We must die
death_message(owner,i,"grenade",1)
// I hope they'll not find the bodies....
origin2 [ 2 ] -= 45.0
}
. Có lỗi j thì nói luôn đi
.