From 68829d11787fe8e92ba120e0cda1b246875aa95e Mon Sep 17 00:00:00 2001 From: NotAnUser1 <72518912+NotAnUser1@users.noreply.github.com> Date: Wed, 25 Nov 2020 23:20:16 +0300 Subject: [PATCH] added, changed and corrected stuff (#1165) * added, changed and corrected stuff * Add files via upload * reset time should only be displayed on flags apparently carts also have a reset timer that goes to negative values * added flask style to magic spells esp * added "hide invisible" to prevent drawing on invis players * oops these should be aligned * added edibles/lunchboxes support to healthpack esp * gets rid of unneded stuff * changed reset time code to make it look neater * Added more checks to auto strafer Makes it so we don't strafe when we're noclipping, double jumping as scout or in water. This closes https://github.com/nullworks/cathook/issues/1126 and a part of https://github.com/nullworks/cathook/issues/998. * Corrected a small typo in auto pyro * Revert "Add files via upload" This reverts commit f3786b527cd0e8f972091c0960e600786088febc. * spec list attempt #2 hello does this work its my first time using gitkraken * small sandviches, stuff off by default, only 1st person spec is colored ye * yes now objective esp is off by default * Some fixes * Update data/menu/nullifiedcat/visuals/esp.xml * Change colours Co-authored-by: NotAnUser Co-authored-by: TotallyNotElite <1yourexperiment@protonmail.com> Co-authored-by: TotallyNotElite <38938720+TotallyNotElite@users.noreply.github.com> --- data/menu/nullifiedcat/trigger/autopyro.xml | 2 +- data/menu/nullifiedcat/visuals/esp.xml | 3 + data/menu/nullifiedcat/visuals/radar.xml | 1 + include/core/netvars.hpp | 12 +- include/itemtypes.hpp | 12 ++ src/core/netvars.cpp | 4 +- src/hacks/ESP.cpp | 118 ++++++++++++++++---- src/hacks/Misc.cpp | 21 ++-- src/hacks/Radar.cpp | 5 +- src/itemtypes.cpp | 28 +++++ 10 files changed, 170 insertions(+), 36 deletions(-) diff --git a/data/menu/nullifiedcat/trigger/autopyro.xml b/data/menu/nullifiedcat/trigger/autopyro.xml index 72b8cfd2..0d37db54 100755 --- a/data/menu/nullifiedcat/trigger/autopyro.xml +++ b/data/menu/nullifiedcat/trigger/autopyro.xml @@ -5,7 +5,7 @@ - + diff --git a/data/menu/nullifiedcat/visuals/esp.xml b/data/menu/nullifiedcat/visuals/esp.xml index d95795ec..6e5080b7 100755 --- a/data/menu/nullifiedcat/visuals/esp.xml +++ b/data/menu/nullifiedcat/visuals/esp.xml @@ -12,6 +12,7 @@ + @@ -22,6 +23,7 @@ + @@ -102,6 +104,7 @@ diff --git a/data/menu/nullifiedcat/visuals/radar.xml b/data/menu/nullifiedcat/visuals/radar.xml index ac12fe6b..3898874f 100755 --- a/data/menu/nullifiedcat/visuals/radar.xml +++ b/data/menu/nullifiedcat/visuals/radar.xml @@ -26,6 +26,7 @@ + diff --git a/include/core/netvars.hpp b/include/core/netvars.hpp index ba1d551f..9869961d 100644 --- a/include/core/netvars.hpp +++ b/include/core/netvars.hpp @@ -1,4 +1,4 @@ -/* +/* * entity.h * * Created on: Oct 6, 2016 @@ -47,11 +47,11 @@ public: offset_t iHealth; // sentry - offset_t m_iAmmoShells; // sentry shells - offset_t m_iAmmoRockets; // use only with if (GetLevel() == 3) - offset_t m_iSentryState; // sentry state + offset_t m_iAmmoShells; // sentry shells + offset_t m_iAmmoRockets; // use only with if (GetLevel() == 3) + offset_t m_iSentryState; // sentry state offset_t m_bPlayerControlled; // controlled via wrangler and sort - offset_t m_bDisabled; // this should be sentry only, not sure + offset_t m_bDisabled; // this should be sentry only, not sure // dispenser offset_t m_iAmmoMetal; // dispenser metal reserve @@ -101,7 +101,6 @@ public: offset_t iHitboxSet; offset_t vVelocity; offset_t bGlowEnabled; - offset_t movetype; offset_t iGlowIndex; offset_t iReloadMode; offset_t res_iMaxHealth; @@ -207,6 +206,7 @@ public: offset_t m_iPlayerIndex; offset_t m_hTargetPlayer; + offset_t m_flResetTime; }; extern NetVars netvar; diff --git a/include/itemtypes.hpp b/include/itemtypes.hpp index 7c657bfb..499dc7e2 100644 --- a/include/itemtypes.hpp +++ b/include/itemtypes.hpp @@ -20,6 +20,8 @@ enum k_EItemType ITEM_HEALTH_SMALL, ITEM_HEALTH_MEDIUM, ITEM_HEALTH_LARGE, + EDIBLE_MEDIUM, + EDIBLE_SMALL, ITEM_AMMO_SMALL, ITEM_AMMO_MEDIUM, @@ -51,6 +53,16 @@ enum k_EItemType BOMB_WOODENBARREL, BOMB_WALKEREXPLODE, + FLAG_ATOMBOMB, + FLAG_SKULLPICKUP, + FLAG_GIBBUCKET, + FLAG_BOTTLEPICKUP, + FLAG_AUSSIECONTAINER, + FLAG_TICKETCASE, + + CART_BOMBCART, + CART_BOMBCART_RED, + ITEM_TF2C_PILL, ITEM_TF2C_CRITS, diff --git a/src/core/netvars.cpp b/src/core/netvars.cpp index 4cd83028..7b001cc8 100644 --- a/src/core/netvars.cpp +++ b/src/core/netvars.cpp @@ -21,7 +21,6 @@ void NetVars::Init() this->hMyWeapons = gNetvars.get_offset("DT_BaseCombatCharacter", "m_hMyWeapons"); this->iHitboxSet = gNetvars.get_offset("DT_BaseAnimating", "m_nHitboxSet"); this->vVelocity = gNetvars.get_offset("DT_BasePlayer", "localdata", "m_vecVelocity[0]"); - this->movetype = gNetvars.get_offset("DT_BaseEntity", "movetype"); this->m_iAmmo = gNetvars.get_offset("DT_BasePlayer", "localdata", "m_iAmmo"); this->m_iPrimaryAmmoType = gNetvars.get_offset("DT_BaseCombatWeapon", "LocalWeaponData", "m_iPrimaryAmmoType"); this->m_iSecondaryAmmoType = gNetvars.get_offset("DT_BaseCombatWeapon", "LocalWeaponData", "m_iSecondaryAmmoType"); @@ -154,6 +153,9 @@ void NetVars::Init() // Gargoyle this->m_hTargetPlayer = gNetvars.get_offset("DT_CHalloweenGiftPickup", "m_hTargetPlayer"); + + // Flag + this->m_flResetTime = gNetvars.get_offset("DT_CaptureFlag", "m_flResetTime"); } IF_GAME(IsTF2C()) { diff --git a/src/hacks/ESP.cpp b/src/hacks/ESP.cpp index ba0a1e01..8d2ab9b4 100644 --- a/src/hacks/ESP.cpp +++ b/src/hacks/ESP.cpp @@ -35,10 +35,12 @@ static settings::Int sightlines{ "esp.sightlines", "0" }; static settings::Int esp_text_position{ "esp.text-position", "0" }; static settings::Int esp_expand{ "esp.expand", "0" }; static settings::Boolean vischeck{ "esp.vischeck", "true" }; +static settings::Boolean hide_invis{ "esp.hide-invis", "false" }; static settings::Boolean legit{ "esp.legit", "false" }; static settings::Boolean local_esp{ "esp.show.local", "true" }; static settings::Boolean buildings{ "esp.show.buildings", "true" }; +static settings::Boolean team_buildings{ "esp.show.team-buildings", "false" }; static settings::Boolean teammates{ "esp.show.teammates", "true" }; static settings::Boolean npc{ "esp.show.npc", "true" }; @@ -63,6 +65,7 @@ static settings::Boolean item_spellbooks{ "esp.item.spellbook", "true" }; static settings::Boolean item_explosive{ "esp.item.explosive", "true" }; static settings::Boolean item_crumpkin{ "esp.item.crumpkin", "true" }; static settings::Boolean item_gargoyle{ "esp.item.gargoyle", "true" }; +static settings::Boolean item_objectives{ "esp.item.objectives", "false" }; // TF2C static settings::Boolean item_weapon_spawners{ "esp.item.weapon-spawner", "true" }; static settings::Boolean item_adrenaline{ "esp.item.adrenaline", "true" }; @@ -258,15 +261,26 @@ const std::string slowed_str = "*Slow*"; const std::string zooming_str = "*Zoom*"; const std::string crit_str = "*Crits*"; const std::string blast_p_str = "*Blast Passive*"; -const std::string blast_a_str = "*Blast Vaccinator*"; +const std::string blast_a_str = "*Blast-Resist*"; const std::string fire_p_str = "*Fire Passive*"; -const std::string fire_a_str = "*Fire Vaccinator*"; +const std::string fire_a_str = "*Fire-Resist*"; const std::string bullet_p_str = "*Bullet Passive*"; -const std::string bullet_a_str = "*Bullet Vaccinator*"; +const std::string bullet_a_str = "*Bullet-Resist*"; const std::string invulnerable_str = "*Invulnerable*"; const std::string ready_ringer_str = "*Dead Ringer Out*"; const std::string cloaked_str = "*Cloak*"; const std::string in_ringer_str = "*Dead Ringer*"; +const std::string disguised_str = "*Disguise*"; +const std::string intel_str = "Intel"; +const std::string atombomb_str = "Atom Bomb"; +const std::string soulpickup_str = "Soul Pickup"; +const std::string bodyparts_str = "Body Parts"; +const std::string beerbottle_str = "Beer Bottle"; +const std::string aussiecontainer_str = "Australium Container"; +const std::string ticketcase_str = "Tickets"; +const std::string mediumhealth_str = "Medium Health"; +const std::string smallhealth_str = "Small Health"; +const std::string cart_str = "Cart"; const std::string botname_str = "Bot #"; const std::string tp_ready_str = "Ready"; const std::string sapped_str = "*Sapped*"; @@ -658,7 +672,7 @@ void _FASTCALL ProcessEntityPT(CachedEntity *ent) Draw3DBox(ent, fg); break; case ENTITY_BUILDING: - if (CE_INT(ent, netvar.iTeamNum) == g_pLocalPlayer->team && !teammates) + if (CE_INT(ent, netvar.iTeamNum) == g_pLocalPlayer->team && !team_buildings) break; if (!fg) fg = colors::EntityF(ent); @@ -1197,7 +1211,7 @@ void _FASTCALL ProcessEntity(CachedEntity *ent) } } // Explosive/Environmental hazard esp - else if (item_explosive && (classid == CL_CLASS(CTFPumpkinBomb) || itemtype == BOMB_BALLOONBOMB || itemtype == BOMB_WOODENBARREL || itemtype == BOMB_WALKEREXPLODE)) + else if (item_explosive && (classid == CL_CLASS(CTFPumpkinBomb) || itemtype >= BOMB_BALLOONBOMB && itemtype <= BOMB_WALKEREXPLODE)) { if (classid == CL_CLASS(CTFPumpkinBomb)) AddEntityString(ent, pumpkinbomb_str, colors::FromRGBA8(255, 162, 0, 255)); @@ -1217,21 +1231,75 @@ void _FASTCALL ProcessEntity(CachedEntity *ent) } } } + if (item_objectives && (classid == CL_CLASS(CCaptureFlag) || itemtype >= FLAG_ATOMBOMB && itemtype <= CART_BOMBCART_RED)) + { + rgba_t color = ent->m_iTeam() == TEAM_BLU ? colors::blu : (ent->m_iTeam() == TEAM_RED ? colors::red : colors::white); + + switch (itemtype) + { + case FLAG_ATOMBOMB: + AddEntityString(ent, atombomb_str, color); + break; + case FLAG_SKULLPICKUP: + AddEntityString(ent, soulpickup_str, color); + break; + case FLAG_GIBBUCKET: + AddEntityString(ent, bodyparts_str, color); + break; + case FLAG_BOTTLEPICKUP: + AddEntityString(ent, beerbottle_str, color); + break; + case FLAG_AUSSIECONTAINER: + AddEntityString(ent, aussiecontainer_str, color); + break; + case FLAG_TICKETCASE: + AddEntityString(ent, ticketcase_str, color); + break; + case CART_BOMBCART: + AddEntityString(ent, cart_str, colors::blu); + break; + case CART_BOMBCART_RED: + AddEntityString(ent, cart_str, colors::red); + break; + default: + AddEntityString(ent, intel_str, color); + break; + } + + auto resettime = CE_FLOAT(ent, netvar.m_flResetTime); + std::string time = std::to_string(int(resettime - g_GlobalVars->curtime)); + time.append("s"); + + if (resettime && classid == CL_CLASS(CCaptureFlag)) + AddEntityString(ent, time, colors::FromRGBA8(98, 163, 213, 255)); + } // Other item esp else if (itemtype != ITEM_NONE) { // Health pack esp - if (item_health_packs && (itemtype >= ITEM_HEALTH_SMALL && itemtype <= ITEM_HEALTH_LARGE || itemtype == ITEM_HL_BATTERY)) + if (item_health_packs && (itemtype >= ITEM_HEALTH_SMALL && itemtype <= EDIBLE_MEDIUM || itemtype == ITEM_HL_BATTERY)) { - if (itemtype == ITEM_HEALTH_SMALL) + switch (itemtype) + { + case ITEM_HEALTH_SMALL: AddEntityString(ent, health_small_str); - if (itemtype == ITEM_HEALTH_MEDIUM) + break; + case ITEM_HEALTH_MEDIUM: AddEntityString(ent, health_medium_str); - if (itemtype == ITEM_HEALTH_LARGE) + break; + case ITEM_HEALTH_LARGE: AddEntityString(ent, health_big_str); - if (itemtype == ITEM_HL_BATTERY) + break; + case ITEM_HL_BATTERY: AddEntityString(ent, hl_battery_str); - + break; + case EDIBLE_MEDIUM: + AddEntityString(ent, mediumhealth_str, colors::green); + break; + case EDIBLE_SMALL: + AddEntityString(ent, smallhealth_str, colors::green); + break; + } // TF2C Adrenaline esp } else if (item_adrenaline && itemtype == ITEM_TF2C_PILL) @@ -1242,13 +1310,18 @@ void _FASTCALL ProcessEntity(CachedEntity *ent) } else if (item_ammo_packs && itemtype >= ITEM_AMMO_SMALL && itemtype <= ITEM_AMMO_LARGE) { - if (itemtype == ITEM_AMMO_SMALL) + switch (itemtype) + { + case ITEM_AMMO_SMALL: AddEntityString(ent, ammo_small_str); - if (itemtype == ITEM_AMMO_MEDIUM) + break; + case ITEM_AMMO_MEDIUM: AddEntityString(ent, ammo_medium_str); - if (itemtype == ITEM_AMMO_LARGE) + break; + case ITEM_AMMO_LARGE: AddEntityString(ent, ammo_big_str); - + break; + } // Powerup esp } else if (item_powerups && itemtype >= ITEM_POWERUP_FIRST && itemtype <= ITEM_POWERUP_LAST) @@ -1302,7 +1375,7 @@ void _FASTCALL ProcessEntity(CachedEntity *ent) { // Check if enemy building - if (!ent->m_bEnemy() && !teammates) + if (!ent->m_bEnemy() && !team_buildings) return; // TODO maybe... @@ -1318,6 +1391,7 @@ void _FASTCALL ProcessEntity(CachedEntity *ent) const std::string &name = (classid == CL_CLASS(CObjectTeleporter) ? teleporter_str : (classid == CL_CLASS(CObjectSentrygun) ? sentry_str : dispenser_str)); int level = CE_INT(ent, netvar.iUpgradeLevel); bool IsMini = CE_BYTE(ent, netvar.m_bMiniBuilding); + if (!IsMini) AddEntityString(ent, format("Level ", level, ' ', name)); else @@ -1384,7 +1458,7 @@ void _FASTCALL ProcessEntity(CachedEntity *ent) { float next_teleport = CE_FLOAT(ent, netvar.m_flTeleRechargeTime); float yaw_to_exit = CE_FLOAT(ent, netvar.m_flTeleYawToExit); - std::string time = std::to_string((int) floor((next_teleport - g_GlobalVars->curtime) * 100) / 100); + std::string time = std::to_string(int(next_teleport - g_GlobalVars->curtime)); time.append("s"); if (yaw_to_exit) @@ -1417,6 +1491,8 @@ void _FASTCALL ProcessEntity(CachedEntity *ent) // Local player handling if (!(local_esp && g_IInput->CAM_IsThirdPerson()) && ent->m_IDX == g_IEngine->GetLocalPlayer()) return; + if (hide_invis && IsPlayerInvisible(ent)) + return; // Get player class int pclass = CE_INT(ent, netvar.iClass); @@ -1499,14 +1575,14 @@ void _FASTCALL ProcessEntity(CachedEntity *ent) CachedEntity *weapon = ENTITY(eid); if (!CE_INVALID(weapon) && weapon->m_iClassID() == CL_CLASS(CWeaponMedigun) && weapon) { - std::string charge = std::to_string((int) floor(CE_FLOAT(weapon, netvar.m_flChargeLevel) * 100)); + std::string charge = std::to_string(int(CE_FLOAT(weapon, netvar.m_flChargeLevel) * 100)); if (CE_INT(weapon, netvar.iItemDefinitionIndex) != 998) { - AddEntityString(ent, charge + "% Uber", colors::Health(floor(CE_FLOAT(weapon, netvar.m_flChargeLevel) * 100), 100)); + AddEntityString(ent, charge + "% Uber", colors::Health(CE_FLOAT(weapon, netvar.m_flChargeLevel) * 100, 100)); } else - AddEntityString(ent, charge + "% Uber | Charges: " + std::to_string(floor(CE_FLOAT(weapon, netvar.m_flChargeLevel) / 0.25f)), colors::Health((CE_FLOAT(weapon, netvar.m_flChargeLevel) * 100), 100)); + AddEntityString(ent, charge + "% Uber | Charges: " + std::to_string(int(CE_FLOAT(weapon, netvar.m_flChargeLevel) / 0.25f)), colors::Health((CE_FLOAT(weapon, netvar.m_flChargeLevel) * 100), 100)); break; } } @@ -1533,6 +1609,8 @@ void _FASTCALL ProcessEntity(CachedEntity *ent) } if (CE_BYTE(ent, netvar.m_bFeignDeathReady)) AddEntityString(ent, ready_ringer_str, colors::FromRGBA8(178.0f, 0.0f, 255.0f, 255.0f)); + if (HasCondition(ent)) + AddEntityString(ent, disguised_str, colors::FromRGBA8(220, 220, 220, 255)); // Uber/Bonk if (IsPlayerInvulnerable(ent)) AddEntityString(ent, invulnerable_str); diff --git a/src/hacks/Misc.cpp b/src/hacks/Misc.cpp index 89bad42e..0138dba7 100644 --- a/src/hacks/Misc.cpp +++ b/src/hacks/Misc.cpp @@ -207,17 +207,21 @@ void CreateMove() if (anti_afk) updateAntiAfk(); - // Automaticly airstrafes in the air - if (auto_strafe) + // Automatically strafes in the air + if (auto_strafe && CE_GOOD(LOCAL_E) && !g_pLocalPlayer->life_state) { - auto ground = (bool) (CE_INT(g_pLocalPlayer->entity, netvar.iFlags) & FL_ONGROUND); - if (!ground) + static bool was_jumping = false; + auto flags = CE_INT(LOCAL_E, netvar.iFlags); + bool is_jumping = current_user_cmd->buttons & IN_JUMP; + + if (!(flags & FL_ONGROUND) && !(flags & FL_INWATER) && (!is_jumping || was_jumping)) { if (current_user_cmd->mousedx) { current_user_cmd->sidemove = current_user_cmd->mousedx > 1 ? 450.f : -450.f; } } + was_jumping = is_jumping; } // TF2c Tauntslide @@ -372,19 +376,22 @@ void Draw() if (!CE_BAD(ent) && ent != LOCAL_E && ent->m_Type() == ENTITY_PLAYER && (CE_INT(ent, netvar.hObserverTarget) & 0xFFF) == LOCAL_E->m_IDX && CE_INT(ent, netvar.iObserverMode) >= 4 && g_IEngine->GetPlayerInfo(i, &info)) { auto observermode = "N/A"; + rgba_t color = colors::green; + switch (CE_INT(ent, netvar.iObserverMode)) { case 4: - observermode = "Firstperson"; + observermode = "1st Person"; + color = colors::red_b; break; case 5: - observermode = "Thirdperson"; + observermode = "3rd Person"; break; case 7: observermode = "Freecam"; break; } - AddSideString(format(info.name, " ", observermode)); + AddSideString(format(info.name, " - (", observermode, ")"), color); } } } diff --git a/src/hacks/Radar.cpp b/src/hacks/Radar.cpp index a842a47e..563ecd2b 100644 --- a/src/hacks/Radar.cpp +++ b/src/hacks/Radar.cpp @@ -28,6 +28,7 @@ static settings::Boolean show_teammates{ "radar.show.teammates", "true" }; static settings::Boolean show_teambuildings{ "radar.show.team.buildings", "true" }; static settings::Boolean show_healthpacks{ "radar.show.health", "true" }; static settings::Boolean show_ammopacks{ "radar.show.ammo", "true" }; +static settings::Boolean hide_invis{ "radar.hide-invis", "false" }; static Timer invalid{}; @@ -105,8 +106,10 @@ void DrawEntity(int x, int y, CachedEntity *ent) { if (ent->m_Type() == ENTITY_PLAYER) { - if (CE_BYTE(ent, netvar.iLifeState)) + if (ent->m_bAlivePlayer()) return; // DEAD. not big surprise. + if (hide_invis && IsPlayerInvisible(ent)) + return; const int &clazz = CE_INT(ent, netvar.iClass); const int &team = CE_INT(ent, netvar.iTeamNum); idx = team - 2; diff --git a/src/itemtypes.cpp b/src/itemtypes.cpp index d29b5653..04bd2448 100644 --- a/src/itemtypes.cpp +++ b/src/itemtypes.cpp @@ -24,6 +24,14 @@ ItemManager::ItemManager() : mapper() RegisterModelMapping("models/items/medkit_large_bday.mdl", ITEM_HEALTH_LARGE); // Medieval RegisterModelMapping("models/props_medieval/medieval_meat.mdl", ITEM_HEALTH_MEDIUM); + // Edibles / Lunchboxes + RegisterModelMapping("models/items/plate.mdl", EDIBLE_MEDIUM); + RegisterModelMapping("models/items/plate_sandwich_xmas.mdl", EDIBLE_MEDIUM); + RegisterModelMapping("models/items/plate_robo_sandwich.mdl", EDIBLE_MEDIUM); + RegisterModelMapping("models/workshop/weapons/c_models/c_fishcake/plate_fishcake.mdl", EDIBLE_SMALL); + RegisterModelMapping("models/workshop/weapons/c_models/c_buffalo_steak/plate_buffalo_steak.mdl", EDIBLE_SMALL); + RegisterModelMapping("models/workshop/weapons/c_models/c_chocolate/plate_chocolate.mdl", EDIBLE_SMALL); + RegisterModelMapping("models/items/banana/plate_banana.mdl", EDIBLE_SMALL); // == AMMOPACKS // Normal @@ -70,8 +78,10 @@ ItemManager::ItemManager() : mapper() // Spellbooks RegisterModelMapping("models/props_halloween/hwn_spellbook_upright.mdl", ITEM_SPELL); RegisterModelMapping("models/items/crystal_ball_pickup.mdl", ITEM_SPELL); + RegisterModelMapping("models/props_monster_mash/flask_vial_green.mdl", ITEM_SPELL); RegisterModelMapping("models/props_halloween/hwn_spellbook_upright_major.mdl", ITEM_SPELL_RARE); RegisterModelMapping("models/items/crystal_ball_pickup_major.mdl", ITEM_SPELL_RARE); + RegisterModelMapping("models/props_monster_mash/flask_vial_purple.mdl", ITEM_SPELL_RARE); // == GHOSTS RegisterModelMapping("models/props_halloween/ghost.mdl", HALLOWEEN_GHOST); @@ -83,6 +93,24 @@ ItemManager::ItemManager() : mapper() RegisterModelMapping("models/props_coast/wooden_barrel.mdl", BOMB_WOODENBARREL); RegisterModelMapping("models/props_invasion/props_alien/walker_explode.mdl", BOMB_WALKEREXPLODE); + // == FLAGS + RegisterModelMapping("models/props_td/atom_bomb.mdl", FLAG_ATOMBOMB); + RegisterModelMapping("models/props_pirate/pd_skull_pickup.mdl", FLAG_SKULLPICKUP); + RegisterModelMapping("models/effects/playersoul.mdl", FLAG_SKULLPICKUP); + RegisterModelMapping("models/props_monster_mash/gib_bucket.mdl", FLAG_GIBBUCKET); + RegisterModelMapping("models/props_watergate/bottle_pickup.mdl", FLAG_BOTTLEPICKUP); + RegisterModelMapping("models/props_doomsday/australium_container.mdl", FLAG_AUSSIECONTAINER); + RegisterModelMapping("models/flag/ticket_case.mdl", FLAG_TICKETCASE); + + // == BOMB CARTS + RegisterModelMapping("models/props_trainyard/bomb_cart.mdl", CART_BOMBCART); + RegisterModelMapping("models/custom/dirty_bomb_cart.mdl", CART_BOMBCART); + RegisterModelMapping("models/lilchewchew/lilchewchew_v3.mdl", CART_BOMBCART); + RegisterModelMapping("models/props_trainyard/bomb_redmond.mdl", CART_BOMBCART); + RegisterModelMapping("models/props_snowycoast/gasoline_bomb_cart.mdl", CART_BOMBCART); + RegisterModelMapping("models/props_trainyard/bomb_blutarch.mdl", CART_BOMBCART_RED); + RegisterModelMapping("models/props_trainyard/bomb_cart_red.mdl", CART_BOMBCART_RED); + RegisterSpecialMapping([](CachedEntity *ent) -> bool { return ent->m_iClassID() == CL_CLASS(CTFAmmoPack) && g_ItemManager.mapper.GetItemType(ent) != ITEM_CRUMPKIN; }, ITEM_AMMO_MEDIUM); RegisterModelMapping("models/items/medkit_overheal.mdl", ITEM_TF2C_PILL);