要使NPC能在被伤害/击杀时有特殊效果 我们需要用到hamsandwich这模块
在sma最上方加入
复制程式
#include <hamsandwich>
#include <fakemeta> //2011.12.28修正(真晚- -
在NPC创建的地方加入
为了确保伤害公式只会被读一次 要记得加记录项 像下面
复制程式
if (!g_hamnpc) //记住!!g_hamnpc只能被放在function外面!!
{
//这两串是让NPC读到你的伤害公式
RegisterHamFromEntity(Ham_TakeDamage, ent, "fw_TakeDamage")
RegisterHamFromEntity(Ham_TraceAttack, ent, "fw_TraceAttack")
RegisterHamFromEntity(Ham_Killed, ent, "fw_Killed")
g_hamnpc = 1
}
※如果读了好几次的话 电脑当机恕不退费(? 不知道怎么加欢迎PM我
并在plugin_init里面加入
复制程式
//这两串是让玩家读到你的伤害公式
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
//这里就不需要加Killed了 不然会读两次
当然 我们还要在下面加入对应的function才行
复制程式
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
if (victim==attacker)
return HAM_IGNORED;
if (!pev_valid(victim) || !pev_valid(attacker))
return HAM_IGNORED;
new classname[32]
pev(victim,pev_classname,classname,31)
if (equal(classname,"(你之前设的NPC名字)")) //这里是检查被打的人是不是NPC
{
//看你要加啥都加在这边
//有一点要注意 "非"玩家使用的指令不能加在这边 否则会有错误
//例如 被攻击/攻击者是NPC 就不能使用 cs_get_user_team(victim) 或 cs_set_user_money(victim, ...)
//当然 is_user_connected(回传玩家是否连接)这类的指令可以用
//伤害的修改教学 可以看a78大的文章 http://bbs-mychat.com/reads.php?tid=829669
}
return HAM_IGNORED;
}
复制程式
#define DMG_HEGRENADE (1 << 24) //感谢fouury提醒
new cache_bloodspray, cache_blood //血的spr 等等会用到
public plugin_precache()
{
//读取spr
cache_blood = precache_model("sprites/blood.spr")
cache_bloodspray = precache_model("sprites/bloodspray.spr")
}
public fw_TraceAttack(victim, attacker, Float:damage, Float:direction[3], tracehandle, damage_type)
{
if (victim==attacker)
return HAM_IGNORED;
if (!pev_valid(victim) || pev_valid(attacker))
return HAM_IGNORED;
new classname[32]
pev(victim,pev_classname,classname,31)
if (equal(classname,"(你之前设的NPC名字)")) //这里是检查被打的人是不是NPC
{
//注意事项跟上面一样
//get_tr/set_tr这类指令可以使用 可用来判定伤害部位/喷血位置
//下面会有范例(饭粒?
new body = get_tr2(tracehandle,TR_iHitgroup) //取得NPC被伤害的部位
if (body == 1) //爆头的情况下
{
damage *= 4.0 //伤害四倍
SetHamParamFloat(3, damage) //读取修改过后的伤害
}
new Float:Fend[3],end[3]
get_tr2(tracehandle, TR_vecEndPos, Fend) //在开枪的位置和被击中的位置画条线(我不知道怎么解释..)
//This message will draw blood sprites at the end of the trace
if (!(damage_type & DMG_HEGRENADE)) //如果不是被芭乐炸的
{
end[0] = floatround(Fend[0])
end[1] = floatround(Fend[1])
end[2] = floatround(Fend[2])
create_block_sprites(end) //在该位置显示喷血(不会有血迹)
}
}
return HAM_IGNORED;
}
create_block_sprites(const origin[3])
{
// Show some blood :)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BLOODSPRITE)
write_coord(origin[0])
write_coord(origin[1])
write_coord(origin[2])
write_short(cache_bloodspray)
write_short(cache_blood)
write_byte(75)
write_byte(5)
message_end()
}
复制程式
public fw_Killed(victim, attacker)
{
//※跟上上方的说明一样 非玩家指令不能用 除非你能确定你用的人是玩家
new classname[32]
pev(victim,pev_classname,classname,31)
if (equal(classname,"(你之前设的NPC名字)")) //这里是检查被打的人是不是NPC
{
if (is_user_connected(attacker)) //当攻击者是玩家时
{
//你可以在这里加给玩家用的指令 例如加钱...加血
}
}
return HAM_IGNORED
}
有兴趣的人 可以看下面从Ham_const里面拿来的说明(英文)
复制程式
* Description: Usually called whenever an entity gets attacked by a hitscan (such as a gun) weapon.
* Use the get/set tr2 natives in fakemeta to handle the traceresult data.
* Do not use a handle of 0 as a traceresult in execution, use create_tr2() from Fakemeta
* to pass a custom handle instead. (Don't forget to free the handle when you're done.)
* Forward params: function(this, idattacker, Float:damage, Float:direction[3], traceresult, damagebits)
* Return type: None.
* Execute params: ExecuteHam(Ham_TraceAttack, this, idattacker, Float:damage, Float:direction[3], tracehandle, damagebits);
*/
Ham_TraceAttack,
/**
* Description: Usually called whenever an entity takes any kind of damage.
* Inflictor is the entity that caused the damage (such as a gun).
* Attacker is the entity that tirggered the damage (such as the gun's owner).
* Forward params: function(this, idinflictor, idattacker, Float:damage, damagebits);
* Return type: Integer.
* Execute params: ExecuteHam(Ham_TakeDamage, this, idinflictor, idattacker, Float:damage, damagebits);
*/
Ham_TakeDamage,
这次说明可能比较难懂 多观察其他插件的使用方式吧
如果完全看不懂 建议你先学一点c++
题外话:
这次的东西好多都忘了改为engine的用法><2011.12.28:还是改回fakemeta好了 问题好多..(汗尤其是get_tr2的部分根本不能用(汗颜