RSSy MYGO.pl Opublikowano Maj 4, 2024 o 00:09 RSSy Udostępnij Opublikowano Maj 4, 2024 o 00:09 Hello this is the .sma Code: #include <amxmodx> #include <engine> #include <fakemeta> #include <fakemeta_util> #include <hamsandwich> #include <cstrike> #include <xs> #define PLUGIN "Dragon Sword" #define VERSION "2.0" #define AUTHOR "Dias Leon" #define V_MODEL "models/v_dragonsword2.mdl" #define P_MODEL "models/p_dragonsword.mdl" #define CSW_DRAGONSWORD CSW_KNIFE #define weapon_dragonsword "weapon_knife" #define WEAPON_ANIMEXT "knife" //"skullaxe" #define DRAW_TIME 1.0 #define SLASH_ROTATE_DAMAGE 75.0 #define SLASH_ROTATE_RADIUS 110.0 #define SLASH_ROTATE_POINT_DIS 60.0 #define SLASH_ROTATE_DELAY_TIME 0.7 #define SLASH_ROTATE_RESET_TIME 1.0 #define SLASH_AHEAD_DAMAGE 90.0 #define SLASH_AHEAD_RADIUS 90.0 #define SLASH_AHEAD_POINT_DIS 30.0 #define SLASH_AHEAD_DELAY_TIME 0.3 #define SLASH_AHEAD_RESET_TIME 0.9 #define STAB_DAMAGE 110.0 #define STAB_RADIUS 100.0 #define STAB_POINT_DIS 80.0 #define STAB_TIME 0.657 #define STAB_RESET_TIME 0.75 #define TASK_SLASHING 2033+20 #define TASK_STABING 2033+10 // OFFSET const PDATA_SAFE = 2 const OFFSET_LINUX_WEAPONS = 4 const OFFSET_WEAPONOWNER = 41 const m_flNextAttack = 83 const m_szAnimExtention = 492 new const DragonSword_Sound[8][] = { "weapons/dragonsword_draw.wav", "weapons/dragonsword_hit1.wav", "weapons/dragonsword_hit2.wav", "weapons/dragonsword_idle.wav", "weapons/dragonsword_slash1.wav", "weapons/dragonsword_slash2.wav", "weapons/dragonsword_stab_hit.wav", "weapons/dragonsword_wall.wav" } enum { ATTACK_SLASH_ROTATE = 1, ATTACK_SLASH_AHEAD, ATTACK_STAB } enum { DS_ANIM_IDLE = 0, DS_ANIM_SLASH_ROTATE, DS_ANIM_SLASH_AHEAD, DS_ANIM_DRAW, DS_ANIM_STAB_BEGIN, DS_ANIM_STAB_END } enum { HIT_NOTHING = 0, HIT_ENEMY, HIT_WALL } new g_Had_DragonSword[33], g_Slashing_Mode[33], g_Attack_Mode[33], g_Checking_Mode[33], g_Hit_Ing[33] new g_Old_Weapon[33], g_Ham_Bot, g_MaxPlayers public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0") register_event("CurWeapon", "Event_CurWeapon", "be", "1=1") register_forward(FM_EmitSound, "fw_EmitSound") register_forward(FM_CmdStart, "fw_CmdStart") register_forward(FM_TraceLine, "fw_TraceLine") register_forward(FM_TraceHull, "fw_TraceHull") RegisterHam(Ham_TraceAttack, "player", "fw_PlayerTraceAttack") g_MaxPlayers = get_maxplayers() register_clcmd("admin_get_dragonsword", "get_dragonsword", ADMIN_KICK) } public plugin_precache() { engfunc(EngFunc_PrecacheModel, V_MODEL) engfunc(EngFunc_PrecacheModel, P_MODEL) for(new i = 0; i < sizeof(DragonSword_Sound); i++) engfunc(EngFunc_PrecacheSound, DragonSword_Sound[i]) } public get_dragonsword(id) { if(!is_user_alive(id)) return remove_task(id+TASK_SLASHING) remove_task(id+TASK_STABING) g_Had_DragonSword[id] = 1 g_Slashing_Mode[id] = 0 g_Attack_Mode[id] = 0 g_Checking_Mode[id] = 0 g_Hit_Ing[id] = 0 if(get_user_weapon(id) == CSW_KNIFE) { set_pev(id, pev_viewmodel2, V_MODEL) set_pev(id, pev_weaponmodel2, P_MODEL) set_weapon_anim(id, DS_ANIM_DRAW) set_player_nextattack(id, DRAW_TIME) } else { engclient_cmd(id, weapon_dragonsword) } } public remove_dragonsword(id) { remove_task(id+TASK_SLASHING) remove_task(id+TASK_STABING) g_Had_DragonSword[id] = 0 g_Slashing_Mode[id] = 0 g_Attack_Mode[id] = 0 g_Checking_Mode[id] = 0 g_Hit_Ing[id] = 0 } public client_putinserver(id) { if(!g_Ham_Bot && is_user_bot(id)) { g_Ham_Bot = 1 set_task(0.1, "Do_RegisterHam_Bot", id) } } public Do_RegisterHam_Bot(id) { RegisterHamFromEntity(Ham_TraceAttack, id, "fw_PlayerTraceAttack") } public Event_NewRound() { for(new i = 0; i < g_MaxPlayers; i++) remove_dragonsword(i) } public Event_CurWeapon(id) { if(!is_user_alive(id)) return // Problem Here ?. SHUT THE FUCK UP if((read_data(2) == CSW_DRAGONSWORD && g_Old_Weapon[id] != CSW_DRAGONSWORD) && g_Had_DragonSword[id]) { set_pev(id, pev_viewmodel2, V_MODEL) set_pev(id, pev_weaponmodel2, P_MODEL) set_weapon_anim(id, DS_ANIM_DRAW) set_player_nextattack(id, DRAW_TIME) set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT, -1 , 20) } g_Old_Weapon[id] = read_data(2) } public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch) { if(!is_user_connected(id)) return FMRES_IGNORED if(/*get_user_weapon(id) != CSW_DRAGONSWORD || */!g_Had_DragonSword[id]) return FMRES_IGNORED if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i') { if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a') return FMRES_SUPERCEDE if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't') { if (sample[17] == 'w') // wall { g_Hit_Ing[id] = HIT_WALL return FMRES_SUPERCEDE } else { g_Hit_Ing[id] = HIT_ENEMY return FMRES_SUPERCEDE } } if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a') return FMRES_SUPERCEDE; } return FMRES_IGNORED } public fw_CmdStart(id, uc_handle, seed) { if (!is_user_alive(id)) return if(get_user_weapon(id) != CSW_DRAGONSWORD || !g_Had_DragonSword[id]) return static ent; ent = fm_get_user_weapon_entity(id, CSW_DRAGONSWORD) if(!pev_valid(ent)) return if(get_pdata_float(ent, 46, OFFSET_LINUX_WEAPONS) > 0.0 || get_pdata_float(ent, 47, OFFSET_LINUX_WEAPONS) > 0.0) return static CurButton CurButton = get_uc(uc_handle, UC_Buttons) if (CurButton & IN_ATTACK) { set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK) if(!g_Slashing_Mode[id]) { g_Attack_Mode[id] = ATTACK_SLASH_ROTATE g_Checking_Mode[id] = 1 ExecuteHamB(Ham_Weapon_PrimaryAttack, ent) g_Checking_Mode[id] = 0 set_pev(id, pev_framerate, 1.5) set_weapons_timeidle(id, CSW_DRAGONSWORD, SLASH_ROTATE_RESET_TIME) set_player_nextattack(id, SLASH_ROTATE_RESET_TIME) set_weapon_anim(id, DS_ANIM_SLASH_ROTATE) set_task(SLASH_ROTATE_DELAY_TIME, "Do_Slashing_Rotate", id+TASK_SLASHING) } else { g_Attack_Mode[id] = ATTACK_SLASH_AHEAD g_Checking_Mode[id] = 1 ExecuteHamB(Ham_Weapon_PrimaryAttack, ent) g_Checking_Mode[id] = 0 set_pev(id, pev_framerate, 2.0) set_weapons_timeidle(id, CSW_DRAGONSWORD, SLASH_AHEAD_RESET_TIME) set_player_nextattack(id, SLASH_AHEAD_RESET_TIME) set_weapon_anim(id, DS_ANIM_SLASH_AHEAD) set_task(SLASH_AHEAD_DELAY_TIME, "Do_Slashing_Ahead", id+TASK_SLASHING) } g_Slashing_Mode[id] = !g_Slashing_Mode[id] } else if (CurButton & IN_ATTACK2) { set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK2) g_Attack_Mode[id] = ATTACK_STAB g_Checking_Mode[id] = 1 ExecuteHamB(Ham_Weapon_SecondaryAttack, ent) g_Checking_Mode[id] = 0 set_pev(id, pev_framerate, 1.5) set_weapons_timeidle(id, CSW_DRAGONSWORD, STAB_TIME + 0.1) set_player_nextattack(id, STAB_TIME + 0.1) set_weapon_anim(id, DS_ANIM_STAB_BEGIN) remove_task(id+TASK_STABING) set_task(STAB_TIME, "Do_StabNow", id+TASK_STABING) } } public Do_Slashing_Rotate(id) { id -= TASK_SLASHING if(!is_user_alive(id)) return if(get_user_weapon(id) != CSW_DRAGONSWORD || !g_Had_DragonSword[id]) return if(Check_Attack(id, ATTACK_SLASH_ROTATE)) { emit_sound(id, CHAN_WEAPON, DragonSword_Sound[1], 1.0, ATTN_NORM, 0, PITCH_NORM) } else { if(g_Hit_Ing[id] == HIT_WALL) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[7], 1.0, ATTN_NORM, 0, PITCH_NORM) else if(g_Hit_Ing[id] == HIT_NOTHING) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[4], 1.0, ATTN_NORM, 0, PITCH_NORM) } g_Attack_Mode[id] = 0 g_Hit_Ing[id] = 0 } public Do_Slashing_Ahead(id) { id -= TASK_SLASHING if(!is_user_alive(id)) return if(get_user_weapon(id) != CSW_DRAGONSWORD || !g_Had_DragonSword[id]) return if(Check_Attack(id, ATTACK_SLASH_AHEAD)) { emit_sound(id, CHAN_WEAPON, DragonSword_Sound[2], 1.0, ATTN_NORM, 0, PITCH_NORM) } else { if(g_Hit_Ing[id] == HIT_WALL) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[7], 1.0, ATTN_NORM, 0, PITCH_NORM) else if(g_Hit_Ing[id] == HIT_NOTHING) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[5], 1.0, ATTN_NORM, 0, PITCH_NORM) } g_Attack_Mode[id] = 0 g_Hit_Ing[id] = 0 } public Do_StabNow(id) { id -= TASK_STABING if (!is_user_alive(id)) return if(!g_Had_DragonSword[id]) return set_weapon_anim(id, DS_ANIM_STAB_END) if(get_user_weapon(id) != CSW_DRAGONSWORD) { set_weapons_timeidle(id, CSW_DRAGONSWORD, 0.0) set_player_nextattack(id, 0.0) } else { set_weapons_timeidle(id, CSW_DRAGONSWORD, STAB_RESET_TIME) set_player_nextattack(id, STAB_RESET_TIME) } if(Check_Attack(id, ATTACK_STAB)) { emit_sound(id, CHAN_WEAPON, DragonSword_Sound[1], 1.0, ATTN_NORM, 0, PITCH_NORM) } else { if(g_Hit_Ing[id] == HIT_WALL) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[7], 1.0, ATTN_NORM, 0, PITCH_NORM) else if(g_Hit_Ing[id] == HIT_NOTHING) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[6], 1.0, ATTN_NORM, 0, PITCH_NORM) } g_Attack_Mode[id] = 0 g_Hit_Ing[id] = 0 } public Check_Attack(id, Mode) { static Float:Max_Distance, Float:Point[4][3], Float:TB_Distance, Float:Point_Dis if(Mode == ATTACK_SLASH_ROTATE) { Point_Dis = SLASH_ROTATE_POINT_DIS Max_Distance = SLASH_ROTATE_RADIUS TB_Distance = Max_Distance / 4.0 } else if(Mode == ATTACK_SLASH_AHEAD) { Point_Dis = SLASH_AHEAD_POINT_DIS Max_Distance = SLASH_AHEAD_RADIUS TB_Distance = Max_Distance / 4.0 } else if(Mode == ATTACK_STAB) { Point_Dis = STAB_POINT_DIS Max_Distance = STAB_RADIUS TB_Distance = Max_Distance / 4.0 } static Float:VicOrigin[3], Float:MyOrigin[3] pev(id, pev_origin, MyOrigin) for(new i = 0; i < 4; i++) get_position(id, TB_Distance * (i + 1), 0.0, 0.0, Point[i]) static Have_Victim; Have_Victim = 0 static ent ent = fm_get_user_weapon_entity(id, get_user_weapon(id)) if(!pev_valid(ent)) return 0 for(new i = 0; i < get_maxplayers(); i++) { if(!is_user_alive(i)) continue if(id == i) continue if(entity_range(id, i) > Max_Distance) continue pev(i, pev_origin, VicOrigin) if(is_wall_between_points(MyOrigin, VicOrigin, id)) continue if(get_distance_f(VicOrigin, Point[0]) <= Point_Dis || get_distance_f(VicOrigin, Point[1]) <= Point_Dis || get_distance_f(VicOrigin, Point[2]) <= Point_Dis || get_distance_f(VicOrigin, Point[3]) <= Point_Dis) { if(!Have_Victim) Have_Victim = 1 if(Mode == ATTACK_SLASH_ROTATE) do_attack(id, i, ent, SLASH_ROTATE_DAMAGE) else if(Mode == ATTACK_SLASH_AHEAD) do_attack(id, i, ent, SLASH_AHEAD_DAMAGE) else if(Mode == ATTACK_STAB) do_attack(id, i, ent, STAB_DAMAGE) } } if(Have_Victim) return 1 else return 0 return 0 } public fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle) { if (!is_user_alive(id)) return FMRES_IGNORED if (get_user_weapon(id) != CSW_DRAGONSWORD || !g_Had_DragonSword[id]) return FMRES_IGNORED static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3] pev(id, pev_origin, fOrigin) pev(id, pev_view_ofs, view_ofs) xs_vec_add(fOrigin, view_ofs, vecStart) pev(id, pev_v_angle, v_angle) engfunc(EngFunc_MakeVectors, v_angle) get_global_vector(GL_v_forward, v_forward) if(g_Attack_Mode[id] == ATTACK_SLASH_ROTATE) xs_vec_mul_scalar(v_forward, SLASH_ROTATE_RADIUS, v_forward) else if(g_Attack_Mode[id] == ATTACK_SLASH_AHEAD) xs_vec_mul_scalar(v_forward, SLASH_AHEAD_RADIUS, v_forward) else if(g_Attack_Mode[id] == ATTACK_STAB) xs_vec_mul_scalar(v_forward, STAB_RADIUS, v_forward) else xs_vec_mul_scalar(v_forward, 0.0, v_forward) xs_vec_add(vecStart, v_forward, vecEnd) engfunc(EngFunc_TraceLine, vecStart, vecEnd, 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_alive(id)) return FMRES_IGNORED if (get_user_weapon(id) != CSW_DRAGONSWORD || !g_Had_DragonSword[id]) return FMRES_IGNORED static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3] pev(id, pev_origin, fOrigin) pev(id, pev_view_ofs, view_ofs) xs_vec_add(fOrigin, view_ofs, vecStart) pev(id, pev_v_angle, v_angle) engfunc(EngFunc_MakeVectors, v_angle) get_global_vector(GL_v_forward, v_forward) if(g_Attack_Mode[id] == ATTACK_SLASH_ROTATE) xs_vec_mul_scalar(v_forward, SLASH_ROTATE_RADIUS, v_forward) else if(g_Attack_Mode[id] == ATTACK_SLASH_AHEAD) xs_vec_mul_scalar(v_forward, SLASH_AHEAD_RADIUS, v_forward) else if(g_Attack_Mode[id] == ATTACK_STAB) xs_vec_mul_scalar(v_forward, STAB_RADIUS, v_forward) else xs_vec_mul_scalar(v_forward, 0.0, v_forward) xs_vec_add(vecStart, v_forward, vecEnd) engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle) return FMRES_SUPERCEDE } public fw_PlayerTraceAttack(Victim, Attacker, Float:Damage, Float:Direction[3], TraceResult, DamageBits) { if(!is_user_alive(Attacker)) return HAM_IGNORED if(!g_Had_DragonSword[Attacker] || !g_Checking_Mode[Attacker]) return HAM_IGNORED return HAM_SUPERCEDE } do_attack(Attacker, Victim, Inflictor, Float:fDamage) { fake_player_trace_attack(Attacker, Victim, fDamage) fake_take_damage(Attacker, Victim, fDamage, Inflictor) } fake_player_trace_attack(iAttacker, iVictim, &Float:fDamage) { // get fDirection new Float:fAngles[3], Float:fDirection[3] pev(iAttacker, pev_angles, fAngles) angle_vector(fAngles, ANGLEVECTOR_FORWARD, fDirection) // get fStart new Float:fStart[3], Float:fViewOfs[3] pev(iAttacker, pev_origin, fStart) pev(iAttacker, pev_view_ofs, fViewOfs) xs_vec_add(fViewOfs, fStart, fStart) // get aimOrigin new iAimOrigin[3], Float:fAimOrigin[3] get_user_origin(iAttacker, iAimOrigin, 3) IVecFVec(iAimOrigin, fAimOrigin) // TraceLine from fStart to AimOrigin new ptr = create_tr2() engfunc(EngFunc_TraceLine, fStart, fAimOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr) new pHit = get_tr2(ptr, TR_pHit) new iHitgroup = get_tr2(ptr, TR_iHitgroup) new Float:fEndPos[3] get_tr2(ptr, TR_vecEndPos, fEndPos) // get target & body at aiming new iTarget, iBody get_user_aiming(iAttacker, iTarget, iBody) // if aiming find target is iVictim then update iHitgroup if (iTarget == iVictim) { iHitgroup = iBody } // if ptr find target not is iVictim else if (pHit != iVictim) { // get AimOrigin in iVictim new Float:fVicOrigin[3], Float:fVicViewOfs[3], Float:fAimInVictim[3] pev(iVictim, pev_origin, fVicOrigin) pev(iVictim, pev_view_ofs, fVicViewOfs) xs_vec_add(fVicViewOfs, fVicOrigin, fAimInVictim) fAimInVictim[2] = fStart[2] fAimInVictim[2] += get_distance_f(fStart, fAimInVictim) * floattan( fAngles[0] * 2.0, degrees ) // check aim in size of iVictim new iAngleToVictim = get_angle_to_target(iAttacker, fVicOrigin) iAngleToVictim = abs(iAngleToVictim) new Float:fDis = 2.0 * get_distance_f(fStart, fAimInVictim) * floatsin( float(iAngleToVictim) * 0.5, degrees ) new Float:fVicSize[3] pev(iVictim, pev_size , fVicSize) if ( fDis <= fVicSize[0] * 0.5 ) { // TraceLine from fStart to aimOrigin in iVictim new ptr2 = create_tr2() engfunc(EngFunc_TraceLine, fStart, fAimInVictim, DONT_IGNORE_MONSTERS, iAttacker, ptr2) new pHit2 = get_tr2(ptr2, TR_pHit) new iHitgroup2 = get_tr2(ptr2, TR_iHitgroup) // if ptr2 find target is iVictim if ( pHit2 == iVictim && (iHitgroup2 != HIT_HEAD || fDis <= fVicSize[0] * 0.25) ) { pHit = iVictim iHitgroup = iHitgroup2 get_tr2(ptr2, TR_vecEndPos, fEndPos) } free_tr2(ptr2) } // if pHit still not is iVictim then set default HitGroup if (pHit != iVictim) { // set default iHitgroup iHitgroup = HIT_GENERIC new ptr3 = create_tr2() engfunc(EngFunc_TraceLine, fStart, fVicOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr3) get_tr2(ptr3, TR_vecEndPos, fEndPos) // free ptr3 free_tr2(ptr3) } } // set new Hit & Hitgroup & EndPos set_tr2(ptr, TR_pHit, iVictim) set_tr2(ptr, TR_iHitgroup, iHitgroup) set_tr2(ptr, TR_vecEndPos, fEndPos) // hitgroup multi fDamage new Float:fMultifDamage switch(iHitgroup) { case HIT_HEAD: fMultifDamage = 4.0 case HIT_STOMACH: fMultifDamage = 1.25 case HIT_LEFTLEG: fMultifDamage = 0.75 case HIT_RIGHTLEG: fMultifDamage = 0.75 default: fMultifDamage = 1.0 } fDamage *= fMultifDamage // ExecuteHam fake_trake_attack(iAttacker, iVictim, fDamage, fDirection, ptr) // free ptr free_tr2(ptr) } stock fake_trake_attack(iAttacker, iVictim, Float:fDamage, Float:fDirection[3], iTraceHandle, iDamageBit = (DMG_NEVERGIB | DMG_BULLET)) { ExecuteHamB(Ham_TraceAttack, iVictim, iAttacker, fDamage, fDirection, iTraceHandle, iDamageBit) } stock fake_take_damage(iAttacker, iVictim, Float:fDamage, iInflictor = 0, iDamageBit = (DMG_NEVERGIB | DMG_BULLET)) { iInflictor = (!iInflictor) ? iAttacker : iInflictor ExecuteHamB(Ham_TakeDamage, iVictim, iInflictor, iAttacker, fDamage, iDamageBit) } stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize = 0.0) { new Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3] pev(id, pev_origin, fOrigin) get_user_origin(id, iAimOrigin, 3) // end position from eyes IVecFVec(iAimOrigin, fAimOrigin) xs_vec_sub(fAimOrigin, fOrigin, fV1) new Float:fV2[3] xs_vec_sub(fTarget, fOrigin, fV2) new iResult = get_angle_between_vectors(fV1, fV2) if (TargetSize > 0.0) { new Float:fTan = TargetSize / get_distance_f(fOrigin, fTarget) new fAngleToTargetSize = floatround( floatatan(fTan, degrees) ) iResult -= (iResult > 0) ? fAngleToTargetSize : -fAngleToTargetSize } return iResult } stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3]) { new Float:fA1[3], Float:fA2[3] engfunc(EngFunc_VecToAngles, fV1, fA1) engfunc(EngFunc_VecToAngles, fV2, fA2) new iResult = floatround(fA1[1] - fA2[1]) iResult = iResult % 360 iResult = (iResult > 180) ? (iResult - 360) : iResult return iResult } stock fm_cs_get_weapon_ent_owner(ent) { if (pev_valid(ent) != PDATA_SAFE) return -1 return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS) } stock set_weapon_anim(id, anim) { if(!is_user_alive(id)) return set_pev(id, pev_weaponanim, anim) message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id) write_byte(anim) write_byte(0) message_end() } stock set_weapons_timeidle(id, WeaponId ,Float:TimeIdle) { if(!is_user_alive(id)) return static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId) if(!pev_valid(entwpn)) return set_pdata_float(entwpn, 46, TimeIdle, OFFSET_LINUX_WEAPONS) set_pdata_float(entwpn, 47, TimeIdle, OFFSET_LINUX_WEAPONS) set_pdata_float(entwpn, 48, TimeIdle + 0.5, OFFSET_LINUX_WEAPONS) } stock set_player_nextattack(id, Float:nexttime) { if(!is_user_alive(id)) return set_pdata_float(id, m_flNextAttack, nexttime, 5) } stock is_valid_entity(ent) { if(pev_valid(ent) != PDATA_SAFE) return 0 return 1 } stock get_position(ent, Float:forw, Float:right, Float:up, Float:vStart[]) { static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3] pev(ent, pev_origin, vOrigin) pev(ent, pev_view_ofs,vUp) //for player xs_vec_add(vOrigin,vUp,vOrigin) pev(ent, pev_v_angle, vAngle) // if normal entity ,use pev_angles angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight) angle_vector(vAngle,ANGLEVECTOR_UP,vUp) vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up } stock is_wall_between_points(Float:start[3], Float:end[3], ignore_ent) { static ptr ptr = create_tr2() engfunc(EngFunc_TraceLine, start, end, IGNORE_MONSTERS, ignore_ent, ptr) static Float:EndPos[3] get_tr2(ptr, TR_vecEndPos, EndPos) free_tr2(ptr) return floatround(get_distance_f(end, EndPos)) }The .inl model example Code: /////////////////////////////////////////////////////////////////////////////////////////////////// //-----------------------------------------| DualKatana |------------------------------------------ //========================================== sDs|Aragon* ========================================== ///////////// // Settings | //==========/ #define DUALKATANA_OLD_NAME "knife" #define DUALKATANA_NEW_NAME "dualkatana" #define DUALKATANA_OLD_EVENT "events/knife.sc" #define weapon_dualkatana "weapon_knife" #define CSW_DUALKATANA CSW_KNIFE #define DUALKATANA_NAME "Dual Katana" #define DUALKATANA_TEAM WPN_TEAM_T #define DUALKATANA_ACCES WPN_ACCES_ALL #define DUALKATANA_LEVEL 0 #define DUALKATANA_DAMAGE 3.0 #define DUALKATANA_SLASH_DELAY 0.5 #define DUALKATANA_STAB_DELAY 1.0 new DualKatanaModel_V[] = "models/Furien40+/v_dualkatana.mdl", DualKatanaModel_P[] = "models/Furien40/p_dualkatana.mdl", DualKatana_WeaponList[] = "furien40_dualkatana", DualKatana_Sprites[] = "sprites/Furien40/dualkatana.spr", DualKatana_Sound[][][] = { { "weapons/dualkatana_draw.wav", "weapons/knife_deploy1.wav" }, { "weapons/dualkatana_hit1.wav", "weapons/knife_hit1.wav" }, { "weapons/dualkatana_hit2.wav", "weapons/knife_hit2.wav" }, { "weapons/dualkatana_hit1.wav", "weapons/knife_hit3.wav" }, { "weapons/dualkatana_hit2.wav", "weapons/knife_hit4.wav" }, { "weapons/dualkatana_hitwall.wav", "weapons/knife_hitwall1.wav" }, { "weapons/dualkatana_slash1.wav", "weapons/knife_slash1.wav" }, { "weapons/dualkatana_slash2.wav", "weapons/knife_slash2.wav" }, { "weapons/dualkatana_stab.wav", "weapons/knife_stab.wav" } }; /////////////// // Model Info | //============/ enum { DUALKATANA_ANIM_IDLE = 0, DUALKATANA_ANIM_SLASH1, DUALKATANA_ANIM_SLASH2, DUALKATANA_ANIM_DRAW, DUALKATANA_ANIM_STAB, DUALKATANA_ANIM_STAB_MISS }; new Float:DualKatana_AnimationTime[] = { 7.0, 1.0, 1.0, 1.0, 1.0, 1.0 }; //////////// // Globals | //=========/ #define dualkatana_get_anim(%1) entity_get_int(%1, EV_INT_iuser1) #define dualkatana_set_anim(%1,%2) entity_set_int(%1, EV_INT_iuser1, %2) new DualKatanaID, dualkatana_event; /////////////////////////////////////////////////////////////////////////////////////////////////// // Plugin | //================================================================================================= DualKatana_Init() { if (!DualKatanaID) return; register_clcmd(DualKatana_WeaponList, "CMD_DualKatana"); register_message(MSGID_DeathMsg, "DualKatana_DeathMsg"); register_event("CurWeapon", "DualKatana_ViewModel", "be", "1=1", "2=29"); register_forward(FM_PlaybackEvent, "DualKatana_PlaybackEvent"); register_forward(FM_EmitSound, "DualKatana_EmitSound"); register_forward(FM_CmdStart, "DualKatana_CmdStart"); RegisterHam(Ham_Item_Deploy, weapon_dualkatana, "DualKatana_Deploy_Post", 1); RegisterHam(Ham_Weapon_WeaponIdle, weapon_dualkatana, "DualKatana_WeaponIdle"); RegisterHookChain(RG_CBasePlayer_TakeDamage, "DualKatana_TakeDamage"); } DualKatana_Precache() { DualKatanaID = RegisterWeapon(CSW_DUALKATANA, DUALKATANA_NAME, DUALKATANA_TEAM, DUALKATANA_ACCES, DUALKATANA_LEVEL); if (!DualKatanaID) return; register_forward(FM_PrecacheEvent, "DualKatana_PrecacheEvent_Post", 1); precache_model(DualKatanaModel_V); precache_model(DualKatanaModel_P); new WPNList[128]; formatex(WPNList, charsmax(WPNList), "sprites/%s.txt", DualKatana_WeaponList); precache_generic(WPNList); precache_generic(DualKatana_Sprites); for (new i = 0; i < sizeof(DualKatana_Sound); i++) precache_sound(DualKatana_Sound[i][0]); } DualKatana_Natives() { register_native("get_user_dualkatana", "native_get_user_dualkatana"); register_native("set_user_dualkatana", "native_set_user_dualkatana"); register_native("dualkatana_id", "native_dualkatana_id"); } /////////////////////////////////////////////////////////////////////////////////////////////////// // Funcitons | //================================================================================================= public DualKatana_DeathMsg(msg_id, msg_dest, id) { new Attacker = get_msg_arg_int(1); if (is_user_connected(Attacker)) { new TruncatedWeapon[33]; get_msg_arg_string(4, TruncatedWeapon, charsmax(TruncatedWeapon)); if (equal(TruncatedWeapon, DUALKATANA_OLD_NAME)) { if (get_user_dualkatana(Attacker)) set_msg_arg_string(4, DUALKATANA_NEW_NAME); } } } public DualKatana_ViewModel(id) { if (is_user_alive(id) && get_user_dualkatana(id, true)) set_weapon_model(id, DualKatanaModel_V, DualKatanaModel_P); } public DualKatana_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2) { if (is_user_connected(invoker) && eventid == dualkatana_event) { playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2); return FMRES_HANDLED; } return FMRES_IGNORED; } public DualKatana_PrecacheEvent_Post(type, const name[]) { if (equal(DUALKATANA_OLD_EVENT, name)) { dualkatana_event = get_orig_retval(); return FMRES_HANDLED; } return FMRES_IGNORED; } public DualKatana_EmitSound(id, channel, const sound[]) { if (is_user_alive(id) && get_user_dualkatana(id, true)) { for (new i = 0; i < sizeof DualKatana_Sound; i++) { if (equal(sound, DualKatana_Sound[i][1])) { emit_sound(id, channel, DualKatana_Sound[i][0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM); return FMRES_SUPERCEDE; } } } return FMRES_IGNORED; } public DualKatana_CmdStart(id, uc_handle, seed) { if (!is_user_alive(id) || get_user_weapon(id) != CSW_DUALKATANA) return FMRES_IGNORED; new CurButton = get_uc(uc_handle, UC_Buttons); if (CurButton & IN_ATTACK) { new ENT_Weapon = cs_get_user_weapon_entity(id); if (is_valid_ent(ENT_Weapon) && get_weapon_key(ENT_Weapon) == DualKatanaID) { if (get_user_NextAttack(id) <= 0.1) { ExecuteHamB(Ham_Weapon_PrimaryAttack, ENT_Weapon); if (dualkatana_get_anim(ENT_Weapon) >= 2) dualkatana_set_anim(ENT_Weapon, 1); else dualkatana_set_anim(ENT_Weapon, dualkatana_get_anim(ENT_Weapon) + 1); new Anim = dualkatana_get_anim(ENT_Weapon); set_weapon_TimeWeaponIdle(ENT_Weapon, DualKatana_AnimationTime[Anim]); set_user_NextAttack(id, DUALKATANA_SLASH_DELAY); SendWeaponAnim(id, Anim, ENT_Weapon); } CurButton &= ~IN_ATTACK; set_uc(uc_handle, UC_Buttons, CurButton); return FMRES_HANDLED; } } else if (CurButton & IN_ATTACK2) { new ENT_Weapon = cs_get_user_weapon_entity(id); if (is_valid_ent(ENT_Weapon) && get_weapon_key(ENT_Weapon) == DualKatanaID) { if (get_user_NextAttack(id) <= 0.1) { ExecuteHamB(Ham_Weapon_SecondaryAttack, ENT_Weapon); new Anim = DUALKATANA_ANIM_STAB; set_weapon_TimeWeaponIdle(ENT_Weapon, DualKatana_AnimationTime[Anim]); set_user_NextAttack(id, DUALKATANA_STAB_DELAY); SendWeaponAnim(id, Anim, ENT_Weapon); } CurButton &= ~IN_ATTACK2; set_uc(uc_handle, UC_Buttons, CurButton); return FMRES_HANDLED; } } return FMRES_IGNORED; } public DualKatana_TakeDamage(const victim, pevInflictor, attacker, Float:flDamage, bitsDamageType) { if (is_user_alive(attacker) && get_user_dualkatana(attacker, true) && (bitsDamageType & DMG_BULLET)) SetHookChainArg(4, ATYPE_FLOAT, flDamage * DUALKATANA_DAMAGE); return HC_CONTINUE; } public DualKatana_Deploy_Post(ENT_Weapon) { if (is_valid_ent(ENT_Weapon)) { new id = pev(ENT_Weapon, pev_owner); if (is_user_alive(id) && get_weapon_key(ENT_Weapon) == DualKatanaID) { new Anim = DUALKATANA_ANIM_DRAW; set_weapon_model(id, DualKatanaModel_V, DualKatanaModel_P); set_weapon_TimeWeaponIdle(ENT_Weapon, DualKatana_AnimationTime[Anim]); set_user_NextAttack(id, DualKatana_AnimationTime[Anim]); SendWeaponAnim(id, Anim, ENT_Weapon); return HAM_HANDLED; } } return HAM_IGNORED; } public DualKatana_WeaponIdle(ENT_Weapon) { if (is_valid_ent(ENT_Weapon)) { new id = pev(ENT_Weapon, pev_owner); if (is_user_alive(id) && get_weapon_key(ENT_Weapon) == DualKatanaID && get_weapon_TimeWeaponIdle(ENT_Weapon) <= 0.1) { new Anim = DUALKATANA_ANIM_IDLE; set_weapon_TimeWeaponIdle(ENT_Weapon, DualKatana_AnimationTime[Anim]); set_weapon_model(id, DualKatanaModel_V, DualKatanaModel_P); SendWeaponAnim(id, Anim, ENT_Weapon); return HAM_HANDLED; } } return HAM_IGNORED; } public CMD_DualKatana(id) { engclient_cmd(id, weapon_dualkatana); return PLUGIN_HANDLED; } /////////////////////////////////////////////////////////////////////////////////////////////////// // Natives | //================================================================================================= public native_get_user_dualkatana(plugin_id, argc) return get_user_dualkatana(get_param(1), bool:get_param(2)); public native_set_user_dualkatana(plugin_id, argc) return set_weapon(get_param(1), CSW_DUALKATANA, DualKatanaID); public native_dualkatana_id() return DualKatanaID; /////////////////////////////////////////////////////////////////////////////////////////////////// // Stock | //================================================================================================= stock get_user_dualkatana(id, bool:CurrWeapon = false) return get_weapon(id, CSW_DUALKATANA, DualKatanaID, CurrWeapon); /////////////////////////////////////////////////////////////////////////////////////////////////// //-----------------------------------------| DualKatana |------------------------------------------ //========================================== sDs|Aragon* ==========================================Please i want someone if can help to modify the .sma similar to the .inl example but the same settings because i need to add new weapons to the shop. Like to convert similar like .inl Przeczytaj cały wpis Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi