[Script]: IW3 compiler behaviour (#880)

This commit is contained in:
Edo 2023-03-28 20:06:46 +01:00 committed by GitHub
parent 6224728d4b
commit 6006c58c86
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 64 additions and 30 deletions

View File

@ -179,7 +179,7 @@ namespace Components
{ {
GSC::Script::AddMethMultiple(GScr_isTestClient, false, {"IsTestClient", "IsBot"}); // Usage: self IsTestClient(); GSC::Script::AddMethMultiple(GScr_isTestClient, false, {"IsTestClient", "IsBot"}); // Usage: self IsTestClient();
GSC::Script::AddMethod("BotStop", [](Game::scr_entref_t entref) // Usage: <bot> BotStop(); GSC::Script::AddMethod("BotStop", [](const Game::scr_entref_t entref) // Usage: <bot> BotStop();
{ {
const auto* ent = GSC::Script::Scr_GetPlayerEntity(entref); const auto* ent = GSC::Script::Scr_GetPlayerEntity(entref);
if (!Game::SV_IsTestClient(ent->s.number)) if (!Game::SV_IsTestClient(ent->s.number))
@ -193,7 +193,7 @@ namespace Components
g_botai[entref.entnum].active = true; g_botai[entref.entnum].active = true;
}); });
GSC::Script::AddMethod("BotWeapon", [](Game::scr_entref_t entref) // Usage: <bot> BotWeapon(<str>); GSC::Script::AddMethod("BotWeapon", [](const Game::scr_entref_t entref) // Usage: <bot> BotWeapon(<str>);
{ {
const auto* ent = GSC::Script::Scr_GetPlayerEntity(entref); const auto* ent = GSC::Script::Scr_GetPlayerEntity(entref);
if (!Game::SV_IsTestClient(ent->s.number)) if (!Game::SV_IsTestClient(ent->s.number))
@ -214,7 +214,7 @@ namespace Components
g_botai[entref.entnum].active = true; g_botai[entref.entnum].active = true;
}); });
GSC::Script::AddMethod("BotAction", [](Game::scr_entref_t entref) // Usage: <bot> BotAction(<str action>); GSC::Script::AddMethod("BotAction", [](const Game::scr_entref_t entref) // Usage: <bot> BotAction(<str action>);
{ {
const auto* ent = GSC::Script::Scr_GetPlayerEntity(entref); const auto* ent = GSC::Script::Scr_GetPlayerEntity(entref);
if (!Game::SV_IsTestClient(ent->s.number)) if (!Game::SV_IsTestClient(ent->s.number))
@ -253,7 +253,7 @@ namespace Components
Game::Scr_ParamError(0, "BotAction: Unknown action"); Game::Scr_ParamError(0, "BotAction: Unknown action");
}); });
GSC::Script::AddMethod("BotMovement", [](Game::scr_entref_t entref) // Usage: <bot> BotMovement(<int>, <int>); GSC::Script::AddMethod("BotMovement", [](const Game::scr_entref_t entref) // Usage: <bot> BotMovement(<int>, <int>);
{ {
const auto* ent = GSC::Script::Scr_GetPlayerEntity(entref); const auto* ent = GSC::Script::Scr_GetPlayerEntity(entref);
if (!Game::SV_IsTestClient(ent->s.number)) if (!Game::SV_IsTestClient(ent->s.number))

View File

@ -61,31 +61,8 @@ namespace Components
void ClientCommand::AddCheatCommands() void ClientCommand::AddCheatCommands()
{ {
Add("noclip", [](Game::gentity_s* ent, [[maybe_unused]] const Command::ServerParams* params) Add("noclip", Cmd_Noclip_f);
{ Add("ufo", Cmd_UFO_f);
if (!CheatsOk(ent))
return;
ent->client->flags ^= Game::PF_NOCLIP;
const auto entNum = ent->s.number;
Logger::Debug("Noclip toggled for entity {}", entNum);
Game::SV_GameSendServerCommand(entNum, Game::SV_CMD_CAN_IGNORE, VA("%c \"%s\"", 0x65, (ent->client->flags & Game::PF_NOCLIP) ? "GAME_NOCLIPON" : "GAME_NOCLIPOFF"));
});
Add("ufo", [](Game::gentity_s* ent, [[maybe_unused]] const Command::ServerParams* params)
{
if (!CheatsOk(ent))
return;
ent->client->flags ^= Game::PF_UFO;
const auto entNum = ent->s.number;
Logger::Debug("UFO toggled for entity {}", entNum);
Game::SV_GameSendServerCommand(entNum, Game::SV_CMD_CAN_IGNORE, VA("%c \"%s\"", 0x65, (ent->client->flags & Game::PF_UFO) ? "GAME_UFOON" : "GAME_UFOOFF"));
});
Add("god", [](Game::gentity_s* ent, [[maybe_unused]] const Command::ServerParams* params) Add("god", [](Game::gentity_s* ent, [[maybe_unused]] const Command::ServerParams* params)
{ {
@ -369,6 +346,21 @@ namespace Components
}); });
} }
void ClientCommand::AddScriptMethods()
{
GSC::Script::AddMethod("Noclip", [](const Game::scr_entref_t entref) // gsc: self Noclip();
{
auto* ent = GSC::Script::Scr_GetPlayerEntity(entref);
Cmd_Noclip_f(ent, nullptr);
});
GSC::Script::AddMethod("Ufo", [](const Game::scr_entref_t entref) // gsc: self Ufo();
{
auto* ent = GSC::Script::Scr_GetPlayerEntity(entref);
Cmd_UFO_f(ent, nullptr);
});
}
const char* ClientCommand::EntInfoLine(const int entNum) const char* ClientCommand::EntInfoLine(const int entNum)
{ {
const auto* ent = &Game::g_entities[entNum]; const auto* ent = &Game::g_entities[entNum];
@ -477,6 +469,32 @@ namespace Components
Logger::Print(Game::CON_CHANNEL_SERVER, "Done writing file.\n"); Logger::Print(Game::CON_CHANNEL_SERVER, "Done writing file.\n");
} }
void ClientCommand::Cmd_Noclip_f(Game::gentity_s* ent, [[maybe_unused]] const Command::ServerParams* params)
{
if (!CheatsOk(ent))
return;
ent->client->flags ^= Game::PF_NOCLIP;
const auto entNum = ent->s.number;
Logger::Debug("Noclip toggled for entity {}", entNum);
Game::SV_GameSendServerCommand(entNum, Game::SV_CMD_CAN_IGNORE, VA("%c \"%s\"", 0x65, (ent->client->flags & Game::PF_NOCLIP) ? "GAME_NOCLIPON" : "GAME_NOCLIPOFF"));
}
void ClientCommand::Cmd_UFO_f(Game::gentity_s* ent, [[maybe_unused]] const Command::ServerParams* params)
{
if (!CheatsOk(ent))
return;
ent->client->flags ^= Game::PF_UFO;
const auto entNum = ent->s.number;
Logger::Debug("UFO toggled for entity {}", entNum);
Game::SV_GameSendServerCommand(entNum, Game::SV_CMD_CAN_IGNORE, VA("%c \"%s\"", 0x65, (ent->client->flags & Game::PF_UFO) ? "GAME_UFOON" : "GAME_UFOOFF"));
}
ClientCommand::ClientCommand() ClientCommand::ClientCommand()
{ {
AssertOffset(Game::playerState_s, stats, 0x150); AssertOffset(Game::playerState_s, stats, 0x150);
@ -486,6 +504,7 @@ namespace Components
AddCheatCommands(); AddCheatCommands();
AddScriptFunctions(); AddScriptFunctions();
AddScriptMethods();
#ifdef _DEBUG #ifdef _DEBUG
AddDevelopmentCommands(); AddDevelopmentCommands();
#endif #endif

View File

@ -16,10 +16,15 @@ namespace Components
static void ClientCommandStub(int clientNum); static void ClientCommandStub(int clientNum);
static void AddCheatCommands(); static void AddCheatCommands();
static void AddDevelopmentCommands(); static void AddDevelopmentCommands();
static void AddScriptFunctions(); static void AddScriptFunctions();
static void AddScriptMethods();
static const char* EntInfoLine(int entNum); static const char* EntInfoLine(int entNum);
static void G_DumpEntityDebugInfoToConsole(bool logfileOnly); static void G_DumpEntityDebugInfoToConsole(bool logfileOnly);
static void G_DumpEntityDebugInfoToCSV(const char* filenameSuffix); static void G_DumpEntityDebugInfoToCSV(const char* filenameSuffix);
static void Cmd_Noclip_f(Game::gentity_s* ent, const Command::ServerParams* params);
static void Cmd_UFO_f(Game::gentity_s* ent, const Command::ServerParams* params);
}; };
} }

View File

@ -9,6 +9,8 @@
#include <mongoose.h> #include <mongoose.h>
#define MG_OVERRIDE_LOG_FN
namespace Components namespace Components
{ {
static mg_mgr Mgr; static mg_mgr Mgr;
@ -689,7 +691,10 @@ namespace Components
mg_log_set(MG_LL_ERROR); mg_log_set(MG_LL_ERROR);
#endif #endif
#ifdef MG_OVERRIDE_LOG_FN
mg_log_set_fn(LogFn, nullptr); mg_log_set_fn(LogFn, nullptr);
#endif
mg_mgr_init(&Mgr); mg_mgr_init(&Mgr);
Network::OnStart([] Network::OnStart([]

View File

@ -284,5 +284,10 @@ namespace Components::GSC
Utils::Hook(0x4EC8DD, BuiltIn_GetMethodStub, HOOK_CALL).install()->quick(); // Scr_GetMethod Utils::Hook(0x4EC8DD, BuiltIn_GetMethodStub, HOOK_CALL).install()->quick(); // Scr_GetMethod
Utils::Hook(0x5F41A3, SetExpFogStub, HOOK_CALL).install()->quick(); Utils::Hook(0x5F41A3, SetExpFogStub, HOOK_CALL).install()->quick();
// Restore IW3's compiler behaviour when dealing with 'overriding builtin function'
Utils::Hook::Nop(0x613EDA, 2);
Utils::Hook::Nop(0x613EF0, 2);
Utils::Hook::Set<std::uint8_t>(0x613EF9, 0xEB);
} }
} }

View File

@ -110,7 +110,7 @@ namespace Components::GSC
}); });
// Func present on IW5 // Func present on IW5
Script::AddFunction("CastFloat", [] // gsc: CastFloat() Script::AddFunction("Float", [] // gsc: Float()
{ {
switch (Game::Scr_GetType(0)) switch (Game::Scr_GetType(0))
{ {