1
0
mirror of https://github.com/VCMP-SqMod/SqMod.git synced 2024-11-08 08:47:17 +01:00
SqMod/source/Core.cpp

1805 lines
63 KiB
C++
Raw Normal View History

2015-09-30 02:56:11 +02:00
#include "Core.hpp"
#include "Debug.hpp"
2015-09-30 02:56:11 +02:00
#include "Logger.hpp"
#include "Entity.hpp"
#include "Register.hpp"
// ------------------------------------------------------------------------------------------------
#include "Command.hpp"
2015-09-30 02:56:11 +02:00
#include "Misc/Automobile.hpp"
#include "Misc/Model.hpp"
// ------------------------------------------------------------------------------------------------
#include <SimpleIni.h>
// ------------------------------------------------------------------------------------------------
#include <sqstdio.h>
#include <sqstdblob.h>
#include <sqstdmath.h>
#include <sqstdsystem.h>
#include <sqstdstring.h>
// ------------------------------------------------------------------------------------------------
#include <cstdarg>
#include <sstream>
#include <fstream>
#include <algorithm>
#include <exception>
// ------------------------------------------------------------------------------------------------
namespace SqMod {
// ------------------------------------------------------------------------------------------------
const Core::Pointer _Core = Core::Inst();
// ------------------------------------------------------------------------------------------------
static std::shared_ptr<CSimpleIni> g_Config;
// ------------------------------------------------------------------------------------------------
Core::Core()
2015-09-30 02:56:11 +02:00
: m_State(SQMOD_SUCCESS)
, m_Options()
, m_VM(nullptr)
, m_Scripts()
, m_ErrorMsg()
, m_PlayerTrack()
, m_VehicleTrack()
, m_BufferPool()
, m_Uptime(0.0)
2015-09-30 02:56:11 +02:00
{
// Create a few shared buffers
MakeBuffer(8);
}
// ------------------------------------------------------------------------------------------------
Core::~Core()
{
// Tell the plug-in to terminate
2015-09-30 02:56:11 +02:00
this->Terminate();
}
// ------------------------------------------------------------------------------------------------
void Core::_Finalizer(Core * ptr)
2015-09-30 02:56:11 +02:00
{
delete ptr; /* Assuming 'delete' checks for NULL */
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
Core::Pointer Core::Inst()
2015-09-30 02:56:11 +02:00
{
if (!_Core)
{
return Pointer(new Core(), &Core::_Finalizer);
}
2015-10-02 00:34:28 +02:00
2015-09-30 02:56:11 +02:00
return Pointer(nullptr, &Core::_Finalizer);
}
// ------------------------------------------------------------------------------------------------
bool Core::Init()
2015-09-30 02:56:11 +02:00
{
2015-10-25 02:20:33 +02:00
LogMsg("%s", CenterStr("INITIALIZING", '*'));
// Attempt to initialize the plug-in resources
2015-09-30 02:56:11 +02:00
if (!this->Configure() || !this->CreateVM() || !this->LoadScripts())
{
return false;
}
// Initialize the player message prefixes
Ent< CPlayer >::Prefixes.fill(Ent< CPlayer >::MsgPrefix::value_type());
// Initialize the player message styles
Ent< CPlayer >::MessageColor = 0x6599FFFF;
Ent< CPlayer >::AnnounceStyle = 1;
2015-10-25 02:20:33 +02:00
LogMsg("%s", CenterStr("SUCCESS", '*'));
2015-09-30 02:56:11 +02:00
return true;
}
bool Core::Load()
2015-09-30 02:56:11 +02:00
{
2015-10-25 02:20:33 +02:00
LogMsg("%s", CenterStr("LOADING", '*'));
// Attempt to execute the loaded scripts
2015-09-30 02:56:11 +02:00
if (!this->Execute())
{
return false;
}
2015-10-25 02:20:33 +02:00
LogMsg("%s", CenterStr("SUCCESS", '*'));
2015-09-30 02:56:11 +02:00
return true;
}
// ------------------------------------------------------------------------------------------------
void Core::Deinit()
2015-09-30 02:56:11 +02:00
{
// Release the VM created during the initialization process
2015-09-30 02:56:11 +02:00
this->DestroyVM();
}
void Core::Unload()
2015-09-30 02:56:11 +02:00
{
}
// ------------------------------------------------------------------------------------------------
void Core::Terminate()
2015-09-30 02:56:11 +02:00
{
this->Deinit();
this->Unload();
}
// ------------------------------------------------------------------------------------------------
void Core::SetState(SQInteger val)
2015-09-30 02:56:11 +02:00
{
m_State = val;
}
SQInteger Core::GetState() const
2015-09-30 02:56:11 +02:00
{
return m_State;
}
// ------------------------------------------------------------------------------------------------
string Core::GetOption(const String & name) const
2015-09-30 02:56:11 +02:00
{
// Attempt to find the specified option
2015-09-30 02:56:11 +02:00
OptionPool::const_iterator elem = m_Options.find(name);
// Return the value associated with the found option
return (elem == m_Options.cend()) ? String() : elem->second;
2015-09-30 02:56:11 +02:00
}
void Core::SetOption(const String & name, const String & value)
2015-09-30 02:56:11 +02:00
{
m_Options[name] = value;
}
// ------------------------------------------------------------------------------------------------
SQFloat Core::GetUptime() const
{
return m_Uptime;
}
// ------------------------------------------------------------------------------------------------
Buffer Core::PullBuffer(unsigned sz)
2015-09-30 02:56:11 +02:00
{
// The container that will manage the buffer
2015-09-30 02:56:11 +02:00
Buffer buf;
// See if there's any buffers available in the pool
2015-09-30 02:56:11 +02:00
if (m_BufferPool.empty())
{
// Create a new buffer if one wasn't available
buf.Reserve(sz);
2015-09-30 02:56:11 +02:00
}
// Is the last buffer big enough?
else if (m_BufferPool.back().Size() >= sz)
2015-09-30 02:56:11 +02:00
{
// Fetch the buffer
2015-09-30 02:56:11 +02:00
buf = std::move(m_BufferPool.back());
// Remove it from the pool
m_BufferPool.pop_back();
}
// Is the first buffer big enough?
else if (m_BufferPool.front().Size() >= sz)
{
// Fetch the buffer
buf = std::move(m_BufferPool.front());
// Remove it from the pool
m_BufferPool.pop_front();
}
// Just fetch one from the pool if possible
else
{
// Get an iterator to the beginning of the pool
auto itr = m_BufferPool.begin();
// See if there are any buffers with the size we need
for (; itr != m_BufferPool.end(); ++itr)
{
if (itr->Size() >= sz)
{
// Stop searching
break;
}
}
// Have we found anything?
if (itr != m_BufferPool.end())
{
// Fetch the buffer
buf = std::move((*itr));
// Remove it from the pool
m_BufferPool.erase(itr);
}
// Just make one to satisfy the requested size
else
{
buf.Reserve(sz);
}
2015-09-30 02:56:11 +02:00
}
// Give the obtained buffer
2015-09-30 02:56:11 +02:00
return std::move(buf);
}
// ------------------------------------------------------------------------------------------------
void Core::PushBuffer(Buffer && buf)
2015-09-30 02:56:11 +02:00
{
// Make sure we don't store empty buffers
if (buf)
{
// Return the specified buffer back to the pool
m_BufferPool.push_back(std::move(buf));
}
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::MakeBuffer(unsigned num, unsigned sz)
2015-09-30 02:56:11 +02:00
{
// Create the specified number of buffers
2015-09-30 02:56:11 +02:00
while (num--)
{
m_BufferPool.emplace_back(sz);
2015-09-30 02:56:11 +02:00
}
}
// ------------------------------------------------------------------------------------------------
void Core::ConnectPlayer(SQInt32 id, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
// Attempt to activate the instance in the plug-in at the received identifier
2015-09-30 02:56:11 +02:00
if (EntMan< CPlayer >::Activate(id, false))
{
// Trigger the specific event
OnPlayerCreated(id, header, payload);
}
else
{
LogErr("Unable to activate player instance: %d", id);
2015-09-30 02:56:11 +02:00
}
}
void Core::DisconnectPlayer(SQInt32 id, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
// Attempt to deactivate this player instance
if (!EntMan< CPlayer >::Deactivate(id, header, payload, true))
2015-09-30 02:56:11 +02:00
{
LogErr("Unable to deactivate player instance: %d", id);
2015-09-30 02:56:11 +02:00
}
}
// ------------------------------------------------------------------------------------------------
bool Core::Configure()
2015-09-30 02:56:11 +02:00
{
2015-10-25 02:20:33 +02:00
LogDbg("Attempting to instantiate the configuration file");
// See if the configurations instance was previously created
2015-09-30 02:56:11 +02:00
if (g_Config)
{
// Release the loaded configurations
2015-09-30 02:56:11 +02:00
g_Config->Reset();
}
// Create the configuration instance
2015-09-30 02:56:11 +02:00
else
{
g_Config.reset(new CSimpleIniA(true, true, true));
}
// See if a configuration instance could be created
2015-09-30 02:56:11 +02:00
if (!g_Config)
{
2015-10-25 02:20:33 +02:00
LogFtl("Unable to instantiate the configuration class");
2015-09-30 02:56:11 +02:00
return false;
}
2015-10-25 02:20:33 +02:00
LogDbg("Attempting to load the configuration file.");
// Attempt to load the configurations from disk
2015-09-30 02:56:11 +02:00
SI_Error ini_ret = g_Config->LoadFile(_SC("./sqmod.ini"));
// See if the configurations could be loaded
2015-09-30 02:56:11 +02:00
if (ini_ret < 0)
{
switch (ini_ret)
{
2015-10-25 02:20:33 +02:00
case SI_FAIL: LogErr("Failed to load the configuration file. Probably invalid"); break;
case SI_NOMEM: LogErr("Run out of memory while loading the configuration file"); break;
case SI_FILE: LogErr("Failed to load the configuration file. %s", strerror(errno)); break;
default: LogErr("Failed to load the configuration file for some unforeseen reason");
2015-09-30 02:56:11 +02:00
}
return false;
}
2015-10-25 02:20:33 +02:00
LogDbg("Applying the specified logging filters");
// Apply the specified logging filters before anything else
2015-09-30 02:56:11 +02:00
if (!SToB(g_Config->GetValue("ConsoleLog", "Debug", "true"))) _Log->DisableConsoleLevel(Logger::LEVEL_DBG);
if (!SToB(g_Config->GetValue("ConsoleLog", "Message", "true"))) _Log->DisableConsoleLevel(Logger::LEVEL_MSG);
if (!SToB(g_Config->GetValue("ConsoleLog", "Success", "true"))) _Log->DisableConsoleLevel(Logger::LEVEL_SCS);
if (!SToB(g_Config->GetValue("ConsoleLog", "Info", "true"))) _Log->DisableConsoleLevel(Logger::LEVEL_INF);
if (!SToB(g_Config->GetValue("ConsoleLog", "Warning", "true"))) _Log->DisableConsoleLevel(Logger::LEVEL_WRN);
if (!SToB(g_Config->GetValue("ConsoleLog", "Error", "true"))) _Log->DisableConsoleLevel(Logger::LEVEL_ERR);
if (!SToB(g_Config->GetValue("ConsoleLog", "Fatal", "true"))) _Log->DisableConsoleLevel(Logger::LEVEL_FTL);
if (!SToB(g_Config->GetValue("FileLog", "Debug", "true"))) _Log->DisableFileLevel(Logger::LEVEL_DBG);
if (!SToB(g_Config->GetValue("FileLog", "Message", "true"))) _Log->DisableFileLevel(Logger::LEVEL_MSG);
if (!SToB(g_Config->GetValue("FileLog", "Success", "true"))) _Log->DisableFileLevel(Logger::LEVEL_SCS);
if (!SToB(g_Config->GetValue("FileLog", "Info", "true"))) _Log->DisableFileLevel(Logger::LEVEL_INF);
if (!SToB(g_Config->GetValue("FileLog", "Warning", "true"))) _Log->DisableFileLevel(Logger::LEVEL_WRN);
if (!SToB(g_Config->GetValue("FileLog", "Error", "true"))) _Log->DisableFileLevel(Logger::LEVEL_ERR);
if (!SToB(g_Config->GetValue("FileLog", "Fatal", "true"))) _Log->DisableFileLevel(Logger::LEVEL_FTL);
2015-10-25 02:20:33 +02:00
LogDbg("Reading the options from the general section");
2015-09-30 02:56:11 +02:00
CSimpleIniA::TNamesDepend general_options;
if (g_Config->GetAllKeys("Options", general_options) || general_options.size() > 0)
{
2015-10-25 02:20:33 +02:00
for (const auto & cfg_option : general_options)
2015-09-30 02:56:11 +02:00
{
CSimpleIniA::TNamesDepend option_list;
if (!g_Config->GetAllValues("Options", cfg_option.pItem, option_list))
{
continue;
}
option_list.sort(CSimpleIniA::Entry::LoadOrder());
2015-10-25 02:20:33 +02:00
for (const auto & cfg_value : option_list)
2015-09-30 02:56:11 +02:00
{
m_Options[cfg_option.pItem] = cfg_value.pItem;
}
}
}
else
{
2015-10-25 02:20:33 +02:00
LogInf("No options specified in the configuration file");
2015-09-30 02:56:11 +02:00
}
return true;
}
// ------------------------------------------------------------------------------------------------
bool Core::CreateVM()
2015-09-30 02:56:11 +02:00
{
2015-10-25 02:20:33 +02:00
LogDbg("Acquiring the virtual machine stack size");
2015-09-30 02:56:11 +02:00
// Start with an unknown stack size
SQInteger stack_size = SQMOD_UNKNOWN;
// Attempt to get it from the configuration file
try
{
2015-10-25 02:20:33 +02:00
stack_size = SToI< SQInteger >::Fn(GetOption(_SC("VMStackSize")), 0, 10);
2015-09-30 02:56:11 +02:00
}
catch (const std::invalid_argument & e)
{
2015-10-25 02:20:33 +02:00
LogWrn("Unable to extract option value: %s", e.what());
2015-09-30 02:56:11 +02:00
}
// Validate the stack size
if (stack_size <= 0)
{
2015-10-25 02:20:33 +02:00
LogWrn("Invalid stack size. Reverting to default size: %d", SQMOD_STACK_SIZE);
2015-09-30 02:56:11 +02:00
SetOption(_SC("VMStackSize"), std::to_string(SQMOD_STACK_SIZE));
stack_size = SQMOD_STACK_SIZE;
}
2015-10-25 02:20:33 +02:00
LogInf("Creating a virtual machine with a stack size of: %d", stack_size);
2015-09-30 02:56:11 +02:00
m_VM = sq_open(stack_size);
if (!m_VM)
{
2015-10-25 02:20:33 +02:00
LogFtl("Unable to open a virtual machine with a stack size: %d", stack_size);
2015-09-30 02:56:11 +02:00
return false;
}
else
{
DefaultVM::Set(m_VM);
ErrorHandling::Enable(true);
m_Scripts.clear();
_Dbg->SetVM(m_VM);
2015-09-30 02:56:11 +02:00
}
2015-10-25 02:20:33 +02:00
LogDbg("Registering the standard libraries");
// Register the standard libraries
2015-09-30 02:56:11 +02:00
sq_pushroottable(m_VM);
sqstd_register_iolib(m_VM);
sqstd_register_bloblib(m_VM);
sqstd_register_mathlib(m_VM);
sqstd_register_systemlib(m_VM);
sqstd_register_stringlib(m_VM);
sq_pop(m_VM, 1);
2015-10-25 02:20:33 +02:00
LogDbg("Setting the base output function");
// Set the function that handles the text output
2015-09-30 02:56:11 +02:00
sq_setprintfunc(m_VM, PrintFunc, ErrorFunc);
2015-10-25 02:20:33 +02:00
LogDbg("Setting the base error handlers");
// Se the error handlers
2015-09-30 02:56:11 +02:00
sq_setcompilererrorhandler(m_VM, CompilerErrorHandler);
sq_newclosure(m_VM, RuntimeErrorHandler, 0);
sq_seterrorhandler(m_VM);
LogDbg("Registering the plug-in API");
// Register the plug-in API
2015-09-30 02:56:11 +02:00
if (!RegisterAPI(m_VM))
{
LogFtl("Unable to register the plug-in API");
2015-09-30 02:56:11 +02:00
return false;
}
2015-10-25 02:20:33 +02:00
// At this point the VM is ready
2015-09-30 02:56:11 +02:00
return true;
}
void Core::DestroyVM()
2015-09-30 02:56:11 +02:00
{
// See if the Virtual Machine wasn't already destroyed
2015-10-02 00:34:28 +02:00
if (m_VM != nullptr)
{
2015-10-25 02:20:33 +02:00
// Let instances know that they should release links to this VM
OnVMClose();
// Release the references to the script objects
m_Scripts.clear();
2015-10-25 02:20:33 +02:00
// Assertions during close may cause double delete
HSQUIRRELVM sq_vm = m_VM;
2015-10-03 20:54:34 +02:00
// Explicitly set the virtual machine to null
2015-10-02 00:34:28 +02:00
m_VM = nullptr;
2015-10-25 02:20:33 +02:00
// Close the Virtual Machine
sq_close(sq_vm);
// Remove it from the debugger as well
_Dbg->SetVM(NULL);
2015-10-02 00:34:28 +02:00
}
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
bool Core::LoadScripts()
2015-09-30 02:56:11 +02:00
{
2015-10-25 02:20:33 +02:00
LogDbg("Attempting to compile the specified scripts");
// See if the config file was loaded
2015-09-30 02:56:11 +02:00
if (!g_Config)
{
2015-10-25 02:20:33 +02:00
LogWrn("Cannot compile any scripts without the configurations");
// No point in loading the plug-in
2015-09-30 02:56:11 +02:00
return false;
}
// Attempt to retrieve the list of strings specified in the config
2015-09-30 02:56:11 +02:00
CSimpleIniA::TNamesDepend script_list;
g_Config->GetAllValues("Scripts", "Source", script_list);
// See if any script was specified
2015-09-30 02:56:11 +02:00
if (script_list.size() <= 0)
{
2015-10-25 02:20:33 +02:00
LogWrn("No scripts specified in the configuration file");
// No point in loading the plug-in
2015-09-30 02:56:11 +02:00
return false;
}
// Sort the list in it's original order
2015-09-30 02:56:11 +02:00
script_list.sort(CSimpleIniA::Entry::LoadOrder());
// Process each specified script path
2015-09-30 02:56:11 +02:00
for (auto const & cfg_script : script_list)
{
// Get the file path as a string
2015-09-30 02:56:11 +02:00
string path(cfg_script.pItem);
// See if it wasn't already loaded
2015-09-30 02:56:11 +02:00
if (m_Scripts.find(path) != m_Scripts.cend())
{
2015-10-25 02:20:33 +02:00
LogWrn("Script was already loaded: %s", path.c_str());
// No point in loading it again
2015-09-30 02:56:11 +02:00
continue;
}
// Attempt to compile it
2015-09-30 02:56:11 +02:00
else if (!Compile(path))
{
// Plug-in shouldn't load
2015-09-30 02:56:11 +02:00
return false;
}
else
{
2015-10-25 02:20:33 +02:00
LogScs("Successfully compiled script: %s", path.c_str());
2015-09-30 02:56:11 +02:00
}
}
// See if any script could be compiled
2015-09-30 02:56:11 +02:00
if (m_Scripts.empty())
{
LogErr("No scripts compiled. No reason to load the plug-in");
// No point in loading the plug-in
2015-09-30 02:56:11 +02:00
return false;
}
// At this point everything went as expected
2015-09-30 02:56:11 +02:00
return true;
}
// ------------------------------------------------------------------------------------------------
bool Core::Compile(const string & name)
2015-09-30 02:56:11 +02:00
{
// See if the specified script path is valid
2015-09-30 02:56:11 +02:00
if (name.empty())
{
2015-10-25 02:20:33 +02:00
LogErr("Cannot compile script without a valid name");
// Failed to compile the specified script
2015-09-30 02:56:11 +02:00
return false;
}
// Create a new script container and insert it into the script pool
2015-09-30 02:56:11 +02:00
std::pair< SqScriptPool::iterator, bool > res = m_Scripts.emplace(name, Script(m_VM));
// See if the script container could be created and inserted
2015-09-30 02:56:11 +02:00
if (res.second)
{
// Attempt to load and compile the specified script file
2015-09-30 02:56:11 +02:00
res.first->second.CompileFile(name);
// See if any compile time error occurred in the compiled script
2015-09-30 02:56:11 +02:00
if (Error::Occurred(m_VM))
{
// Output debugging information
2015-10-25 02:20:33 +02:00
LogErr("Unable to compile script: %s", name.c_str());
LogInf("=> %s", Error::Message(m_VM).c_str());
// Release the script container
2015-09-30 02:56:11 +02:00
m_Scripts.erase(res.first);
// Failed to compile the specified script
2015-09-30 02:56:11 +02:00
return false;
}
}
// Failed to create the script container
2015-09-30 02:56:11 +02:00
else
{
2015-10-25 02:20:33 +02:00
LogErr("Unable to queue script: %s", name.c_str());
// Failed to compile the specified script
2015-09-30 02:56:11 +02:00
return false;
}
// At this point everything went as it should
2015-09-30 02:56:11 +02:00
return true;
}
bool Core::Execute()
2015-09-30 02:56:11 +02:00
{
2015-10-25 02:20:33 +02:00
LogDbg("Attempting to execute the specified scripts");
// Go through each loaded script
2015-09-30 02:56:11 +02:00
for (auto & elem : m_Scripts)
{
// Attempt to execute the script
2015-09-30 02:56:11 +02:00
elem.second.Run();
// See if the executed script had any errors
2015-09-30 02:56:11 +02:00
if (Error::Occurred(m_VM))
{
// Output the error information
2015-10-25 02:20:33 +02:00
LogErr("Unable to execute script: %s", elem.first.c_str());
LogInf("=> %s", Error::Message(m_VM).c_str());
// Failed to execute scripts
2015-09-30 02:56:11 +02:00
return false;
}
else
{
2015-10-25 02:20:33 +02:00
LogScs("Successfully executed script: %s", elem.first.c_str());
2015-09-30 02:56:11 +02:00
}
}
// At this point everything succeeded
2015-09-30 02:56:11 +02:00
return true;
}
// ------------------------------------------------------------------------------------------------
void Core::PrintCallstack()
2015-09-30 02:56:11 +02:00
{
SQStackInfos si;
// Begin a new section in the console
2015-10-25 02:20:33 +02:00
LogMsg("%s", CenterStr("CALLSTACK", '*'));
// Trace back the function call
2015-09-30 02:56:11 +02:00
for (SQInteger level = 1; SQ_SUCCEEDED(sq_stackinfos(m_VM, level, &si)); ++level)
{
// Function name
2015-10-25 02:20:33 +02:00
LogInf("FUNCTION %s()", si.funcname ? si.funcname : _SC("unknown"));
// Function location
2015-10-25 02:20:33 +02:00
LogInf("=> [%d] : {%s}", si.line, si.source ? si.source : _SC("unknown"));
2015-09-30 02:56:11 +02:00
}
// Dummy variables used to retrieve values from the Squirrel VM
2015-09-30 02:56:11 +02:00
const SQChar * s_ = 0, * name = 0;
SQInteger i_, seq = 0;
SQFloat f_;
SQUserPointer p_;
// Begin a new section in the console
2015-10-25 02:20:33 +02:00
LogMsg("%s", CenterStr("LOCALS", '*'));
// Process each local variable
2015-09-30 02:56:11 +02:00
for (SQInteger level = 0; level < 10; level++) {
seq = 0;
while((name = sq_getlocal(m_VM, level, seq))) {
++seq;
switch(sq_gettype(m_VM, -1))
{
case OT_NULL:
2015-10-25 02:20:33 +02:00
LogInf("NULL [%s] : ...", name);
2015-09-30 02:56:11 +02:00
break;
case OT_INTEGER:
sq_getinteger(m_VM, -1, &i_);
2015-10-25 02:20:33 +02:00
LogInf("INTEGER [%s] : {%d}", name, i_);
2015-09-30 02:56:11 +02:00
break;
case OT_FLOAT:
sq_getfloat(m_VM, -1, &f_);
2015-10-25 02:20:33 +02:00
LogInf("FLOAT [%s] : {%f}", name, f_);
2015-09-30 02:56:11 +02:00
break;
case OT_USERPOINTER:
sq_getuserpointer(m_VM, -1, &p_);
2015-10-25 02:20:33 +02:00
LogInf("USERPOINTER [%s] : {%p}\n", name, p_);
2015-09-30 02:56:11 +02:00
break;
case OT_STRING:
sq_getstring(m_VM, -1, &s_);
2015-10-25 02:20:33 +02:00
LogInf("STRING [%s] : {%s}", name, s_);
2015-09-30 02:56:11 +02:00
break;
case OT_TABLE:
2015-10-25 02:20:33 +02:00
LogInf("TABLE [%s] : ...", name);
2015-09-30 02:56:11 +02:00
break;
case OT_ARRAY:
2015-10-25 02:20:33 +02:00
LogInf("ARRAY [%s] : ...", name);
2015-09-30 02:56:11 +02:00
break;
case OT_CLOSURE:
2015-10-25 02:20:33 +02:00
LogInf("CLOSURE [%s] : ...", name);
2015-09-30 02:56:11 +02:00
break;
case OT_NATIVECLOSURE:
2015-10-25 02:20:33 +02:00
LogInf("NATIVECLOSURE [%s] : ...", name);
2015-09-30 02:56:11 +02:00
break;
case OT_GENERATOR:
2015-10-25 02:20:33 +02:00
LogInf("GENERATOR [%s] : ...", name);
2015-09-30 02:56:11 +02:00
break;
case OT_USERDATA:
2015-10-25 02:20:33 +02:00
LogInf("USERDATA [%s] : ...", name);
2015-09-30 02:56:11 +02:00
break;
case OT_THREAD:
2015-10-25 02:20:33 +02:00
LogInf("THREAD [%s] : ...", name);
2015-09-30 02:56:11 +02:00
break;
case OT_CLASS:
2015-10-25 02:20:33 +02:00
LogInf("CLASS [%s] : ...", name);
2015-09-30 02:56:11 +02:00
break;
case OT_INSTANCE:
2015-10-25 02:20:33 +02:00
LogInf("INSTANCE [%s] : ...", name);
2015-09-30 02:56:11 +02:00
break;
case OT_WEAKREF:
2015-10-25 02:20:33 +02:00
LogInf("WEAKREF [%s] : ...", name);
2015-09-30 02:56:11 +02:00
break;
case OT_BOOL:
sq_getinteger(m_VM, -1, &i_);
2015-10-25 02:20:33 +02:00
LogInf("BOOL [%s] : {%s}", name, i_ ? _SC("true") : _SC("false"));
2015-09-30 02:56:11 +02:00
break;
default:
2015-10-25 02:20:33 +02:00
LogErr("UNKNOWN [%s] : ...", name);
2015-09-30 02:56:11 +02:00
break;
}
sq_pop(m_VM, 1);
}
}
}
// ------------------------------------------------------------------------------------------------
void Core::PrintFunc(HSQUIRRELVM vm, const SQChar * str, ...)
2015-09-30 02:56:11 +02:00
{
SQMOD_UNUSED_VAR(vm);
2015-10-25 02:20:33 +02:00
// Prepare the arguments list
2015-09-30 02:56:11 +02:00
va_list args;
va_start(args, str);
2015-10-25 02:20:33 +02:00
// Acquire a buffer from the buffer pool
Buffer vbuf = _Core->PullBuffer();
2015-10-25 02:20:33 +02:00
// Attempt to process the specified format string
SQInt32 fmt_ret = std::vsnprintf(vbuf.Data(), vbuf.Size(), str, args);
2015-10-25 02:20:33 +02:00
// See if the formatting was successful
2015-09-30 02:56:11 +02:00
if (fmt_ret < 0)
{
2015-10-25 02:20:33 +02:00
// Return the buffer back to the buffer pool
_Core->PushBuffer(std::move(vbuf));
LogErr("Format error");
2015-09-30 02:56:11 +02:00
return;
}
2015-10-25 02:20:33 +02:00
// See if the buffer was big enough
else if (_SCU32(fmt_ret) > vbuf.Size())
2015-09-30 02:56:11 +02:00
{
// Resize the buffer to accommodate the required size
vbuf.Reserve(++fmt_ret);
2015-10-25 02:20:33 +02:00
// Attempt to process the specified format string again
fmt_ret = std::vsnprintf(vbuf.Data(), vbuf.Size(), str, args);
2015-10-25 02:20:33 +02:00
// See if the formatting was successful
if (fmt_ret < 0)
{
// Return the buffer back to the buffer pool
_Core->PushBuffer(std::move(vbuf));
LogErr("Format error");
return;
}
2015-09-30 02:56:11 +02:00
}
2015-10-25 02:20:33 +02:00
// Release the arguments list
2015-09-30 02:56:11 +02:00
va_end(args);
2015-10-25 02:20:33 +02:00
// Output the buffer content
LogMsg("%s", vbuf.Data());
2015-10-25 02:20:33 +02:00
// Return the buffer back to the buffer pool
_Core->PushBuffer(std::move(vbuf));
2015-09-30 02:56:11 +02:00
}
void Core::ErrorFunc(HSQUIRRELVM vm, const SQChar * str, ...)
2015-09-30 02:56:11 +02:00
{
SQMOD_UNUSED_VAR(vm);
2015-10-25 02:20:33 +02:00
// Prepare the arguments list
2015-09-30 02:56:11 +02:00
va_list args;
va_start(args, str);
2015-10-25 02:20:33 +02:00
// Acquire a buffer from the buffer pool
Buffer vbuf = _Core->PullBuffer();
2015-10-25 02:20:33 +02:00
// Attempt to process the specified format string
SQInt32 fmt_ret = std::vsnprintf(vbuf.Data(), vbuf.Size(), str, args);
2015-10-25 02:20:33 +02:00
// See if the formatting was successful
if (fmt_ret < 0)
2015-09-30 02:56:11 +02:00
{
2015-10-25 02:20:33 +02:00
// Return the buffer back to the buffer pool
_Core->PushBuffer(std::move(vbuf));
LogErr("Format error");
return;
2015-09-30 02:56:11 +02:00
}
2015-10-25 02:20:33 +02:00
// See if the buffer was big enough
else if (_SCU32(fmt_ret) > vbuf.Size())
2015-10-25 02:20:33 +02:00
{
// Resize the buffer to accommodate the required size
vbuf.Reserve(++fmt_ret);
2015-10-25 02:20:33 +02:00
// Attempt to process the specified format string again
fmt_ret = std::vsnprintf(vbuf.Data(), vbuf.Size(), str, args);
2015-10-25 02:20:33 +02:00
// See if the formatting was successful
if (fmt_ret < 0)
{
// Return the buffer back to the buffer pool
_Core->PushBuffer(std::move(vbuf));
LogErr("Format error");
return;
}
}
// Release the arguments list
2015-09-30 02:56:11 +02:00
va_end(args);
2015-10-25 02:20:33 +02:00
// Output the buffer content
LogErr("%s", vbuf.Data());
2015-10-25 02:20:33 +02:00
// Return the buffer back to the buffer pool
_Core->PushBuffer(std::move(vbuf));
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
SQInteger Core::RuntimeErrorHandler(HSQUIRRELVM vm)
2015-09-30 02:56:11 +02:00
{
// Verify the top of the stack and whether there's any information to process
2015-09-30 02:56:11 +02:00
if (sq_gettop(vm) < 1)
{
return 0;
}
const SQChar * err_msg = NULL;
// Attempt to retrieve the error message
2015-09-30 02:56:11 +02:00
if (SQ_SUCCEEDED(sq_getstring(vm, 2, &err_msg)))
{
_Core->m_ErrorMsg.assign(err_msg);
}
else
{
_Core->m_ErrorMsg.assign(_SC("An unknown runtime error has occurred"));
}
// Start a new section in the console
2015-10-25 02:20:33 +02:00
LogMsg("%s", CenterStr("ERROR", '*'));
// Output the retrieved error message
2015-10-25 02:20:33 +02:00
LogInf("[MESSAGE] : %s", _Core->m_ErrorMsg.c_str());
// See if the specified verbosity level allows a print of the call-stack
2015-09-30 02:56:11 +02:00
if (_Log->GetVerbosity() > 0)
{
_Core->PrintCallstack();
}
// Close the console section
2015-10-25 02:20:33 +02:00
LogMsg("%s", CenterStr("CONCLUDED", '*'));
// The error was handled
2015-09-30 02:56:11 +02:00
return SQ_OK;
}
void Core::CompilerErrorHandler(HSQUIRRELVM vm, const SQChar * desc, const SQChar * src, SQInteger line, SQInteger column)
2015-09-30 02:56:11 +02:00
{
SQMOD_UNUSED_VAR(vm);
2015-09-30 02:56:11 +02:00
try
{
_Core->m_ErrorMsg.assign(ToStringF("%s : %s:%d : %s", src, line, column, desc));
2015-09-30 02:56:11 +02:00
}
catch (const std::exception & e)
{
2015-10-25 02:20:33 +02:00
LogErr("Compiler error: %s", e.what());
2015-09-30 02:56:11 +02:00
_Core->m_ErrorMsg.assign(_SC("An unknown compiler error has occurred"));
}
// Output the obtained error message
2015-10-25 02:20:33 +02:00
LogErr("%s", _Core->m_ErrorMsg.c_str());
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
Reference< CBlip > Core::NewBlip(SQInt32 index, SQInt32 world, SQFloat x, SQFloat y, SQFloat z,
SQInt32 scale, SQUint32 color, SQInt32 sprid,
SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
// Attempt to create the entity and return a reference to it
return Reference< CBlip >(EntMan< CBlip >::Create(header, payload, true,
index, world, x, y, z, scale, color, sprid));
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
Reference< CCheckpoint > Core::NewCheckpoint(SQInt32 player, SQInt32 world, SQFloat x, SQFloat y, SQFloat z,
Uint8 r, Uint8 g, Uint8 b, Uint8 a, SQFloat radius,
SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
// See if the specified player reference is valid
if (!Reference< CPlayer >::Verify(player))
2015-09-30 02:56:11 +02:00
{
LogWrn("Attempting to <create a checkpoint instance> on an invalid player: %d", player);
2015-09-30 02:56:11 +02:00
}
// Attempt to create the entity and return a reference to it
2015-09-30 02:56:11 +02:00
else
{
return Reference< CCheckpoint >(EntMan< CCheckpoint >::Create(header, payload, true,
player, world, x, y, z, r, g, b, a, radius));
2015-09-30 02:56:11 +02:00
}
// Return an invalid reference
return Reference< CCheckpoint >();
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
Reference< CKeybind > Core::NewKeybind(SQInt32 slot, bool release,
SQInt32 primary, SQInt32 secondary, SQInt32 alternative,
SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
// Attempt to create the entity and return a reference to it
return Reference< CKeybind >(EntMan< CKeybind >::Create(header, payload, true,
slot, release, primary, secondary, alternative));
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
Reference< CObject > Core::NewObject(SQInt32 model, SQInt32 world, SQFloat x, SQFloat y, SQFloat z,
SQInt32 alpha,
SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
// See if the specified model is valid
if (!CModel::Valid(model))
2015-09-30 02:56:11 +02:00
{
LogWrn("Attempting to <create an object instance> using an invalid model: %d", model);
2015-09-30 02:56:11 +02:00
}
// Attempt to create the entity and return a reference to it
2015-09-30 02:56:11 +02:00
else
{
return Reference< CObject >(EntMan< CObject >::Create(header, payload, true,
model, world, x, y, z, alpha));
2015-09-30 02:56:11 +02:00
}
// Return an invalid reference
return Reference< CObject >();
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
Reference< CPickup > Core::NewPickup(SQInt32 model, SQInt32 world, SQInt32 quantity,
SQFloat x, SQFloat y, SQFloat z, SQInt32 alpha, bool automatic,
SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
// See if the specified model is valid
if (!CModel::Valid(model))
2015-09-30 02:56:11 +02:00
{
LogWrn("Attempting to <create a pickup instance> using an invalid model: %d", model);
2015-09-30 02:56:11 +02:00
}
// Attempt to create the entity and return a reference to it
2015-09-30 02:56:11 +02:00
else
{
return Reference< CPickup >(EntMan< CPickup >::Create(header, payload, true,
model, world, quantity, x, y, z, alpha, automatic));
2015-09-30 02:56:11 +02:00
}
// Return an invalid reference
return Reference< CPickup >();
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
Reference< CSphere > Core::NewSphere(SQInt32 player, SQInt32 world, SQFloat x, SQFloat y, SQFloat z,
Uint8 r, Uint8 g, Uint8 b, SQFloat radius,
SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
// See if the specified player reference is valid
if (!Reference< CPlayer >::Verify(player))
2015-09-30 02:56:11 +02:00
{
LogWrn("Attempting to <create a Sphere instance> on an invalid player: %d", player);
2015-09-30 02:56:11 +02:00
}
// Attempt to create the entity and return a reference to it
2015-09-30 02:56:11 +02:00
else
{
return Reference< CSphere >(EntMan< CSphere >::Create(header, payload, true,
player, world, x, y, z, r, g, b, radius));
2015-09-30 02:56:11 +02:00
}
// Return an invalid reference
return Reference< CSphere >();
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
Reference< CSprite > Core::NewSprite(SQInt32 index, const SQChar * file, SQInt32 xp, SQInt32 yp,
SQInt32 xr, SQInt32 yr, SQFloat angle, SQInt32 alpha, bool rel,
SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
// See if the specified file path is valid
if (!file)
2015-09-30 02:56:11 +02:00
{
LogWrn("Attempting to <create a sprite instance> with an empty path: null");
2015-09-30 02:56:11 +02:00
}
// Attempt to create the entity and return a reference to it
2015-09-30 02:56:11 +02:00
else
{
return Reference< CSprite >(EntMan< CSprite >::Create(header, payload, true,
index, file, xp, yp, xr, yr, angle, alpha, rel));
2015-09-30 02:56:11 +02:00
}
// Return an invalid reference
return Reference< CSprite >();
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
Reference< CTextdraw > Core::NewTextdraw(SQInt32 index, const SQChar * text, SQInt32 xp, SQInt32 yp,
SQUint32 color, bool rel,
SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
// See if the specified text is valid
if (!text)
2015-09-30 02:56:11 +02:00
{
LogWrn("Attempting to <create a textdraw instance> using an empty text: null");
2015-09-30 02:56:11 +02:00
}
// Attempt to create the entity and return a reference to it
2015-09-30 02:56:11 +02:00
else
{
return Reference< CTextdraw >(EntMan< CTextdraw >::Create(header, payload, true,
index, text, xp, yp, color, rel));
2015-09-30 02:56:11 +02:00
}
// Return an invalid reference
return Reference< CTextdraw >();
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
Reference< CVehicle > Core::NewVehicle(SQInt32 model, SQInt32 world, SQFloat x, SQFloat y, SQFloat z,
SQFloat angle, SQInt32 primary, SQInt32 secondary,
SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
// See if the specified model is valid
if (!CAutomobile::Valid(model))
2015-09-30 02:56:11 +02:00
{
LogWrn("Attempting to <create a vehicle instance> using an invalid model: %d", model);
2015-09-30 02:56:11 +02:00
}
// Attempt to create the entity and return a reference to it
2015-09-30 02:56:11 +02:00
else
{
return Reference< CVehicle >(EntMan< CVehicle >::Create(header, payload, true,
model, world, x, y, z, angle, primary, secondary));
2015-09-30 02:56:11 +02:00
}
// Return an invalid reference
return Reference< CVehicle >();
2015-09-30 02:56:11 +02:00
}
2015-11-08 06:20:31 +01:00
// ------------------------------------------------------------------------------------------------
void Core::OnVMClose()
{
// Call base classes manually
_Cmd->VMClose();
// Froward to instances
VMClose.Emit();
}
2015-09-30 02:56:11 +02:00
// ------------------------------------------------------------------------------------------------
void Core::OnBlipCreated(SQInt32 blip, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
BlipCreated.Emit(blip, header, payload);
Reference< CBlip >::Get(blip).BlipCreated.Emit(blip, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnCheckpointCreated(SQInt32 checkpoint, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
CheckpointCreated.Emit(checkpoint, header, payload);
Reference< CCheckpoint >::Get(checkpoint).CheckpointCreated.Emit(checkpoint, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnKeybindCreated(SQInt32 keybind, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
KeybindCreated.Emit(keybind, header, payload);
Reference< CKeybind >::Get(keybind).KeybindCreated.Emit(keybind, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnObjectCreated(SQInt32 object, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
ObjectCreated.Emit(object, header, payload);
Reference< CObject >::Get(object).ObjectCreated.Emit(object, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnPickupCreated(SQInt32 pickup, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
PickupCreated.Emit(pickup, header, payload);
Reference< CPickup >::Get(pickup).PickupCreated.Emit(pickup, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerCreated(SQInt32 player, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
PlayerCreated.Emit(player, header, payload);
Reference< CPlayer >::Get(player).PlayerCreated.Emit(player, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnSphereCreated(SQInt32 sphere, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
SphereCreated.Emit(sphere, header, payload);
Reference< CSphere >::Get(sphere).SphereCreated.Emit(sphere, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnSpriteCreated(SQInt32 sprite, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
SpriteCreated.Emit(sprite, header, payload);
Reference< CSprite >::Get(sprite).SpriteCreated.Emit(sprite, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnTextdrawCreated(SQInt32 textdraw, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
TextdrawCreated.Emit(textdraw, header, payload);
Reference< CTextdraw >::Get(textdraw).TextdrawCreated.Emit(textdraw, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnVehicleCreated(SQInt32 vehicle, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
VehicleCreated.Emit(vehicle, header, payload);
Reference< CVehicle >::Get(vehicle).VehicleCreated.Emit(vehicle, header, payload);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnBlipDestroyed(SQInt32 blip, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
BlipDestroyed.Emit(blip, header, payload);
Reference< CBlip >::Get(blip).BlipDestroyed.Emit(blip, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnCheckpointDestroyed(SQInt32 checkpoint, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
CheckpointDestroyed.Emit(checkpoint, header, payload);
Reference< CCheckpoint >::Get(checkpoint).CheckpointDestroyed.Emit(checkpoint, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnKeybindDestroyed(SQInt32 keybind, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
KeybindDestroyed.Emit(keybind, header, payload);
Reference< CKeybind >::Get(keybind).KeybindDestroyed.Emit(keybind, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnObjectDestroyed(SQInt32 object, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
ObjectDestroyed.Emit(object, header, payload);
Reference< CObject >::Get(object).ObjectDestroyed.Emit(object, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnPickupDestroyed(SQInt32 pickup, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
PickupDestroyed.Emit(pickup, header, payload);
Reference< CPickup >::Get(pickup).PickupDestroyed.Emit(pickup, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerDestroyed(SQInt32 player, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
PlayerDestroyed.Emit(player, header, payload);
Reference< CPlayer >::Get(player).PlayerDestroyed.Emit(player, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnSphereDestroyed(SQInt32 sphere, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
SphereDestroyed.Emit(sphere, header, payload);
Reference< CSphere >::Get(sphere).SphereDestroyed.Emit(sphere, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnSpriteDestroyed(SQInt32 sprite, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
SpriteDestroyed.Emit(sprite, header, payload);
Reference< CSprite >::Get(sprite).SpriteDestroyed.Emit(sprite, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnTextdrawDestroyed(SQInt32 textdraw, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
TextdrawDestroyed.Emit(textdraw, header, payload);
Reference< CTextdraw >::Get(textdraw).TextdrawDestroyed.Emit(textdraw, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnVehicleDestroyed(SQInt32 vehicle, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
VehicleDestroyed.Emit(vehicle, header, payload);
Reference< CVehicle >::Get(vehicle).VehicleDestroyed.Emit(vehicle, header, payload);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnBlipCustom(SQInt32 blip, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
BlipCustom.Emit(blip, header, payload);
Reference< CBlip >::Get(blip).BlipCustom.Emit(blip, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnCheckpointCustom(SQInt32 checkpoint, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
CheckpointCustom.Emit(checkpoint, header, payload);
Reference< CCheckpoint >::Get(checkpoint).CheckpointCustom.Emit(checkpoint, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnKeybindCustom(SQInt32 keybind, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
KeybindCustom.Emit(keybind, header, payload);
Reference< CKeybind >::Get(keybind).KeybindCustom.Emit(keybind, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnObjectCustom(SQInt32 object, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
ObjectCustom.Emit(object, header, payload);
Reference< CObject >::Get(object).ObjectCustom.Emit(object, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnPickupCustom(SQInt32 pickup, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
PickupCustom.Emit(pickup, header, payload);
Reference< CPickup >::Get(pickup).PickupCustom.Emit(pickup, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerCustom(SQInt32 player, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
PlayerCustom.Emit(player, header, payload);
Reference< CPlayer >::Get(player).PlayerCustom.Emit(player, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnSphereCustom(SQInt32 sphere, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
SphereCustom.Emit(sphere, header, payload);
Reference< CSphere >::Get(sphere).SphereCustom.Emit(sphere, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnSpriteCustom(SQInt32 sprite, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
SpriteCustom.Emit(sprite, header, payload);
Reference< CSprite >::Get(sprite).SpriteCustom.Emit(sprite, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnTextdrawCustom(SQInt32 textdraw, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
TextdrawCustom.Emit(textdraw, header, payload);
Reference< CTextdraw >::Get(textdraw).TextdrawCustom.Emit(textdraw, header, payload);
2015-09-30 02:56:11 +02:00
}
void Core::OnVehicleCustom(SQInt32 vehicle, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
VehicleCustom.Emit(vehicle, header, payload);
Reference< CVehicle >::Get(vehicle).VehicleCustom.Emit(vehicle, header, payload);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnPlayerAway(SQInt32 player, bool status)
2015-09-30 02:56:11 +02:00
{
PlayerAway.Emit(player, status);
Reference< CPlayer >::Get(player).PlayerAway.Emit(player, status);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnPlayerGameKeys(SQInt32 player, SQInt32 previous, SQInt32 current)
2015-09-30 02:56:11 +02:00
{
PlayerGameKeys.Emit(player, previous, current);
Reference< CPlayer >::Get(player).PlayerGameKeys.Emit(player, previous, current);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerName(SQInt32 player, const SQChar * previous, const SQChar * current)
2015-09-30 02:56:11 +02:00
{
PlayerRename.Emit(player, previous, current);
Reference< CPlayer >::Get(player).PlayerRename.Emit(player, previous, current);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnPlayerRequestClass(SQInt32 player, SQInt32 offset)
2015-09-30 02:56:11 +02:00
{
PlayerRequestClass.Emit(player, offset);
Reference< CPlayer >::Get(player).PlayerRequestClass.Emit(player, offset);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerRequestSpawn(SQInt32 player)
2015-09-30 02:56:11 +02:00
{
PlayerRequestSpawn.Emit(player);
Reference< CPlayer >::Get(player).PlayerRequestSpawn.Emit(player);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnPlayerSpawn(SQInt32 player)
2015-09-30 02:56:11 +02:00
{
PlayerSpawn.Emit(player);
Reference< CPlayer >::Get(player).PlayerSpawn.Emit(player);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnPlayerStartTyping(SQInt32 player)
2015-09-30 02:56:11 +02:00
{
PlayerStartTyping.Emit(player);
Reference< CPlayer >::Get(player).PlayerStartTyping.Emit(player);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerStopTyping(SQInt32 player)
2015-09-30 02:56:11 +02:00
{
PlayerStopTyping.Emit(player);
Reference< CPlayer >::Get(player).PlayerStopTyping.Emit(player);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnPlayerChat(SQInt32 player, const SQChar * message)
2015-09-30 02:56:11 +02:00
{
PlayerChat.Emit(player, message);
Reference< CPlayer >::Get(player).PlayerChat.Emit(player, message);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerCommand(SQInt32 player, const SQChar * command)
2015-09-30 02:56:11 +02:00
{
// Send it to the command manager
_Cmd->Execute(player, command);
// Forward to instances
PlayerCommand.Emit(player, command);
Reference< CPlayer >::Get(player).PlayerCommand.Emit(player, command);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerMessage(SQInt32 player, SQInt32 receiver, const SQChar * message)
2015-09-30 02:56:11 +02:00
{
PlayerMessage.Emit(player, receiver, message);
Reference< CPlayer >::Get(player).PlayerMessage.Emit(player, receiver, message);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnPlayerHealth(SQInt32 player, SQFloat previous, SQFloat current)
2015-09-30 02:56:11 +02:00
{
PlayerHealth.Emit(player, previous, current);
Reference< CPlayer >::Get(player).PlayerHealth.Emit(player, previous, current);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerArmour(SQInt32 player, SQFloat previous, SQFloat current)
2015-09-30 02:56:11 +02:00
{
PlayerArmour.Emit(player, previous, current);
Reference< CPlayer >::Get(player).PlayerArmour.Emit(player, previous, current);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerWeapon(SQInt32 player, SQInt32 previous, SQInt32 current)
2015-09-30 02:56:11 +02:00
{
PlayerWeapon.Emit(player, previous, current);
Reference< CPlayer >::Get(player).PlayerWeapon.Emit(player, previous, current);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerMove(SQInt32 player, const Vector3 & previous, const Vector3 & current)
2015-09-30 02:56:11 +02:00
{
PlayerMove.Emit(player, previous, current);
Reference< CPlayer >::Get(player).PlayerMove.Emit(player, previous, current);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnPlayerWasted(SQInt32 player, SQInt32 reason)
2015-09-30 02:56:11 +02:00
{
PlayerWasted.Emit(player, reason);
Reference< CPlayer >::Get(player).PlayerWasted.Emit(player, reason);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerKilled(SQInt32 player, SQInt32 killer, SQInt32 reason, SQInt32 body_part)
2015-09-30 02:56:11 +02:00
{
PlayerKilled.Emit(player, killer, reason, body_part);
Reference< CPlayer >::Get(player).PlayerKilled.Emit(player, killer, reason, body_part);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnPlayerSpectate(SQInt32 player, SQInt32 target)
2015-09-30 02:56:11 +02:00
{
PlayerSpectate.Emit(player, target);
Reference< CPlayer >::Get(player).PlayerSpectate.Emit(player, target);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerCrashreport(SQInt32 player, const SQChar * report)
2015-09-30 02:56:11 +02:00
{
PlayerCrashreport.Emit(player, report);
Reference< CPlayer >::Get(player).PlayerCrashreport.Emit(player, report);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnPlayerBurning(SQInt32 player, bool state)
2015-09-30 02:56:11 +02:00
{
PlayerBurning.Emit(player, state);
Reference< CPlayer >::Get(player).PlayerBurning.Emit(player, state);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerCrouching(SQInt32 player, bool state)
2015-09-30 02:56:11 +02:00
{
PlayerCrouching.Emit(player, state);
Reference< CPlayer >::Get(player).PlayerCrouching.Emit(player, state);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnPlayerState(SQInt32 player, SQInt32 previous, SQInt32 current)
2015-09-30 02:56:11 +02:00
{
PlayerState.Emit(player, previous, current);
Reference< CPlayer >::Get(player).PlayerState.Emit(player, previous, current);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerAction(SQInt32 player, SQInt32 previous, SQInt32 current)
2015-09-30 02:56:11 +02:00
{
PlayerAction.Emit(player, previous, current);
Reference< CPlayer >::Get(player).PlayerAction.Emit(player, previous, current);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnStateNone(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
StateNone.Emit(player, previous);
Reference< CPlayer >::Get(player).StateNone.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnStateNormal(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
StateNormal.Emit(player, previous);
Reference< CPlayer >::Get(player).StateNormal.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnStateShooting(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
StateShooting.Emit(player, previous);
Reference< CPlayer >::Get(player).StateShooting.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnStateDriver(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
StateDriver.Emit(player, previous);
Reference< CPlayer >::Get(player).StateDriver.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnStatePassenger(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
StatePassenger.Emit(player, previous);
Reference< CPlayer >::Get(player).StatePassenger.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnStateEnterDriver(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
StateEnterDriver.Emit(player, previous);
Reference< CPlayer >::Get(player).StateEnterDriver.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnStateEnterPassenger(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
StateEnterPassenger.Emit(player, previous);
Reference< CPlayer >::Get(player).StateEnterPassenger.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnStateExitVehicle(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
StateExitVehicle.Emit(player, previous);
Reference< CPlayer >::Get(player).StateExitVehicle.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnStateUnspawned(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
StateUnspawned.Emit(player, previous);
Reference< CPlayer >::Get(player).StateUnspawned.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnActionNone(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
ActionNone.Emit(player, previous);
Reference< CPlayer >::Get(player).ActionNone.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnActionNormal(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
ActionNormal.Emit(player, previous);
Reference< CPlayer >::Get(player).ActionNormal.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnActionAiming(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
ActionAiming.Emit(player, previous);
Reference< CPlayer >::Get(player).ActionAiming.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnActionShooting(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
ActionShooting.Emit(player, previous);
Reference< CPlayer >::Get(player).ActionShooting.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnActionJumping(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
ActionJumping.Emit(player, previous);
Reference< CPlayer >::Get(player).ActionJumping.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnActionLieDown(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
ActionLieDown.Emit(player, previous);
Reference< CPlayer >::Get(player).ActionLieDown.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnActionGettingUp(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
ActionGettingUp.Emit(player, previous);
Reference< CPlayer >::Get(player).ActionGettingUp.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnActionJumpVehicle(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
ActionJumpVehicle.Emit(player, previous);
Reference< CPlayer >::Get(player).ActionJumpVehicle.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnActionDriving(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
ActionDriving.Emit(player, previous);
Reference< CPlayer >::Get(player).ActionDriving.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnActionDying(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
ActionDying.Emit(player, previous);
Reference< CPlayer >::Get(player).ActionDying.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnActionWasted(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
ActionWasted.Emit(player, previous);
Reference< CPlayer >::Get(player).ActionWasted.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnActionEmbarking(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
ActionEmbarking.Emit(player, previous);
Reference< CPlayer >::Get(player).ActionEmbarking.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
void Core::OnActionDisembarking(SQInt32 player, SQInt32 previous)
2015-09-30 02:56:11 +02:00
{
ActionDisembarking.Emit(player, previous);
Reference< CPlayer >::Get(player).ActionDisembarking.Emit(player, previous);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnVehicleRespawn(SQInt32 vehicle)
2015-09-30 02:56:11 +02:00
{
VehicleRespawn.Emit(vehicle);
Reference< CVehicle >::Get(vehicle).VehicleRespawn.Emit(vehicle);
2015-09-30 02:56:11 +02:00
}
void Core::OnVehicleExplode(SQInt32 vehicle)
2015-09-30 02:56:11 +02:00
{
VehicleExplode.Emit(vehicle);
Reference< CVehicle >::Get(vehicle).VehicleExplode.Emit(vehicle);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnVehicleHealth(SQInt32 vehicle, SQFloat previous, SQFloat current)
2015-09-30 02:56:11 +02:00
{
VehicleHealth.Emit(vehicle, previous, current);
Reference< CVehicle >::Get(vehicle).VehicleHealth.Emit(vehicle, previous, current);
2015-09-30 02:56:11 +02:00
}
void Core::OnVehicleMove(SQInt32 vehicle, const Vector3 & previous, const Vector3 & current)
2015-09-30 02:56:11 +02:00
{
VehicleMove.Emit(vehicle, previous, current);
Reference< CVehicle >::Get(vehicle).VehicleMove.Emit(vehicle, previous, current);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnPickupRespawn(SQInt32 pickup)
2015-09-30 02:56:11 +02:00
{
PickupRespawn.Emit(pickup);
Reference< CPickup >::Get(pickup).PickupRespawn.Emit(pickup);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnPlayerKeyPress(SQInt32 player, SQInt32 keybind)
2015-09-30 02:56:11 +02:00
{
KeybindKeyPress.Emit(player, keybind);
Reference< CKeybind >::Get(keybind).KeybindKeyPress.Emit(player, keybind);
Reference< CPlayer >::Get(player).KeybindKeyPress.Emit(player, keybind);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerKeyRelease(SQInt32 player, SQInt32 keybind)
2015-09-30 02:56:11 +02:00
{
KeybindKeyRelease.Emit(player, keybind);
Reference< CKeybind >::Get(keybind).KeybindKeyRelease.Emit(player, keybind);
Reference< CPlayer >::Get(player).KeybindKeyRelease.Emit(player, keybind);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnPlayerEmbarking(SQInt32 player, SQInt32 vehicle, SQInt32 slot)
2015-09-30 02:56:11 +02:00
{
VehicleEmbarking.Emit(player, vehicle, slot);
Reference< CVehicle >::Get(vehicle).VehicleEmbarking.Emit(player, vehicle, slot);
Reference< CPlayer >::Get(player).VehicleEmbarking.Emit(player, vehicle, slot);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerEmbarked(SQInt32 player, SQInt32 vehicle, SQInt32 slot)
2015-09-30 02:56:11 +02:00
{
VehicleEmbarked.Emit(player, vehicle, slot);
Reference< CVehicle >::Get(vehicle).VehicleEmbarked.Emit(player, vehicle, slot);
Reference< CPlayer >::Get(player).VehicleEmbarked.Emit(player, vehicle, slot);
2015-09-30 02:56:11 +02:00
}
void Core::OnPlayerDisembark(SQInt32 player, SQInt32 vehicle)
2015-09-30 02:56:11 +02:00
{
VehicleDisembark.Emit(player, vehicle);
Reference< CVehicle >::Get(vehicle).VehicleDisembark.Emit(player, vehicle);
Reference< CPlayer >::Get(player).VehicleDisembark.Emit(player, vehicle);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnPickupClaimed(SQInt32 player, SQInt32 pickup)
2015-09-30 02:56:11 +02:00
{
PickupClaimed.Emit(player, pickup);
Reference< CPickup >::Get(pickup).PickupClaimed.Emit(player, pickup);
Reference< CPlayer >::Get(player).PickupClaimed.Emit(player, pickup);
2015-09-30 02:56:11 +02:00
}
void Core::OnPickupCollected(SQInt32 player, SQInt32 pickup)
2015-09-30 02:56:11 +02:00
{
PickupClaimed.Emit(player, pickup);
Reference< CPickup >::Get(pickup).PickupClaimed.Emit(player, pickup);
Reference< CPlayer >::Get(player).PickupClaimed.Emit(player, pickup);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnObjectShot(SQInt32 player, SQInt32 object, SQInt32 weapon)
2015-09-30 02:56:11 +02:00
{
ObjectShot.Emit(player, object, weapon);
Reference< CObject >::Get(object).ObjectShot.Emit(player, object, weapon);
Reference< CPlayer >::Get(player).ObjectShot.Emit(player, object, weapon);
2015-09-30 02:56:11 +02:00
}
void Core::OnObjectBump(SQInt32 player, SQInt32 object)
2015-09-30 02:56:11 +02:00
{
ObjectBump.Emit(player, object);
Reference< CObject >::Get(object).ObjectBump.Emit(player, object);
Reference< CPlayer >::Get(player).ObjectBump.Emit(player, object);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnCheckpointEntered(SQInt32 player, SQInt32 checkpoint)
2015-09-30 02:56:11 +02:00
{
CheckpointEntered.Emit(player, checkpoint);
Reference< CCheckpoint >::Get(checkpoint).CheckpointEntered.Emit(player, checkpoint);
Reference< CPlayer >::Get(player).CheckpointEntered.Emit(player, checkpoint);
2015-09-30 02:56:11 +02:00
}
void Core::OnCheckpointExited(SQInt32 player, SQInt32 checkpoint)
2015-09-30 02:56:11 +02:00
{
CheckpointExited.Emit(player, checkpoint);
Reference< CCheckpoint >::Get(checkpoint).CheckpointExited.Emit(player, checkpoint);
Reference< CPlayer >::Get(player).CheckpointExited.Emit(player, checkpoint);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnSphereEntered(SQInt32 player, SQInt32 sphere)
2015-09-30 02:56:11 +02:00
{
SphereEntered.Emit(player, sphere);
Reference< CSphere >::Get(sphere).SphereEntered.Emit(player, sphere);
Reference< CPlayer >::Get(player).SphereEntered.Emit(player, sphere);
2015-09-30 02:56:11 +02:00
}
void Core::OnSphereExited(SQInt32 player, SQInt32 sphere)
2015-09-30 02:56:11 +02:00
{
SphereExited.Emit(player, sphere);
Reference< CSphere >::Get(sphere).SphereExited.Emit(player, sphere);
Reference< CPlayer >::Get(player).SphereExited.Emit(player, sphere);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnServerFrame(SQFloat delta)
2015-09-30 02:56:11 +02:00
{
m_Uptime += delta;
ServerFrame.Emit(delta);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnServerStartup()
2015-09-30 02:56:11 +02:00
{
ServerStartup.Emit();
2015-09-30 02:56:11 +02:00
}
void Core::OnServerShutdown()
2015-09-30 02:56:11 +02:00
{
ServerShutdown.Emit();
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnInternalCommand(SQInt32 type, const SQChar * text)
2015-09-30 02:56:11 +02:00
{
InternalCommand.Emit(type, text);
2015-09-30 02:56:11 +02:00
}
void Core::OnLoginAttempt(const SQChar * name, const SQChar * passwd, const SQChar * ip)
2015-09-30 02:56:11 +02:00
{
LoginAttempt.Emit(name, passwd, ip);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnCustomEvent(SQInt32 group, SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
CustomEvent.Emit(group, header, payload);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnWorldOption(SQInt32 option, SqObj & value)
2015-09-30 02:56:11 +02:00
{
WorldOption.Emit(option, value);
2015-09-30 02:56:11 +02:00
}
void Core::OnWorldToggle(SQInt32 option, bool value)
2015-09-30 02:56:11 +02:00
{
WorldToggle.Emit(option, value);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnScriptReload(SQInt32 header, SqObj & payload)
2015-09-30 02:56:11 +02:00
{
ScriptReload.Emit(header, payload);
2015-09-30 02:56:11 +02:00
}
// ------------------------------------------------------------------------------------------------
void Core::OnPlayerUpdate(SQInt32 player, SQInt32 type)
2015-09-30 02:56:11 +02:00
{
SQMOD_UNUSED_VAR(type);
Vector3 pos;
// Is this player instance tracked for the first time
if (m_PlayerTrack[player].Fresh)
{
// Obtain the current position of this instance
_Func->GetPlayerPos(player, &pos.x, &pos.y, &pos.z);
// Initialize the tracked values for the first time
m_PlayerTrack[player].Position = pos;
m_PlayerTrack[player].Health = _Func->GetPlayerHealth(player);
m_PlayerTrack[player].Armour = _Func->GetPlayerArmour(player);
m_PlayerTrack[player].Weapon = _Func->GetPlayerWeapon(player);
m_PlayerTrack[player].Fresh = false;
// No need to check a freshly tracked instance
return;
}
// Obtain the current position of this instance
_Func->GetPlayerPos(player, &pos.x, &pos.y, &pos.z);
// Did the position change since the last tracked value?
if (pos != m_PlayerTrack[player].Position)
{
// Trigger the specific event
PlayerMove.Emit(player, m_PlayerTrack[player].Position, pos);
// Update the tracked value
m_PlayerTrack[player].Position = pos;
}
// Obtain the current health of this instance
SQFloat health = _Func->GetPlayerHealth(player);
// Did the health change since the last tracked value?
if (!EpsEq(health, m_PlayerTrack[player].Health))
{
// Trigger the specific event
PlayerHealth.Emit(player, m_PlayerTrack[player].Health, health);
// Update the tracked value
m_PlayerTrack[player].Health = health;
}
// Obtain the current armor of this instance
SQFloat armour = _Func->GetPlayerArmour(player);
// Did the armor change since the last tracked value?
if (!EpsEq(armour, m_PlayerTrack[player].Armour))
{
// Trigger the specific event
PlayerArmour.Emit(player, m_PlayerTrack[player].Armour, armour);
// Update the tracked value
m_PlayerTrack[player].Armour = armour;
}
// Obtain the current weapon of this instance
SQInteger wep = _Func->GetPlayerWeapon(player);
// Did the weapon change since the last tracked value?
if (wep != m_PlayerTrack[player].Weapon)
{
// Trigger the specific event
PlayerWeapon.Emit(player, m_PlayerTrack[player].Weapon, wep);
// Update the tracked value
m_PlayerTrack[player].Weapon = wep;
}
2015-09-30 02:56:11 +02:00
}
void Core::OnVehicleUpdate(SQInt32 vehicle, SQInt32 type)
2015-09-30 02:56:11 +02:00
{
SQMOD_UNUSED_VAR(type);
Vector3 pos;
// Is this vehicle instance tracked for the first time
if (m_VehicleTrack[vehicle].Fresh)
{
// Obtain the current position of this instance
_Func->GetVehiclePos(vehicle, &pos.x, &pos.y, &pos.z);
// Initialize the tracked values for the first time
m_VehicleTrack[vehicle].Position = pos;
m_VehicleTrack[vehicle].Health = _Func->GetVehicleHealth(vehicle);
m_VehicleTrack[vehicle].Fresh = false;
// No need to check a freshly tracked instance
return;
}
// Obtain the current position of this instance
_Func->GetVehiclePos(vehicle, &pos.x, &pos.y, &pos.z);
// Did the position change since the last tracked value?
if (pos != m_VehicleTrack[vehicle].Position)
{
// Trigger the specific event
VehicleMove.Emit(vehicle, m_VehicleTrack[vehicle].Position, pos);
// Update the tracked value
m_VehicleTrack[vehicle].Position = pos;
}
// Obtain the current health of this instance
SQFloat health = _Func->GetVehicleHealth(vehicle);
// Did the health change since the last tracked value?
if (!EpsEq(health, m_VehicleTrack[vehicle].Health))
{
// Trigger the specific event
VehicleHealth.Emit(vehicle, m_VehicleTrack[vehicle].Health, health);
// Update the tracked value
m_VehicleTrack[vehicle].Health = health;
}
2015-09-30 02:56:11 +02:00
}
void Core::OnEntityPool(SQInt32 type, SQInt32 id, bool deleted)
2015-09-30 02:56:11 +02:00
{
// Script object to play the role of a dummy payload
static SqObj payload;
// Make sure that the payload is null
payload.Release();
// See what type of change happened in the entity pool
2015-09-30 02:56:11 +02:00
switch (type)
{
case SQMOD_ENTITY_POOL_VEHICLE:
if (deleted)
{
EntMan< CVehicle >::Deactivate(id, SQMOD_DESTROY_POOL, payload, true);
2015-09-30 02:56:11 +02:00
}
else if (EntMan< CVehicle >::Activate(id, false))
{
OnVehicleCreated(id, SQMOD_CREATE_POOL, payload);
2015-09-30 02:56:11 +02:00
}
break;
case SQMOD_ENTITY_POOL_OBJECT:
if (deleted)
{
EntMan< CObject >::Deactivate(id, SQMOD_DESTROY_POOL, payload, true);
2015-09-30 02:56:11 +02:00
}
else if (EntMan< CObject >::Activate(id, false))
{
OnObjectCreated(id, SQMOD_CREATE_POOL, payload);
2015-09-30 02:56:11 +02:00
}
break;
case SQMOD_ENTITY_POOL_PICKUP:
if (deleted)
{
EntMan< CPickup >::Deactivate(id, SQMOD_DESTROY_POOL, payload, true);
2015-09-30 02:56:11 +02:00
}
else if (EntMan< CPickup >::Activate(id, false))
{
OnPickupCreated(id, SQMOD_CREATE_POOL, payload);
2015-09-30 02:56:11 +02:00
}
break;
case SQMOD_ENTITY_POOL_RADIO:
// @TODO Implement...
break;
case SQMOD_ENTITY_POOL_SPRITE:
if (deleted)
{
EntMan< CSprite >::Deactivate(id, SQMOD_DESTROY_POOL, payload, true);
2015-09-30 02:56:11 +02:00
}
else if (EntMan< CSprite >::Activate(id, false))
2015-09-30 02:56:11 +02:00
{
OnSpriteCreated(id, SQMOD_CREATE_POOL, payload);
2015-09-30 02:56:11 +02:00
}
break;
case SQMOD_ENTITY_POOL_TEXTDRAW:
if (deleted)
{
EntMan< CTextdraw >::Deactivate(id, SQMOD_DESTROY_POOL, payload, true);
2015-09-30 02:56:11 +02:00
}
else if (EntMan< CTextdraw >::Activate(id, false))
2015-09-30 02:56:11 +02:00
{
OnTextdrawCreated(id, SQMOD_CREATE_POOL, payload);
2015-09-30 02:56:11 +02:00
}
break;
case SQMOD_ENTITY_POOL_BLIP:
if (deleted)
{
EntMan< CBlip >::Deactivate(id, SQMOD_DESTROY_POOL, payload, true);
2015-09-30 02:56:11 +02:00
}
else
{
SQInt32 world, scale, sprid;
SQUint32 color;
SQFloat x, y, z;
2015-09-30 02:56:11 +02:00
// Get the blip information from the server
_Func->GetCoordBlipInfo(id, &world, &x, &y, &z, &scale, &color, &sprid);
// Attempt to activate this instance
if (EntMan< CBlip >::Activate(id, false, SQMOD_UNKNOWN, world, x, y, z, scale, color, sprid))
2015-09-30 02:56:11 +02:00
{
OnBlipCreated(id, SQMOD_CREATE_POOL, payload);
2015-09-30 02:56:11 +02:00
}
}
break;
default:
LogErr("Unknown change in the entity pool of type: %d", type);
}
}
} // Namespace:: SqMod