#pragma once namespace Components { class Script : public Component { public: Script(); using scriptNames = std::vector; static void AddFunction(const std::string& name, Game::BuiltinFunction func, bool type = false); static void AddMethod(const std::string& name, Game::BuiltinMethod func, bool type = false); static void AddFuncMultiple(Game::BuiltinFunction func, bool type, scriptNames); static void AddMethMultiple(Game::BuiltinMethod func, bool type, scriptNames); static Game::client_t* GetClient(const Game::gentity_t* gentity); // Probably a macro 'originally' but this is fine static Game::gentity_s* Scr_GetPlayerEntity(Game::scr_entref_t entref) { if (entref.classnum != 0) { Game::Scr_ObjectError("not an entity"); return nullptr; } assert(entref.entnum < Game::MAX_GENTITIES); auto* ent = &Game::g_entities[entref.entnum]; if (ent->client == nullptr) { Game::Scr_ObjectError(Utils::String::VA("entity %i is not a player", entref.entnum)); return nullptr; } return ent; } private: struct ScriptFunction { Game::BuiltinFunction actionFunc; bool type; scriptNames aliases; }; struct ScriptMethod { Game::BuiltinMethod actionFunc; bool type; scriptNames aliases; }; static std::vector CustomScrFunctions; static std::vector CustomScrMethods; static std::unordered_map ScriptMainHandles; static std::unordered_map ScriptInitHandles; static void Scr_LoadGameType_Stub(); static void Scr_StartupGameType_Stub(); static void GScr_LoadGameTypeScript_Stub(); static Game::BuiltinFunction BuiltIn_GetFunctionStub(const char** pName, int* type); static Game::BuiltinMethod BuiltIn_GetMethodStub(const char** pName, int* type); static unsigned int SetExpFogStub(); }; }