NST Efect Killer Metahook Spr
Đây là bộ killmark mình làm lại từ bộ NST Efect Killer, có tham khảo code của ACG
Sử dụng các spr (cho nhẹ máy), có 1 số tính năng sau:
- Tương thích version p48 4554
- Hỗ trợ HLDS
- Không cần hud.txt
- Có sẵn Fade out
- Đẹp rõ hơn cách sử dụng Spr cũ
- Đã tối ưu hóa code tối đa (theo mình nghĩ)
Lưu ý:
- hiện nó chưa hoàn thiện, mình public chủ yếu nhờ mọi người cùng nghiên cứu metahook.inc để hoàn thiện cái này hơn
- sprites có sẵn chỉ là để làm mẫu, các bạn tự sửa lại cho đẹp nhé, vì mình không rành cái khoảng design đâu
Cách sử dụng:
- copy đè vô game Counter Strike, phần Server thêm vô chữ
metahook trong file modules.ini và mở fakemeta
- trong game mở console gõ lệnh
djb_killtip 0
Link download:
http://www.mediafire.com/?uiz9dy9s2kdm6z4
Code:
[SPOIL]
#include <amxmodx>
#include <fakemeta>
#include <metahook>
#define LEVELS 8
new kills[33], Float:timekill[33], revenge[33], oneshot[33]
new g_firstkill, g_lastkill
new const spr_combo[][] =
{
"sprites/Mark/1shot_2kill.spr",
"sprites/Mark/1shot_3kill.spr",
"sprites/Mark/c4_defuse.spr",
"sprites/Mark/c4_set.spr",
"sprites/Mark/kill_1.spr",
"sprites/Mark/kill_2.spr",
"sprites/Mark/kill_3.spr",
"sprites/Mark/kill_4.spr",
"sprites/Mark/kill_5.spr",
"sprites/Mark/kill_6.spr",
"sprites/Mark/kill_7.spr",
"sprites/Mark/kill_8.spr",
"sprites/Mark/kill_first.spr",
"sprites/Mark/kill_he.spr",
"sprites/Mark/kill_headshot.spr",
"sprites/Mark/kill_knife.spr",
"sprites/Mark/kill_last.spr",
"sprites/Mark/kill_revenge.spr",
"sprites/Mark/wall_shot.spr",
"sprites/Mark/wall_shot_hs.spr"
}
new const spr_combo2[][] =
{
"Mark/kill_1",
"Mark/kill_2",
"Mark/kill_3",
"Mark/kill_4",
"Mark/kill_5",
"Mark/kill_6",
"Mark/kill_7",
"Mark/kill_8",
"Mark/kill_first",
"Mark/c4_defuse",
"Mark/c4_set",
"Mark/kill_he",
"Mark/kill_headshot",
"Mark/kill_knife",
"Mark/kill_last",
"Mark/kill_revenge",
"Mark/wall_shot",
"Mark/wall_shot_hs",
"Mark/1shot_2kill",
"Mark/1shot_3kill"
}
enum
{
KILL_1 = 0,
KILL_2,
KILL_3,
KILL_4,
KILL_5,
KILL_6,
KILL_7,
KILL_8,
KILL_FIRST,
C4_DEFUSE,
C4_SET,
KILL_HEGRENADE,
KILL_HEADSHOT,
KILL_KNIFE,
KILL_LAST,
KILL_REVENGE,
WALLSHOT,
WALLSHOT_HEADSHOT,
ONESHOT_2KILL,
ONESHOT_3KILL
}
public plugin_precache()
{
for (new i = 0; i <= 17; i++)
{
precache_model(spr_combo
)
}
}
public plugin_init()
{
register_plugin("NST Effects Kill MH Spr", "1.0", "N?K modified from NST & ACG")
register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
register_event("DeathMsg", "event_DeathMsg", "a")
}
public event_round_start()
{
new reset_value[33]
g_firstkill = 1
kills = reset_value
revenge = reset_value
oneshot = reset_value
}
public event_DeathMsg()
{
static killer, headshot, weapon[32], wpnindex, victim
killer = read_data(1)
victim = read_data(2)
headshot = read_data(3)
read_data(4, weapon, charsmax(weapon))
if (equali(weapon, "grenade"))
format(weapon, charsmax(weapon), "hegrenade")
format(weapon, charsmax(weapon), "weapon_%s", weapon)
wpnindex = get_weaponid(weapon)
if (!is_user_connected(killer) || !is_user_connected(victim) || killer==victim) return;
if (!get_user_name(killer))
{
if (g_firstkill)
g_firstkill = 0
return;
}
kills[victim] = 0
// set revenge of victim
revenge[victim] = killer
new Float:timeleft = get_gametime()-timekill[killer]
if (timeleft <= 3.0) kills[killer] += 1
else kills[killer] = 1
if (kills[killer]>LEVELS) kills[killer] = LEVELS
timekill[killer] = get_gametime()
if (!oneshot[killer]) oneshot[killer] = 1
if (!timeleft && wpnindex != CSW_HEGRENADE) oneshot[killer] += 1
else oneshot[killer] = 1
oneshot[killer] = min(3, oneshot[killer])
new players_ct[32], players_t[32], ict, ite
get_players(players_ct,ict,"ae","CT")
get_players(players_t,ite,"ae","TERRORIST")
if (ict == 0 || ite == 0) g_lastkill = 1
new m_revenge
if (victim == revenge[killer])
{
m_revenge = 1
revenge[killer] = 0
}
if (oneshot[killer] > 1)
{
if (oneshot[killer] == 2)
MH_DrawImage(killer, 0, 1, spr_combo2[ONESHOT_2KILL], 0.7, 0.3, 255, 255, 255, 2, 3.0, 1, -1)
else if (oneshot[killer] == 3)
MH_DrawImage(killer, 0, 1, spr_combo2[ONESHOT_3KILL], 0.7, 0.3, 255, 255, 255, 2, 3.0, 1, -1)
}
if (g_lastkill)
{
g_lastkill = 0
MH_DrawImage(killer, 0, 1, spr_combo2[KILL_LAST], 0.6, 0.3, 255, 255, 255, 2, 3.0, 2, -1)
}
if (m_revenge)
MH_DrawImage(killer, 0, 1, spr_combo2[KILL_REVENGE], 0.5, 0.65, 255, 255, 255, 2, 3.0, 3, -1)
if ((wpnindex != CSW_KNIFE) && (wpnindex != CSW_HEGRENADE) && !can_see_fm(killer, victim))
{
if (headshot)
MH_DrawImage(killer, 0, 1, spr_combo2[WALLSHOT_HEADSHOT], 0.5, 0.75, 255, 255, 255, 2, 3.0, 4, -1)
else
MH_DrawImage(killer, 0, 1, spr_combo2[WALLSHOT], 0.5, 0.75, 255, 255, 255, 2, 3.0, 4, -1)
}
if (headshot && wpnindex)
{
MH_DrawImage(killer, 0, 1, spr_combo2[KILL_HEADSHOT], 0.4, 0.3, 255, 255, 255, 2, 3.0, 5, -1)
}
else if (wpnindex == CSW_KNIFE)
{
MH_DrawImage(killer, 0, 1, spr_combo2[KILL_KNIFE], 0.4, 0.3, 255, 255, 255, 2, 3.0, 5, -1)
}
else if (wpnindex == CSW_HEGRENADE)
{
MH_DrawImage(killer, 0, 1, spr_combo2[KILL_HEGRENADE], 0.4, 0.3, 255, 255, 255, 2, 3.0, 5, -1)
}
if (g_firstkill)
{
g_firstkill = 0
MH_DrawImage(killer, 0, 1, spr_combo2[KILL_FIRST], 0.6, 0.3, 255, 255, 255, 2, 3.0, 6, -1)
}
else
{
MH_DrawImage(killer, 0, 1, spr_combo2[kills[killer] - 1], 0.55, 0.3, 255, 255, 255, 2, 3.0, 6, -1)
}
}
public bomb_defused(id)
{
MH_DrawImage(id, 0, 1, spr_combo2[C4_DEFUSE], 0.5, 0.75, 255, 255, 255, 2, 3.0, 7, -1)
}
public bomb_planted(id)
{
MH_DrawImage(id, 0, 1, spr_combo2[C4_SET], 0.5, 0.75, 255, 255, 255, 2, 3.0, 7, -1)
}
bool:can_see_fm(entindex1, entindex2)
{
if (!entindex1 || !entindex2)
return false
// new ent1, ent2
if (pev_valid(entindex1) && pev_valid(entindex1))
{
new flags = pev(entindex1, pev_flags)
if (flags & EF_NODRAW || flags & FL_NOTARGET)
{
return false
}
new Float:lookerOrig[3]
new Float:targetBaseOrig[3]
new Float:targetOrig[3]
new Float:temp[3]
pev(entindex1, pev_origin, lookerOrig)
pev(entindex1, pev_view_ofs, temp)
lookerOrig[0] += temp[0]
lookerOrig[1] += temp[1]
lookerOrig[2] += temp[2]
pev(entindex2, pev_origin, targetBaseOrig)
pev(entindex2, pev_view_ofs, temp)
targetOrig[0] = targetBaseOrig [0] + temp[0]
targetOrig[1] = targetBaseOrig [1] + temp[1]
targetOrig[2] = targetBaseOrig [2] + temp[2]
engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0)
if (get_tr2(0, TraceResult:TR_InOpen) && get_tr2(0, TraceResult:TR_InWater))
{
return false
}
else
{
new Float:flFraction
get_tr2(0, TraceResult:TR_flFraction, flFraction)
if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
{
return true
}
else
{
targetOrig[0] = targetBaseOrig [0]
targetOrig[1] = targetBaseOrig [1]
targetOrig[2] = targetBaseOrig [2]
engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0)
get_tr2(0, TraceResult:TR_flFraction, flFraction)
if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
{
return true
}
else
{
targetOrig[0] = targetBaseOrig [0]
targetOrig[1] = targetBaseOrig [1]
targetOrig[2] = targetBaseOrig [2] - 17.0
engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0)
get_tr2(0, TraceResult:TR_flFraction, flFraction)
if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
{
return true
}
}
}
}
}
return false
}[/SPOIL]