RSSy MYGO.pl Opublikowano Listopad 18, 2022 o 20:33 RSSy Udostępnij Opublikowano Listopad 18, 2022 o 20:33 D i 5 7 i n c T's JetPack Non-player dependant JetPack entity. Compatible with Zombie Plague 4.3(will add ZP5 support later). Runs on any GoldSource(Half-Life 1) engine game. Supports Counter-Strike: Condition Zero bots. Short video: Command to buy: say jp Command to give jetpack as an admin with amx_cvar access: say jp name CVar list(they are self explanatory): PHP Code: D7N4DJPVelocityMax 265.0 D7N4DJPFuelRegenPercentage 3.757 D7N4DJPRemoveTime 600.0 D7N4DJPFuelRegenStartDelay 5 D7N4DJPFuelRegenInterval 0.1 D7N4DJPFuelConsumptionPercentage 1.0 D7N4DJPVelocityAcceleration 50.0 D7N4DJPThrustDelay 0.05 D7N4DJPPickUpCooldown 0.3 D7N4DJPCost 7500 None. This plug-in requires the following: - BitSum stocks include file (bitsums.inc). Attached along below. - Optional: Ham Bots API. Latest version as of 2015 December 22 of the script(cs_ham_bots_api.sma) and include(cs_ham_bots_api.inc) are attached along below. To enable support for CZ bots(Ham Bots API required), simply uncomment the following line and recompile: PHP Code: //#include <cs_ham_bots_api> --> PHP Code: #include <cs_ham_bots_api> Get source and compile locally. yokomo - For his original N4D JetPack plug-in which mine is based on. MeRcyLeZZ - For his HamSandwich register bots API. dorin2oo7 - For his images I used to style up my post. NiHiLaNTh, schmurgel1983, KliPPy, meTaLiCroSS - For being true friends and always helping and teaching me new stuff. Code: T = needs testing X = done - = cancelled [X] dead and/or zombie bit [X] movetype_follow entity [X] follow entity glow depending on fuel? [X] make all the variable names descriptive [X] upper the customization parts [X] cs-like drop system [X] time-based flight(+max thrusts per second) [X] fix fuel regen task [X] fix jetpack disappearing on spawn/new round sometimes [X] fix incorrect rendering color? [X] fix bots not fully using the fuel [T] bypass the acceleration cvar if value is <= 180.0 and velocity is 0.0 [X] fix icon disappearing on resethud [X] custom keys to press [X] (re)pick up delay [X] (re)pick up delay cvar [-] velocity by aim remove X vector? [T] fixed bug where dead players could fly with jetpack after not fully losing it on death(mode not started) [T] fixed bug where enable pickup task would remain active after entity was removed after drop [T] added removing the update hud task wherever it was necessary [T] fixed bug where entity iID wouldn't be removed from the jetpack list array when entity was removed after drop [T] changed the function which was removing all of the jetpacks to be able to remove only a single specified jetpack too [T] fix jetpacks getting removed from players which died before round mode start [-] initialize all information on entity create [-] delete all information on entity remove? v0.3.6 [T] add chat commands to buy and give jp as admin [T] add support for zp 4 [T] add random chance for bot to buy [T] hold jump to fly [T] cvar to find servers running the plugin [X] flame sprite reposition [X] no fall damage for bots [X] fix cvars not caching at the start of the map because round start doesn't trigger v0.4.4 [ ] remove fakemeta or engine [ ] remove unnecessary code [ ] optimize [ ] cvars for enabling/customizing icon [ ] cvars for enabling/customizing player model [ ] admin menu and/or commands to give/take/drop item [ ] time-based jetpack (ac/de)celeration [ ] cvar to bypass the max thrusts per second if velocity is < than a certain value(default 180.00001) [ ] cooldown -1 = as soon as the player touches the ground [ ] find out the player's exact deceleration rate for any gravity level [ ] trail instead of sprite message [ ] fix velocity_by_aim messing with our vertical velocity [ ] custom touch forward [ ] make a simple cvar for how long it should take to fully refuel and remove the rest? [ ] add support for zp 5 [ ] multi lang Code(for easy readability): 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", "0.3.6", "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() } cs_ham_bots_api.sma cs_ham_bots_api.inc bitsums.inc Attached Files Get Plugin or Get Source (D7N4DJetPack.sma - 30.0 KB) Przeczytaj cały wpis Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi