[AMX] Tổng hợp Code, Plug do Mem chế hoặc giới thiệu

  • Thread starter Thread starter Orpheus
  • Ngày gửi Ngày gửi
Mịa, mấy chú không biết dùng weapon offset để khởi tạo đk à.:w
duy: xem lại dùm tui cái code tui send đi. Anim idle tui còn block rồi set cái anim mới huống gì mấy cái anim khác:|
mịa 2 ông kia có hép tui khôg đấy.
 
Mấy bác đọc lại code mới của em đi. Em đã dùng thêm 1 biến ghi thời gian attack lần cuối rồi đó. Thế mà... (cuối page 291)
 
^
^
- cho code offset xem :)). kiểm tra nextattack = 0.0 à :))
 
Thì nó check rồi đó. Nhỡ player đè phím Attack2 thì sao. nó chém liên thanh :))
Nó tự remove task cũ nên sẽ ko có trường hợp ấy xảy ra, chỉ bị ko chém đc thôi (vì task remove và set liên tục)=='
 
P/S: không ai giúp à :(( ......... làm đủ kiểu vẫn không được ! thỉnh thoảng lại lỗi !

PHP:
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <engine>
#include <hamsandwich>
#include <nst_wpn>
#include <xs>

#define PLUGIN	"Knife"
#define AUTHOR	"Bui duc duy"
#define VERSION	"1.0"

enum
{
	anim_idle = 0,
	anim_slash_1,
	anim_slash_2,
	anim_draw,
	anim_stab,
	anim_stab_miss,
	anim_slash1_mid,
	anim_slash2_mid
}

new Float:g_knife_attack[33]

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	RegisterHam(Ham_Weapon_SendWeaponAnim,"weapon_knife","Fw_Weapon_SendWeaponAnim")
	RegisterHam(Ham_Weapon_SecondaryAttack,"weapon_knife","Fw_SecondaryAttack_Post",1)
	RegisterHam(Ham_Weapon_PrimaryAttack,"weapon_knife","Fw_PrimAttack_Post",1)
	
	
	register_forward(FM_CmdStart,"Fw_CmdStart")
	register_forward(FM_TraceLine,"Fw_TraceLine")
	register_forward(FM_TraceHull,"Fw_TraceHull")
}

public Fw_SecondaryAttack_Post(ent)
{
	static id 
	id = pev(ent,pev_owner)
	if(!pev_valid(ent) || !is_user_connected(id))
		return HAM_IGNORED
		
	set_pdata_float(ent,47,nst_wpn_get_float3(id, NST_WPN_DATA_DELAY)+0.5,4)
	
	return HAM_IGNORED
}

public Fw_PrimAttack_Post(ent)
{
	static id 
	id = pev(ent,pev_owner)
	if(!pev_valid(ent) || !is_user_connected(id))
		return HAM_IGNORED
	
	set_pdata_float(ent,46, 0.3 ,4)
	
	return HAM_IGNORED
}

// set distance
public Fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
{
	if (!is_user_connected(id))
		return FMRES_IGNORED;
	
	if (!is_user_alive(id))
		return FMRES_IGNORED;
	
	if (get_user_weapon(id) != CSW_KNIFE)
		return FMRES_IGNORED;
	
	
	pev(id, pev_v_angle, vector_end)
	angle_vector(vector_end, ANGLEVECTOR_FORWARD, vector_end)
	
	xs_vec_mul_scalar(vector_end, nst_wpn_get_float3(id, NST_WPN_DATA_DISTANCE), vector_end)
	
	xs_vec_add(vector_start, vector_end, vector_end)
	engfunc(EngFunc_TraceLine, vector_start, vector_end, ignored_monster, id, handle)
	
	return FMRES_SUPERCEDE;
}

public Fw_TraceHull(Float:vector_start[3], Float:vector_end[3], ignored_monster, hull, id, handle)
{
	if (!is_user_connected(id))
		return FMRES_IGNORED;
	
	if (!is_user_alive(id))
		return FMRES_IGNORED;
	
	if (get_user_weapon(id) != CSW_KNIFE)
		return FMRES_IGNORED;
	
	
	pev(id, pev_v_angle, vector_end)
	angle_vector(vector_end, ANGLEVECTOR_FORWARD, vector_end)
	
	xs_vec_mul_scalar(vector_end, nst_wpn_get_float3(id, NST_WPN_DATA_DISTANCE), vector_end)
	
	xs_vec_add(vector_start, vector_end, vector_end)
	engfunc(EngFunc_TraceHull, vector_start, vector_end, ignored_monster, hull, id, handle)
	
	return FMRES_SUPERCEDE;
}

//

/* Knife Hook delay */
public Fw_CmdStart(id,handle,seed)
{
	static iButton,iEnt
	iButton = get_uc(handle,UC_Buttons)
	iEnt = find_ent_by_owner(-1, "weapon_knife", id)
	
	
	if(get_user_weapon(id) ==CSW_KNIFE)
	{
		if (iButton&IN_ATTACK2)
		{
			if (get_gametime() - g_knife_attack[id] < nst_wpn_get_float3(id, NST_WPN_DATA_DELAY)+1.0) return
			g_knife_attack[id] = get_gametime()
			
			//set_uc(handle,UC_Buttons,iButton&~IN_ATTACK2)
			
			set_weapon_anim(id, anim_stab_miss)
			
			if (task_exists(id)) remove_task(id)
			set_task(nst_wpn_get_float3(id, NST_WPN_DATA_DELAY),"task_knife_attack",id)
			
			set_pdata_float(iEnt, 47, nst_wpn_get_float3(id, NST_WPN_DATA_DELAY)+0.5,4)
		}
	}
}

public task_knife_attack(id)
{
	new ent = find_ent_by_owner(-1,"weapon_knife",id)
	
	if(!is_user_alive(id) || get_user_weapon(id) != CSW_KNIFE) return
	ExecuteHamB(Ham_Weapon_SecondaryAttack,ent)
}



public Fw_Weapon_SendWeaponAnim(ent,anim)
{
	static id 
	id = pev(ent,pev_owner)
	if(!pev_valid(ent) || !is_user_connected(id)) return HAM_IGNORED
		
	if (get_gametime() - g_knife_attack[id] < nst_wpn_get_float3(id, NST_WPN_DATA_DELAY)+1.0 && get_user_weapon(id)==CSW_KNIFE || anim == anim_stab) return HAM_SUPERCEDE
	
	return HAM_IGNORED
}


stock set_weapon_anim(id, anim)
{
	set_pev(id, pev_weaponanim, anim)
	
	message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id)
	write_byte(anim)
	write_byte(pev(id,pev_body))
	message_end()
}
 
