diff --git a/dlls/fakemeta/fakemeta.vcproj b/dlls/fakemeta/fakemeta.vcproj
index b731bd06..ebc71216 100755
--- a/dlls/fakemeta/fakemeta.vcproj
+++ b/dlls/fakemeta/fakemeta.vcproj
@@ -207,6 +207,16 @@
RelativePath="..\..\plugins\include\fakemeta_stocks.inc">
+
+
+
+
+
+
diff --git a/dlls/fakemeta/fakemeta_amxx.cpp b/dlls/fakemeta/fakemeta_amxx.cpp
index 07b0aee6..4097c4cf 100755
--- a/dlls/fakemeta/fakemeta_amxx.cpp
+++ b/dlls/fakemeta/fakemeta_amxx.cpp
@@ -5,12 +5,14 @@ edict_t *g_player_edicts[33]; // Used for INDEXENT() forward.
void OnAmxxAttach()
{
initialze_offsets();
+ initialize_glb_offsets();
MF_AddNatives(engfunc_natives);
MF_AddNatives(dllfunc_natives);
MF_AddNatives(pev_natives);
MF_AddNatives(forward_natives);
MF_AddNatives(pdata_natives);
MF_AddNatives(tr_Natives);
+ MF_AddNatives(glb_natives);
}
int GetHullBounds(int hullnumber, float *mins, float *maxs);
// sawce: Do not null out the forward for ServerActivate. It's required for the INDEXENT() fix. (I don't think ServerActivate is planned on being forwarded anyway)
diff --git a/dlls/fakemeta/fakemeta_amxx.h b/dlls/fakemeta/fakemeta_amxx.h
index 142cdd3d..8dc8ebc8 100755
--- a/dlls/fakemeta/fakemeta_amxx.h
+++ b/dlls/fakemeta/fakemeta_amxx.h
@@ -8,6 +8,7 @@
#include "pev.h"
#include "forward.h"
#include "fm_tr.h"
+#include "glb.h"
extern edict_t *g_player_edicts[33];
@@ -45,6 +46,7 @@ extern AMX_NATIVE_INFO forward_natives[];
extern AMX_NATIVE_INFO pdata_natives[];
extern AMX_NATIVE_INFO tr_Natives[];
extern AMX_NATIVE_INFO pev_natives[];
+extern AMX_NATIVE_INFO glb_natives[];
extern TraceResult g_tr;
/* Wouldnt modifying the table AFTER it's memcpy'd be ... pointless?
diff --git a/dlls/fakemeta/glb.cpp b/dlls/fakemeta/glb.cpp
new file mode 100644
index 00000000..9e3dc32c
--- /dev/null
+++ b/dlls/fakemeta/glb.cpp
@@ -0,0 +1,166 @@
+#include "fakemeta_amxx.h"
+
+static int g_glob_offset_table[glb_end_pchar] = {-1};
+
+#define DO_OFFSET_GLB(offset) g_glob_offset_table[offset] = offsetof(globalvars_t, offset)
+
+void initialize_glb_offsets()
+{
+ DO_OFFSET_GLB(trace_hitgroup);
+ DO_OFFSET_GLB(trace_flags);
+ DO_OFFSET_GLB(msg_entity);
+ DO_OFFSET_GLB(cdAudioTrack);
+ DO_OFFSET_GLB(maxClients);
+ DO_OFFSET_GLB(maxEntities);
+ DO_OFFSET_GLB(time);
+ DO_OFFSET_GLB(frametime);
+ DO_OFFSET_GLB(force_retouch);
+ DO_OFFSET_GLB(deathmatch);
+ DO_OFFSET_GLB(coop);
+ DO_OFFSET_GLB(teamplay);
+ DO_OFFSET_GLB(serverflags);
+ DO_OFFSET_GLB(found_secrets);
+ DO_OFFSET_GLB(trace_allsolid);
+ DO_OFFSET_GLB(trace_startsolid);
+ DO_OFFSET_GLB(trace_fraction);
+ DO_OFFSET_GLB(trace_plane_dist);
+ DO_OFFSET_GLB(trace_inopen);
+ DO_OFFSET_GLB(trace_inwater);
+ DO_OFFSET_GLB(trace_ent);
+ DO_OFFSET_GLB(v_forward);
+ DO_OFFSET_GLB(v_up);
+ DO_OFFSET_GLB(v_right);
+ DO_OFFSET_GLB(trace_endpos);
+ DO_OFFSET_GLB(trace_plane_normal);
+ DO_OFFSET_GLB(vecLandmarkOffset);
+ DO_OFFSET_GLB(mapname);
+ DO_OFFSET_GLB(startspot);
+ DO_OFFSET_GLB(pStringBase);
+}
+
+#define GET_OFFS(v,o) ((char *)v + o)
+
+static cell AMX_NATIVE_CALL amx_glb(AMX *amx, cell *params)
+{
+ int iSwitch = params[1];
+
+ if (iSwitch <= glb_start_int || iSwitch >= glb_end_pchar)
+ {
+ MF_LogError(amx, AMX_ERR_NATIVE, "Undefined global index: %d", iSwitch);
+ return 0;
+ }
+
+ int offset = g_glob_offset_table[iSwitch];
+ if (offset == -1)
+ {
+ MF_LogError(amx, AMX_ERR_NATIVE, "Undefined global index: %d", iSwitch);
+ return 0;
+ }
+
+ enum
+ {
+ Ret_Int = (1<<0),
+ Ret_Float = (1<<1),
+ Ret_Vec = (1<<2),
+ Ret_Edict = (1<<3),
+ Ret_PChar = (1<<4)
+ };
+
+ union
+ {
+ int i;
+ float f;
+ const char *c;
+ } rets;
+ Vector vec;
+
+ int Valtype = 0;
+
+ if (iSwitch > glb_start_int && iSwitch < glb_end_int)
+ {
+ rets.i = *(int *)GET_OFFS(gpGlobals, offset);
+ Valtype = Ret_Int;
+ }
+ else if (iSwitch > glb_start_float && iSwitch < glb_end_float)
+ {
+ rets.f = *(float *)GET_OFFS(gpGlobals, offset);
+ Valtype = Ret_Float;
+ }
+ else if (iSwitch > glb_start_edict && iSwitch < glb_end_edict)
+ {
+ edict_t *e = *(edict_t **)GET_OFFS(gpGlobals, offset);
+ rets.i = ENTINDEX(e);
+ Valtype = Ret_Int | Ret_Edict;
+ }
+ else if (iSwitch > glb_start_vector && iSwitch < glb_end_vector)
+ {
+ vec = *(vec3_t *)GET_OFFS(gpGlobals, offset);
+ Valtype = Ret_Vec;
+ }
+ else if (iSwitch > glb_start_string && iSwitch < glb_end_string)
+ {
+ rets.c = STRING(*(string_t *)GET_OFFS(gpGlobals, offset));
+ Valtype = Ret_PChar;
+ }
+ else if (iSwitch > glb_start_pchar && iSwitch < glb_end_pchar)
+ {
+ rets.c = *(const char **)GET_OFFS(gpGlobals, offset);
+ Valtype = Ret_PChar;
+ }
+
+ size_t paramnum = params[0] / sizeof(cell) - 1;
+
+ if (paramnum == 0)
+ {
+ //return an int
+ if (Valtype & Ret_Int)
+ {
+ return rets.i;
+ } else {
+ MF_LogError(amx, AMX_ERR_NATIVE, "Invalid return type");
+ return 0;
+ }
+ }
+ else if (paramnum == 1)
+ {
+ //return a byref float - usually
+ cell *addr = MF_GetAmxAddr(amx, params[2]);
+ if (Valtype == Ret_Float)
+ {
+ *addr = amx_ftoc(rets.f);
+ }
+ else if (Valtype == Ret_Vec)
+ {
+ addr[0] = amx_ftoc(vec.x);
+ addr[1] = amx_ftoc(vec.y);
+ addr[2] = amx_ftoc(vec.z);
+ } else {
+ MF_LogError(amx, AMX_ERR_NATIVE, "Invalid return type");
+ return 0;
+ }
+ return 1;
+ }
+ else if (paramnum == 2)
+ {
+ cell size = *(MF_GetAmxAddr(amx, params[3]));
+ if (Valtype == Ret_PChar)
+ {
+ const char *str = rets.c;
+ if (!str)
+ str = "";
+ return MF_SetAmxString(amx, params[2], str, size);
+ }
+ MF_LogError(amx, AMX_ERR_NATIVE, "Invalid return type");
+ }
+
+ //if we got here, something happened
+ MF_LogError(amx, AMX_ERR_NATIVE, "Unknown global index or return combination %d", iSwitch);
+
+ return 0;
+}
+
+AMX_NATIVE_INFO glb_natives[] =
+{
+ {"global_get", amx_glb},
+ {NULL, NULL},
+};
\ No newline at end of file
diff --git a/dlls/fakemeta/glb.h b/dlls/fakemeta/glb.h
new file mode 100644
index 00000000..7764fe0d
--- /dev/null
+++ b/dlls/fakemeta/glb.h
@@ -0,0 +1,52 @@
+#ifndef _INCLUDE_GLB_H
+#define _INCLUDE_GLB_H
+
+enum glb_pointers
+{
+ glb_start_int = 0,
+ trace_hitgroup,
+ trace_flags,
+ msg_entity,
+ cdAudioTrack,
+ maxClients,
+ maxEntities,
+ glb_end_int,
+ glb_start_float,
+ time,
+ frametime,
+ force_retouch,
+ deathmatch,
+ coop,
+ teamplay,
+ serverflags,
+ found_secrets,
+ trace_allsolid,
+ trace_startsolid,
+ trace_fraction,
+ trace_plane_dist,
+ trace_inopen,
+ trace_inwater,
+ glb_end_float,
+ glb_start_edict,
+ trace_ent,
+ glb_end_edict,
+ glb_start_vector,
+ v_forward,
+ v_up,
+ v_right,
+ trace_endpos,
+ trace_plane_normal,
+ vecLandmarkOffset,
+ glb_end_vector,
+ glb_start_string,
+ mapname,
+ startspot,
+ glb_end_string,
+ glb_start_pchar,
+ pStringBase,
+ glb_end_pchar
+};
+
+void initialize_glb_offsets();
+
+#endif /* _INCLUDE_GLB_H */
\ No newline at end of file