). Attached along below.
: Ham Bots API. Latest version as of 2015 December 22 of the script(
PHP Code:
// Modules - global
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
// Plug-in APIs
//#include <cs_ham_bots_api>
// Stocks
#include <amxmisc>
#include <bitsums>
//#include <D7Debug>
new const g_szConstVersion[] = "0.4.4";
// Natives
native cs_get_user_money(index);
native cs_set_user_money(index, money, flash = 1);
native zp_register_extra_item(const name[], cost, teams)
native zp_force_buy_extra_item(id, itemid, ignorecost = 0)
native zp_get_user_zombie(id)
// Forwards
forward zp_extra_item_selected(id, itemid)
#define ZP_PLUGIN_HANDLED 97
#define ZP_TEAM_ZOMBIE (1<<0)
#define ZP_TEAM_HUMAN (1<<1)
#define ZP_TEAM_NEMESIS (1<<2)
#define ZP_TEAM_SURVIVOR (1<<3)
//new const g_szEntityClassName[] = "info_target";
new const g_szClassNameJetPack[] = "D7N4DJetpack";
new const g_szModelPJetPack[] = "models/p_longjump.mdl";
new const g_szModelWJetPack[] = "models/w_longjump.mdl";
new const g_szSpriteJetPackFlame[] = "sprites/rjet1.spr"; // rjet1, stmbal1, WXplo1, xsmoke1
new const g_szSoundJetPackPickUp[] = "items/gunpickup2.wav";
new const g_szSoundJetPackFly[] = "jetpack.wav";
new const g_szSoundJetPackEmpty[] = "jp_blow.wav";
new g_iIDSpriteFlame;
new g_iBsConnected, g_iBsAlive;
new g_iMaxPlayers, g_iIDItem;
#define is_user_inserver(%1) ((1 <= %1 <= g_iMaxPlayers) && bitsum_get(g_iBsConnected, %1))
public plugin_natives()
{
set_native_filter("fwNativeFilter")
}
public fwNativeFilter(const szName[], const iID, const iTrap)
{
return (!iTrap) ? PLUGIN_HANDLED : PLUGIN_CONTINUE
}
public plugin_precache()
{
g_iIDSpriteFlame = precache_model(g_szSpriteJetPackFlame);
precache_sound(g_szSoundJetPackPickUp)
precache_sound(g_szSoundJetPackFly)
precache_sound(g_szSoundJetPackEmpty)
precache_model(g_szModelPJetPack)
precache_model(g_szModelWJetPack)
}
new g_iIDEntityJetPack[33];
new /*g_bitHoldingButtons, */g_iBsDeadOrZombie, g_iBsBot;
const g_fFuelConsumed = pev_fuser1;
const g_fNextThrust = pev_fuser2;
const g_fNextRefuel = pev_fuser3;
const g_fThrottleVelocity = pev_fuser4; //g_fNextAcceleration
const g_bIsRefueling = pev_iuser2;
//const g_fNextDeceleration = pev_iuser3;
//const g_fThrottleVelocity = pev_iuser4;
enum (+= 10001)
{
g_iIDTaskEntityEnablePickUp = 10000,
g_iIDTaskEntityRemove
}
new g_bEscapeMap;
new g_iIDPCVarVelocityMax, g_iIDPCVarFuelRegenPercent, g_iIDPCVarFuelRegenCoolDown,
g_iIDPCVarFuelRegenInterval, g_iIDPCVarFuelConsumptionPc, g_iIDPCVarVelocityAcceleration,
Float:g_fCachedVelocityMax, Float:g_fCachedFuelRegenPercent, Float:g_fCachedFuelRegenCoolDown,
Float:g_fCachedFuelRegenInterval, Float:g_fCachedFuelConsumptionPercent, Float:g_fCachedVelocityAcceleration;
new g_iIDPCVarRemoveAfterDrop, g_iIDPCVarThrustMinimumDelay, g_iIDPCVarPickUpCoolDown, g_iIDPCVarCost;
public plugin_init()
{
register_plugin("D7 N4D JetPack", g_szConstVersion, "D i 5 7 i n c T, Bad_Bud, ZmOutStanding, ConnorMcLeod, wbyokomo, NiHiLaNTh")
register_cvar("D7N4DJPVersion", g_szConstVersion, FCVAR_SERVER | FCVAR_SPONLY)
set_cvar_string("D7N4DJPVersion", g_szConstVersion)
register_event("HLTV", "fwEvHLTVRoundStart", "a", "1=0", "2=0")
register_event("ResetHUD", "fwEventPlayerResetHUD", "b")
register_touch(g_szClassNameJetPack, "player", "fwJetPackTouch")
register_think(g_szClassNameJetPack, "fwJetPackThink")
RegisterHam(Ham_Spawn, "player", "fwHamSpawnPlayer", 1)
RegisterHam(Ham_Killed, "player", "fwHamKilledPlayer", 1)
//RegisterHam(Ham_TakeDamage, "player", "fwHamTakeDamagePlayer", 1)
//RegisterHam(Ham_Player_Jump, "player", "fwHamPlayerJump")
#if defined _cs_ham_bots_api_included
RegisterHamBots(Ham_Spawn, "fwHamSpawnPlayer", 1)
RegisterHamBots(Ham_TakeDamage, "fwHamTakeDamagePlayerPre")
RegisterHamBots(Ham_Killed, "fwHamKilledPlayer", 1)
//RegisterHamBots(Ham_TakeDamage, "fwHamTakeDamagePlayer", 1)
//RegisterHamBots(Ham_Player_Jump, "fwHamPlayerJump")
#endif
g_iIDPCVarVelocityMax = register_cvar("D7N4DJPVelocityMax", "265.0")
g_iIDPCVarFuelRegenPercent = register_cvar("D7N4DJPFuelRegenPercentage", "3.757")
g_iIDPCVarRemoveAfterDrop = register_cvar("D7N4DJPRemoveTime", "600.0")
g_iIDPCVarFuelRegenCoolDown = register_cvar("D7N4DJPFuelRegenStartDelay", "5")
g_iIDPCVarFuelRegenInterval = register_cvar("D7N4DJPFuelRegenInterval", "0.1")
g_iIDPCVarFuelConsumptionPc = register_cvar("D7N4DJPFuelConsumptionPercentage", "1.0")
g_iIDPCVarVelocityAcceleration = register_cvar("D7N4DJPVelocityAcceleration", "50.0")
g_iIDPCVarThrustMinimumDelay = register_cvar("D7N4DJPThrustDelay", "0.05")
g_iIDPCVarPickUpCoolDown = register_cvar("D7N4DJPPickUpCooldown", "0.3")
g_iIDPCVarCost = register_cvar("D7N4DJPCost", "7500")
register_clcmd("drop", "fwClCmdDrop")
register_clcmd("say", "fwClCmdSay")
register_clcmd("say_team", "fwClCmdSay")
new szTemp[32];
get_mapname(szTemp, charsmax(szTemp))
if (containi(szTemp, "escape") != -1 || containi(szTemp, "ze_") != -1 || containi(szTemp, "atix") != -1)
g_bEscapeMap = true;
//register_forward(FM_Touch, "fwFmTouch", 1)
g_iMaxPlayers = get_maxplayers();
//register_message(g_iIDMsgDeath, "fwMsgDeathPre")
get_cvar_string("zp_version", szTemp, charsmax(szTemp))
if (szTemp[0] && containi(szTemp, "5.0.") == -1 && containi(szTemp, "5.1.") == -1)
g_iIDItem = zp_register_extra_item("D7 JetPack", 20, ZP_TEAM_HUMAN | ZP_TEAM_SURVIVOR);
//ftD7Log(_, _, "zp_version: ^"%s^". g_iIDItem: %d.", szTemp, g_iIDItem)
}
public plugin_cfg()
fwEvHLTVRoundStart()
public fwClCmdSay(const iID)
{
new szTemp[7 + 31 + 1], iTemp;
read_args(szTemp, charsmax(szTemp))
//ftD7Log(_, _, szTemp)
trim(szTemp)
remove_quotes(szTemp)
replace(szTemp, charsmax(szTemp), "/", "")
iTemp = containi(szTemp, " ");
if (iTemp > -1)
szTemp[iTemp] = EOS;
if (!equali(szTemp, "jp") && !equali(szTemp, "jetpack") && !equali(szTemp, "jet"))
return PLUGIN_CONTINUE;
/*
if (iTemp > -1)
{
//szTemp[iTemp] = ' ';
format(szTemp, charsmax(szTemp), szTemp[iTemp + 1])
}*/
//ftD7Log(_, _, szTemp)
if (iTemp > -1 && get_user_flags(iID) & ADMIN_CVAR)
{
iTemp = cmd_target(iID, szTemp[iTemp + 1], CMDTARGET_ALLOW_SELF);
if (!iTemp)
{
ftClientPrintChatColor(iID, 33, "^3%L", iID, "CL_NOT_FOUND")
}
else
ftJpGive(iTemp, 1)
}
else
ftJpBuy(iID)
return PLUGIN_HANDLED_MAIN;
}
ftJpBuy(const iID)
{
if (!g_iIDItem)
{
new szTemp[8];
get_modname(szTemp, charsmax(szTemp))
if (equali(szTemp, "cstrike") || equali(szTemp, "czero") || equali(szTemp, "csv15") || equali(szTemp, "cs13"))
{
if (cs_get_user_money(iID) < get_pcvar_num(g_iIDPCVarCost))
ftClientPrintChatColor(iID, 33, "^3You don't have enough money^1!")
else if (ftJpGive(iID))
{
cs_set_user_money(iID, cs_get_user_money(iID) - get_pcvar_num(g_iIDPCVarCost))
}
}
}
else
zp_force_buy_extra_item(iID, g_iIDItem)
}
ftJpGive(const iID, const bDrop = 0)
{
if (g_bEscapeMap && !(get_user_flags(iID) & ADMIN_CVAR))
{
ftClientPrintChatColor(iID, 33, "^3You can't use JetPack on escape maps^1!")
return PLUGIN_CONTINUE;
}
else if (g_iIDEntityJetPack[iID])
{
if (!bDrop)
{
ftClientPrintChatColor(iID, 33, "^3You already have a JetPack^1!")
return PLUGIN_CONTINUE;
}
else
DropJetPack(iID)
}
new iEntityID = create_entity("info_target");
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Has bought a jetpack. Entity created with ID %d.", iID, iEntityID)
#endif
*/
if (!is_valid_ent(iEntityID))
return PLUGIN_CONTINUE;
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Jetpack entity %d is valid. Adding it to the entity list array.", iID, iEntityID)
#endif
*/
remove_task(iID)
g_iIDEntityJetPack[iID] = iEntityID;
new Float:fVecOrigin[3];
pev(iID, pev_origin, fVecOrigin)
//engfunc(EngFunc_SetOrigin, iEntityID, fVecOrigin)
//engfunc(EngFunc_SetModel, iEntityID, g_szModelPJetPack)
entity_set_origin(iEntityID, fVecOrigin)
entity_set_model(iEntityID, g_szModelPJetPack)
set_pev(iEntityID, g_fFuelConsumed, 0.0)
set_pev(iEntityID, pev_movetype, MOVETYPE_FOLLOW)
set_pev(iEntityID, pev_aiment, iID)
//set_pev(iEntityID, pev_classname, g_szClassNameJetPack)
entity_set_string(iEntityID, EV_SZ_classname, g_szClassNameJetPack)
set_pev(iEntityID, pev_solid, SOLID_NOT)
set_pev(iEntityID, pev_iuser1, iID)
set_pev(iEntityID, pev_owner, iID)
set_pev(iEntityID, pev_rendermode, kRenderNormal)
set_pev(iEntityID, pev_renderfx, kRenderFxGlowShell)
set_pev(iEntityID, pev_renderamt, random_float(5.77, 7.57))
entity_set_float(iEntityID, EV_FL_nextthink, get_gametime())
//dllfunc(DLLFunc_Spawn, iEntityID)
ComputeColor(iEntityID, 0.0, iID, false)
emit_sound(iID, CHAN_ITEM, g_szSoundJetPackPickUp, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
ftClientPrintChatColor(iID, iID, "^4You got a JetPack^1! Press and hold ^4JUMP^1 to ^4fly^1.^3 Loading bar = cooldown BEFORE refuel start^1.")
/*
#if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Entity %d succesfully created and alocated.", iID, iEntityID)
#endif*/
return PLUGIN_HANDLED;
}
public zp_extra_item_selected(iID, item)
{
if (item != g_iIDItem)
return PLUGIN_CONTINUE;
if (!ftJpGive(iID))
return ZP_PLUGIN_HANDLED;
return PLUGIN_CONTINUE;
}
/*
public pfn_think(iIDEnt)
{
static szClassName[32];
entity_get_string(iIDEnt, EV_SZ_classname, szClassName, charsmax(szClassName))
if (!equal(szClassName, g_szClassNameJetPack))
return;
fwJetPackEntityThink(iIDEnt)
client_print(0, print_center, "[pfn_think] Triggered.")
}*/
public fwJetPackThink(const iIDEnt)
{
fwJetPackEntityThink(iIDEnt)
//client_print(0, print_center, "[fwJetPackThink] Triggered.")
entity_set_float(iIDEnt, EV_FL_nextthink, get_gametime() + 0.001)
}
fwJetPackEntityThink(const iEntityID)
{
new Float:fGameTime = get_gametime(), Float:fThrustMinimumDelay = get_pcvar_float(g_iIDPCVarThrustMinimumDelay);
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[JetPack think] Game time: %f | User: %d | Buttons: %d | Refuel time left: %f | Fuel consumed: %f.",
fGameTime, iUserID, iBitSumButtons, fNextRefuel, fFuelConsumed)
#endif
*/
new iUserID = pev(iEntityID, pev_iuser1), Float:fFuelConsumed, Float:fNextRefuel;
//if (is_user_alive(iUserID))
//client_print(iUserID, print_center, "[fwJetPackEntityThink] Triggered.")
pev(iEntityID, g_fFuelConsumed, fFuelConsumed)
new Float:fNextThrust;
pev(iEntityID, g_fNextThrust, fNextThrust)
if (fNextThrust <= fGameTime)
{
if (iUserID && iUserID < 33 && fFuelConsumed < 100.0)
{
new iBitSumButtons = pev(iUserID, pev_button);
if (iBitSumButtons & IN_JUMP || bitsum_get(g_iBsBot, iUserID) && !pev(iEntityID, g_bIsRefueling))
{
new Float:fVelocity[3];
pev(iUserID, pev_velocity, fVelocity)
#if defined DefDebug
if (!bitsum_get(g_iBsBot, iUserID))
log_to_file(g_szFileDebug, "[JetPack think] Player current vertical velocity: %f.", fVelocity[2])
#endif
if (fVelocity[2] < g_fCachedVelocityMax)
{
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[JetPack think] The current vertical velocity is above or equal to the max(%f). Skipping this frame.", g_fCachedVelocityMax)
#endif
*/
new Float:fVelocityUpNew = fVelocity[2]/* + ((fVelocity[2] != 0.0) ? g_fCachedVelocityAcceleration : 181.0)*/;
if (iBitSumButtons & IN_FORWARD)
velocity_by_aim(iUserID, floatround(g_fCachedVelocityMax), fVelocity)
else if (iBitSumButtons & IN_BACK)
velocity_by_aim(iUserID, -floatround(g_fCachedVelocityMax), fVelocity)
pev(iEntityID, g_fThrottleVelocity, fVelocity[2])
fVelocity[2] += g_fCachedVelocityAcceleration;
set_pev(iEntityID, g_fThrottleVelocity, fVelocity[2])
fVelocity[2] += fVelocityUpNew;
if (fVelocity[2] > g_fCachedVelocityMax)
fVelocity[2] = g_fCachedVelocityMax;
#if defined DefDebug
if (!bitsum_get(g_iBsBot, iUserID))
log_to_file(g_szFileDebug, "[JetPack think] New vertical velocity: %f.", fVelocity[2])
#endif
set_pev(iUserID, pev_velocity, fVelocity)
if (!random_num(0, 3))
{
new Float:fVecTemp[3];
pev(iUserID, pev_origin, fVecTemp)
velocity_by_aim(iUserID, -20, fVelocity)
// Credits to Sylwester @ AlliedModders
//fVelocityUpNew = floatsqroot(fVelocity[0]*fVelocity[0]+fVelocity[1]*fVelocity[1]+fVelocity[2]*fVelocity[2]);
/*
if (iBitSumButtons & IN_FORWARD)
{
fVecTemp[0] -= fVelocity[0] * 50.0 / fVelocityUpNew;
fVecTemp[1] -= fVelocity[1] * 50.0 / fVelocityUpNew;
fVecTemp[2] -= fVelocity[2] * 50.0 / fVelocityUpNew;
}
else if (iBitSumButtons & IN_BACK)
{
fVecTemp[0] += fVelocity[0] * 50.0 / fVelocityUpNew;
fVecTemp[1] += fVelocity[1] * 50.0 / fVelocityUpNew;
fVecTemp[2] += fVelocity[2] * 50.0 / fVelocityUpNew;
}*/
fVecTemp[0] += fVelocity[0];
fVecTemp[1] += fVelocity[1];
fVecTemp[2] += fVelocity[2];
fVecTemp[2] -= 20;
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, fVecTemp, 0)
write_byte(TE_SPRITE)
engfunc(EngFunc_WriteCoord, fVecTemp[0])
engfunc(EngFunc_WriteCoord, fVecTemp[1])
engfunc(EngFunc_WriteCoord, fVecTemp[2])
write_short(g_iIDSpriteFlame)
write_byte(8) //scale in 0.1's
write_byte(157) //brightness
message_end()
emit_sound(iEntityID, CHAN_STREAM, (fFuelConsumed <= 75.0) ? g_szSoundJetPackFly : g_szSoundJetPackEmpty, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
}
fFuelConsumed += g_fCachedFuelConsumptionPercent;
if (fFuelConsumed < 100.0)
set_pev(iEntityID, g_fNextThrust, fGameTime + fThrustMinimumDelay)
#if defined DefDebug
if (!bitsum_get(g_iBsBot, iUserID))
log_to_file(g_szFileDebug, "[JetPack think] New fuel consumption percentage: %f.", fFuelConsumed)
#endif
set_pev(iEntityID, g_fFuelConsumed, fFuelConsumed)
#if defined DefDebug
if (!bitsum_get(g_iBsBot, iUserID))
log_to_file(g_szFileDebug, "[JetPack think] New thrust will be available in %f seconds.", fThrustMinimumDelay)
#endif
ComputeColor(iEntityID, fFuelConsumed, iUserID, false)
fNextRefuel = fGameTime + g_fCachedFuelRegenCoolDown;
set_pev(iEntityID, g_fNextRefuel, fNextRefuel)
set_pev(iEntityID, g_bIsRefueling, false)
#if defined DefDebug
if (!bitsum_get(g_iBsBot, iUserID))
log_to_file(g_szFileDebug, "[JetPack think] New refuel will be available in %f seconds.", g_fCachedFuelRegenCoolDown)
#endif
ProgressBar(iUserID, floatround(g_fCachedFuelRegenCoolDown))
}
}
}
// Hasn't just been used
if (fNextRefuel == 0.0)
{
pev(iEntityID, g_fThrottleVelocity, fNextThrust)
if (fNextThrust > 0.0)
{
fNextThrust -= g_fCachedVelocityAcceleration;
if (fNextThrust < 0.0)
fNextThrust = 0.0;
set_pev(iEntityID, g_fThrottleVelocity, fNextThrust)
}
}
}
if (fFuelConsumed > 0.0 && fNextRefuel == 0.0)
{
pev(iEntityID, g_fNextRefuel, fNextRefuel)
if (fNextRefuel <= fGameTime)
{
fNextRefuel -= fGameTime;
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[JetPack think] It's time for the next refuel. Time left: %f.", fNextRefuel)
log_to_file(g_szFileDebug, "[JetPack think] Current fuel consumption percentage: %f.", fFuelConsumed)
#endif
*/
fFuelConsumed -= g_fCachedFuelRegenPercent;
if (fFuelConsumed <= 0.0)
{
fFuelConsumed = 0.0;
set_pev(iEntityID, g_fNextRefuel, 0.0)
set_pev(iEntityID, g_bIsRefueling, false)
ComputeColor(iEntityID, fFuelConsumed, iUserID, false)
}
else
{
set_pev(iEntityID, g_fNextRefuel, fGameTime + fNextRefuel + g_fCachedFuelRegenInterval)
set_pev(iEntityID, g_bIsRefueling, true)
ComputeColor(iEntityID, fFuelConsumed, iUserID, true)
}
set_pev(iEntityID, g_fFuelConsumed, fFuelConsumed)
#if defined DefDebug
log_to_file(g_szFileDebug, "[JetPack think] New fuel consumption percentage: %f. Next refuel in %f seconds.", fFuelConsumed, fGameTime + fNextRefuel + g_fCachedFuelRegenInterval)
#endif
}
}
}
public fwEvHLTVRoundStart()
{
RemoveJetPack()
g_fCachedVelocityMax = get_pcvar_float(g_iIDPCVarVelocityMax);
g_fCachedFuelRegenPercent = get_pcvar_float(g_iIDPCVarFuelRegenPercent);
g_fCachedFuelRegenCoolDown = get_pcvar_float(g_iIDPCVarFuelRegenCoolDown);
g_fCachedFuelRegenInterval = get_pcvar_float(g_iIDPCVarFuelRegenInterval);
g_fCachedFuelConsumptionPercent = get_pcvar_float(g_iIDPCVarFuelConsumptionPc);
g_fCachedVelocityAcceleration = get_pcvar_float(g_iIDPCVarVelocityAcceleration);
}
public client_putinserver(iID)
{
bitsum_add(g_iBsConnected, iID)
bitsum_add(g_iBsDeadOrZombie, iID)
if (is_user_bot(iID))
bitsum_add(g_iBsBot, iID)
}
public fwEventPlayerResetHUD(iID)
{
remove_task(iID)
set_task(0.1, "TaskResetHUD", iID)
}
public TaskResetHUD(const iID)
if ((1 <= iID <= g_iMaxPlayers) && bitsum_get(g_iBsAlive, iID) && g_iIDEntityJetPack[iID])
ComputeColor(g_iIDEntityJetPack[iID], _, iID)
public client_disconnect(iID)
{
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Disconnected.", iID)
#endif
*/
bitsum_del(g_iBsBot, iID)
bitsum_add(g_iBsDeadOrZombie, iID)
remove_task(iID + g_iIDTaskEntityEnablePickUp)
DropJetPack(iID)
remove_task(iID)
bitsum_del(g_iBsAlive, iID)
bitsum_del(g_iBsConnected, iID)
}
public fwHamSpawnPlayer(iID)
{
remove_task(iID)
if (!is_user_alive(iID))
return;
bitsum_add(g_iBsAlive, iID)
if (g_iIDItem && zp_get_user_zombie(iID))
return;
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Ham spawn post.", iID)
#endif
*/
bitsum_del(g_iBsDeadOrZombie, iID)
if (!g_iIDEntityJetPack[iID])
{
if (bitsum_get(g_iBsBot, iID) && !random_num(0, 4))
{
ftJpBuy(iID)
}
return;
}
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Has jetpack with entity iID %d.", iID, g_iIDEntityJetPack[iID])
#endif
*/
set_pev(g_iIDEntityJetPack[iID], pev_iuser1, iID)
ProgressBar(iID, 0)
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Setting fuel level to 0.", iID)
#endif
*/
set_pev(g_iIDEntityJetPack[iID], g_fFuelConsumed, 0.0)
ComputeColor(g_iIDEntityJetPack[iID], 0.0, iID, false)
}
public fwHamTakeDamagePlayerPre(const iID, const iIDAttacker, const iIDInflictor, const Float:fDamage, const iBsDamageType)
{
if (iBsDamageType != DMG_FALL || !bitsum_get(g_iBsBot, iID) || !g_iIDEntityJetPack[iID])
return HAM_IGNORED;
return HAM_SUPERCEDE;
}
public fwClCmdDrop(iID)
{
if (bitsum_get(g_iBsDeadOrZombie, iID) || get_user_weapon(iID) != CSW_KNIFE)
return PLUGIN_CONTINUE;
return DropJetPack(iID);
}
public fwJetPackTouch(iEntityID, iID)
{
if (g_iIDEntityJetPack[iID] || bitsum_get(g_iBsDeadOrZombie, iID) || task_exists(iID + g_iIDTaskEntityEnablePickUp))
return;
remove_task(iID)
remove_task(iEntityID + g_iIDTaskEntityRemove)
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Touch jetpack entity with ID %d.", iID, iEntityID)
#endif
*/
engfunc(EngFunc_SetModel, iEntityID, g_szModelPJetPack)
set_pev(iEntityID, pev_movetype, MOVETYPE_FOLLOW)
set_pev(iEntityID, pev_aiment, iID)
set_pev(iEntityID, pev_solid, SOLID_NOT)
set_pev(iEntityID, pev_owner, iID)
set_pev(iEntityID, pev_iuser1, iID)
set_pev(iEntityID, pev_rendermode, kRenderNormal)
set_pev(iEntityID, pev_renderfx, kRenderFxGlowShell)
set_pev(iEntityID, pev_renderamt, random_float(5.77, 7.57))
g_iIDEntityJetPack[iID] = iEntityID;
ComputeColor(iEntityID, _, iID)
emit_sound(iID, CHAN_ITEM, g_szSoundJetPackPickUp, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
ftClientPrintChatColor(iID, iID, "^4You got a JetPack^1! Press and hold ^4JUMP^1 to ^4fly^1.^3 Loading bar = cooldown BEFORE refuel start^1.")
/*
#if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Touch. Entity %d succesfully attached to player.", iID, g_iIDEntityJetPack[iID])
#endif*/
}
public zp_user_infected_post(iID)
{
bitsum_add(g_iBsDeadOrZombie, iID)
DropJetPack(iID)
}
public zp_user_humanized_post(iID)
bitsum_del(g_iBsDeadOrZombie, iID)
public fwHamKilledPlayer(iID)
{
bitsum_del(g_iBsAlive, iID)
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Ham killed post.", iID)
#endif
*/
bitsum_add(g_iBsDeadOrZombie, iID)
// Only lose the item permanently if the round has started
// if (zp_has_round_started())
DropJetPack(iID)
/* else
{
remove_task(iID)
if (!g_iIDEntityJetPack[iID])
return;
ProgressBar(iID, 0)
IconJetPackFuel(iID, _, 0)
set_pev(g_iIDEntityJetPack[iID], pev_iuser1, iID + 32)
}*/
}
DropJetPack(const iID)
{
if (!g_iIDEntityJetPack[iID])
return PLUGIN_CONTINUE;
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Drop jetpack with entity iID %d.", iID, g_iIDEntityJetPack[iID])
#endif
*/
remove_task(iID)
ProgressBar(iID, 0)
IconJetPackFuel(iID, _, 0)
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Drop. Setting entity iuser1.", iID)
#endif
*/
set_pev(g_iIDEntityJetPack[iID], pev_iuser1, 0)
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Drop. Setting entity model.", iID)
#endif
*/
engfunc(EngFunc_SetModel, g_iIDEntityJetPack[iID], g_szModelWJetPack)
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Drop. Setting entity solid state.", iID)
#endif
*/
set_pev(g_iIDEntityJetPack[iID], pev_solid, SOLID_TRIGGER)
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Drop. Setting entity move type.", iID)
#endif
*/
set_pev(g_iIDEntityJetPack[iID], pev_movetype, MOVETYPE_TOSS)
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Drop. Setting entity aiment.", iID)
#endif
*/
set_pev(g_iIDEntityJetPack[iID], pev_aiment, 0)
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Drop. Setting entity origin, velocity and angles.", iID)
#endif
*/
new Float:fOrigin[3], Float:fVelocity[3];
pev(iID, pev_origin, fOrigin)
set_pev(g_iIDEntityJetPack[iID], pev_origin, fOrigin)
engfunc(EngFunc_SetSize, g_iIDEntityJetPack[iID], Float:{ -16.0, -16.0, -15.0 }, Float:{ 16.0, 16.0, 20.0 })
pev(iID, pev_angles, fOrigin)
fOrigin[0] = 0.0;
set_pev(g_iIDEntityJetPack[iID], pev_angles, fOrigin)
velocity_by_aim(iID, 250, fOrigin)
pev(iID, pev_velocity, fVelocity)
fVelocity[0] += fOrigin[0];
fVelocity[1] += fOrigin[1];
fVelocity[2] += fOrigin[2];
set_pev(g_iIDEntityJetPack[iID], pev_velocity, fVelocity)
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Drop. Setting entity next think.", iID)
#endif
*/
set_task(get_pcvar_float(g_iIDPCVarPickUpCoolDown), "TaskPickUpEnable", iID + g_iIDTaskEntityEnablePickUp) // prevent drop/pickup exploit
set_task(get_pcvar_float(g_iIDPCVarRemoveAfterDrop), "TaskRemove", g_iIDEntityJetPack[iID] + g_iIDTaskEntityRemove)
g_iIDEntityJetPack[iID] = 0;
return PLUGIN_HANDLED;
}
public TaskPickUpEnable()
{
/* Do nothing */
}
public TaskRemove(iEntityID)
{
iEntityID -= g_iIDTaskEntityRemove;
RemoveJetPack(iEntityID)
}
ComputeColor(const iID, Float:fFuelConsumed = -1.0, const iUserID, bFlash = -1)
{
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Entity %d] Compute color.", iID)
#endif
*/
if (fFuelConsumed == -1.0)
{
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Entity %d] Compute color. Getting fuel consumption percentage since it's not defined.", iID)
#endif
*/
pev(iID, g_fFuelConsumed, fFuelConsumed)
}
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Entity %d] Compute color. Calculating color amounts.", iID)
#endif
*/
new Float:fColorAmounts[3];
if (fFuelConsumed > 100)
fFuelConsumed = 100.0;
if (fFuelConsumed != 100.0)
{
fColorAmounts[0] = 255 * fFuelConsumed / 100; // red
fColorAmounts[1] = 255 - fColorAmounts[0]; // green
fColorAmounts[2] = 0.0;
}
else
{
fColorAmounts[0] = 157.0;
fColorAmounts[1] = 157.0;
fColorAmounts[2] = 157.0;
}
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Entity %d] Compute color. Setting entity rendering.", iID)
#endif
*/
set_pev(iID, pev_rendercolor, fColorAmounts)
if (!iUserID) // || bitsum_get(g_iBsDeadOrZombie, iUserID)
{
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Entity %d] Compute color. User %d is invalid/zombie/dead.", iID, iUserID)
#endif
*/
return;
}
new iColorAmounts[3];
iColorAmounts[0] = floatround(fColorAmounts[0]);
iColorAmounts[1] = floatround(fColorAmounts[1]);
iColorAmounts[2] = floatround(fColorAmounts[2]);
if (bFlash == -1)
{
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Entity %d] Compute color. Icon flash unspecified. Finding if it should flash or not.", iID)
#endif
*/
if (!pev(iID, g_bIsRefueling))
bFlash = 0;
else
bFlash = 1;
}
IconJetPackFuel(iUserID, iColorAmounts, !bFlash ? 1 : 2)
}
stock IconJetPackFuel(const iID, const iColorAmounts[3] = { 0, 255, 0 }, const iMode = 1)
{
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Icon display. Colors: %d, %d, %d. Display mode: %d.",
iID, iColorAmounts[0], iColorAmounts[1], iColorAmounts[2], iMode)
#endif
*/
static msgStatusIcon;
if (!msgStatusIcon)
msgStatusIcon = get_user_msgid("StatusIcon");
message_begin(MSG_ONE_UNRELIABLE, msgStatusIcon, _, iID)
write_byte(iMode) // status (0=hide, 1=show, 2=flash)
write_string("item_longjump") // sprite name
write_byte(iColorAmounts[0])
write_byte(iColorAmounts[1])
write_byte(iColorAmounts[2])
message_end()
}
stock ProgressBar(const iID, const iTime, const iStartPercent = 0)
{
/* #if defined DefDebug
log_to_file(g_szFileDebug, "[Player %d] Progress bar message. Time: %d. Start position percentage: %d.", iID, iTime, iStartPercent)
#endif
*/
static msgBarTime2;
if (!msgBarTime2)
msgBarTime2 = get_user_msgid("BarTime2");
message_begin(MSG_ONE_UNRELIABLE, msgBarTime2, _, iID)
write_short(iTime)
write_short(iStartPercent)
message_end()
}
RemoveJetPack(iIDEnt = 0)
{
if (iIDEnt && pev_valid(iIDEnt))
{
remove_task(iIDEnt + g_iIDTaskEntityRemove)
engfunc(EngFunc_RemoveEntity, iIDEnt)
return;
}
iIDEnt = -1;
while ((iIDEnt = engfunc(EngFunc_FindEntityByString, iIDEnt, "classname", g_szClassNameJetPack)) != 0)
{
if (!pev_valid(iIDEnt) || pev(iIDEnt, pev_iuser1))
continue;
remove_task(iIDEnt + g_iIDTaskEntityRemove)
engfunc(EngFunc_RemoveEntity, iIDEnt)
}
}
ftClientPrintChatColor(const iIDTarget, const iIDSender = 0, const szMessage[], any:...)
{
if (iIDTarget && !is_user_inserver(iIDTarget))
return;
static szBuffer[192];
vformat(szBuffer, charsmax(szBuffer), szMessage, 4)
static const D7_CHAT_TAG[] = "^1[^4D7^1] ";
format(szBuffer, charsmax(szBuffer), "%s%s", D7_CHAT_TAG, szBuffer)
static iIDMsgSayText;
if (!iIDMsgSayText)
iIDMsgSayText = get_user_msgid("SayText");
if (iIDTarget)
message_begin(MSG_ONE, iIDMsgSayText, _, iIDTarget)
else
message_begin(MSG_ALL, iIDMsgSayText)
write_byte(!iIDSender ? iIDTarget : iIDSender)
write_string(szBuffer)
message_end()
}