P/S: không ai giúp à :(( ......... làm đủ kiểu vẫn không được ! thỉnh thoảng lại lỗi !
Fix it by yourself
yao_ming_face2_normal.png
 
Chỉnh sửa cuối:
Thế không biết ghi log và print để tìm lỗi à
yao_ming_face2_normal.png

Rồi chứ... nhưng thấy gì đâu... ! print mọi chỗ.. chỗ sendanim cũng print nhưng đâu thấy gì khác lạ.. thỉnh thoảng nó mới bị !



PHP:
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <engine>
#include <hamsandwich>
#include <nst_wpn>
#include <xs>

#define PLUGIN	"Knife"
#define AUTHOR	"Bui duc duy"
#define VERSION	"1.0"

enum
{
	anim_idle = 0,
	anim_slash_1,
	anim_slash_2,
	anim_draw,
	anim_stab,
	anim_stab_miss,
	anim_slash1_mid,
	anim_slash2_mid
}

new Float:g_knife_attack[33]

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	RegisterHam(Ham_Weapon_SendWeaponAnim,"weapon_knife","Fw_Weapon_SendWeaponAnim")
	RegisterHam(Ham_Weapon_SecondaryAttack,"weapon_knife","Fw_SecondaryAttack_Post",1)
	RegisterHam(Ham_Weapon_PrimaryAttack,"weapon_knife","Fw_PrimAttack_Post",1)
	
	
	register_forward(FM_CmdStart,"Fw_CmdStart")
	register_forward(FM_TraceLine,"Fw_TraceLine")
	register_forward(FM_TraceHull,"Fw_TraceHull")
}

public Fw_SecondaryAttack_Post(ent)
{
	static id 
	id = pev(ent,pev_owner)
	if(!pev_valid(ent) || !is_user_connected(id))
		return HAM_IGNORED
		
	set_pdata_float(ent,47,nst_wpn_get_float3(id, NST_WPN_DATA_DELAY)+0.5,4)
	
	return HAM_IGNORED
}

public Fw_PrimAttack_Post(ent)
{
	static id 
	id = pev(ent,pev_owner)
	if(!pev_valid(ent) || !is_user_connected(id))
		return HAM_IGNORED
	
	set_pdata_float(ent,46, 0.3 ,4)
	
	return HAM_IGNORED
}

// set distance
public Fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
{
	if (!is_user_connected(id))
		return FMRES_IGNORED;
	
	if (!is_user_alive(id))
		return FMRES_IGNORED;
	
	if (get_user_weapon(id) != CSW_KNIFE)
		return FMRES_IGNORED;
	
	
	pev(id, pev_v_angle, vector_end)
	angle_vector(vector_end, ANGLEVECTOR_FORWARD, vector_end)
	
	xs_vec_mul_scalar(vector_end, nst_wpn_get_float3(id, NST_WPN_DATA_DISTANCE), vector_end)
	
	xs_vec_add(vector_start, vector_end, vector_end)
	engfunc(EngFunc_TraceLine, vector_start, vector_end, ignored_monster, id, handle)
	
	return FMRES_SUPERCEDE;
}

public Fw_TraceHull(Float:vector_start[3], Float:vector_end[3], ignored_monster, hull, id, handle)
{
	if (!is_user_connected(id))
		return FMRES_IGNORED;
	
	if (!is_user_alive(id))
		return FMRES_IGNORED;
	
	if (get_user_weapon(id) != CSW_KNIFE)
		return FMRES_IGNORED;
	
	
	pev(id, pev_v_angle, vector_end)
	angle_vector(vector_end, ANGLEVECTOR_FORWARD, vector_end)
	
	xs_vec_mul_scalar(vector_end, nst_wpn_get_float3(id, NST_WPN_DATA_DISTANCE), vector_end)
	
	xs_vec_add(vector_start, vector_end, vector_end)
	engfunc(EngFunc_TraceHull, vector_start, vector_end, ignored_monster, hull, id, handle)
	
	return FMRES_SUPERCEDE;
}

//

/* Knife Hook delay */
public Fw_CmdStart(id,handle,seed)
{
	static iButton,iEnt
	iButton = get_uc(handle,UC_Buttons)
	iEnt = find_ent_by_owner(-1, "weapon_knife", id)
	
	
	if(get_user_weapon(id) ==CSW_KNIFE)
	{
		if (iButton&IN_ATTACK2)
		{
			if (get_gametime() - g_knife_attack[id] < nst_wpn_get_float3(id, NST_WPN_DATA_DELAY)+1.0) return
			g_knife_attack[id] = get_gametime()

                        client_print(id, print_chat, "Right Mouse")
			
			//set_uc(handle,UC_Buttons,iButton&~IN_ATTACK2)
			
			set_weapon_anim(id, anim_stab_miss)
			
			if (task_exists(id)) remove_task(id)
			set_task(nst_wpn_get_float3(id, NST_WPN_DATA_DELAY),"task_knife_attack",id)
			
			set_pdata_float(iEnt, 47, nst_wpn_get_float3(id, NST_WPN_DATA_DELAY)+0.5,4)
		}
	}
}

public task_knife_attack(id)
{
	new ent = find_ent_by_owner(-1,"weapon_knife",id)
	
	if(!is_user_alive(id) || get_user_weapon(id) != CSW_KNIFE) return
	ExecuteHamB(Ham_Weapon_SecondaryAttack,ent)
                        client_print(id, print_chat, "damage extract")
}



public Fw_Weapon_SendWeaponAnim(ent,anim)
{
	static id 
	id = pev(ent,pev_owner)
	if(!pev_valid(ent) || !is_user_connected(id)) return HAM_IGNORED
		
	if (get_gametime() - g_knife_attack[id] < nst_wpn_get_float3(id, NST_WPN_DATA_DELAY)+1.0 && get_user_weapon(id)==CSW_KNIFE || anim == anim_stab) 
        {
                                   client_print(id, print_chat, "Anim Blocked %i", anim)
            return HAM_SUPERCEDE
	}
	return HAM_IGNORED
}


stock set_weapon_anim(id, anim)
{
	set_pev(id, pev_weaponanim, anim)
	
	message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id)
	write_byte(anim)
	write_byte(pev(id,pev_body))
	message_end()
}
 
