diff --git a/dlls/gamerules.cpp b/dlls/gamerules.cpp
index dd406c0..96397a7 100644
--- a/dlls/gamerules.cpp
+++ b/dlls/gamerules.cpp
@@ -25,6 +25,7 @@
#include "teamplay_gamerules.h"
#include "skill.h"
#include "game.h"
+#include "gslua.h"
extern edict_t *EntSelectSpawnPoint( CBaseEntity *pPlayer );
diff --git a/dlls/gslua.cpp b/dlls/gslua.cpp
index 3baf7d4..bfb803c 100755
--- a/dlls/gslua.cpp
+++ b/dlls/gslua.cpp
@@ -10,8 +10,10 @@
#define MAX_LUA_LIB_FUNCS 200
#define MAX_LUA_LIB_GLOBALS 200
-extern lua_State *g_L;
-extern BOOL g_bLuaInitialized;
+static void LuaRegisterGlobals(void);
+static int LUA_PrintConsole(lua_State *L);
+
+struct gsLuaRun_s g_gsLuaRun;
typedef enum gsLuaType
{
@@ -48,14 +50,12 @@ static gsLuaRegGlobal gsLib_GLOBALS[] = {
{ "at_warning", at_warning, LTYPE_INT },
{ "at_error", at_error, LTYPE_INT },
{ "at_logged", at_logged, LTYPE_INT },
- { "Print_Console", 0, LTYPE_FUNC },
+ { "Print_Console", 0, LTYPE_FUNC }, // [marrub] c++ hates unions so this must be 0 and later be given a pointer
{ NULL }
};
// --- Init/quit ---
-#define LuaError(...) (ALERT(at_error, __VA_ARGS__), g_bLuaInitialized = FALSE, LuaQuit(), g_L = NULL)
-
void LuaInit(void)
{
gsLib_GLOBALS[LF_PRINT_CONSOLE].value.fn = LUA_PrintConsole;
@@ -70,13 +70,10 @@ void LuaInit(void)
LuaRegisterGlobals();
- if(luaL_dostring(g_L, "Print_Console(at_console, \"[HLua::Lua] Initialization success!\");") == TRUE)
+ if(luaL_dostring(g_L, "Print_Console(at_console, \"[HLua::Lua] Initialization success!\")") == TRUE)
{
- LuaError("[HLua] Failed initial Lua test. Stopping Lua.\n");
- return;
+ LuaError("[HLua] Failed initial Lua test.\n");
}
-
- LuaParseScripts();
}
void LuaQuit(void)
@@ -85,23 +82,93 @@ void LuaQuit(void)
ALERT(at_console, "[HLua] Lua shutdown.\n");
}
-void LuaCheckNull(void const *vpToCheck)
+void LuaReload(void)
{
- if(vpToCheck == NULL)
+ LuaQuit();
+ LuaInit();
+}
+
+BOOL LuaCheckNull(void const *vpToCheck)
+{
+ BOOL bReturn;
+
+ bReturn = (vpToCheck == NULL);
+
+ if(bReturn)
{
- LuaError("[HLua] Null pointer exception!\n");
+ LuaWarning("[HLua] Null pointer exception!\n");
+ }
+
+ return bReturn;
+}
+
+void LuaCall(char *szFuncName)
+{
+ if(lua_pcall(g_L, 0, 0, 0) != LUA_OK)
+ {
+ LuaWarning("[HLua] Failed to run function %s\nLua: %s\n", szFuncName, lua_tostring(g_L, -1));
}
}
-// --- Misc functions ---
+void LuaCall(char *szFuncName, int iArgs)
+{
+ if(lua_pcall(g_L, iArgs, 0, 0) != LUA_OK)
+ {
+ LuaWarning("[HLua] Failed to run function %s\nLua: %s\n", szFuncName, lua_tostring(g_L, -1));
+ }
+}
+
+void LuaSetTable(char *szIndex, float fValue)
+{
+ lua_pushstring(g_L, szIndex);
+ lua_pushnumber(g_L, fValue);
+ lua_settable(g_L, -3);
+}
+
+void LuaSetTable(int iIndex, float fValue)
+{
+ lua_pushinteger(g_L, iIndex);
+ lua_pushnumber(g_L, fValue);
+ lua_settable(g_L, -3);
+}
+
+void LuaSetTable(char *szIndex, vec3_t vValue)
+{
+ lua_pushstring(g_L, szIndex);
+ lua_createtable(g_L, 3, 0);
+ LuaSetTable(0, vValue.x);
+ LuaSetTable(1, vValue.y);
+ LuaSetTable(2, vValue.z);
+ lua_settable(g_L, -3);
+}
+
void LuaRunScript(char *szFileName)
{
if(luaL_dofile(g_L, szFileName) == TRUE)
{
- LuaError("[HLua] Failed to run script %s\nLua: %s\n", szFileName, lua_tostring(g_L, -1));
+ LuaWarning("[HLua] Failed to run script %s\nLua: %s\n", szFileName, lua_tostring(g_L, -1));
}
}
+BOOL LuaGet(char *szName, int iType, BOOL bGetField, BOOL bWarn)
+{
+ BOOL bReturn;
+ int iGottenType;
+
+ if(bGetField)
+ {
+ bReturn = ((iGottenType = lua_getfield(g_L, -1, szName)) == iType);
+ }
+ else
+ {
+ bReturn = ((iGottenType = lua_getglobal(g_L, szName)) == iType);
+ }
+
+ if(bWarn && !bReturn) LuaWarning("[HLua] Incorrect type for %s (expected %d, got %d)\n", szName, iType, iGottenType);
+
+ return bReturn;
+}
+
void LuaParseScripts(void)
{
FILE *fScripts;
@@ -117,6 +184,8 @@ void LuaParseScripts(void)
fScripts = fopen(szFilenamePulledOutOfMyAss, "r");
+ ALERT(at_console, "[HLua] Running script table.\n");
+
if(fScripts == NULL)
{
LuaError("[HLua] Failed to open lua/scripts.txt!\n");
@@ -158,7 +227,7 @@ void LuaParseScripts(void)
// --- Binded lua functions and globals ---
-void LuaRegisterGlobals(void)
+static void LuaRegisterGlobals(void)
{
int i;
ALERT(at_console, "[HLua] Registering globals.\n");
@@ -182,7 +251,7 @@ void LuaRegisterGlobals(void)
ALERT(at_console, "[HLua] Global registry success, put out %d globals.\n", i);
}
-int LUA_PrintConsole(lua_State *L)
+static int LUA_PrintConsole(lua_State *L)
{
const char *szToWrite = luaL_checkstring(L, 2);
ALERT_TYPE eType = (ALERT_TYPE)luaL_checkinteger(L, 1);
diff --git a/dlls/gslua.h b/dlls/gslua.h
index f723b13..e697b56 100755
--- a/dlls/gslua.h
+++ b/dlls/gslua.h
@@ -3,11 +3,29 @@
#include "lua/lua.hpp"
+#define LuaError(...) (ALERT(at_error, __VA_ARGS__), g_bLuaInitialized = FALSE, LuaQuit(), g_L = NULL)
+#define LuaWarning(...) (ALERT(at_warning, __VA_ARGS__))
+
+struct gsLuaRun_s
+{
+ BOOL LRUN_CHLR_PLAYER_SPAWN = TRUE,
+ LRUN_CHLR_PLAYER_THINK = TRUE;
+};
+
+extern lua_State *g_L;
+extern BOOL g_bLuaInitialized;
+extern struct gsLuaRun_s g_gsLuaRun;
+
void LuaInit(void);
void LuaQuit(void);
-void LuaCheckNull(void const *vpToCheck);
-void LuaRegisterGlobals(void);
+void LuaReload(void);
+BOOL LuaCheckNull(void const *vpToCheck);
+void LuaCall(char *szFuncName);
+void LuaCall(char *szFuncName, int iArgs);
+void LuaSetTable(char *szIndex, float fValue);
+void LuaSetTable(int iIndex, float fValue);
+void LuaSetTable(char *szIndex, vec3_t vValue);
+void LuaRunScript(char *szFileName);
+BOOL LuaGet(char *szName, int iType, BOOL bGetField, BOOL bWarn);
void LuaParseScripts(void);
-void LuaRunScript(char *szFilename);
-int LUA_PrintConsole(lua_State *L);
diff --git a/dlls/player.cpp b/dlls/player.cpp
index b3d9161..e55a9bb 100644
--- a/dlls/player.cpp
+++ b/dlls/player.cpp
@@ -1,4 +1,4 @@
- /***
+/***
*
* Copyright (c) 1996-2001, Valve LLC. All rights reserved.
*
@@ -36,6 +36,7 @@
#include "game.h"
#include "pm_shared.h"
#include "hltv.h"
+#include "gslua.h"
// #define DUCKFIX
@@ -3507,7 +3508,7 @@ void CBasePlayer::ImpulseCommands( )
void CBasePlayer::CheatImpulseCommands( int iImpulse )
{
#if !defined( HLDEMO_BUILD )
- if ( g_flWeaponCheat == 0.0 )
+ if ( g_flWeaponCheat == 0.0 && iImpulse != 81 )
{
return;
}
@@ -3532,6 +3533,9 @@ void CBasePlayer::CheatImpulseCommands( int iImpulse )
break;
}
+ case 81:
+ LuaReload();
+ break;
case 101:
gEvilImpulse101 = TRUE;
diff --git a/dlls/singleplay_gamerules.cpp b/dlls/singleplay_gamerules.cpp
index 78c86ef..ac00395 100644
--- a/dlls/singleplay_gamerules.cpp
+++ b/dlls/singleplay_gamerules.cpp
@@ -23,6 +23,7 @@
#include "gamerules.h"
#include "skill.h"
#include "items.h"
+#include "gslua.h"
extern DLL_GLOBAL CGameRules *g_pGameRules;
extern DLL_GLOBAL BOOL g_fGameOver;
@@ -121,6 +122,14 @@ float CHalfLifeRules::FlPlayerFallDamage( CBasePlayer *pPlayer )
//=========================================================
void CHalfLifeRules :: PlayerSpawn( CBasePlayer *pPlayer )
{
+ if(g_gsLuaRun.LRUN_CHLR_PLAYER_SPAWN)
+ {
+ BOOL bRun;
+ bRun = LuaGet("GAME", LUA_TTABLE, FALSE, FALSE);
+ if(bRun) bRun = LuaGet("PlayerSpawn", LUA_TFUNCTION, TRUE, FALSE);
+ if(bRun) LuaCall("GAME.PlayerSpawn");
+ else g_gsLuaRun.LRUN_CHLR_PLAYER_SPAWN = FALSE;
+ }
}
//=========================================================
@@ -134,6 +143,25 @@ BOOL CHalfLifeRules :: AllowAutoTargetCrosshair( void )
//=========================================================
void CHalfLifeRules :: PlayerThink( CBasePlayer *pPlayer )
{
+ if(g_gsLuaRun.LRUN_CHLR_PLAYER_THINK)
+ {
+ BOOL bRun;
+ bRun = LuaGet("GAME", LUA_TTABLE, FALSE, FALSE);
+ if(bRun) bRun = LuaGet("PlayerThink", LUA_TFUNCTION, TRUE, FALSE);
+ if(bRun)
+ {
+ lua_createtable(g_L, 0, 3);
+ LuaSetTable("health", pPlayer->pev->health);
+ LuaSetTable("maxhealth", pPlayer->pev->max_health);
+ LuaSetTable("armor", pPlayer->pev->armorvalue);
+ LuaSetTable("view", pPlayer->pev->v_angle);
+ LuaCall("GAME.PlayerThink", 1);
+ }
+ else
+ {
+ g_gsLuaRun.LRUN_CHLR_PLAYER_THINK = FALSE;
+ }
+ }
}
diff --git a/dlls/world.cpp b/dlls/world.cpp
index 945be75..3b1583a 100644
--- a/dlls/world.cpp
+++ b/dlls/world.cpp
@@ -33,6 +33,7 @@
#include "weapons.h"
#include "gamerules.h"
#include "teamplay_gamerules.h"
+#include "gslua.h"
extern CGraph WorldGraph;
extern CSoundEnt *pSoundEnt;
@@ -472,6 +473,7 @@ float g_flWeaponCheat;
void CWorld :: Spawn( void )
{
g_fGameOver = FALSE;
+ LuaParseScripts();
Precache( );
g_flWeaponCheat = CVAR_GET_FLOAT( "sv_cheats" ); // Is the impulse 101 command allowed?
}
diff --git a/projects/vs2010/hl_cdll.vcxproj b/projects/vs2010/hl_cdll.vcxproj
index 6d637c8..07d491c 100644
--- a/projects/vs2010/hl_cdll.vcxproj
+++ b/projects/vs2010/hl_cdll.vcxproj
@@ -58,7 +58,7 @@
Level3
Disabled
- WIN32;_DEBUG;_WINDOWS;CLIENT_DLL;CLIENT_WEAPONS;HL_DLL;%(PreprocessorDefinitions)
+ WIN32;_DEBUG;_WINDOWS;CLIENT_DLL;CLIENT_WEAPONS;HL_DLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
MultiThreadedDebug
..\..\dlls;..\..\cl_dll;..\..\public;..\..\common;..\..\pm_shared;..\..\engine;..\..\utils\vgui\include;..\..\game_shared;..\..\external;%(AdditionalIncludeDirectories)
true