diff --git a/src/Components/Modules/Command.cpp b/src/Components/Modules/Command.cpp index 5f23f9a2..30f6be8a 100644 --- a/src/Components/Modules/Command.cpp +++ b/src/Components/Modules/Command.cpp @@ -164,8 +164,11 @@ namespace Components static int toastDurationMedium = 2500; static int toastDurationLong = 5000; - // Disable native noclip command - Utils::Hook::Nop(0x474846, 5); + // Disable native cheat commands + Utils::Hook::Nop(0x474846, 5); // Cmd_Noclip_f + Utils::Hook::Nop(0x474859, 5); // Cmd_UFO_f + Utils::Hook::Nop(0x47480A, 5); // Cmd_God_f + Utils::Hook::Nop(0x47481D, 5); // Cmd_DemiGod_f Command::Add("noclip", [](Command::Params*) { @@ -213,6 +216,52 @@ namespace Components Toast::Show("cardicon_abduction", "Success", "UFO toggled", toastDurationShort); }); + Command::Add("god", [](Command::Params*) + { + int clientNum = Game::CG_GetClientNum(); + if (!Game::CL_IsCgameInitialized() || clientNum >= 18 || clientNum < 0) + { + Logger::Print("You are not hosting a match!\n"); + Toast::Show("cardicon_stop", "Error", "You are not hosting a match!", toastDurationMedium); + return; + } + + if (!Dvar::Var("sv_cheats").get()) + { + Logger::Print("Cheats disabled!\n"); + Toast::Show("cardicon_stop", "Error", "Cheats disabled!", toastDurationMedium); + return; + } + + Game::g_entities[clientNum].flags ^= Game::FL_GODMODE; + + Logger::Print("Godmode toggled\n"); + Toast::Show("cardicon_abduction", "Success", "Godmode toggled", toastDurationShort); + }); + + Command::Add("demigod", [](Command::Params*) + { + int clientNum = Game::CG_GetClientNum(); + if (!Game::CL_IsCgameInitialized() || clientNum >= 18 || clientNum < 0) + { + Logger::Print("You are not hosting a match!\n"); + Toast::Show("cardicon_stop", "Error", "You are not hosting a match!", toastDurationMedium); + return; + } + + if (!Dvar::Var("sv_cheats").get()) + { + Logger::Print("Cheats disabled!\n"); + Toast::Show("cardicon_stop", "Error", "Cheats disabled!", toastDurationMedium); + return; + } + + Game::g_entities[clientNum].flags ^= Game::FL_DEMI_GODMODE; + + Logger::Print("Demigod toggled\n"); + Toast::Show("cardicon_abduction", "Success", "Demigod toggled", toastDurationShort); + }); + Command::Add("setviewpos", [](Command::Params* params) { int clientNum = Game::CG_GetClientNum(); diff --git a/src/Components/Modules/Script.cpp b/src/Components/Modules/Script.cpp index d97c1486..dfd614af 100644 --- a/src/Components/Modules/Script.cpp +++ b/src/Components/Modules/Script.cpp @@ -636,7 +636,7 @@ namespace Components Script::ScriptStorage.clear(); }); - Script::AddFunction("Noclip", [](Game::scr_entref_t entref) + Script::AddFunction("Noclip", [](Game::scr_entref_t entref) // gsc: Noclip(); { if (entref >= Game::MAX_GENTITIES || Game::g_entities[entref].client == nullptr) { @@ -644,7 +644,7 @@ namespace Components return; } - if (Game::Scr_GetNumParam() == 1 && Game::Scr_GetType(0) == Game::VAR_INTEGER) + if (Game::Scr_GetNumParam() == 1u && Game::Scr_GetType(0) == Game::VAR_INTEGER) { if (Game::Scr_GetInt(0)) { @@ -661,7 +661,7 @@ namespace Components } }); - Script::AddFunction("Ufo", [](Game::scr_entref_t entref) + Script::AddFunction("Ufo", [](Game::scr_entref_t entref) // gsc: Ufo(); { if (entref >= Game::MAX_GENTITIES || Game::g_entities[entref].client == nullptr) { @@ -669,7 +669,7 @@ namespace Components return; } - if (Game::Scr_GetNumParam() == 1 && Game::Scr_GetType(0) == Game::VAR_INTEGER) + if (Game::Scr_GetNumParam() == 1u && Game::Scr_GetType(0) == Game::VAR_INTEGER) { if (Game::Scr_GetInt(0)) { @@ -685,6 +685,56 @@ namespace Components Game::g_entities[entref].client->flags ^= Game::PLAYER_FLAG_UFO; } }); + + Script::AddFunction("God", [](Game::scr_entref_t entref) // gsc: God(); + { + if (entref >= Game::MAX_GENTITIES) + { + Game::Scr_Error(Utils::String::VA("^1God: entity %u is out of bounds\n", entref)); + return; + } + + if (Game::Scr_GetNumParam() == 1u && Game::Scr_GetType(0) == Game::VAR_INTEGER) + { + if (Game::Scr_GetInt(0)) + { + Game::g_entities[entref].flags |= Game::FL_GODMODE; + } + else + { + Game::g_entities[entref].flags &= ~Game::FL_GODMODE; + } + } + else + { + Game::g_entities[entref].flags ^= Game::FL_GODMODE; + } + }); + + Script::AddFunction("Demigod", [](Game::scr_entref_t entref) // gsc: Demigod(); + { + if (entref >= Game::MAX_GENTITIES) + { + Game::Scr_Error(Utils::String::VA("^1Demigod: entity %u is out of bounds\n", entref)); + return; + } + + if (Game::Scr_GetNumParam() == 1u && Game::Scr_GetType(0) == Game::VAR_INTEGER) + { + if (Game::Scr_GetInt(0)) + { + Game::g_entities[entref].flags |= Game::FL_DEMI_GODMODE; + } + else + { + Game::g_entities[entref].flags &= ~Game::FL_DEMI_GODMODE; + } + } + else + { + Game::g_entities[entref].flags ^= Game::FL_DEMI_GODMODE; + } + }); } Script::Script() diff --git a/src/Game/Structs.hpp b/src/Game/Structs.hpp index bb2bd6f3..8a74e54d 100644 --- a/src/Game/Structs.hpp +++ b/src/Game/Structs.hpp @@ -189,6 +189,28 @@ namespace Game ERR_MAPLOADERRORSUMMARY = 0x7 } errorParm_t; + enum entityFlag + { + FL_GODMODE = 0x1, + FL_DEMI_GODMODE = 0x2, + FL_NOTARGET = 0x4, + FL_NO_KNOCKBACK = 0x8, + FL_NO_RADIUS_DAMAGE = 0x10, + FL_SUPPORTS_LINKTO = 0x1000, + FL_NO_AUTO_ANIM_UPDATE = 0x2000, + FL_GRENADE_TOUCH_DAMAGE = 0x4000, + FL_STABLE_MISSILES = 0x20000, + FL_REPEAT_ANIM_UPDATE = 0x40000, + FL_VEHICLE_TARGET = 0x80000, + FL_GROUND_ENT = 0x100000, + FL_CURSOR_HINT = 0x200000, + FL_MISSILE_ATTRACTOR = 0x800000, + FL_WEAPON_BEING_GRABBED = 0x1000000, + FL_DELETE = 0x2000000, + FL_BOUNCE = 0x4000000, + FL_MOVER_SLIDE = 0x8000000 + }; + struct FxEffectDef; struct pathnode_t; struct pathnode_tree_t;