Chỉnh sửa cuối:
Rồi chứ... nhưng thấy gì đâu... ! print mọi chỗ.. chỗ sendanim cũng print nhưng đâu thấy gì khác lạ.. thỉnh thoảng nó mới bị !
Thôi gợi ý cho bạn trẻ là đừng xài cái var g_knife_attack nữa, xài offset đi, nếu ko biết làm thì thôi nghỉ code là vừa
yao_ming_face2_normal.png
 
Chỉnh sửa cuối:
Bạn trẻ phải biết print mọi thứ chứ ko phải 1 thứ đâu nhé
yao_ming_face2_normal.png

Khi print mình thấy chỗ block anim... Nếu không lỗi gì sẽ print ra là block 5
Nếu lỗi thì sẽ print ra block 5 và block 0... :))
Chắc phải hook thêm cái Idle !
 
Khi print mình thấy chỗ block anim... Nếu không lỗi gì sẽ print ra là block 5
Nếu lỗi thì sẽ print ra block 5 và block 0... :))
Chắc phải hook thêm cái Idle !
Đọc lại post trên đã edit. Chắc lão tèo gửi bạn trẻ cái file CSO_Skull9 của mình đây mà.
 
Đầu tiên thấy bác teo làm offset cũng làm theo nhưng vẫn lỗi hệt như thế.
PHP:
get_pdata_float với dùng biến lấy time attack chả khác gì nhau. Lỗi y hêt
 
