Re: Bear Trap
Cvars:
beartrap_self_trap - Should you trap yourself?
beartrap_trap_teammates - Your teammates maybe?
beartrap_print_owner - Print 'you trapped X' message to the owner of the trap?
beartrap_freedom_time - How many seconds to release the victim
beartrap_max_traps - Yup, you know that
beartrap_trap_delay - Same
Here ya go:
PHP Code:
#include <amxmodx> #include <hamsandwich> #include <engine> #include <fakemeta> #include <xs>
#define PLUGIN "Bear Trap" #define VERSION "1.3" #define AUTHOR "EFFEX"
#define TASK_FREEDOM 4383173 #define resetUserSpeed(%1) ExecuteHamB(Ham_Player_ResetMaxSpeed, %1)
new const g_szTrapModel[] = "models/beartrap.mdl" new const g_szTrapClassName[] = "beartrap" new const g_szTrapSound[] = "bearsound.wav" new const g_szTrapHitSound[] = "debris/metal6.wav"
const Float:g_fMaxDistance = 150.0
new pCvarSelfTrap, pCvarMessageOwner, pCvarFreedomTime, pCvarTrapTeammates, pCvarMaxTraps, pCvarTrapDelay, pCvarBearTrapLife
new g_mMessageBarTime new Ham:Ham_Player_ResetMaxSpeed = Ham_Item_PreFrame
new bool:g_bGotTrapped[MAX_PLAYERS + 1] new g_iTrapNum[MAX_PLAYERS + 1], g_iSysTime[MAX_PLAYERS + 1], g_iTrapID[MAX_PLAYERS + 1]
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR)
pCvarSelfTrap = register_cvar("beartrap_self_trap", "0") pCvarMessageOwner = register_cvar("beartrap_print_owner", "1") pCvarTrapTeammates = register_cvar("beartrap_trap_teammates", "0") pCvarFreedomTime = register_cvar("beartrap_freedom_time", "10") pCvarMaxTraps = register_cvar("beartrap_max_traps", "3") pCvarTrapDelay = register_cvar("beartrap_trap_delay", "10") pCvarBearTrapLife = register_cvar("beartrap_trap_life", "800.0") g_mMessageBarTime = get_user_msgid("BarTime")
register_event("HLTV", "event_NewRound", "a", "1=0", "2=0") RegisterHam(Ham_Player_Jump, "player", "ham_Player_Jump_Pre", 0) RegisterHam(Ham_Spawn, "player", "ham_PlayerSpawn_Post", 1) RegisterHam(Ham_Player_ResetMaxSpeed, "player", "Player_ResetMaxSpeed", 1) register_clcmd("say /placetrap", "cmdPlaceTrap") register_forward(FM_Touch, "forward_BearTrapTouch") }
public plugin_precache() { precache_model(g_szTrapModel) precache_sound(g_szTrapSound) precache_sound(g_szTrapHitSound) }
public client_putinserver(id) { g_bGotTrapped[id] = false g_iTrapNum[id] = 0 }
public event_NewRound() { new iEnt = -1 while((iEnt = find_ent_by_class(iEnt, g_szTrapClassName))) { remove_entity(iEnt) } }
public ham_PlayerSpawn_Post(id) { g_bGotTrapped[id] = false g_iTrapNum[id] = g_iSysTime[id] = 0 remove_task(id + TASK_FREEDOM) }
public ham_Player_Jump_Pre(id) { if(g_bGotTrapped[id]) { static iOldbuttons; iOldbuttons = entity_get_int(id, EV_INT_oldbuttons) if(!(iOldbuttons & IN_JUMP)) { entity_set_int(id, EV_INT_oldbuttons, (iOldbuttons | IN_JUMP)) return HAM_HANDLED } return HAM_SUPERCEDE } return HAM_HANDLED }
public ham_trapTakeDamage(iVictimID, iInflictor, iAttacker, Float:fDamage) { if(!pev_valid(iVictimID) || !is_user_connected(iAttacker)) return FMRES_IGNORED
new iTrapVictimID = pev(iVictimID, pev_iuser1) if(!iTrapVictimID || !is_user_connected(iTrapVictimID)) { SetHamReturnInteger(0) return HAM_SUPERCEDE } static Float:fOrigin[3] pev(iVictimID, pev_origin, fOrigin) fOrigin[2] += 3.0 drawSparks(fOrigin) if(floatround(fDamage) >= pev(iVictimID, pev_health)) { unfreezePlayer(iTrapVictimID) barTime(iTrapVictimID, 0) remove_task(iTrapVictimID + TASK_FREEDOM) g_iTrapID[iTrapVictimID] = 0 } emit_sound(iVictimID, CHAN_BODY, g_szTrapHitSound, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) return HAM_IGNORED }
public Player_ResetMaxSpeed(id) { if(is_user_alive(id) && g_bGotTrapped[id]) { set_pev(id, pev_maxspeed, -1.0) } }
public forward_BearTrapTouch(iTouched, iToucher) { if(!pev_valid(iTouched) || !is_user_connected(iToucher)) return FMRES_IGNORED if(g_bGotTrapped[iToucher]) return FMRES_IGNORED static szClassName[2][MAX_PLAYERS] pev(iToucher, pev_classname, szClassName[0], charsmax(szClassName[])) pev(iTouched, pev_classname, szClassName[1], charsmax(szClassName[])) if(equal(szClassName[1], g_szTrapClassName) && equal(szClassName[0], "player")) { static Float:fGameTime;fGameTime = get_gametime() if((fGameTime - pev(iTouched, pev_fuser1)) < 1.0) return FMRES_IGNORED new iOwner = pev(iTouched, pev_iuser2) if((iOwner == iToucher) && !get_pcvar_num(pCvarSelfTrap) || !(iOwner == iToucher) && !get_pcvar_num(pCvarTrapTeammates) && (get_user_team(iOwner) == get_user_team(iToucher))) return FMRES_IGNORED setAnimation((g_iTrapID[iToucher] = iTouched), 1) emit_sound(iTouched, CHAN_BODY, g_szTrapSound, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) trapPlayer(iToucher, iOwner, iTouched) } return FMRES_IGNORED }
public cmdPlaceTrap(id) { new Float:fEndPosition[3], iTarget, Float:fMaxAimDistanceCheck = 30.0 getAimEndPosition(id, fEndPosition) if((iTarget = checkEntitiesAround(id, fMaxAimDistanceCheck, fEndPosition))) { if(pev(iTarget, pev_iuser2) == id) { if(pev(iTarget, pev_iuser1) > 0) { client_print(id, print_chat, "[BearTrap]: There a player stuck on your trap, you can not take it back.") return PLUGIN_HANDLED } client_print(id, print_chat, "[BearTrap]: You got back your bear trap!") g_iTrapNum[id]-- remove_entity(iTarget) } else { client_print(id, print_chat, "[BearTrap]: This is not your bear trap, get outta here!") } return PLUGIN_HANDLED } if(g_iTrapNum[id] >= get_pcvar_num(pCvarMaxTraps)) { client_print(id, print_chat, "[BearTrap]: You cannot make bear traps anymore!") return PLUGIN_HANDLED } new iSysTime = get_systime(), iPcvarValue = get_pcvar_num(pCvarTrapDelay) new iDelay = (iSysTime - g_iSysTime[id]), iCountDown = (iPcvarValue - iDelay) if(iDelay < iPcvarValue) { client_print(id, print_chat, "[BearTrap]: You must wait %d second%s to place another trap!", iCountDown, (iCountDown > 1) ? "s" : "") return PLUGIN_HANDLED } new iBearTrapEntity = create_entity("info_target") if(pev_valid(iBearTrapEntity)) { g_iTrapNum[id]++ g_iSysTime[id] = iSysTime engfunc(EngFunc_SetOrigin, iBearTrapEntity, fEndPosition) engfunc(EngFunc_SetModel, iBearTrapEntity, g_szTrapModel) set_pev(iBearTrapEntity, pev_movetype, MOVETYPE_NOCLIP) set_pev(iBearTrapEntity, pev_solid, SOLID_SLIDEBOX) engfunc(EngFunc_SetSize, iBearTrapEntity, Float:{-5.78, -10.0, -0.44}, Float:{5.78, 6.0, 5.05}) set_pev(iBearTrapEntity, pev_iuser2, id) set_pev(iBearTrapEntity, pev_classname, g_szTrapClassName) drop_to_floor(iBearTrapEntity) } return PLUGIN_HANDLED }
checkEntitiesAround(player, Float:fRadius, Float:fOrigin[3]) { static szClassName[MAX_PLAYERS], Float:fEntOrigin[3], Float:fPlayerOrigin[3] pev(player, pev_origin, fPlayerOrigin) for(new iWbox; (iWbox = find_ent_in_sphere(iWbox, fOrigin, fRadius)) != 0;) { pev(iWbox, pev_origin, fEntOrigin) if(get_distance_f(fEntOrigin, fPlayerOrigin) > g_fMaxDistance) continue entity_get_string(iWbox, EV_SZ_classname, szClassName, charsmax(szClassName)) if(equal(szClassName, g_szTrapClassName)) { return iWbox } } return 0 }
getAimEndPosition(id, Float:fOrigin[3]) { new Float:fStart[3], Float:fViewOfs[3] pev(id, pev_origin, fStart) pev(id, pev_view_ofs, fViewOfs) xs_vec_add(fStart, fViewOfs, fStart)
new Float:fDest[3] pev(id, pev_v_angle, fDest) engfunc(EngFunc_MakeVectors, fDest) global_get(glb_v_forward, fDest) xs_vec_mul_scalar(fDest, g_fMaxDistance, fDest) xs_vec_add(fStart, fDest, fDest)
engfunc(EngFunc_TraceLine, fStart, fDest, 0, id, 0) get_tr2(0, TR_vecEndPos, fOrigin) }
trapPlayer(iVictim, iKiller, iTrapID) { g_bGotTrapped[iVictim] = true set_pev(iVictim, pev_maxspeed, -1.0) if(get_pcvar_num(pCvarMessageOwner)) { new szVictimName[MAX_PLAYERS] get_user_name(iVictim, szVictimName, charsmax(szVictimName)) client_print(iKiller, print_chat, "[BearTrap]: %s got trapped by your bear trap!", szVictimName) }
set_pev(iTrapID, pev_health, get_pcvar_float(_:pCvarBearTrapLife)) set_pev(iTrapID, pev_takedamage, DAMAGE_AIM) RegisterHamFromEntity(Ham_TakeDamage, iTrapID, "ham_trapTakeDamage") set_pev(iTrapID, pev_nextthink, get_gametime() + 1.0) new Float:fDelayTime = float(get_pcvar_num(pCvarFreedomTime)) set_pev(iTrapID, pev_iuser1, iVictim) set_pev(iTrapID, pev_fuser1, get_gametime() + (fDelayTime + 2.0)) set_task(fDelayTime, "giveFreedom", iVictim + TASK_FREEDOM)
barTime(iVictim, floatround(fDelayTime)) }
public giveFreedom(id) { id -= TASK_FREEDOM if(is_user_connected(id)) { setAnimation(g_iTrapID[id], 0) set_pev(g_iTrapID[id], pev_iuser1, 0) unfreezePlayer(id) g_iTrapID[id] = 0 } else g_iTrapID[id] = 0 }
setAnimation(iEntity, iAnim) { entity_set_float(iEntity, EV_FL_animtime, 0.0) entity_set_float(iEntity, EV_FL_framerate, 0.4) entity_set_int(iEntity, EV_INT_sequence, iAnim) entity_set_int(iEntity, EV_INT_gaitsequence, 1) entity_set_float(iEntity, EV_FL_frame, 0.0) }
unfreezePlayer(iVictim) { g_bGotTrapped[iVictim] = false resetUserSpeed(iVictim) }
barTime(id, iTime) { if(is_user_connected(id)) { message_begin(MSG_ONE, g_mMessageBarTime, .player = id) write_short(iTime) message_end() } }
drawSparks(Float:fOrigin[3]) { message_begin(MSG_ALL, SVC_TEMPENTITY) write_byte(TE_SPARKS) engfunc(EngFunc_WriteCoord, fOrigin[0]) engfunc(EngFunc_WriteCoord, fOrigin[1]) engfunc(EngFunc_WriteCoord, fOrigin[2]) message_end() }
You can use a sound, just download it and name as 'beartrap' ^^.
|