Đầu tiên thấy bác teo làm offset cũng làm theo nhưng vẫn lỗi hệt như thế.
PHP:
get_pdata_float với dùng biến lấy time attack chả khác gì nhau. Lỗi y hêt
Vậy sao mình ko bị lỗi gì nhỉ, chắc bạn trẻ edit gì đó nữa rồi
yao_ming_face2_normal.png
 
Heo:tui share duy cái hammer ko phải s9 đâu.
 
Cuối cùng cũng tìm ra cái mầu chốt của vấn đề là set thêm cái nì :
PHP:
set_pdata_float(ent,48,get_gametime(),4) // set time idle ~~~
 
Có ai sửa dc lỗi này không ?, cái animation của npc bị bug

[video=youtube;U8M3cKK3-UY]http://www.youtube.com/watch?v=U8M3cKK3-UY[/URL][/video]

Code đây. Tôi nghĩ là do cái ent_move_to vì tắt nó đi thì ko bị còn bật lên thì bị :))
PHP:
public fw_zb_think(ent)
{
    if(!is_valid_ent(ent))
        return FMRES_IGNORED
        
    if(g_dead[ent])
        return FMRES_IGNORED
        
    if((pev(ent, pev_health) - 1000.0) <= 0.0)
    {
        g_dead[ent] = 1
        zombie_dead(ent)
        
        return FMRES_IGNORED
    }
    
    if(g_think[ent])
    {
        static victim
        static Float:Origin[3], Float:VicOrigin[3], Float:distance
        
        victim = FindClosesEnemy(ent)
        pev(ent, pev_origin, Origin)
        pev(victim, pev_origin, VicOrigin)
        
        distance = get_distance_f(Origin, VicOrigin)
        
        if(is_user_alive(victim))
        {
            if(distance <= 60.0)
            {            
                new Float:Ent_Origin[3], Float:Vic_Origin[3]
                
                pev(ent, pev_origin, Ent_Origin)
                pev(victim, pev_origin, Vic_Origin)            
            
                npc_turntotarget(ent, Ent_Origin, victim, Vic_Origin)
                
                zombie_attack(ent, victim)
                entity_set_float(ent, EV_FL_nextthink, get_gametime() + 2.0)
            } else {
                
                if(get_anim(ent) != ANIM_WALK)
                    play_anim(ent, ANIM_WALK, 1.0)
                    
                new Float:Ent_Origin[3], Float:Vic_Origin[3]
                
                pev(ent, pev_origin, Ent_Origin)
                pev(victim, pev_origin, Vic_Origin)
                
                npc_turntotarget(ent, Ent_Origin, victim, Vic_Origin)
                ent_move_to(ent, victim, 150)
    
                entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.1)
            }
            
            current_target[ent] = victim
        } else {
            if(get_anim(ent) != ANIM_IDLE)
                play_anim(ent, ANIM_IDLE, 1.0)
            
            entity_set_float(ent, EV_FL_nextthink, get_gametime() + 1.0)
        }
    } else {
        if(get_anim(ent) != ANIM_IDLE)
            play_anim(ent, ANIM_IDLE, 1.0)
            
        entity_set_float(ent, EV_FL_nextthink, get_gametime() + 1.0)        
    }

    return FMRES_IGNORED
}

public npc_turntotarget(ent, Float:Ent_Origin[3], target, Float:Vic_Origin[3]) 
{
    if(target) 
    {
        new Float:newAngle[3]
        entity_get_vector(ent, EV_VEC_angles, newAngle)
        new Float:x = Vic_Origin[0] - Ent_Origin[0]
        new Float:z = Vic_Origin[1] - Ent_Origin[1]

        new Float:radians = floatatan(z/x, radian)
        newAngle[1] = radians * (180 / 3.14)
        if (Vic_Origin[0] < Ent_Origin[0])
            newAngle[1] -= 180.0
        
        entity_set_vector(ent, EV_VEC_angles, newAngle)
    }
}

stock ent_move_to(ent, victim, speed)
{
    // set vel
    static Float:vec[3], Float:Target[3]
    pev(victim, pev_origin, Target)
    
    aim_at_origin(ent, Target, vec)
    engfunc(EngFunc_MakeVectors, vec)
    global_get(glb_v_forward, vec)
    vec[0] *= speed
    vec[1] *= speed
    vec[2] *= speed
    set_pev(ent, pev_velocity, vec)
}

stock aim_at_origin(id, Float:target[3], Float:angles[3])
{
    static Float:vec[3]
    pev(id,pev_origin,vec)
    vec[0] = target[0] - vec[0]
    vec[1] = target[1] - vec[1]
    vec[2] = target[2] - vec[2]
    engfunc(EngFunc_VecToAngles,vec,angles)
    angles[0] *= -1.0, angles[2] = 0.0
}

stock play_anim(index, sequence, Float:framerate = 1.0)
{
    if(is_valid_ent(index))
    {
        entity_set_int(index, EV_INT_sequence, sequence)
        entity_set_float(index, EV_FL_animtime, get_gametime())
        entity_set_float(index, EV_FL_framerate,  framerate)
        entity_set_float(index, EV_FL_frame, 0.0)
        
    }
}
 
tự sướng!
[YOUTUBE]frL4ThEvfJk&feature=youtu.be[/YOUTUBE]
 
Chỉnh sửa cuối:
Chết đi. Ai chỉ làm cái anim cho player coi nào!
 
Back
Top