diff --git a/amxmodx/CCmd.cpp b/amxmodx/CCmd.cpp --- a/amxmodx/CCmd.cpp +++ b/amxmodx/CCmd.cpp @@ -148,17 +148,17 @@ void CmdMngr::setCmdLink(CmdLink** a, Co if (np == 0) return; if (sorted) { while (*a) { int i = strcmp(c->getCommand(), (*a)->cmd->getCommand()); - if ((i < 0) || (i == 0) && (strcmp(c->getArgument(), (*a)->cmd->getArgument()) < 0)) + if ((i < 0) || ((i == 0) && (strcmp(c->getArgument(), (*a)->cmd->getArgument()) < 0))) break; a = &(*a)->next; } np->next = *a; *a = np; } else { diff --git a/amxmodx/CForward.h b/amxmodx/CForward.h --- a/amxmodx/CForward.h +++ b/amxmodx/CForward.h @@ -139,17 +139,16 @@ public: return m_ParamTypes[paramId]; } }; // Single plugin forward class CSPForward { friend class CForwardMngr; - const char *m_FuncName; int m_NumParams; ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS]; AMX *m_Amx; int m_Func; bool m_HasFunc; String m_Name; diff --git a/amxmodx/CLang.cpp b/amxmodx/CLang.cpp --- a/amxmodx/CLang.cpp +++ b/amxmodx/CLang.cpp @@ -30,17 +30,17 @@ */ #include #include "amxmodx.h" #include "CLang.h" #include "format.h" #include "amxmod_compat.h" -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) #define _snprintf snprintf #endif #define LITIDX_NONE 0 #define LITIDX_BRACKET 1 #define LITIDX_DEFINITION 2 #define INSERT_NUMBER 1 @@ -103,17 +103,17 @@ int Compare(const int &k1, const in // return the number of written characters (including the terimating zero char) size_t CLangMngr::strip(char *str, char *newstr, bool makelower) { size_t i = 0; size_t pos = 0; int flag = 0; size_t strln = strlen(str); - for (i = strln - 1; i >= 0; i--) + for (i = strln - 1; i < strln; i--) { if (str[i] == '\n' || str[i] == ' ' || str[i] == '\t') { str[i] = 0; } else { break; } } diff --git a/amxmodx/CLogEvent.cpp b/amxmodx/CLogEvent.cpp --- a/amxmodx/CLogEvent.cpp +++ b/amxmodx/CLogEvent.cpp @@ -106,34 +106,34 @@ void LogEventsMngr::CLogEvent::registerF LogCondEle* aa = new LogCondEle(cmp, 0); if (aa == 0) return; filters = new LogCond(cmp->pos, aa, filters); } -void LogEventsMngr::setLogString(char* frmt, va_list& vaptr) +void LogEventsMngr::setLogString(const char* frmt, va_list& vaptr) { ++logCounter; int len = vsnprintf(logString, 255, frmt, vaptr); if (len == - 1) { len = 255; logString[len] = 0; } if (len) logString[--len] = 0; logArgc = 0; } -void LogEventsMngr::setLogString(char* frmt, ...) +void LogEventsMngr::setLogString(const char* frmt, ...) { ++logCounter; va_list logArgPtr; va_start(logArgPtr, frmt); int len = vsnprintf(logString, 255, frmt, logArgPtr); if (len == - 1) { diff --git a/amxmodx/CLogEvent.h b/amxmodx/CLogEvent.h --- a/amxmodx/CLogEvent.h +++ b/amxmodx/CLogEvent.h @@ -136,18 +136,18 @@ private: public: LogEventsMngr(); ~LogEventsMngr(); // Interface CLogEvent* registerLogEvent(CPluginMngr::CPlugin* plugin, int func, int pos); inline bool logEventsExist() { return arelogevents; } - void setLogString(char* frmt, va_list& vaptr); - void setLogString(char* frmt, ...); + void setLogString(const char* frmt, va_list& vaptr); + void setLogString(const char* frmt, ...); void parseLogString(); void executeLogEvents(); inline const char* getLogString() { return logString; } inline int getLogArgNum() { return logArgc; } inline const char* getLogArg(int i) { return (i < 0 || i >= logArgc) ? "" : logArgs[i]; } void clearLogEvents(); diff --git a/amxmodx/CMisc.h b/amxmodx/CMisc.h --- a/amxmodx/CMisc.h +++ b/amxmodx/CMisc.h @@ -337,17 +337,17 @@ public: while (i=0; i--) + for (i=len-1; iI;li-nLj0V<)5d8u^{ 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 UN&TeFq+!xl(uJgpN%`;p0C3oGl>h($ diff --git a/amxmodx/JIT/amxexecn.obj b/amxmodx/JIT/amxexecn.obj index 70edf84ae043da56d677b8adaf47ae82f99bb890..059c2c833f384e96409edfd6902f17edd206ecf8 GIT binary patch literal 12621 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 diff --git a/amxmodx/JIT/amxjitsn-darwin.o b/amxmodx/JIT/amxjitsn-darwin.o new file mode 100644 index 0000000000000000000000000000000000000000..0b21d6d5ec31a489100b53dde3c3e6097b2da816 GIT binary patch literal 24434 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 GDE|%fW>kCt diff --git a/amxmodx/JIT/amxjitsn.o b/amxmodx/JIT/amxjitsn.o index 4b48453124d28e161a199b2a8e920c6d8f682a03..5f4b0e404c62d025d4b8752936943172735656a6 GIT binary patch literal 25728 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 ZeE|9}^bzRe&`r=Mq0d0oI*0oA{{YwJoOJ*I diff --git a/amxmodx/JIT/amxjitsn.obj b/amxmodx/JIT/amxjitsn.obj index 24682e0009dcb7981401fd089f48988f6f5bdd99..4981755744847fb0e5389254cde73c5001a0fe62 GIT binary patch literal 26143 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

!QnQI~{i|7xzcr9^ml=zSKO6 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 diff --git a/amxmodx/JIT/helpers-x86.o b/amxmodx/JIT/helpers-x86.o index 1727aba55a4d0134eb1f0e5ce91cfe50d45d4300..1d7e9590dfd2a57fb6712cff0ae3340c9fdf2561 GIT binary patch literal 592 zc$}+u^>JflWMqH=Mh0dE1doBi0ZN;INeu>81||k_03#H$LHPoV2(!U_D9sMU%t+z^ zKy`{}=74}85F@*!0Vq)bq*;KN6-tB5lteS{15jNo7V}^rwDW234iJNXQS%SR8tom7 zV76)l&|wE(us8o;EfH`2!BQf0@D+daBgW=m3?=MfHLsZr4@AcvX3#51ttes8E6yk` zDJn@!0Wq2~Sj z&%lt*n30-OkXlr%TVY|Qmsp&O<`$4vW=01FbfA}*RGgnv3RdnPe?#7Eip3( KQ#3U%g#iFvQ&CL- diff --git a/amxmodx/JIT/natives-darwin-x86.o b/amxmodx/JIT/natives-darwin-x86.o new file mode 100644 index 0000000000000000000000000000000000000000..9ad779d29ebf8ac2a2b709718302802ccbd40bbd GIT binary patch literal 708 zc$_=;>+L^w1_lOZAZ7$&CLq4S00AKW0S4?K8Hm3?X?7@Pg386mm!wvdAk@akhqy+B zpz4o@>IZ=cMu`0kEXaCN5=#=1`7Vwjj;Q)U%7YnkI1uU{2_P;2s^NhO905|Holm=6 zITnMA*a6ZWdl)DZ9@bsUvCkUF-6;hm{(N2n2~GmWRHtSDBMvIW+L>zl;?jb zN5FqkkRi=Scpx%TU^QU7eIVAcNJGMr1sXmqwLqE=C;+l(B9v_hq?bY2p&&gABsGbH9#RK&Yf<|TUOWtK3+qjKRq z-^A=xBuOwA&T}ixOGc6ebKyMa{FKz<%qnEvScE`&f=d#MkX_)LUzX~hmR6ivf~L?l TFNML~$KT1(C*IvL#FYU6FY|?U diff --git a/amxmodx/JIT/natives-x86.o b/amxmodx/JIT/natives-x86.o index 45cc2aeda2e8fc664a4559c3ae387899da7bbb62..b8f58393cb700a956067ffb864952febbaa976fe GIT binary patch literal 1040 zc$}+u^>JflWMqH=Mh0dE1doBi0ZN;INeu>epgcK%5sKNM`~)B;9!XvRO0z@N!E8AI zVS-4q0x1rtc_6#x(aaM7a;{)8PaTLkk;Fd$ z)k#3jVT95gNb;ebPrF??7K4~OK=QGNfg<5y-L)M1tbyE}Qb6L*=OsXX^Kq7LSDsGx zxOjxZ9Tj0FLjOy7{+DtD{1*io(tLymA|nM>!+-(wN>VFI81zySOA;CMiZhB!ib@ib zfUL?~2o2>IrRG3X5&+0)fra7Ye`Gn-lmg;2F=PN~Yb4z@K++D0KM@orNcTF#J54?dn4Ho;zy$K7bDpZ;%`OcGvpsDBp=_MBDG9>0! zRK&Yf<|TUOWtK3+qjKRq-^A=xBuOwA&T}ixOGc8!!VNA-EJ8NiH@_^^KP{~|wFFI} wYhDV%T<83h)Z)x4WQ*ZK?mqrbjz013jv=lnAq>u6z%(ljqJeqA2g-*509r1PT>t<8 diff --git a/amxmodx/JIT/natives-x86.obj b/amxmodx/JIT/natives-x86.obj index 67b0b0bb6c8ab4c27eb8f96b6aafcce70e33c677..60855c6ab7206c8235be58de78974fbd33623d17 GIT binary patch literal 788 zc%1WLWMbI*TOjZ$0|SEy0|e-mq*jzLAV542rvUL`D4!XK6&L~%^imQ_5|Pxg0P#a0 zeu^aKz+iA7wDW1VE5~9GcLyVoh&>Dx2@mV8<=AHph#kpvn2HDNb7!UO-0w8;s39N>N0UhWiCKc!Bl!A@={~u-o zOdTUsCj)~JhKM3m6d|IIAz}x_)+i!A7$VU~A`sj2p*j&FEkGQKA~Fq01Y*t#43XW) zerIq&1 | cut -b1) +LINK = -Lzlib -ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(MM_ROOT) + +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + OBJECTS += JIT/amxexecn-darwin.o JIT/amxjitsn-darwin.o JIT/natives-darwin-x86.o \ + JIT/helpers-darwin-x86.o + + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _mm + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 -Wl,-read_only_relocs,suppress -lz-darwin +else + OBJECTS += JIT/amxexecn.o JIT/amxjitsn.o JIT/natives-x86.o JIT/helpers-x86.o + + LIB_EXT = so + LIB_SUFFIX = _mm_i386 + CFLAGS += -DLINUX + LINK += -shared -lz endif +LINK += -m32 -lm -ldl + +CFLAGS += -DAMX_NOPROPLIST -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing \ + -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) + ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif ifeq "$(BINLOG)" "true" - NAME := $(NAME)_bl + LIB_SUFFIX := _bl$(LIB_SUFFIX) BIN_DIR := $(BIN_DIR)BinLog OBJECTS += binlog.cpp CFLAGS += -DBINLOG_ENABLED endif -CFLAGS += -DLINUX -DAMX_NOPROPLIST -Wall -Werror -DHAVE_STDINT_H -static-libgcc -fno-rtti -fno-exceptions +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -ifeq "$(AMD64)" "true" - BINARY = $(NAME)_$(BIN_SUFFIX_64) - CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -DAMD64 -m64 - LINK += -lz64 - OBJECTS += JIT/natives-amd64.o +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") else - BINARY = $(NAME)_$(BIN_SUFFIX_32) - OBJECTS += JIT/amxexecn.o JIT/amxjitsn.o JIT/natives-x86.o - OBJECTS += JIT/helpers-x86.o - CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 - LINK += -lz - OPT_FLAGS += -march=i586 - CFLAGS += -m32 + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< all: mkdir -p $(BIN_DIR) - $(MAKE) amxmodx + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -amd64: - rm -f zlib/libz.a - $(MAKE) all AMD64=true +binlog: + $(MAKE) -f $(MAKEFILE_NAME) all BINLOG=true -amd64_debug: - rm -f zlib/libz.a - $(MAKE) all AMD64=true DEBUG=true +binlog_debug: + $(MAKE) -f $(MAKEFILE_NAME) all BINLOG=true DEBUG=true -amd64_binlog: - rm -f zlib/libz.a - $(MAKE) all AMD64=true BINLOG=true +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -amd64_binlog_debug: - rm -f zlib/libz.a - $(MAKE) all AMD64=true BINLOG=true DEBUG=true - -binlog: - $(MAKE) all BINLOG=true - -binlog_debug: - $(MAKE) all BINLOG=true DEBUG=true - -amxmodx: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Release/$(NAME)_$(BIN_SUFFIX_64) - rm -rf ReleaseBinLog/*.o - rm -rf ReleaseBinLog/$(NAME)_bl_$(BIN_SUFFIX_32) - rm -rf ReleaseBinLog/$(NAME)_bl_$(BIN_SUFFIX_64) - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_64) - rm -rf DebugBinLog/*.o - rm -rf DebugBinLog/$(NAME)_bl_$(BIN_SUFFIX_32) - rm -rf DebugBinLog/$(NAME)_bl_$(BIN_SUFFIX_64) + rm -rf $(BIN_DIR)/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/amxmodx/amx.cpp b/amxmodx/amx.cpp --- a/amxmodx/amx.cpp +++ b/amxmodx/amx.cpp @@ -43,17 +43,17 @@ #include #include #include /* for wchar_t */ #include #include #include #include #include "osdefs.h" -#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ +#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ #include #include #include #if !defined AMX_NODYNALOAD #include #endif #if defined JIT #include @@ -431,17 +431,17 @@ int AMXAPI amx_Callback(AMX *amx, cell i { AMX_HEADER *hdr; AMX_FUNCSTUB *func; AMX_NATIVE f; hdr=(AMX_HEADER *)amx->base; assert(hdr->natives<=hdr->libraries); #if defined AMX_NATIVETABLE - if (index=0 && index<(cell)NUMENTRIES(hdr,natives,libraries)); func=GETENTRY(hdr,natives,index); f=(AMX_NATIVE)func->address; #if defined AMX_NATIVETABLE @@ -927,17 +927,17 @@ int AMXAPI amx_Init(AMX *amx, void *prog p = PAGE_EXECUTE_READWRITE; else p |= PAGE_EXECUTE_READ; return !VirtualProtect(addr, len, p, &prev); } #define ALIGN(addr) (addr) - #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ + #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ /* Linux already has mprotect() */ /* But wants the address aligned! */ #define ALIGN(addr) (char *)(((long)addr + sysconf(_SC_PAGESIZE)-1) & ~(sysconf(_SC_PAGESIZE)-1)) #else // TODO: Add cases for Linux, Unix, OS/2, ... @@ -1009,50 +1009,50 @@ int AMXAPI amx_InitJIT(AMX *amx,void *co #endif /* #if defined JIT */ #endif /* AMX_INIT */ #if defined AMX_CLEANUP int AMXAPI amx_Cleanup(AMX *amx) { - #if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__) && !defined AMX_NODYNALOAD + #if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__) && !defined AMX_NODYNALOAD #if defined _Windows typedef int (FAR WINAPI *AMX_ENTRY)(AMX FAR *amx); - #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ + #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ typedef int (*AMX_ENTRY)(AMX *amx); #endif AMX_HEADER *hdr; int numlibraries,i; AMX_FUNCSTUB *lib; AMX_ENTRY libcleanup; #endif /* unload all extension modules */ - #if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__) && !defined AMX_NODYNALOAD + #if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__) && !defined AMX_NODYNALOAD hdr=(AMX_HEADER *)amx->base; assert(hdr->magic==AMX_MAGIC); numlibraries=NUMENTRIES(hdr,libraries,pubvars); for (i=0; iaddress!=0) { char funcname[sNAMEMAX+12]; /* +1 for '\0', +4 for 'amx_', +7 for 'Cleanup' */ strcpy(funcname,"amx_"); strcat(funcname,GETENTRYNAME(hdr,lib)); strcat(funcname,"Cleanup"); #if defined _Windows libcleanup=(AMX_ENTRY)GetProcAddress((HINSTANCE)lib->address,funcname); - #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ + #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ libcleanup=(AMX_ENTRY)dlsym((void*)lib->address,funcname); #endif if (libcleanup!=NULL) libcleanup(amx); #if defined _Windows FreeLibrary((HINSTANCE)lib->address); - #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ + #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ dlclose((void*)lib->address); #endif } /* if */ } /* for */ #else (void)amx; #endif return AMX_ERR_NONE; @@ -3690,17 +3690,17 @@ int AMXAPI amx_GetAddr(AMX *amx,cell amx assert(amx!=NULL); hdr=(AMX_HEADER *)amx->base; assert(hdr!=NULL); assert(hdr->magic==AMX_MAGIC); data=(amx->data!=NULL) ? amx->data : amx->base+(int)hdr->dat; assert(phys_addr!=NULL); - if (amx_addr>=amx->hea && amx_addrstk || amx_addr<0 || amx_addr>=amx->stp) { + if ((amx_addr>=amx->hea && amx_addrstk) || amx_addr<0 || amx_addr>=amx->stp) { *phys_addr=NULL; return AMX_ERR_MEMACCESS; } /* if */ *phys_addr=(cell *)(data + (int)amx_addr); return AMX_ERR_NONE; } #endif /* AMX_GETADDR */ @@ -4089,17 +4089,17 @@ int AMXAPI amx_UTF8Len(const cell *cstr, int AMXAPI amx_GetLibraries(AMX *amx) { AMX_HEADER *hdr = (AMX_HEADER *)amx->base; int numLibraries = NUMENTRIES(hdr, libraries, pubvars); return numLibraries; } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) #define _snprintf snprintf #endif const char *AMXAPI amx_GetLibrary(AMX *amx, int index, char *buffer, int len) { AMX_HEADER *hdr = (AMX_HEADER *)amx->base; AMX_FUNCSTUB *lib; diff --git a/amxmodx/amx.h b/amxmodx/amx.h --- a/amxmodx/amx.h +++ b/amxmodx/amx.h @@ -19,27 +19,27 @@ * 3. This notice may not be removed or altered from any source distribution. * * Version: $Id: amx.h 3006 2006-08-28 11:08:18Z dvander $ */ #if defined FREEBSD && !defined __FreeBSD__ #define __FreeBSD__ #endif -#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ +#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ #include #endif #ifndef AMX_H_INCLUDED #define AMX_H_INCLUDED #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -185,17 +185,17 @@ typedef int (AMXAPI *AMX_NATIVE_FILTER)( #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -437,17 +437,17 @@ int AMXAPI amx_GetStringOld(char *dest,c #else #error Unsupported cell size #endif #define amx_RegisterFunc(amx, name, func) \ amx_Register((amx), amx_NativeInfo((name),(func)), 1); #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack() /* reset default packing */ #elif defined MACOS && defined __MWERKS__ #pragma options align=reset #else #pragma pack(pop) /* reset previous packing */ #endif #endif diff --git a/amxmodx/amxcore.cpp b/amxmodx/amxcore.cpp --- a/amxmodx/amxcore.cpp +++ b/amxmodx/amxcore.cpp @@ -175,17 +175,17 @@ static cell AMX_NATIVE_CALL setarg(AMX * hdr=(AMX_HEADER *)amx->base; data=amx->data ? amx->data : amx->base+(int)hdr->dat; /* get the base value */ value= * (cell *)(data+(int)amx->frm+((int)params[1]+3)*sizeof(cell)); /* adjust the address in "value" in case of an array access */ value+=params[2]*sizeof(cell); /* verify the address */ - if (value<0 || value>=amx->hea && valuestk) + if (value<0 || (value>=amx->hea && valuestk)) return 0; /* set the value indirectly */ * (cell *)(data+(int)value) = params[3]; return 1; } static cell AMX_NATIVE_CALL heapspace(AMX *amx,cell *params) { diff --git a/amxmodx/amxdbg.cpp b/amxmodx/amxdbg.cpp --- a/amxmodx/amxdbg.cpp +++ b/amxmodx/amxdbg.cpp @@ -457,18 +457,18 @@ int AMXAPI dbg_GetVariable(AMX_DBG *amxd while (index < amxdbg->hdr->symbols && (amxdbg->symboltbl[index]->ident == iFUNCTN || strcmp(amxdbg->symboltbl[index]->name, symname) != 0) && (amxdbg->symboltbl[index]->codestart > scopeaddr || amxdbg->symboltbl[index]->codeend < scopeaddr)) index++; if (index >= amxdbg->hdr->symbols) break; /* check the range, keep a pointer to the symbol with the smallest range */ if (strcmp(amxdbg->symboltbl[index]->name, symname) == 0 - && (codestart == 0 && codeend == 0 - || amxdbg->symboltbl[index]->codestart >= codestart && amxdbg->symboltbl[index]->codeend <= codeend)) + && ((codestart == 0 && codeend == 0) + || (amxdbg->symboltbl[index]->codestart >= codestart && amxdbg->symboltbl[index]->codeend <= codeend))) { *sym = amxdbg->symboltbl[index]; codestart = amxdbg->symboltbl[index]->codestart; codeend = amxdbg->symboltbl[index]->codeend; } /* if */ index++; } /* for */ diff --git a/amxmodx/amxdbg.h b/amxmodx/amxdbg.h --- a/amxmodx/amxdbg.h +++ b/amxmodx/amxdbg.h @@ -44,17 +44,17 @@ extern "C" { #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -151,17 +151,17 @@ int AMXAPI dbg_GetLineAddress(AMX_DBG *a int AMXAPI dbg_GetAutomatonName(AMX_DBG *amxdbg, int automaton, const char **name); int AMXAPI dbg_GetStateName(AMX_DBG *amxdbg, int state, const char **name); int AMXAPI dbg_GetTagName(AMX_DBG *amxdbg, int tag, const char **name); int AMXAPI dbg_GetVariable(AMX_DBG *amxdbg, const char *symname, ucell scopeaddr, const AMX_DBG_SYMBOL **sym); int AMXAPI dbg_GetArrayDim(AMX_DBG *amxdbg, const AMX_DBG_SYMBOL *sym, const AMX_DBG_SYMDIM **symdim); #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack() /* reset default packing */ #elif defined MACOS && defined __MWERKS__ #pragma options align=reset #else #pragma pack(pop) /* reset previous packing */ #endif #endif diff --git a/amxmodx/amxjitsn.asm b/amxmodx/amxjitsn.asm --- a/amxmodx/amxjitsn.asm +++ b/amxmodx/amxjitsn.asm @@ -298,24 +298,16 @@ %endmacro %macro _DROPARGS 1 ; (TR) remove function arguments from the stack %ifndef STDECL ; (for __cdecl calling convention only) add esp,%1 %endif %endmacro - -%ifdef WIN32 -section .data exec -%else -section .text -%endif - - global asm_runJIT, _asm_runJIT global amx_exec_jit, _amx_exec_jit global getMaxCodeSize, _getMaxCodeSize ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; void asm_runJIT( AMX_HEADER *amxh, JumpAddressArray *jumps, void *dest ) ; @@ -431,25 +423,16 @@ reloc_code_done: reloc_done: mov eax,0 pop esi pop edi pop ebx pop ebp ret -; GWMV: -; The code below modifies itself to store the arguments to the Pawn opcodes -; in the compiled code. This is fine, but the .text section in an ELF executable -; is usually marked read-only, that's why this code is in the .data section. - -%ifndef WIN32 -section .data exec -%endif - OP_LOAD_PRI: ;nop; putval j_load_pri+2 GO_ON j_load_pri, OP_LOAD_ALT, 8 j_load_pri: mov eax,[edi+12345678h] CHECKCODESIZE j_load_pri @@ -1047,17 +1030,17 @@ OP_RETN: OP_CALL: ;nop; RELOC j_call_e8-j_call+1 GO_ON j_call, OP_CALL_I, 8 j_call: ;call 12345678h ; tasm chokes on this out of a sudden _PUSH 0 - j_call_e8 + j_call_e8: db 0e8h, 0, 0, 0, 0 CHECKCODESIZE j_call OP_CALL_I: ;nop; GO_ON j_call_i, OP_JUMP j_call_i: @@ -2586,9 +2569,9 @@ amx_opcodelist_jit: DD OP_FLOAT_MUL ; DA DD OP_FLOAT_DIV ; DA DD OP_FLOAT_ADD ; DA DD OP_FLOAT_SUB ; DA DD OP_FLOAT_TO ; DA DD OP_FLOAT_ROUND ; DA DD OP_FLOAT_CMP ; DA -END +END: diff --git a/amxmodx/amxmodx.cpp b/amxmodx/amxmodx.cpp --- a/amxmodx/amxmodx.cpp +++ b/amxmodx/amxmodx.cpp @@ -141,17 +141,17 @@ static cell AMX_NATIVE_CALL server_print message[len] = 0; SERVER_PRINT(message); return len; } static cell AMX_NATIVE_CALL engclient_print(AMX *amx, cell *params) /* 3 param */ { - int len; + int len = 0; char *msg; if (params[1] == 0) { for (int i = 1; i <= gpGlobals->maxClients; ++i) { CPlayer* pPlayer = GET_PLAYER_POINTER_I(i); @@ -492,16 +492,25 @@ static cell AMX_NATIVE_CALL is_amd64_ser { #if PAWN_CELL_SIZE==64 return 1; #else return 0; #endif } +static cell AMX_NATIVE_CALL is_mac_server(AMX *amx, cell *params) +{ +#ifdef __APPLE__ + return 1; +#else + return 0; +#endif +} + static cell AMX_NATIVE_CALL is_jit_enabled(AMX *amx, cell *params) // PM: Useless ;P { #ifdef JIT return 1; #else return 0; #endif } @@ -1000,17 +1009,17 @@ static cell AMX_NATIVE_CALL get_user_tea { // SidLuke, DoD fix if (g_bmod_dod) { int iTeam = pPlayer->pEdict->v.team; if (params[3]) { - char *szTeam = ""; + const char *szTeam = ""; switch (iTeam) { case 1: szTeam = "Allies"; break; case 2: szTeam = "Axis"; @@ -3838,17 +3847,17 @@ cell AMX_NATIVE_CALL require_module(AMX } static cell AMX_NATIVE_CALL amx_mkdir(AMX *amx, cell *params) { int len = 0; char *path = get_amxstring(amx, params[1], 0, len); char *realpath = build_pathname("%s", path); -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) return mkdir(realpath, 0700); #else return mkdir(realpath); #endif } static cell AMX_NATIVE_CALL find_plugin_byfile(AMX *amx, cell *params) { @@ -4701,16 +4710,17 @@ AMX_NATIVE_INFO amxmodx_Natives[] = {"get_xvar_float", get_xvar_num}, {"get_xvar_id", get_xvar_id}, {"get_xvar_num", get_xvar_num}, {"int3", int3}, {"is_amd64_server", is_amd64_server}, {"is_dedicated_server", is_dedicated_server}, {"is_jit_enabled", is_jit_enabled}, {"is_linux_server", is_linux_server}, + {"is_mac_server", is_mac_server}, {"is_map_valid", is_map_valid}, {"is_module_loaded", is_module_loaded}, {"is_plugin_loaded", is_plugin_loaded}, {"is_user_alive", is_user_alive}, {"is_user_authorized", is_user_authorized}, {"is_user_bot", is_user_bot}, {"is_user_connected", is_user_connected}, {"is_user_connecting", is_user_connecting}, diff --git a/amxmodx/amxmodx.h b/amxmodx/amxmodx.h --- a/amxmodx/amxmodx.h +++ b/amxmodx/amxmodx.h @@ -27,17 +27,17 @@ * to your version of the file, but you are not obligated to do so. If * you do not wish to do so, delete this exception statement from your * version. */ #ifndef AMXMODX_H #define AMXMODX_H -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) #include #include #include "sclinux.h" #endif #include //tolower, etc #include "string.h" #include #include @@ -81,17 +81,17 @@ extern AMX_NATIVE_INFO file_Natives[]; extern AMX_NATIVE_INFO float_Natives[]; extern AMX_NATIVE_INFO string_Natives[]; extern AMX_NATIVE_INFO vault_Natives[]; extern AMX_NATIVE_INFO msg_Natives[]; extern AMX_NATIVE_INFO vector_Natives[]; extern AMX_NATIVE_INFO g_SortNatives[]; extern AMX_NATIVE_INFO g_DataStructNatives[]; -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLOAD(path) (DLHANDLE)LoadLibrary(path) #define DLPROC(m, func) GetProcAddress(m, func) #define DLFREE(m) FreeLibrary(m) #else #define DLLOAD(path) (DLHANDLE)dlopen(path, RTLD_NOW) #define DLPROC(m, func) dlsym(m, func) #define DLFREE(m) dlclose(m) #endif @@ -102,24 +102,24 @@ extern AMX_NATIVE_INFO g_DataStructNativ #else #if defined AMD64 typedef __int64 _INT_PTR; #else typedef __int32 _INT_PTR; #endif #endif -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) typedef HINSTANCE DLHANDLE; #else typedef void* DLHANDLE; #define INFINITE 0xFFFFFFFF #endif -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define PATH_SEP_CHAR '\\' #define ALT_SEP_CHAR '/' #else #define PATH_SEP_CHAR '/' #define ALT_SEP_CHAR '\\' #endif #ifndef GETPLAYERAUTHID @@ -134,17 +134,17 @@ extern AMX_NATIVE_INFO g_DataStructNativ #define SETCLIENTMAXSPEED (*g_engfuncs.pfnSetClientMaxspeed) char* UTIL_SplitHudMessage(register const char *src); int UTIL_ReadFlags(const char* c); void UTIL_ClientPrint(edict_t *pEntity, int msg_dest, char *msg); void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1 = NULL, const char *arg2 = NULL); void UTIL_GetFlags(char* flags, int flag); -void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, char *pMessage); +void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, const char *pMessage); void UTIL_IntToString(int value, char *output); void UTIL_ShowMOTD(edict_t *client, char *motd, int mlen, const char *name); void UTIL_ShowMenu(edict_t* pEntity, int slots, int time, char *menu, int mlen); char *UTIL_VarArgs(const char *fmt, ...); #define GET_PLAYER_POINTER(e) (&g_players[ENTINDEX(e)]) @@ -271,34 +271,34 @@ enum CountModulesMode }; int countModules(CountModulesMode mode); void modules_callPluginsLoaded(); void modules_callPluginsUnloaded(); void modules_callPluginsUnloading(); cell* get_amxaddr(AMX *amx, cell amx_addr); -char* build_pathname(char *fmt, ...); -char* build_pathname_r(char *buffer, size_t maxlen, char *fmt, ...); +char* build_pathname(const char *fmt, ...); +char* build_pathname_r(char *buffer, size_t maxlen, const char *fmt, ...); char* format_amxstring(AMX *amx, cell *params, int parm, int& len); AMX* get_amxscript(int, void**, const char**); const char* get_amxscriptname(AMX* amx); char* get_amxstring(AMX *amx, cell amx_addr, int id, int& len); extern "C" size_t get_amxstring_r(AMX *amx, cell amx_addr, char *destination, int maxlen); int amxstring_len(cell* cstr); int load_amxscript(AMX* amx, void** program, const char* path, char error[64], int debug); int set_amxnatives(AMX* amx, char error[64]); int set_amxstring(AMX *amx, cell amx_addr, const char *source, int max); int unload_amxscript(AMX* amx, void** program); void copy_amxmemory(cell* dest, cell* src, int len); void get_modname(char*); -void print_srvconsole(char *fmt, ...); -void report_error(int code, char* fmt, ...); +void print_srvconsole(const char *fmt, ...); +void report_error(int code, const char* fmt, ...); void* alloc_amxmemory(void**, int size); void free_amxmemory(void **ptr); // get_localinfo const char* get_localinfo(const char* name, const char* def); cell AMX_NATIVE_CALL require_module(AMX *amx, cell *params); extern "C" void LogError(AMX *amx, int err, const char *fmt, ...); enum ModuleCallReason diff --git a/amxmodx/amxxfile.cpp b/amxmodx/amxxfile.cpp --- a/amxmodx/amxxfile.cpp +++ b/amxmodx/amxxfile.cpp @@ -37,17 +37,17 @@ **********************/ #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif -#if defined __linux__ +#if defined(__linux__) || defined(__APPLE__) #pragma pack(1) /* structures must be packed (byte-aligned) */ #else #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ #endif #endif @@ -122,27 +122,27 @@ CAmxxReader::CAmxxReader(const char *fil DATAREAD(&m_Bh.numPlugins, sizeof(mint8_t), 1); m_Bh.plugins = new PluginEntry[m_Bh.numPlugins]; PluginEntry *pe; m_SectionHdrOffset = 0; m_Entry = -1; for (mint8_t i = 0; i < m_Bh.numPlugins; i++) { - pe = &(m_Bh.plugins[i]); + pe = &(m_Bh.plugins[(unsigned)i]); DATAREAD(&pe->cellsize, sizeof(mint8_t), 1); DATAREAD(&pe->disksize, sizeof(int32_t), 1); DATAREAD(&pe->imagesize, sizeof(int32_t), 1); DATAREAD(&pe->memsize, sizeof(int32_t), 1); DATAREAD(&pe->offs, sizeof(int32_t), 1); } for (mint8_t i = 0; i < m_Bh.numPlugins; i++) { - pe = &(m_Bh.plugins[i]); + pe = &(m_Bh.plugins[(unsigned)i]); if (pe->cellsize == m_CellSize) { m_Entry = i; break; } } diff --git a/amxmodx/amxxlog.cpp b/amxmodx/amxxlog.cpp --- a/amxmodx/amxxlog.cpp +++ b/amxmodx/amxxlog.cpp @@ -30,22 +30,22 @@ // amxx_logging localinfo: // 0 = no logging // 1 = one logfile / day // 2 = one logfile / map // 3 = HL Logs #include -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #include #endif #include "amxmodx.h" -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define vsnprintf _vsnprintf #endif #include "svn_version.h" CLog::CLog() { m_LogType = 0; @@ -132,17 +132,17 @@ void CLog::UseFile(const String &fileNam static char file[256]; m_LogFile.assign(build_pathname_r(file, sizeof(file)-1, "%s/%s", g_log_dir.c_str(), fileName.c_str())); } void CLog::MapChange() { // create dir if not existing char file[256]; -#ifdef __linux +#if defined(__linux__) || defined(__APPLE__) mkdir(build_pathname_r(file, sizeof(file)-1, "%s", g_log_dir.c_str()), 0700); #else mkdir(build_pathname_r(file, sizeof(file)-1, "%s", g_log_dir.c_str())); #endif m_LogType = atoi(get_localinfo("amxx_logging", "1")); if (m_LogType < 0 || m_LogType > 3) diff --git a/amxmodx/binlog.cpp b/amxmodx/binlog.cpp --- a/amxmodx/binlog.cpp +++ b/amxmodx/binlog.cpp @@ -41,17 +41,17 @@ bool BinLog::Open() { const char *data = get_localinfo("amxmodx_datadir", "addons/amxmodx/data"); char path[255]; build_pathname_r(path, sizeof(path)-1, "%s/binlogs", data); if (!DirExists(path)) { mkdir(path -#if defined __linux__ +#if defined(__linux__) || defined(__APPLE__) , 0755 #endif ); if (!DirExists(path)) return false; } char file[255]; diff --git a/amxmodx/datastructs.h b/amxmodx/datastructs.h --- a/amxmodx/datastructs.h +++ b/amxmodx/datastructs.h @@ -210,18 +210,17 @@ public: return NULL; } return data + (which * cellcount); }; // Shifts all items from this item, and including this item up 1. int ShiftUpFrom(size_t which) { // No point shifting this. - if (this->count < 0 || - which > this->count) + if (which > this->count) { return 0; } // First make a new item. this->Push(); // If we got an InsertAfter(lastitem), then which will equal this->count - 1 @@ -249,18 +248,17 @@ public: return 1; }; // Shifts all items from this item, and including this item down 1. // This deletes the item specified. int Delete(size_t which) { // No point shifting this. - if (this->count < 0 || - which >= this->count) + if (which >= this->count) { return 0; } for (size_t i=which; icount - 1; i++) { memcpy(GetCellPointer(i), GetCellPointer(i + 1), sizeof(cell) * cellcount); diff --git a/amxmodx/debugger.cpp b/amxmodx/debugger.cpp --- a/amxmodx/debugger.cpp +++ b/amxmodx/debugger.cpp @@ -609,19 +609,19 @@ void Debugger::FmtGenericMsg(AMX *amx, i { const char *filename = ""; char native[sNAMEMAX+1]; CList::iterator a = g_loadedscripts.find(amx); if (a) filename = (*a).getName(); size_t len = strlen(filename); - for (size_t i=len-1; i>=0; i--) + for (size_t i=len-1; i #include #include #include #endif // header file for unlink() -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) #include #else #define WINDOWS_LEAN_AND_MEAN #include #include #endif #include "amxmodx.h" @@ -779,17 +779,17 @@ static cell AMX_NATIVE_CALL amx_ungetc(A FILE *fp = (FILE *)params[1]; if (!fp) return 0; return ungetc(static_cast(params[2]), fp); } -#if defined __linux__ +#if defined(__linux__) || defined(__APPLE__) #define _rmdir rmdir #endif static cell AMX_NATIVE_CALL amx_rmdir(AMX *amx, cell *params) { int len; char* sFile = build_pathname("%s", get_amxstring(amx, params[1], 0, len)); @@ -812,17 +812,17 @@ static cell AMX_NATIVE_CALL amx_rename(A { build_pathname_r(f_old_r, sizeof(f_old_r)-1, "%s", fold); build_pathname_r(f_new_r, sizeof(f_new_r)-1, "%s", fnew); } else { snprintf(f_old_r, sizeof(f_old_r)-1, "%s", fold); snprintf(f_new_r, sizeof(f_new_r)-1, "%s", fnew); } -#if defined __linux__ +#if defined(__linux__) || defined(__APPLE__) return (rename(f_old_r, f_new_r) == 0); #elif defined WIN32 return MoveFileA(f_old_r, f_new_r); #endif } static cell LoadFileForMe(AMX *amx, cell *params) { diff --git a/amxmodx/format.cpp b/amxmodx/format.cpp --- a/amxmodx/format.cpp +++ b/amxmodx/format.cpp @@ -24,16 +24,21 @@ #define is_digit(c) ((unsigned)to_digit(c) <= 9) #define to_char(n) ((n) + '0') #define CHECK_ARGS(n) \ if ((arg+n) > args) { \ LogError(amx, AMX_ERR_PARAMS, "String formatted incorrectly - parameter %d (total %d)", arg, args); \ return 0; \ } +template size_t atcprintf(cell *, size_t, const cell *, AMX *, cell *, int *); +template size_t atcprintf(char *, size_t, const cell *, AMX *, cell *, int *); +template size_t atcprintf(cell *, size_t, const char *, AMX *, cell *, int *); +template size_t atcprintf(char *, size_t, const char *, AMX *, cell *, int *); + THash BadLang_Table; static cvar_t *amx_mldebug = NULL; static cvar_t *amx_cl_langs = NULL; const char *translate(AMX *amx, cell amxaddr, const char *key) { const char *pLangName = NULL; diff --git a/amxmodx/format.h b/amxmodx/format.h --- a/amxmodx/format.h +++ b/amxmodx/format.h @@ -1,11 +1,14 @@ #ifndef _INCLUDE_FORMATTING_H #define _INCLUDE_FORMATTING_H //Amx Templatized Cell Printf template size_t atcprintf(D *buffer, size_t maxlen, const S *format, AMX *amx, cell *params, int *param); +//extern template +//size_t atcprintf(cell *buffer, size_t maxlen, const cell *format, AMX *amx, cell *params, int *param); + const char *translate(AMX *amx, cell amxaddr, const char *key); bool translate_bcompat(AMX *amx, cell *source, const char **_key, const char **_def); #endif //_INCLUDE_FORMATTING_H diff --git a/amxmodx/helpers-x86.asm b/amxmodx/helpers-x86.asm --- a/amxmodx/helpers-x86.asm +++ b/amxmodx/helpers-x86.asm @@ -38,14 +38,14 @@ amxx_CpuSupport: je .fail mov eax, 1 jmp .end .fail: xor eax, eax -.end +.end: pop ebx pop ebp ret diff --git a/amxmodx/md5.cpp b/amxmodx/md5.cpp --- a/amxmodx/md5.cpp +++ b/amxmodx/md5.cpp @@ -180,17 +180,17 @@ unsigned char *MD5::raw_digest(){ } memcpy(s, digest, 16); return s; } -char *MD5::hex_digest(){ +const char *MD5::hex_digest(){ int i; char *s= new char[33]; if (!finalized){ /* cerr << "MD5::hex_digest: Can't get digest if you haven't "<< "finalized the digest!" <::iterator a = g_forcemodels.begin(); a; ++a) { PRECACHE_MODEL((char*)(*a).getFilename()); ENGINE_FORCE_UNMODIFIED((*a).getForceType(), (*a).getMin(), (*a).getMax(), (*a).getFilename()); } } RETURN_META_VALUE(MRES_IGNORED, 0); } -int C_PrecacheSound(char *s) +int C_PrecacheSound(const char *s) { if (!g_forcedsounds) { g_forcedsounds = true; for (CList::iterator a = g_forcesounds.begin(); a; ++a) { PRECACHE_SOUND((char*)(*a).getFilename()); ENGINE_FORCE_UNMODIFIED((*a).getForceType(), (*a).getMin(), (*a).getMax(), (*a).getFilename()); @@ -726,26 +726,26 @@ void C_ServerDeactivate_Post() { if (g_memreport_count == 0) { // make new directory time_t td; time(&td); tm *curTime = localtime(&td); int i = 0; -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) mkdir(build_pathname("%s/memreports", get_localinfo("amxx_basedir", "addons/amxmodx")), 0700); #else mkdir(build_pathname("%s/memreports", get_localinfo("amxx_basedir", "addons/amxmodx"))); #endif while (true) { char buffer[256]; sprintf(buffer, "%s/memreports/D%02d%02d%03d", get_localinfo("amxx_basedir", "addons/amxmodx"), curTime->tm_mon + 1, curTime->tm_mday, i); -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) mkdir(build_pathname("%s", g_log_dir.c_str()), 0700); if (mkdir(build_pathname(buffer), 0700) < 0) #else mkdir(build_pathname("%s", g_log_dir.c_str())); if (mkdir(build_pathname(buffer)) < 0) #endif { if (errno == EEXIST) @@ -1078,26 +1078,26 @@ void C_StartFrame_Post(void) if (g_memreport_count == 0) { // make new directory time_t td; time(&td); tm *curTime = localtime(&td); int i = 0; -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) mkdir(build_pathname("%s/memreports", get_localinfo("amxx_basedir", "addons/amxmodx")), 0700); #else mkdir(build_pathname("%s/memreports", get_localinfo("amxx_basedir", "addons/amxmodx"))); #endif while (true) { char buffer[256]; sprintf(buffer, "%s/memreports/D%02d%02d%03d", get_localinfo("amxx_basedir", "addons/amxmodx"), curTime->tm_mon + 1, curTime->tm_mday, i); -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) mkdir(build_pathname("%s", g_log_dir.c_str()), 0700); if (mkdir(build_pathname(buffer), 0700) < 0) #else mkdir(build_pathname("%s", g_log_dir.c_str())); if (mkdir(build_pathname(buffer)) < 0) #endif { if (errno == EEXIST) @@ -1280,17 +1280,17 @@ void C_TraceLine_Post(const float *v1, c pPlayer->aiming = ptr->iHitgroup; pPlayer->lastTrace = ptr->vecEndPos; } RETURN_META(MRES_IGNORED); } -void C_AlertMessage(ALERT_TYPE atype, char *szFmt, ...) +void C_AlertMessage(ALERT_TYPE atype, const char *szFmt, ...) { if (atype != at_logged) { RETURN_META(MRES_IGNORED); } /* There are also more messages but we want only logs at_notice, @@ -1324,17 +1324,17 @@ void C_AlertMessage(ALERT_TYPE atype, ch if (retVal) { RETURN_META(MRES_SUPERCEDE); } RETURN_META(MRES_IGNORED); } -void C_ChangeLevel(char *map, char *what) +void C_ChangeLevel(const char *map, const char *what) { int ret = executeForwards(FF_ChangeLevel, map); if (ret) RETURN_META(MRES_SUPERCEDE); RETURN_META(MRES_IGNORED); } void C_CvarValue2(const edict_t *pEdict, int requestId, const char *cvar, const char *value) @@ -1366,17 +1366,17 @@ void C_CvarValue2(const edict_t *pEdict, break; } } RETURN_META(MRES_HANDLED); } -C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +C_DLLEXPORT int Meta_Query(const char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) { gpMetaUtilFuncs = pMetaUtilFuncs; *pPlugInfo = &Plugin_info; int mmajor = 0, mminor = 0, pmajor = 0, pminor = 0; sscanf(ifvers, "%d:%d", &mmajor, &mminor); sscanf(Plugin_info.ifvers, "%d:%d", &pmajor, &pminor); @@ -1530,17 +1530,17 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIM Module_UncacheFunctions(); ClearLibraries(LibSource_Plugin); ClearLibraries(LibSource_Module); return (TRUE); } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) // linux prototype C_DLLEXPORT void GiveFnptrsToDll(enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals) { #else #ifdef _MSC_VER // MSVC: Simulate __stdcall calling convention C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll(enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals) { diff --git a/amxmodx/modules.cpp b/amxmodx/modules.cpp --- a/amxmodx/modules.cpp +++ b/amxmodx/modules.cpp @@ -24,18 +24,21 @@ * L.L.C ("Valve"). You must obey the GNU General Public License in all * respects for all of the code used other than the HL Engine and MODs * from Valve. If you modify this file, you may extend this exception * to your version of the file, but you are not obligated to do so. If * you do not wish to do so, delete this exception statement from your * version. */ -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) +#if defined(__linux__) #include +#endif + #include #include #include "sclinux.h" #endif #include "amxmodx.h" #include "osdep.h" // sleep, etc #include "CFile.h" @@ -81,17 +84,17 @@ bool DirExists(const char *dir) if (S_ISDIR(s.st_mode)) return true; #endif return false; } -void report_error(int code, char* fmt, ...) +void report_error(int code, const char* fmt, ...) { va_list argptr; char string[256]; *string = 0; va_start(argptr, fmt); vsnprintf(string, 255, fmt, argptr); string[255] = 0; va_end(argptr); @@ -101,17 +104,17 @@ void report_error(int code, char* fmt, . AMXXLOG_Log("Error:"); AMXXLOG_Log(string); } else { AMXXLOG_Log("!!! There was an unexpected module error."); AMXXLOG_Log("The server may not work correctly."); } } -void print_srvconsole(char *fmt, ...) +void print_srvconsole(const char *fmt, ...) { va_list argptr; static char string[384]; va_start(argptr, fmt); vsnprintf(string, sizeof(string) - 1, fmt, argptr); string[sizeof(string) - 1] = '\0'; va_end(argptr); @@ -335,21 +338,24 @@ int load_amxscript(AMX *amx, void **prog strcpy(error, "Failed to initialize JIT'd plugin"); return (amx->error = AMX_ERR_INIT); } if ((err = amx_InitJIT(amx, (void *)rt, (void *)np)) == AMX_ERR_NONE) { //amx->base = (unsigned char FAR *)realloc(np, amx->code_size); -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) amx->base = (unsigned char *)VirtualAlloc(NULL, amx->code_size, MEM_COMMIT, PAGE_EXECUTE_READWRITE); -#else - //posix_memalign((void **)&(amx->base), sysconf(_SC_PAGESIZE), amx->code_size); +#elif defined(__GNUC__) +# if defined(__APPLE__) + amx->base = (unsigned char *)valloc(amx->code_size); +# else amx->base = (unsigned char *)memalign(sysconf(_SC_PAGESIZE), amx->code_size); +# endif mprotect((void *)amx->base, amx->code_size, PROT_READ|PROT_WRITE|PROT_EXEC); #endif if (amx->base) memcpy(amx->base, np, amx->code_size); delete [] np; delete [] rt; @@ -636,17 +642,17 @@ int unload_amxscript(AMX* amx, void** pr a.remove(); char *prg = (char *)*program; if (!prg) return AMX_ERR_NONE; #if defined JIT -#if defined __linux__ +#if defined(__linux__) || defined(__APPLE__) if ((flags & AMX_FLAG_JITC) != AMX_FLAG_JITC) { delete [] prg; } else { #ifdef free #undef free free(prg); #define free(ptr) m_deallocator(__FILE__, __LINE__, __FUNCTION__, m_alloc_free, ptr) @@ -715,17 +721,17 @@ const char* get_amxscriptname(AMX* amx) return a ? (*a).getName() : ""; } void get_modname(char* buffer) { strcpy(buffer, g_mod_name.c_str()); } -char* build_pathname(char *fmt, ...) +char* build_pathname(const char *fmt, ...) { static char string[256]; int b; int a = b = snprintf(string, 255, "%s%c", g_mod_name.c_str(), PATH_SEP_CHAR); va_list argptr; va_start(argptr, fmt); a += vsnprintf (&string[a], 255 - a, fmt, argptr); @@ -741,17 +747,17 @@ char* build_pathname(char *fmt, ...) *path = PATH_SEP_CHAR; } ++path; } return string; } -char *build_pathname_r(char *buffer, size_t maxlen, char *fmt, ...) +char *build_pathname_r(char *buffer, size_t maxlen, const char *fmt, ...) { snprintf(buffer, maxlen, "%s%c", g_mod_name.c_str(), PATH_SEP_CHAR); size_t len = strlen(buffer); char *ptr = buffer + len; va_list argptr; va_start(argptr, fmt); @@ -766,17 +772,17 @@ char *build_pathname_r(char *buffer, siz } ++ptr; } return buffer; } // build pathname based on addons dir -char* build_pathname_addons(char *fmt, ...) +char* build_pathname_addons(const char *fmt, ...) { static char string[256]; va_list argptr; va_start(argptr, fmt); vsnprintf (string, 255, fmt, argptr); va_end(argptr); @@ -870,29 +876,31 @@ bool ConvertModuleName(const char *pathS } else { *ptr = '\0'; } path.assign(orig_path); path.append(PATH_SEP_CHAR); path.append(tmpname); path.append("_amxx"); -#if defined __linux__ +#if defined(__linux__) || defined(__APPLE__) #if defined AMD64 || PAWN_CELL_SIZE==64 path.append("_amd64"); #else path.append("_i"); path.append(iDigit); path.append("86"); #endif #endif #if defined WIN32 path.append(".dll"); #elif defined __linux__ path.append(".so"); +#elif defined __APPLE__ + path.append(".dylib"); #endif return true; } bool LoadModule(const char *shortname, PLUG_LOADTIME now, bool simplify, bool noFileBail) { char pathString[512]; @@ -1174,30 +1182,26 @@ void modules_callPluginsUnloading() (*iter).CallPluginsUnloading(); ++iter; } } // new functions int MNF_AddNatives(AMX_NATIVE_INFO* natives) { - CList::iterator a = g_modules.begin(); - if (!g_CurrentlyCalledModule || g_ModuleCallReason != ModuleCall_Attach) return FALSE; // may only be called from attach g_CurrentlyCalledModule->m_Natives.push_back(natives); return TRUE; } int MNF_AddNewNatives(AMX_NATIVE_INFO *natives) { - CList::iterator a = g_modules.begin(); - if (!g_CurrentlyCalledModule || g_ModuleCallReason != ModuleCall_Attach) return FALSE; // may only be called from attach g_CurrentlyCalledModule->m_NewNatives.push_back(natives); return TRUE; } diff --git a/amxmodx/modules.h b/amxmodx/modules.h --- a/amxmodx/modules.h +++ b/amxmodx/modules.h @@ -30,17 +30,17 @@ */ #ifndef __MODULES_H__ #define __MODULES_H__ #include "amx.h" #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) #define WINAPI #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT diff --git a/amxmodx/natives.cpp b/amxmodx/natives.cpp --- a/amxmodx/natives.cpp +++ b/amxmodx/natives.cpp @@ -30,18 +30,21 @@ #include "amxmodx.h" #include "sh_stack.h" #include "natives.h" #include "debugger.h" #include "libraries.h" #include "format.h" -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) +#if defined(__linux__) #include +#endif + #include #include #include "sclinux.h" #endif //Written by David "BAILOPAN" Anderson //With the exception for param_convert, which was written by // Julien "dJeyL" Laurent @@ -474,22 +477,26 @@ static cell AMX_NATIVE_CALL register_nat regnative *pNative = new regnative; pNative->amx = amx; pNative->func = idx; //we'll apply a safety buffer too //make our function int size = amxx_DynaCodesize(); -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) DWORD temp; pNative->pfn = new char[size + 10]; VirtualProtect(pNative->pfn, size+10, PAGE_EXECUTE_READWRITE, &temp); -#else +#elif defined(__GNUC__) +# if defined(__APPLE__) + pNative->pfn = (char *)valloc(size+10); +# else pNative->pfn = (char *)memalign(sysconf(_SC_PAGESIZE), size+10); +# endif mprotect((void *)pNative->pfn, size+10, PROT_READ|PROT_WRITE|PROT_EXEC); #endif int id = (int)g_RegNatives.size(); amxx_DynaMake(pNative->pfn, id); pNative->func = idx; pNative->style = params[3]; diff --git a/amxmodx/osdefs.h b/amxmodx/osdefs.h --- a/amxmodx/osdefs.h +++ b/amxmodx/osdefs.h @@ -34,16 +34,20 @@ # define __32BIT__ 1 # endif #endif #if defined __linux__ #include #endif +#if defined __APPLE__ + #include +#endif + /* Linux NOW has these */ #if !defined BIG_ENDIAN #define BIG_ENDIAN 4321 #endif #if !defined LITTLE_ENDIAN #define LITTLE_ENDIAN 1234 #endif diff --git a/amxmodx/sclinux.h b/amxmodx/sclinux.h --- a/amxmodx/sclinux.h +++ b/amxmodx/sclinux.h @@ -15,36 +15,40 @@ * * So we stick to getchar at the moment... (one needs to key ctrl-d to terminate input if getch is called with a controlling * terminal driven by a tty having -raw) */ #define getch getchar #define stricmp(a,b) strcasecmp(a,b) #define strnicmp(a,b,c) strncasecmp(a,b,c) -#if defined __linux__ && !defined _snprintf +#if ( defined(__linux__) || defined(__APPLE__) ) && !defined _snprintf #define _snprintf snprintf #endif -#if defined __linux__ && !defined _vsnprintf +#if ( defined(__linux__) || defined(__APPLE__) ) && !defined _vsnprintf //#define _vsnprintf vsnprintf #endif /* * WinWorld wants '\'. Unices do not. */ #define DIRECTORY_SEP_CHAR '/' #define DIRECTORY_SEP_STR "/" /* * SC assumes that a computer is Little Endian unless told otherwise. It uses * (and defines) the macros BYTE_ORDER and BIG_ENDIAN. * For Linux, we must overrule these settings with those defined in glibc. */ #if !defined __BYTE_ORDER # include +# if defined __APPLE__ +# include +# define __BYTE_ORDER BYTE_ORDER +# endif #endif #if defined __OpenBSD__ # define __BYTE_ORDER BYTE_ORDER # define __LITTLE_ENDIAN LITTLE_ENDIAN # define __BIG_ENDIAN BIG_ENDIAN #endif diff --git a/amxmodx/sdk/amxxmodule.cpp b/amxmodx/sdk/amxxmodule.cpp --- a/amxmodx/sdk/amxxmodule.cpp +++ b/amxmodx/sdk/amxxmodule.cpp @@ -2235,17 +2235,17 @@ static META_FUNCTIONS g_MetaFunctions_Ta GetEntityAPI2, GetEntityAPI2_Post, GetNewDLLFunctions, GetNewDLLFunctions_Post, GetEngineFunctions, GetEngineFunctions_Post }; -C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +C_DLLEXPORT int Meta_Query(const char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) { if ((int) CVAR_GET_FLOAT("developer") != 0) UTIL_LogPrintf("[%s] dev: called: Meta_Query; version=%s, ours=%s\n", Plugin_info.logtag, ifvers, Plugin_info.ifvers); // Check for valid pMetaUtilFuncs before we continue. if(!pMetaUtilFuncs) { UTIL_LogPrintf("[%s] ERROR: Meta_Query called with null pMetaUtilFuncs\n", Plugin_info.logtag); @@ -2329,17 +2329,17 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIM #ifdef FN_META_DETACH FN_META_DETACH(); #endif // FN_META_DETACH return TRUE; } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) // linux prototype C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { #else #ifdef _MSC_VER // MSVC: Simulate __stdcall calling convention C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { @@ -3045,17 +3045,17 @@ char* UTIL_VarArgs( char *format, ... ) return string; } //========================================================= // UTIL_LogPrintf - Prints a logged message to console. // Preceded by LOG: ( timestamp ) < message > //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/amxmodx/sdk/amxxmodule.h b/amxmodx/sdk/amxxmodule.h --- a/amxmodx/sdk/amxxmodule.h +++ b/amxmodx/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/amxmodx/sh_list.h b/amxmodx/sh_list.h --- a/amxmodx/sh_list.h +++ b/amxmodx/sh_list.h @@ -14,17 +14,17 @@ // MSVC8 fix for offsetof macro redefition warnings #ifdef _MSC_VER #if _MSC_VER >= 1400 #undef offsetof #endif #endif #include -#include +#include //namespace SourceHook //{ //This class is from CSDM for AMX Mod X /* A circular, doubly-linked list with one sentinel node Empty: diff --git a/amxmodx/sh_tinyhash.h b/amxmodx/sh_tinyhash.h --- a/amxmodx/sh_tinyhash.h +++ b/amxmodx/sh_tinyhash.h @@ -49,22 +49,22 @@ val = other.val; } K key; V val; }; typedef List * NodePtr; public: class const_iterator; - THash() : m_Buckets(NULL), m_numBuckets(0), m_percentUsed(0.0f), m_items(0) + THash() : m_Buckets(NULL), m_numBuckets(0), m_percentUsed(0.0f) { _Refactor(); } THash(const THash &other) : m_Buckets(new NodePtr[other.m_numBuckets]), - m_numBuckets(other.m_numBuckets), m_percentUsed(other.m_percentUsed), m_items(0) + m_numBuckets(other.m_numBuckets), m_percentUsed(other.m_percentUsed) { for (size_t i=0; ikey)->val = iter->val; } void operator=(const THash &other) { @@ -77,20 +77,16 @@ { _Clear(); } void clear() { _Clear(); _Refactor(); } - size_t size() - { - return m_items; - } size_t GetBuckets() { return m_numBuckets; } float PercentUsed() { return m_percentUsed; } @@ -117,17 +113,16 @@ delete m_Buckets[i]; m_Buckets[i] = NULL; } } if (m_Buckets) delete [] m_Buckets; m_Buckets = NULL; m_numBuckets = 0; - m_items = 0; } public: template V & AltFindOrInsert(const U & ukey) { size_t place = HashAlt(ukey) % m_numBuckets; THashNode *pNode = NULL; if (!m_Buckets[place]) @@ -224,18 +219,16 @@ } } //reassign bucket table delete [] m_Buckets; m_Buckets = temp; } } public: - friend class iterator; - friend class const_iterator; class iterator { friend class THash; public: iterator() : curbucket(-1), hash(NULL), end(true) { }; iterator(THash *h) : curbucket(-1), hash(h), end(false) @@ -299,18 +292,16 @@ // Remove this element and move to the next one iterator tmp = *this; ++tmp; delete (*iter); hash->m_Buckets[curbucket]->erase(iter); *this = tmp; // :TODO: Maybe refactor to a lower size if required - - m_items--; } private: void _Inc() { if (end || !hash || curbucket >= static_cast(hash->m_numBuckets)) return; if (curbucket < 0) { @@ -449,16 +440,18 @@ } } private: int curbucket; typename List::iterator iter; const THash *hash; bool end; }; + friend class iterator; + friend class const_iterator; public: iterator begin() { return iterator(this); } iterator end() { iterator iter; diff --git a/amxmodx/sm_trie_tpl.h b/amxmodx/sm_trie_tpl.h --- a/amxmodx/sm_trie_tpl.h +++ b/amxmodx/sm_trie_tpl.h @@ -29,17 +29,17 @@ * Version: $Id$ */ #ifndef _INCLUDE_SOURCEMOD_TEMPLATED_TRIE_H_ #define _INCLUDE_SOURCEMOD_TEMPLATED_TRIE_H_ #include #include -#include +#include #include enum NodeType { Node_Unused = 0, /* Node is not being used (sparse) */ Node_Arc, /* Node is part of an arc and does not terminate */ Node_Term, /* Node is a terminator */ }; diff --git a/amxmodx/strptime.cpp b/amxmodx/strptime.cpp --- a/amxmodx/strptime.cpp +++ b/amxmodx/strptime.cpp @@ -5,17 +5,17 @@ Localized strptime(). *-----------------------------------------------------------------------*/ //#include "config.h" #include #include #include -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) #define strnicmp strncasecmp #endif #if _MSC_VER #if _MSC_VER >= 1400 // MSVC8 - Replace POSIX stricmp with ISO C++ conformant one as it is deprecated #define stricmp _stricmp @@ -331,18 +331,20 @@ char *strptime(const char *buf, const ch ti.qZ = /* 0 = STD, 1 = DST */ ti.qU = /* week in year (0...53) */ ti.qV = -1; /* week in year mode: 0=U, 1=W, 2=V */ if (0 > time_int(&ti, (const unsigned char **)&buf, fmt, addthem)) buf = NULL; if (0 <= ti.qS) (*defoper) ( &tm->tm_sec , ti.qS ); if (0 <= ti.qM) (*defoper) ( &tm->tm_min , ti.qM ); //tm->tm_min = ti.qM; if (0 <= ti.qI) + { if (0 <= ti.qp) ti.qH = ti.qI % 12 + ti.qp * 12; - else (*defoper) ( &tm->tm_hour , ti.qI ); //tm->tm_hour = ti.qI; + else (*defoper) ( &tm->tm_hour , ti.qI ); //tm->tm_hour = ti.qI; + } if (0 <= ti.qH) (*defoper) ( &tm->tm_hour , ti.qH ); //tm->tm_hour = ti.qH; if (0 <= ti.qZ) (*defoper) ( &tm->tm_isdst , ti.qZ - 1 ); //tm->tm_isdst = ti.qZ - 1; if (0 <= ti.qy) ti.qY = ti.qy; if (0 <= ti.qY) (*defoper) ( &tm->tm_year , ti.qY += (ti.qY > 99? -1900: (ti.qY < 70? 100: 0)) ); /*tm->tm_year = ti.qY += diff --git a/amxmodx/util.cpp b/amxmodx/util.cpp --- a/amxmodx/util.cpp +++ b/amxmodx/util.cpp @@ -27,17 +27,17 @@ * to your version of the file, but you are not obligated to do so. If * you do not wish to do so, delete this exception statement from your * version. */ #include #include "amxmodx.h" -#if defined __linux__ && !defined _vsnprintf +#if ( defined(__linux__) || defined(__APPLE__) ) && !defined _vsnprintf #define _vsnprintf vsnprintf #endif char *UTIL_VarArgs(const char *fmt, ...) { va_list ap; static char string[4096]; @@ -152,38 +152,38 @@ void UTIL_IntToString(int value, char *o *output = 0; if (value < 0) value = -value; int tho = value / 1000; int aaa = 0; if (tho) { - aaa += sprintf(&output[aaa], words[tho]); - aaa += sprintf(&output[aaa], words[29]); + aaa += sprintf(&output[aaa], "%s", words[tho]); + aaa += sprintf(&output[aaa], "%s", words[29]); value = value % 1000; } int hun = value / 100; if (hun) { - aaa += sprintf(&output[aaa], words[hun]); - aaa += sprintf(&output[aaa], words[28]); + aaa += sprintf(&output[aaa], "%s", words[hun]); + aaa += sprintf(&output[aaa], "%s", words[28]); value = value % 100; } int ten = value / 10; int unit = value % 10; if (ten) - aaa += sprintf(&output[aaa], words[(ten > 1) ? (ten + 18) : (unit + 10)]); + aaa += sprintf(&output[aaa], "%s", words[(ten > 1) ? (ten + 18) : (unit + 10)]); if (ten != 1 && (unit || (!value && !hun && !tho))) - sprintf(&output[aaa], words[unit]); + sprintf(&output[aaa], "%s", words[unit]); } char* UTIL_SplitHudMessage(const char *src) { static char message[512]; short b = 0, d = 0, e = 0, c = -1; while (src[d] && e < 480) @@ -237,17 +237,17 @@ short FixedSigned16(float value, float s if (output > 32767) output = 32767; else if (output < -32768) output = -32768; return (short)output; } -void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, char *pMessage) +void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, const char *pMessage) { if (pEntity) MESSAGE_BEGIN(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, NULL, pEntity); else MESSAGE_BEGIN(MSG_BROADCAST, SVC_TEMPENTITY); WRITE_BYTE(29); WRITE_BYTE(textparms.channel & 0xFF); diff --git a/compiler/amxxpc/Makefile b/compiler/amxxpc/Makefile --- a/compiler/amxxpc/Makefile +++ b/compiler/amxxpc/Makefile @@ -1,46 +1,107 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OPT_FLAGS = -O3 -funroll-loops -s -pipe -fno-strict-aliasing -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -BINARY = amxxpc - +PROJECT = amxxpc OBJECTS = amx.cpp amxxpc.cpp Binary.cpp -LINK = -lz /lib32/libstdc++.a +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -INCLUDE = -I. -L. +C_OPT_FLAGS = -DNDEBUG -O2 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang + +LINK = + +INCLUDE = -I. + +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_SUFFIX = _osx + CFLAGS += -DOSX + LINK += -lstdc++ -mmacosx-version-min=10.5 -lz-darwin +else + LIB_SUFFIX = + CFLAGS += -DLINUX + LINK += -lz /lib32/libstdc++.a +endif + +LINK += -m32 -lm -ldl -L. + +CFLAGS += -DAMX_ANSIONLY -DHAVE_STDINT_H -fno-strict-aliasing \ + -m32 -Wall -Werror +CPPFLAGS += -fexceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX) ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) endif -CFLAGS += -DLINUX -DNDEBUG -Wno-deprecated -fexceptions -DHAVE_STDINT_H -DAMX_ANSIONLY -fno-rtti -static-libgcc +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") +else + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) +endif + +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -m32 -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< all: mkdir -p $(BIN_DIR) - $(MAKE) amxxpc + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -amxxpc: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) -m32 $(OBJ_LINUX) $(LINK) -ldl -lm -o$(BIN_DIR)/$(BINARY) +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) default: all clean: - rm -rf Release/*.o - rm -rf Release/$(BINARY) - rm -rf Debug/*.o - rm -rf Debug/$(BINARY) + rm -rf $(BIN_DIR)/*.o + rm -f $(BIN_DIR)/$(BINARY) diff --git a/compiler/amxxpc/amx.cpp b/compiler/amxxpc/amx.cpp --- a/compiler/amxxpc/amx.cpp +++ b/compiler/amxxpc/amx.cpp @@ -37,17 +37,17 @@ #endif #include #include #include #include /* for wchar_t */ #include #include "osdefs.h" -#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ +#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ #include #if !defined AMX_NODYNALOAD #include #endif #if defined JIT #include #include #endif @@ -810,22 +810,22 @@ static void expand(unsigned char *code, /* when all bytes have been expanded, the complete memory block should be done */ assert(memsize==0); } #endif /* defined AMX_INIT */ int AMXAPI amx_Init(AMX *amx,void *program) { AMX_HEADER *hdr; - #if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__) && !defined AMX_NODYNALOAD + #if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__) && !defined AMX_NODYNALOAD char libname[sNAMEMAX+8]; /* +1 for '\0', +3 for 'amx' prefix, +4 for extension */ #if defined _Windows typedef int (FAR WINAPI *AMX_ENTRY)(AMX _FAR *amx); HINSTANCE hlib; - #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ + #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ typedef int (*AMX_ENTRY)(AMX *amx); void *hlib; #endif int numlibraries,i; AMX_FUNCSTUB *lib; AMX_ENTRY libinit; #endif @@ -960,47 +960,47 @@ int AMXAPI amx_Init(AMX *amx,void *progr } /* for */ } /* local */ #endif /* relocate call and jump instructions */ amx_BrowseRelocate(amx); /* load any extension modules that the AMX refers to */ - #if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__) && !defined AMX_NODYNALOAD + #if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__) && !defined AMX_NODYNALOAD hdr=(AMX_HEADER *)amx->base; numlibraries=NUMENTRIES(hdr,libraries,pubvars); for (i=0; iaddress=(ucell)hlib; } /* for */ #endif @@ -1024,17 +1024,17 @@ int AMXAPI amx_Init(AMX *amx,void *progr DWORD prev, p = 0; if ((prot & PROT_WRITE)!=0) p = PAGE_EXECUTE_READWRITE; else p |= PAGE_EXECUTE_READ; return !VirtualProtect(addr, len, p, &prev); } - #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ + #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ /* Linux already has mprotect() */ #else // TODO: Add cases for Linux, Unix, OS/2, ... /* DOS32 has no imposed limits on its segments */ @@ -1099,50 +1099,50 @@ int AMXAPI amx_InitJIT(AMX *amx,void *co #endif /* #if defined JIT */ #endif /* AMX_INIT */ #if defined AMX_CLEANUP int AMXAPI amx_Cleanup(AMX *amx) { - #if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__) && !defined AMX_NODYNALOAD + #if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__) && !defined AMX_NODYNALOAD #if defined _Windows typedef int (FAR WINAPI *AMX_ENTRY)(AMX FAR *amx); - #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ + #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ typedef int (*AMX_ENTRY)(AMX *amx); #endif AMX_HEADER *hdr; int numlibraries,i; AMX_FUNCSTUB *lib; AMX_ENTRY libcleanup; #endif /* unload all extension modules */ - #if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__) && !defined AMX_NODYNALOAD + #if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__) && !defined AMX_NODYNALOAD hdr=(AMX_HEADER *)amx->base; assert(hdr->magic==AMX_MAGIC); numlibraries=NUMENTRIES(hdr,libraries,pubvars); for (i=0; iaddress!=0) { char funcname[sNAMEMAX+12]; /* +1 for '\0', +4 for 'amx_', +7 for 'Cleanup' */ strcpy(funcname,"amx_"); strcat(funcname,GETENTRYNAME(hdr,lib)); strcat(funcname,"Cleanup"); #if defined _Windows libcleanup=(AMX_ENTRY)GetProcAddress((HINSTANCE)lib->address,funcname); - #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ + #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ libcleanup=(AMX_ENTRY)dlsym((void*)lib->address,funcname); #endif if (libcleanup!=NULL) libcleanup(amx); #if defined _Windows FreeLibrary((HINSTANCE)lib->address); - #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ + #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ dlclose((void*)lib->address); #endif } /* if */ } /* for */ #else (void)amx; #endif return AMX_ERR_NONE; @@ -1661,17 +1661,17 @@ int AMXAPI amx_PushString(AMX *amx, cell #define CHKSTACK() if (stk>amx->stp) return AMX_ERR_STACKLOW #define CHKHEAP() if (heahlw) return AMX_ERR_HEAPLOW #if defined __GNUC__ && !(defined ASM32 || defined JIT) /* GNU C version uses the "labels as values" extension to create * fast "indirect threaded" interpreter. */ -#define NEXT(cip) goto **cip++ +#define NEXT(cip) goto *(const void *)*cip++ int AMXAPI amx_Exec(AMX *amx, cell *retval, int index) { static const void * const amx_opcodelist[] = { &&op_none, &&op_load_pri, &&op_load_alt, &&op_load_s_pri, &&op_load_s_alt,&&op_lref_pri, &&op_lref_alt, &&op_lref_s_pri, &&op_lref_s_alt,&&op_load_i, &&op_lodb_i, &&op_const_pri, &&op_const_alt, &&op_addr_pri, &&op_addr_alt, &&op_stor_pri, @@ -1841,24 +1841,24 @@ static const void * const amx_opcodelist NEXT(cip); op_lref_s_alt: GETPARAM(offs); offs= * (cell *)(data+(int)frm+(int)offs); alt= * (cell *)(data+(int)offs); NEXT(cip); op_load_i: /* verify address */ - if (pri>=hea && pri=(ucell)amx->stp) + if ((pri>=hea && pri=(ucell)amx->stp) ABORT(amx,AMX_ERR_MEMACCESS); pri= * (cell *)(data+(int)pri); NEXT(cip); op_lodb_i: GETPARAM(offs); /* verify address */ - if (pri>=hea && pri=(ucell)amx->stp) + if ((pri>=hea && pri=(ucell)amx->stp) ABORT(amx,AMX_ERR_MEMACCESS); switch (offs) { case 1: pri= * (data+(int)pri); break; case 2: pri= * (uint16_t *)(data+(int)pri); break; @@ -1914,49 +1914,49 @@ static const void * const amx_opcodelist NEXT(cip); op_sref_s_alt: GETPARAM(offs); offs= * (cell *)(data+(int)frm+(int)offs); *(cell *)(data+(int)offs)=alt; NEXT(cip); op_stor_i: /* verify address */ - if (alt>=hea && alt=(ucell)amx->stp) + if ((alt>=hea && alt=(ucell)amx->stp) ABORT(amx,AMX_ERR_MEMACCESS); *(cell *)(data+(int)alt)=pri; NEXT(cip); op_strb_i: GETPARAM(offs); /* verify address */ - if (alt>=hea && alt=(ucell)amx->stp) + if ((alt>=hea && alt=(ucell)amx->stp) ABORT(amx,AMX_ERR_MEMACCESS); switch (offs) { case 1: *(data+(int)alt)=(unsigned char)pri; break; case 2: *(uint16_t *)(data+(int)alt)=(uint16_t)pri; break; case 4: *(uint32_t *)(data+(int)alt)=(uint32_t)pri; break; } /* switch */ NEXT(cip); op_lidx: offs=pri*sizeof(cell)+alt; /* verify address */ - if (offs>=hea && offs=(ucell)amx->stp) + if ((offs>=hea && offs=(ucell)amx->stp) ABORT(amx,AMX_ERR_MEMACCESS); pri= * (cell *)(data+(int)offs); NEXT(cip); op_lidx_b: GETPARAM(offs); offs=(pri << (int)offs)+alt; /* verify address */ - if (offs>=hea && offs=(ucell)amx->stp) + if ((offs>=hea && offs=(ucell)amx->stp) ABORT(amx,AMX_ERR_MEMACCESS); pri= * (cell *)(data+(int)offs); NEXT(cip); op_idxaddr: pri=pri*sizeof(cell)+alt; NEXT(cip); op_idxaddr_b: GETPARAM(offs); @@ -2383,47 +2383,47 @@ static const void * const amx_opcodelist op_dec_i: *(cell *)(data+(int)pri) -= 1; NEXT(cip); op_movs: GETPARAM(offs); /* verify top & bottom memory addresses, for both source and destination * addresses */ - if (pri>=hea && pri=(ucell)amx->stp) + if ((pri>=hea && pri=(ucell)amx->stp) ABORT(amx,AMX_ERR_MEMACCESS); - if ((pri+offs)>hea && (pri+offs)(ucell)amx->stp) + if (((pri+offs)>hea && (pri+offs)(ucell)amx->stp) ABORT(amx,AMX_ERR_MEMACCESS); - if (alt>=hea && alt=(ucell)amx->stp) + if ((alt>=hea && alt=(ucell)amx->stp) ABORT(amx,AMX_ERR_MEMACCESS); - if ((alt+offs)>hea && (alt+offs)(ucell)amx->stp) + if (((alt+offs)>hea && (alt+offs)(ucell)amx->stp) ABORT(amx,AMX_ERR_MEMACCESS); memcpy(data+(int)alt, data+(int)pri, (int)offs); NEXT(cip); op_cmps: GETPARAM(offs); /* verify top & bottom memory addresses, for both source and destination * addresses */ - if (pri>=hea && pri=(ucell)amx->stp) + if ((pri>=hea && pri=(ucell)amx->stp) ABORT(amx,AMX_ERR_MEMACCESS); - if ((pri+offs)>hea && (pri+offs)(ucell)amx->stp) + if (((pri+offs)>hea && (pri+offs)(ucell)amx->stp) ABORT(amx,AMX_ERR_MEMACCESS); - if (alt>=hea && alt=(ucell)amx->stp) + if ((alt>=hea && alt=(ucell)amx->stp) ABORT(amx,AMX_ERR_MEMACCESS); - if ((alt+offs)>hea && (alt+offs)(ucell)amx->stp) + if (((alt+offs)>hea && (alt+offs)(ucell)amx->stp) ABORT(amx,AMX_ERR_MEMACCESS); pri=memcmp(data+(int)alt, data+(int)pri, (int)offs); NEXT(cip); op_fill: GETPARAM(offs); /* verify top & bottom memory addresses */ - if (alt>=hea && alt=(ucell)amx->stp) + if ((alt>=hea && alt=(ucell)amx->stp) ABORT(amx,AMX_ERR_MEMACCESS); - if ((alt+offs)>hea && (alt+offs)(ucell)amx->stp) + if (((alt+offs)>hea && (alt+offs)(ucell)amx->stp) ABORT(amx,AMX_ERR_MEMACCESS); for (i=(int)alt; offs>=(int)sizeof(cell); i+=sizeof(cell), offs-=sizeof(cell)) *(cell *)(data+i) = pri; NEXT(cip); op_halt: GETPARAM(offs); if (retval!=NULL) *retval=pri; @@ -3587,17 +3587,17 @@ int AMXAPI amx_GetAddr(AMX *amx,cell amx assert(amx!=NULL); hdr=(AMX_HEADER *)amx->base; assert(hdr!=NULL); assert(hdr->magic==AMX_MAGIC); data=(amx->data!=NULL) ? amx->data : amx->base+(int)hdr->dat; assert(phys_addr!=NULL); - if (amx_addr>=amx->hea && amx_addrstk || amx_addr<0 || amx_addr>=amx->stp) { + if ((amx_addr>=amx->hea && amx_addrstk) || amx_addr<0 || amx_addr>=amx->stp) { *phys_addr=NULL; return AMX_ERR_MEMACCESS; } /* if */ *phys_addr=(cell *)(data + (int)amx_addr); return AMX_ERR_NONE; } #endif /* AMX_GETADDR */ diff --git a/compiler/amxxpc/amx.h b/compiler/amxxpc/amx.h --- a/compiler/amxxpc/amx.h +++ b/compiler/amxxpc/amx.h @@ -19,27 +19,27 @@ * 3. This notice may not be removed or altered from any source distribution. * * Version: $Id: amx.h 3736 2008-08-16 20:13:12Z damagedsoul $ */ #if defined FREEBSD && !defined __FreeBSD__ #define __FreeBSD__ #endif -#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ +#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ #include #endif #ifndef AMX_H_INCLUDED #define AMX_H_INCLUDED #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -183,17 +183,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -411,17 +411,17 @@ int AMXAPI amx_UTF8Put(char *string, cha #else #error Unsupported cell size #endif #define amx_RegisterFunc(amx, name, func) \ amx_Register((amx), amx_NativeInfo((name),(func)), 1); #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack() /* reset default packing */ #elif defined MACOS && defined __MWERKS__ #pragma options align=reset #else #pragma pack(pop) /* reset previous packing */ #endif #endif diff --git a/compiler/amxxpc/amxdbg.h b/compiler/amxxpc/amxdbg.h --- a/compiler/amxxpc/amxdbg.h +++ b/compiler/amxxpc/amxdbg.h @@ -44,17 +44,17 @@ extern "C" { #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -151,17 +151,17 @@ int AMXAPI dbg_GetLineAddress(AMX_DBG *a int AMXAPI dbg_GetAutomatonName(AMX_DBG *amxdbg, int automaton, const char **name); int AMXAPI dbg_GetStateName(AMX_DBG *amxdbg, int state, const char **name); int AMXAPI dbg_GetTagName(AMX_DBG *amxdbg, int tag, const char **name); int AMXAPI dbg_GetVariable(AMX_DBG *amxdbg, const char *symname, ucell scopeaddr, const AMX_DBG_SYMBOL **sym); int AMXAPI dbg_GetArrayDim(AMX_DBG *amxdbg, const AMX_DBG_SYMBOL *sym, const AMX_DBG_SYMDIM **symdim); #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack() /* reset default packing */ #elif defined MACOS && defined __MWERKS__ #pragma options align=reset #else #pragma pack(pop) /* reset previous packing */ #endif #endif diff --git a/compiler/amxxpc/amxxpc.cpp b/compiler/amxxpc/amxxpc.cpp --- a/compiler/amxxpc/amxxpc.cpp +++ b/compiler/amxxpc/amxxpc.cpp @@ -1,10 +1,10 @@ #include -#ifdef __linux__ +#if defined(__linux__) | defined (__APPLE__) #include #else #include #include #endif #include #include "zlib.h" #include "amx.h" @@ -24,57 +24,58 @@ static PRINTF pc_printf = NULL; void ReadFileIntoPl(abl *pl, FILE *fp); bool CompressPl(abl *pl); void Pl2Bh(abl *pl, BinPlugin *bh); void WriteBh(BinaryWriter *bw, BinPlugin *bh); int main(int argc, char **argv) { struct abl pl32; - struct abl pl64; #ifdef _DEBUG printf("debug clamp\n"); getchar(); #endif -#ifdef __linux__ +#if defined(__linux__) HINSTANCE lib = NULL; if (FileExists("./amxxpc32.so")) lib = dlmount("./amxxpc32.so"); else lib = dlmount("amxxpc32.so"); +#elif defined(__APPLE__) + HINSTANCE lib = dlmount("amxxpc32.dylib"); #else HINSTANCE lib = dlmount("amxxpc32.dll"); #endif if (!lib) { -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) printf("compiler failed to instantiate: %s\n", dlerror()); #else printf("compiler failed to instantiate: %d\n", GetLastError()); #endif exit(0); } COMPILER sc32 = (COMPILER)dlsym(lib, "Compile32"); pc_printf = (PRINTF)dlsym(lib, "pc_printf"); if (!sc32 || !pc_printf) { -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) printf("compiler failed to link: %p.\n",sc32); #else printf("compiler failed to link: %d.\n", GetLastError()); #endif exit(0); } pc_printf("Welcome to the AMX Mod X %s Compiler.\n", VERSION_STRING); - pc_printf("Copyright (c) 1997-2006 ITB CompuPhase, AMX Mod X Team\n\n"); + pc_printf("Copyright (c) 1997-2013 ITB CompuPhase, AMX Mod X Team\n\n"); if (argc < 2) { pc_printf("Usage: [options]\n"); pc_printf("Use -? or --help to see full options\n\n"); getchar(); exit(0); } @@ -238,17 +239,17 @@ void ReadFileIntoPl(abl *pl, FILE *fp) //we get the full name of the file here //our job is to a] switch the .sma extension to .amx // and to b] strip everything but the trailing name char *swiext(const char *file, const char *ext, int isO) { int i = 0, pos = -1, j = 0; int fileLen = strlen(file); int extLen = strlen(ext); - int max = 0, odirFlag = -1; + int odirFlag = -1; for (i=fileLen-1; i>=0; i--) { if (file[i] == '.' && pos == -1) { pos = i+1; } if ((file[i] == '/' || file[i] == '\\') && !isO) @@ -334,17 +335,17 @@ void show_help() printf("\t-H window handle to send a notification message on finish\n"); printf("\t-i path for include files\n"); printf("\t-l create list file (preprocess only)\n"); printf("\t-o set base name of output file\n"); printf("\t-p set name of \"prefix\" file\n"); printf("\t-r[name] write cross reference report to console or to specified file\n"); } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) bool FileExists(const char *file) { FILE *fp = fopen(file, "rb"); if (!fp) return false; fclose(fp); return true; } diff --git a/compiler/amxxpc/amxxpc.h b/compiler/amxxpc/amxxpc.h --- a/compiler/amxxpc/amxxpc.h +++ b/compiler/amxxpc/amxxpc.h @@ -1,24 +1,24 @@ #ifndef _AMXXSC_INCLUDE_H #define _AMXXSC_INCLUDE_H #define VERSION_STRING "1.8.1-300" #define MAGIC_HEADER2 0x414D5858 #define MAGIC_VERSION 0x0300 -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) # include #else # include #endif #include -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) # define dlmount(x) dlopen(x, RTLD_NOW|RTLD_GLOBAL) typedef void* HINSTANCE; #else # define dlsym(x, s) GetProcAddress(x, s) # define dlmount(x) LoadLibrary(x) # define dlclose(x) FreeLibrary(x) #endif @@ -60,13 +60,13 @@ struct BinPlugin { int8_t cellsize; //cell size int32_t imagesize; //uncompressed image size int32_t disksize; //compressed image size int32_t memsize; //memory image size int32_t offs; //file offset }; -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) bool FileExists(const char *file); #endif #endif //_AMXXSC_INCLUDE_H diff --git a/compiler/amxxpc/libz-darwin.a b/compiler/amxxpc/libz-darwin.a new file mode 100644 index 0000000000000000000000000000000000000000..03964e8e745100720d199fbdcfabe399f3aafdaa GIT binary patch literal 87176 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 #endif +#if defined __APPLE__ + #include +#endif + /* Linux NOW has these */ #if !defined BIG_ENDIAN #define BIG_ENDIAN 4321 #endif #if !defined LITTLE_ENDIAN #define LITTLE_ENDIAN 1234 #endif diff --git a/compiler/amxxpc/sclinux.h b/compiler/amxxpc/sclinux.h --- a/compiler/amxxpc/sclinux.h +++ b/compiler/amxxpc/sclinux.h @@ -27,16 +27,20 @@ /* * SC assumes that a computer is Little Endian unless told otherwise. It uses * (and defines) the macros BYTE_ORDER and BIG_ENDIAN. * For Linux, we must overrule these settings with those defined in glibc. */ #if !defined __BYTE_ORDER # include +# if defined __APPLE__ +# include +# define __BYTE_ORDER BYTE_ORDER +# endif #endif #if defined __OpenBSD__ || defined __FreeBSD__ # define __BYTE_ORDER BYTE_ORDER # define __LITTLE_ENDIAN LITTLE_ENDIAN # define __BIG_ENDIAN BIG_ENDIAN #endif diff --git a/compiler/libpc300/Makefile b/compiler/libpc300/Makefile --- a/compiler/libpc300/Makefile +++ b/compiler/libpc300/Makefile @@ -1,46 +1,108 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OPT_FLAGS = -O3 -funroll-loops -s -pipe -fno-strict-aliasing -fvisibility=hidden -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = amxxpc32 +PROJECT = amxxpc32 +OBJECTS = sc1.c sc2.c sc3.c sc4.c sc5.c sc6.c sc7.c scvars.c scmemfil.c scstate.c sclist.c sci18n.c \ + scexpand.c pawncc.c libpawnc.c prefix.c memfile.c -OBJECTS = sc1.c sc2.c sc3.c sc4.c sc5.c sc6.c sc7.c scvars.c scmemfil.c \ - scstate.c sclist.c sci18n.c scexpand.c pawncc.c libpawnc.c prefix.c \ - memfile.c +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## + +C_OPT_FLAGS = -DNDEBUG -O2 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang LINK = -lpthread -INCLUDE = -I. +INCLUDE = -I. -BINARY = $(NAME).so -BIN_DIR = Release -CFLAGS += -DPAWN_CELL_SIZE=32 +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ -CFLAGS += -DLINUX -DNDEBUG -DHAVE_STDINT_H -DENABLE_BINRELOC -DNO_MAIN -DPAWNC_DLL -static-libgcc +OS := $(shell uname -s) -CFLAGS += $(OPT_FLAGS) -OBJ_LINUX := $(OBJECTS:%.c=$(BIN_DIR)/%.o) +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + CFLAGS += -DOSX + LINK += -dynamiclib -mmacosx-version-min=10.5 +else + LIB_EXT = so + CFLAGS += -DLINUX + LINK += -shared +endif + +LINK += -m32 -lm -ldl + +CFLAGS += -DENABLE_BINRELOC -DNO_MAIN -DPAWNC_DLL -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall \ + -Werror +CPPFLAGS += -fexceptions -fno-rtti + +BINARY = $(PROJECT).$(LIB_EXT) + +ifeq "$(DEBUG)" "true" + BIN_DIR = Debug + CFLAGS += $(C_DEBUG_FLAGS) +else + BIN_DIR = Release + CFLAGS += $(C_OPT_FLAGS) +endif + +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") + +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") +else + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) +endif + +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.c=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.c - $(CPP) $(INCLUDE) $(CFLAGS) -m32 -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< all: - mkdir -p Release - $(MAKE) pawn_make + mkdir -p $(BIN_DIR) + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -pawn_make: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) -m32 $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) default: all clean: - rm -rf Release/*.o - rm -rf Release/$(BINARY) + rm -rf $(BIN_DIR)/*.o + rm -f $(BIN_DIR)/$(BINARY) diff --git a/compiler/libpc300/amx.h b/compiler/libpc300/amx.h --- a/compiler/libpc300/amx.h +++ b/compiler/libpc300/amx.h @@ -28,27 +28,27 @@ #define chdir _chdir #define stricmp _stricmp #endif #endif #if defined FREEBSD && !defined __FreeBSD__ #define __FreeBSD__ #endif -#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ +#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ #include #endif #ifndef AMX_H_INCLUDED #define AMX_H_INCLUDED #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -192,17 +192,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -420,17 +420,17 @@ int AMXAPI amx_UTF8Put(char *string, cha #else #error Unsupported cell size #endif #define amx_RegisterFunc(amx, name, func) \ amx_Register((amx), amx_NativeInfo((name),(func)), 1); #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack() /* reset default packing */ #elif defined MACOS && defined __MWERKS__ #pragma options align=reset #else #pragma pack(pop) /* reset previous packing */ #endif #endif diff --git a/compiler/libpc300/amxdbg.h b/compiler/libpc300/amxdbg.h --- a/compiler/libpc300/amxdbg.h +++ b/compiler/libpc300/amxdbg.h @@ -44,17 +44,17 @@ extern "C" { #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -151,17 +151,17 @@ int AMXAPI dbg_GetLineAddress(AMX_DBG *a int AMXAPI dbg_GetAutomatonName(AMX_DBG *amxdbg, int automaton, const char **name); int AMXAPI dbg_GetStateName(AMX_DBG *amxdbg, int state, const char **name); int AMXAPI dbg_GetTagName(AMX_DBG *amxdbg, int tag, const char **name); int AMXAPI dbg_GetVariable(AMX_DBG *amxdbg, const char *symname, ucell scopeaddr, const AMX_DBG_SYMBOL **sym); int AMXAPI dbg_GetArrayDim(AMX_DBG *amxdbg, const AMX_DBG_SYMBOL *sym, const AMX_DBG_SYMDIM **symdim); #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack() /* reset default packing */ #elif defined MACOS && defined __MWERKS__ #pragma options align=reset #else #pragma pack(pop) /* reset previous packing */ #endif #endif diff --git a/compiler/libpc300/libpawnc.c b/compiler/libpc300/libpawnc.c --- a/compiler/libpc300/libpawnc.c +++ b/compiler/libpc300/libpawnc.c @@ -25,28 +25,25 @@ #include #include #include #include #include "sc.h" #if defined PAWNC_DLL -#ifndef __linux__ +#if !defined(__linux__) && !defined(__APPLE__) #include "dllmain.c" #endif # define MAX_ARGS 100 # if !defined UNUSED_PARAM # define UNUSED_PARAM(p) ((void)(p)) # endif - static char *argv[MAX_ARGS]; - static int argc; - #if PAWN_CELL_SIZE==32 #define EXCOMPILER Compile32 #else #define EXCOMPILER Compile64 #endif # if defined __WIN32__ || defined _WIN32 || defined WIN32 || defined __NT__ __declspec (dllexport) diff --git a/compiler/libpc300/memfile.c b/compiler/libpc300/memfile.c --- a/compiler/libpc300/memfile.c +++ b/compiler/libpc300/memfile.c @@ -5,16 +5,17 @@ memfile_t *memfile_creat(const char *name, size_t init) { memfile_t mf; memfile_t *pmf; mf.size = init; mf.base = (char *)malloc(init); mf.usedoffs = 0; + mf.name = NULL; if (!mf.base) { return NULL; } mf.offs = 0; mf._static = 0; diff --git a/compiler/libpc300/memfile.h b/compiler/libpc300/memfile.h --- a/compiler/libpc300/memfile.h +++ b/compiler/libpc300/memfile.h @@ -4,17 +4,17 @@ #ifdef _MSC_VER // MSVC8 - replace POSIX functions with ISO C++ conformant ones as they are deprecated #if _MSC_VER >= 1400 #define strdup _strdup #pragma warning(disable : 4996) #endif #endif -#include +#include typedef struct memfile_s { char *name; char *base; long offs; long usedoffs; size_t size; diff --git a/compiler/libpc300/osdefs.h b/compiler/libpc300/osdefs.h --- a/compiler/libpc300/osdefs.h +++ b/compiler/libpc300/osdefs.h @@ -36,16 +36,20 @@ #endif #if defined __FreeBSD__ #include #elif defined LINUX #include #endif +#if defined __APPLE__ + #include +#endif + /* Linux NOW has these */ #if !defined BIG_ENDIAN #define BIG_ENDIAN 4321 #endif #if !defined LITTLE_ENDIAN #define LITTLE_ENDIAN 1234 #endif diff --git a/compiler/libpc300/sc.h b/compiler/libpc300/sc.h --- a/compiler/libpc300/sc.h +++ b/compiler/libpc300/sc.h @@ -58,17 +58,17 @@ #define sDIMEN_MAX 3 /* maximum number of array dimensions */ #define sLINEMAX 511 /* input line length (in characters) */ #define sCOMP_STACK 32 /* maximum nesting of #if .. #endif sections */ #define sDEF_LITMAX 500 /* initial size of the literal pool, in "cells" */ #define sDEF_AMXSTACK 4096 /* default stack size for AMX files */ #define PREPROC_TERM '\x7f'/* termination character for preprocessor expressions (the "DEL" code) */ #define sDEF_PREFIX "default.inc" /* default prefix filename */ -#if defined WIN32 +#if defined WIN32 || defined __clang__ #define INVISIBLE #else #define INVISIBLE __attribute__((visibility("protected"))) #endif typedef union { void *pv; /* e.g. a name */ int i; diff --git a/compiler/libpc300/sc1.c b/compiler/libpc300/sc1.c --- a/compiler/libpc300/sc1.c +++ b/compiler/libpc300/sc1.c @@ -30,19 +30,20 @@ #include #include #if defined __WIN32__ || defined _WIN32 || defined __MSDOS__ #include #include #endif -#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ +#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ #include #include /* from BinReloc, see www.autopackage.org */ + #include #endif #if defined FORTIFY #include "fortify.h" #endif #if defined __BORLANDC__ || defined __WATCOMC__ #include @@ -416,17 +417,17 @@ int pc_compile(int argc, char *argv[]) int retcode; char incfname[_MAX_PATH]; char reportname[_MAX_PATH]; char codepage[MAXCODEPAGE+1]; FILE *binf; void *inpfmark; int lcl_packstr,lcl_needsemicolon,lcl_tabsize; #if !defined SC_LIGHT - int hdrsize; + int hdrsize=0; #endif /* set global variables to their initial value */ binf=NULL; initglobals(); errorset(sRESET); errorset(sEXPRRELEASE); lexinit(); @@ -1243,19 +1244,19 @@ static void setconfig(char *root) #else char path[_MAX_PATH]; char *ptr,*base; int len; /* add the default "include" directory */ #if defined __WIN32__ || defined _WIN32 GetModuleFileName(NULL,path,_MAX_PATH); - #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ + #elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ /* see www.autopackage.org for the BinReloc module */ - ptr = SELFPATH; + ptr = (char *)SELFPATH; if (!ptr) ptr = root; strncpy(path,ptr,sizeof path); #else if (root!=NULL) strncpy(path,root,sizeof path); /* path + filename (hopefully) */ #endif #if defined __MSDOS__ @@ -1917,17 +1918,17 @@ static int declloc(int fstatic) constvalue *enumroot; cell val,size; char *str; value lval = {0}; int cur_lit=0; int dim[sDIMEN_MAX]; int numdim; int fconst; - int staging_start; + int staging_start=0; fconst=matchtoken(tCONST); do { ident=iVARIABLE; size=1; numdim=0; /* no dimensions */ tag=pc_addtag(NULL); if (lex(&val,&str)!=tSYMBOL) /* read in (new) token */ @@ -1943,17 +1944,17 @@ static int declloc(int fstatic) */ if ((sym=findloc(name))!=NULL && sym->compound==nestlevel) error(21,name); /* symbol already defined */ /* Although valid, a local variable whose name is equal to that * of a global variable or to that of a local variable at a lower * level might indicate a bug. * NOTE - don't bother with the error if there's no valid function! */ - if ((sym=findloc(name))!=NULL && sym->compound!=nestlevel || findglb(name)!=NULL) + if (((sym=findloc(name))!=NULL && sym->compound!=nestlevel) || findglb(name)!=NULL) if (curfunc!=NULL && (curfunc->usage & uNATIVE)) error(219,name); /* variable shadows another symbol */ while (matchtoken('[')){ ident=iARRAY; if (numdim == sDIMEN_MAX) { error(53); /* exceeding maximum number of dimensions */ return ident; } /* if */ @@ -2858,17 +2859,17 @@ static int operatoradjust(int opertok,sy if (count!=1 && count!=2) error(62); /* number or placement of the operands does not fit the operator */ break; default: if (count!=2) error(62); /* number or placement of the operands does not fit the operator */ } /* switch */ - if (tags[0]==0 && (opertok!='=' && tags[1]==0 || opertok=='=' && resulttag==0)) + if (tags[0]==0 && ((opertok!='=' && tags[1]==0) || (opertok=='=' && resulttag==0))) error(64); /* cannot change predefined operators */ /* change the operator name */ assert(strlen(opername)>0); operator_symname(tmpname,opername,tags[0],tags[1],count,resulttag); if ((oldsym=findglb(tmpname))!=NULL) { int i; if ((oldsym->usage & uDEFINE)!=0) { @@ -3040,17 +3041,17 @@ static void funcstub(int native) if (size > INT_MAX) error(105); /* overflow, exceeding capacity */ #endif dim[numdim++]=(int)size; } /* while */ tok=lex(&val,&str); if (native) { - if (tok==tPUBLIC || tok==tSTOCK || tok==tSTATIC || tok==tSYMBOL && *str==PUBLIC_CHAR) + if (tok==tPUBLIC || tok==tSTOCK || tok==tSTATIC || (tok==tSYMBOL && *str==PUBLIC_CHAR)) error(42); /* invalid combination of class specifiers */ } else { if (tok==tPUBLIC || tok==tSTOCK || tok==tSTATIC) tok=lex(&val,&str); } /* if */ if (tok==tOPERATOR) { opertok=operatorname(symbolname); @@ -3161,17 +3162,17 @@ static int newfunc(char *firstname,int f if (firstname!=NULL) { assert(strlen(firstname)<=sNAMEMAX); strcpy(symbolname,firstname); /* save symbol name */ tag=firsttag; } else { tag= (firsttag>=0) ? firsttag : pc_addtag(NULL); tok=lex(&val,&str); assert(!fpublic); - if (tok==tNATIVE || tok==tPUBLIC && stock) + if (tok==tNATIVE || (tok==tPUBLIC && stock)) error(42); /* invalid combination of class specifiers */ if (tok==tOPERATOR) { opertok=operatorname(symbolname); if (opertok==0) return TRUE; /* error message already given */ check_operatortag(opertok,tag,symbolname); } else { if (tok!=tSYMBOL && freading) { @@ -3507,17 +3508,17 @@ static int declargs(symbol *sym) error(25); /* function definition does not match prototype */ } /* if */ argcnt++; break; default: error(10); /* illegal function or declaration */ } /* switch */ } while (tok=='&' || tok==tLABEL || tok==tCONST - || tok!=tELLIPS && matchtoken(',')); /* more? */ + || (tok!=tELLIPS && matchtoken(','))); /* more? */ /* if the next token is not ",", it should be ")" */ needtoken(')'); } /* if */ /* resolve any "sizeof" arguments (now that all arguments are known) */ assert(sym->dim.arglist!=NULL); arglist=sym->dim.arglist; for (idx=0; idxparent!=NULL) continue; /* hierarchical data type */ assert(sym->ident==iCONSTEXPR || sym->ident==iVARIABLE || sym->ident==iARRAY || sym->ident==iFUNCTN); if (sym->ident!=iCONSTEXPR || (sym->usage & uENUMROOT)==0) continue; if ((sym->usage & uREAD)==0) continue; - fprintf(log,"\t\t\n",funcdisplayname(symname,sym->name),sym->addr); + fprintf(log,"\t\t\n",funcdisplayname(symname,sym->name),(long)sym->addr); if (sym->tag!=0) { tagsym=find_tag_byval(sym->tag); assert(tagsym!=NULL); fprintf(log,"\t\t\t\n",tagsym->name); } /* if */ /* browse through all fields */ if ((enumroot=sym->dim.enumlist)!=NULL) { enumroot=enumroot->next; /* skip root */ while (enumroot!=NULL) { - fprintf(log,"\t\t\t\n",funcdisplayname(symname,enumroot->name),enumroot->value); + fprintf(log,"\t\t\t\n",funcdisplayname(symname,enumroot->name),(long)enumroot->value); /* find the constant with this name and get the tag */ ref=findglb(enumroot->name); if (ref!=NULL) { if (ref->x.idxtag!=0) { tagsym=find_tag_byval(ref->x.idxtag); assert(tagsym!=NULL); fprintf(log,"\t\t\t\t\n",tagsym->name); } /* if */ @@ -3914,17 +3915,17 @@ static void make_report(symbol *root,FIL if (sym->parent!=NULL) continue; /* hierarchical data type */ assert(sym->ident==iCONSTEXPR || sym->ident==iVARIABLE || sym->ident==iARRAY || sym->ident==iFUNCTN); if (sym->ident!=iCONSTEXPR) continue; if ((sym->usage & uREAD)==0 || (sym->usage & (uENUMFIELD | uENUMROOT))!=0) continue; - fprintf(log,"\t\t\n",funcdisplayname(symname,sym->name),sym->addr); + fprintf(log,"\t\t\n",funcdisplayname(symname,sym->name),(long)sym->addr); if (sym->tag!=0) { tagsym=find_tag_byval(sym->tag); assert(tagsym!=NULL); fprintf(log,"\t\t\t\n",tagsym->name); } /* if */ assert(sym->refer!=NULL); for (i=0; inumrefers; i++) { if ((ref=sym->refer[i])!=NULL) @@ -4034,17 +4035,17 @@ static void make_report(symbol *root,FIL if (ref->refer[i]==sym) fprintf(log,"\t\t\t\n",xmlencode(symname,funcdisplayname(symname,ref->name))); } /* for */ /* print parameter list, with tag & const information, plus descriptions */ assert(sym->dim.arglist!=NULL); for (arg=0; sym->dim.arglist[arg].ident!=0; arg++) { int dim,paraminfo; char *outer_start,*inner_start; - int outer_length,inner_length; + int outer_length=0,inner_length=0; if (sym->dim.arglist[arg].ident==iVARARGS) fprintf(log,"\t\t\t\n"); else fprintf(log,"\t\t\t\n",sym->dim.arglist[arg].name); /* print the tag name(s) for each parameter */ assert(sym->dim.arglist[arg].numtags>0); assert(sym->dim.arglist[arg].tags!=NULL); paraminfo=(sym->dim.arglist[arg].numtags>1 || sym->dim.arglist[arg].tags[0]!=0) @@ -5243,26 +5244,26 @@ static void doreturn(void) ident=doexpr(TRUE,FALSE,TRUE,TRUE,&tag,&sym,TRUE); needtoken(tTERM); /* see if this function already has a sub type (an array attached) */ sub=finddepend(curfunc); assert(sub==NULL || sub->ident==iREFARRAY); if ((rettype & uRETVALUE)!=0) { int retarray=(ident==iARRAY || ident==iREFARRAY); /* there was an earlier "return" statement in this function */ - if (sub==NULL && retarray || sub!=NULL && !retarray) + if ((sub==NULL && retarray) || (sub!=NULL && !retarray)) error(79); /* mixing "return array;" and "return value;" */ } /* if */ rettype|=uRETVALUE; /* function returns a value */ /* check tagname with function tagname */ assert(curfunc!=NULL); if (!matchtag(curfunc->tag,tag,TRUE)) error(213); /* tagname mismatch */ if (ident==iARRAY || ident==iREFARRAY) { - int dim[sDIMEN_MAX],numdim; + int dim[sDIMEN_MAX],numdim=0; cell arraysize; assert(sym!=NULL); if (sub!=NULL) { assert(sub->ident==iREFARRAY); /* this function has an array attached already; check that the current * "return" statement returns exactly the same array */ level=sym->dim.array.level; diff --git a/compiler/libpc300/sc2.c b/compiler/libpc300/sc2.c --- a/compiler/libpc300/sc2.c +++ b/compiler/libpc300/sc2.c @@ -22,17 +22,17 @@ */ #include #include #include #include #include #include #include "sc.h" -#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ +#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ #include #endif #if defined FORTIFY #include "fortify.h" #endif /* flags for litchar() */ @@ -193,17 +193,17 @@ SC_FUNC int plungefile(char *name,int tr if (try_includepaths && name[0]!=DIRSEP_CHAR) { int i; char *ptr; for (i=0; !result && (ptr=get_path(i))!=NULL; i++) { char path[_MAX_PATH]; strncpy(path,ptr,sizeof path); path[sizeof path - 1]='\0'; /* force '\0' termination */ - strncat(path,name,sizeof(path)-strlen(path)); + strncat(path,name,sizeof(path) - strlen(path) - 1); path[sizeof path - 1]='\0'; result=plungequalifiedfile(path); } /* while */ } /* if */ return result; } static void check_empty(const unsigned char *lptr) @@ -403,17 +403,17 @@ static void stripcom(unsigned char *line *(line+1)=' '; line+=2; } else { if (*line=='/' && *(line+1)=='*') error(216); /* nested comment */ #if !defined SC_LIGHT /* collect the comment characters in a string */ if (icomment==2) { - if (skipstar && (*line!='\0' && *line<=' ' || *line=='*')) { + if (skipstar && ((*line!='\0' && *line<=' ') || *line=='*')) { /* ignore leading whitespace and '*' characters */ } else if (commentidxCOMMENT_LIMIT && *line!='\0' && *line<=' ') { comment[commentidx]='\0'; insert_docstring(comment); commentidx=0; } /* if */ @@ -580,32 +580,19 @@ static int htoi(cell *val,const unsigned } /* if */ if (alphanum(*ptr)) return 0; else return (int)(ptr-curptr); } #if defined __GNUC__ -static double pow10(int value) +static double pow10(double d) { - double res=1.0; - while (value>=4) { - res*=10000.0; - value-=5; - } /* while */ - while (value>=2) { - res*=100.0; - value-=2; - } /* while */ - while (value>=1) { - res*=10.0; - value-=1; - } /* while */ - return res; + return pow(10, d); } #endif /* ftoi * * Attempts to interpret a numeric symbol as a rational number, either as * IEEE 754 single/double precision floating point or as a fixed point integer. * On success it returns the number of characters processed and the value is @@ -1205,17 +1192,17 @@ static int command(void) case tRATIONAL: outval(val,FALSE); code_idx+=opargs(1); break; case tSYMBOL: sym=findloc(str); if (sym==NULL) sym=findglb(str); - if (sym==NULL || sym->ident!=iFUNCTN && sym->ident!=iREFFUNC && (sym->usage & uDEFINE)==0) { + if (sym==NULL || (sym->ident!=iFUNCTN && sym->ident!=iREFFUNC && (sym->usage & uDEFINE)==0)) { error(17,str); /* undefined symbol */ } else { outval(sym->addr,FALSE); /* mark symbol as "used", unknown whether for read or write */ markusage(sym,uREAD | uWRITTEN); code_idx+=opargs(1); } /* if */ break; @@ -1639,17 +1626,17 @@ static void substallpatterns(unsigned ch start++; /* skip non-alphapetic character (or closing quote of a string) */ } /* while */ if (*start=='\0') break; /* abort loop on error */ /* if matching the operator "defined", skip it plus the symbol behind it */ if (strncmp((char*)start,"defined",7)==0 && !isalpha((char)*(start+7))) { start+=7; /* skip "defined" */ /* skip white space & parantheses */ - while (*start<=' ' && *start!='\0' || *start=='(') + while ((*start<=' ' && *start!='\0') || *start=='(') start++; /* skip the symbol behind it */ while (isalpha(*start) || isdigit(*start) || *start=='_') start++; /* drop back into the main loop */ continue; } /* if */ /* get the prefix (length), look for a matching definition */ @@ -1941,32 +1928,32 @@ SC_FUNC int lex(cell *lexvalue,char **le } else if (find_constval(&tagname_tab,_lexstr,0)!=NULL) { /* this looks like a tag override (because a tag with this name * exists), but tags are not allowed right now, so it is probably an * error */ error(220); } /* if */ } /* if */ - } else if (*lptr=='\"' || *lptr==sc_ctrlchar && *(lptr+1)=='\"') + } else if (*lptr=='\"' || (*lptr==sc_ctrlchar && *(lptr+1)=='\"')) { /* unpacked string literal */ _lextok=tSTRING; stringflags= (*lptr==sc_ctrlchar) ? RAWMODE : 0; *lexvalue=_lexval=litidx; lptr+=1; /* skip double quote */ if ((stringflags & RAWMODE)!=0) lptr+=1; /* skip "escape" character too */ lptr=sc_packstr ? packedstring(lptr,stringflags) : unpackedstring(lptr,stringflags); if (*lptr=='\"') lptr+=1; /* skip final quote */ else error(37); /* invalid (non-terminated) string */ - } else if (*lptr=='!' && *(lptr+1)=='\"' - || *lptr=='!' && *(lptr+1)==sc_ctrlchar && *(lptr+2)=='\"' - || *lptr==sc_ctrlchar && *(lptr+1)=='!' && *(lptr+2)=='\"') + } else if ((*lptr=='!' && *(lptr+1)=='\"') + || (*lptr=='!' && *(lptr+1)==sc_ctrlchar && *(lptr+2)=='\"') + || (*lptr==sc_ctrlchar && *(lptr+1)=='!' && *(lptr+2)=='\"')) { /* packed string literal */ _lextok=tSTRING; stringflags= (*lptr==sc_ctrlchar || *(lptr+1)==sc_ctrlchar) ? RAWMODE : 0; *lexvalue=_lexval=litidx; lptr+=2; /* skip exclamation point and double quote */ if ((stringflags & RAWMODE)!=0) lptr+=1; /* skip "escape" character too */ lptr=sc_packstr ? unpackedstring(lptr,stringflags) : packedstring(lptr,stringflags); @@ -2048,17 +2035,17 @@ SC_FUNC void lexclr(int clreol) */ SC_FUNC int matchtoken(int token) { cell val; char *str; int tok; tok=lex(&val,&str); - if (tok==token || token==tTERM && (tok==';' || tok==tENDEXPR)) { + if (tok==token || (token==tTERM && (tok==';' || tok==tENDEXPR))) { return 1; } else if (!sc_needsemicolon && token==tTERM && (_lexnewline || !freading)) { /* Push "tok" back, because it is the token following the implicit statement * termination (newline) token. */ lexpush(); return 2; } else { @@ -2413,17 +2400,17 @@ SC_FUNC void delete_symbol(symbol *root, root->next=sym->next; free_symbol(sym); } SC_FUNC void delete_symbols(symbol *root,int level,int delete_labels,int delete_functions) { symbol *sym,*parent_sym; constvalue *stateptr; - int mustdelete; + int mustdelete=0; /* erase only the symbols with a deeper nesting level than the * specified nesting level */ while (root->next!=NULL) { sym=root->next; if (sym->compoundident) { diff --git a/compiler/libpc300/sc3.c b/compiler/libpc300/sc3.c --- a/compiler/libpc300/sc3.c +++ b/compiler/libpc300/sc3.c @@ -924,17 +924,17 @@ static int hier14(value *lval1) if (val<0) { val=-val; if (lval3.sym->x.idxtag==0) exactmatch=FALSE; } /* if */ } /* if */ if (lval3.sym->dim.array.level!=level) return error(48); /* array dimensions must match */ - else if (ltlengthval || val==0) + else if (ltlengthval) || val==0) return error(47); /* array sizes must match */ else if (lval3.ident!=iARRAYCELL && !matchtag(lval3.sym->x.idxtag,idxtag,TRUE)) error(229,(lval2.sym!=NULL) ? lval2.sym->name : lval3.sym->name); /* index tag mismatch */ if (level>0) { /* check the sizes of all sublevels too */ symbol *sym1 = lval3.sym; symbol *sym2 = lval2.sym; int i; @@ -1119,17 +1119,17 @@ static int hier3(value *lval) } static int hier2(value *lval) { int lvalue,tok; int tag,paranthese; cell val; char *st; - symbol *sym; + symbol *sym=NULL; int saveresult; tok=lex(&val,&st); switch (tok) { case tINC: /* ++lval */ if (!hier2(lval)) return error(22); /* must be lvalue */ assert(lval->sym!=NULL); @@ -1242,17 +1242,17 @@ static int hier2(value *lval) error(72); /* "function" symbol has no size */ else if ((sym->usage & uDEFINE)==0) return error(17,st); /* undefined symbol (symbol is in the table, but it is "used" only) */ clear_value(lval); lval->ident=iCONSTEXPR; lval->constval=1; /* preset */ if (sym->ident==iARRAY || sym->ident==iREFARRAY) { int level; - symbol *idxsym; + symbol *idxsym=NULL; for (level=0; matchtoken('['); level++) { idxsym=NULL; if (level==sym->dim.array.level && matchtoken(tSYMBOL)) { char *idxname; tokeninfo(&val,&idxname); if ((idxsym=findconst(idxname))==NULL) error(80,idxname); /* unknown symbol, or non-constant */ } /* if */ @@ -1288,17 +1288,17 @@ static int hier2(value *lval) if (sym==NULL) return error(17,st); /* undefined symbol */ if ((sym->usage & uDEFINE)==0) return error(17,st); /* undefined symbol (symbol is in the table, but it is "used" only) */ tag=sym->tag; } /* if */ if (sym->ident==iARRAY || sym->ident==iREFARRAY) { int level; - symbol *idxsym; + symbol *idxsym=NULL; for (level=0; matchtoken('['); level++) { idxsym=NULL; if (level==sym->dim.array.level && matchtoken(tSYMBOL)) { char *idxname; tokeninfo(&val,&idxname); if ((idxsym=findconst(idxname))==NULL) error(80,idxname); /* unknown symbol, or non-constant */ } /* if */ @@ -1457,35 +1457,35 @@ restart: if (lval2.ident==iCONSTEXPR) { /* constant expression */ stgdel(index,cidx); /* scratch generated code */ if (lval1->arrayidx!=NULL) { /* keep constant index, for checking */ assert(sym->dim.array.level>=0 && sym->dim.array.levelarrayidx[sym->dim.array.level]=lval2.constval; } /* if */ if (close==']') { /* normal array index */ - if (lval2.constval<0 || sym->dim.array.length!=0 && sym->dim.array.length<=lval2.constval) + if (lval2.constval<0 || (sym->dim.array.length!=0 && sym->dim.array.length<=lval2.constval)) error(32,sym->name); /* array index out of bounds */ if (lval2.constval!=0) { /* don't add offsets for zero subscripts */ #if PAWN_CELL_SIZE==16 ldconst(lval2.constval<<1,sALT); #elif PAWN_CELL_SIZE==32 ldconst(lval2.constval<<2,sALT); #elif PAWN_CELL_SIZE==64 ldconst(lval2.constval<<3,sALT); #else #error Unsupported cell size #endif ob_add(); } /* if */ } else { /* character index */ - if (lval2.constval<0 || sym->dim.array.length!=0 - && sym->dim.array.length*((8*sizeof(cell))/sCHARBITS)<=(ucell)lval2.constval) + if (lval2.constval<0 || (sym->dim.array.length!=0 + && sym->dim.array.length*((8*sizeof(cell))/sCHARBITS)<=(ucell)lval2.constval)) error(32,sym->name); /* array index out of bounds */ if (lval2.constval!=0) { /* don't add offsets for zero subscripts */ #if sCHARBITS==16 ldconst(lval2.constval<<1,sALT);/* 16-bit character */ #else ldconst(lval2.constval,sALT); /* 8-bit character */ #endif @@ -2030,18 +2030,18 @@ static int nesting=0; if (lval.ident==iARRAYCELL) { error(47); /* array sizes must match */ } else { assert(lval.constval!=0); /* literal array must have a size */ /* A literal array must have exactly the same size as the * function argument; a literal string may be smaller than * the function argument. */ - if (lval.constval>0 && arg[argidx].dim[0]!=lval.constval - || lval.constval<0 && arg[argidx].dim[0] < -lval.constval) + if ((lval.constval>0 && arg[argidx].dim[0]!=lval.constval) + || (lval.constval<0 && arg[argidx].dim[0] < -lval.constval)) error(47); /* array sizes must match */ } /* if */ } /* if */ if (lval.ident!=iARRAYCELL) { /* save array size, for default values with uSIZEOF flag */ cell array_sz=lval.constval; assert(array_sz!=0);/* literal array must have a size */ if (array_sz<0) diff --git a/compiler/libpc300/sc4.c b/compiler/libpc300/sc4.c --- a/compiler/libpc300/sc4.c +++ b/compiler/libpc300/sc4.c @@ -230,17 +230,17 @@ SC_FUNC void begdseg(void) stgwrite("DATA\t; "); outval(glb_declared-litidx,TRUE); curseg=sIN_DSEG; } /* if */ } SC_FUNC void setline(int chkbounds) { - if ((sc_debug & sSYMBOLIC)!=0 || chkbounds && (sc_debug & sCHKBOUNDS)!=0) { + if ((sc_debug & sSYMBOLIC)!=0 || (chkbounds && (sc_debug & sCHKBOUNDS)!=0)) { /* generate a "break" (start statement) opcode rather than a "line" opcode * because earlier versions of Small/Pawn have an incompatible version of the * line opcode */ stgwrite("\tbreak\t; "); outval(code_idx,TRUE); code_idx+=opcodes(1); } /* if */ @@ -714,17 +714,17 @@ SC_FUNC void ffcall(symbol *sym,const ch stgwrite("\tcall "); if (label!=NULL) { stgwrite("l."); stgwrite(label); } else { stgwrite(sym->name); } /* if */ if (sc_asmfile - && (label!=NULL || !isalpha(sym->name[0]) && sym->name[0]!='_' && sym->name[0]!=sc_ctrlchar)) + && (label!=NULL || (!isalpha(sym->name[0]) && sym->name[0]!='_' && sym->name[0]!=sc_ctrlchar))) { stgwrite("\t; "); stgwrite(symname); } /* if */ stgwrite("\n"); code_idx+=opcodes(1)+opargs(1); } /* if */ } diff --git a/compiler/libpc300/sc5.c b/compiler/libpc300/sc5.c --- a/compiler/libpc300/sc5.c +++ b/compiler/libpc300/sc5.c @@ -20,17 +20,17 @@ * 3. This notice may not be removed or altered from any source distribution. * * Version: $Id: sc5.c 1724 2005-07-24 20:00:55Z dvander $ */ #include #if defined __WIN32__ || defined _WIN32 || defined __MSDOS__ #include #endif -#if defined LINUX || defined __GNUC__ +#if defined LINUX || defined __APPLE__ || defined __GNUC__ #include #endif #include #include #include /* ANSI standardized variable argument list functions */ #include #if defined FORTIFY #include "fortify.h" @@ -127,17 +127,17 @@ static short lastfile; else fprintf(fp,"%s(%d) : %s %03d: ",inpfname,fline,pre,number); vfprintf(fp,string,argptr); fclose(fp); } /* if */ } /* if */ va_end(argptr); - if (number>=100 && number<200 || errnum>25){ + if ((number>=100 && number<200) || errnum>25){ if (strlen(errfname)==0) { va_start(argptr,number); pc_error(0,"\nCompilation aborted.",NULL,0,0,argptr); va_end(argptr); } /* if */ if (outf!=NULL) { pc_closeasm(outf,TRUE); outf=NULL; diff --git a/compiler/libpc300/sc6.c b/compiler/libpc300/sc6.c --- a/compiler/libpc300/sc6.c +++ b/compiler/libpc300/sc6.c @@ -25,17 +25,17 @@ #include /* for macro max() */ #include #include #if defined FORTIFY #include "fortify.h" #endif #include "sc.h" #include "amxdbg.h" -#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ +#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ #include #endif static void append_dbginfo(FILE *fout); typedef cell (*OPCODE_PROC)(FILE *fbin,char *params,cell opcode); @@ -890,17 +890,17 @@ SC_FUNC int assemble(FILE *fout,FILE *fi bytes_out=0; for (pass=sIN_CSEG; pass<=sIN_DSEG; pass++) { pc_resetasm(fin); while (pc_readasm(fin,line,sizeof line)!=NULL) { stripcomment(line); instr=skipwhitespace(line); /* ignore empty lines and labels (labels have a special syntax, so these * must be parsed separately) */ - if (*instr=='\0' || tolower(*instr)=='l' && *(instr+1)=='.') + if (*instr=='\0' || (tolower(*instr)=='l' && *(instr+1)=='.')) continue; /* get to the end of the instruction (make use of the '\n' that fgets() * added at the end of the line; this way we will *always* drop on a * whitespace character) */ for (params=instr; *params!='\0' && !isspace(*params); params++) /* nothing */; assert(params>instr); i=findopcode(instr,(int)(params-instr)); diff --git a/compiler/libpc300/sc7.c b/compiler/libpc300/sc7.c --- a/compiler/libpc300/sc7.c +++ b/compiler/libpc300/sc7.c @@ -452,28 +452,28 @@ static int matchsequence(char *start,cha start++; ptr++; } /* while */ pattern--; /* there is an increment following at the end of the loop */ break; case ' ': if (*start!='\t' && *start!=' ') return FALSE; - while (start=0xd800 && result<=0xdfff || result==0xfffe || result==0xffff) + if ((result>=0xd800 && result<=0xdfff) || result==0xfffe || result==0xffff) return -1; } /* if */ break; } else if (follow==0 && (ch & 0x80)==0x80) { /* UTF-8 leader code */ if ((ch & 0xe0)==0xc0) { /* 110xxxxx 10xxxxxx */ follow=1; diff --git a/compiler/libpc300/sclinux.h b/compiler/libpc300/sclinux.h --- a/compiler/libpc300/sclinux.h +++ b/compiler/libpc300/sclinux.h @@ -27,16 +27,20 @@ /* * SC assumes that a computer is Little Endian unless told otherwise. It uses * (and defines) the macros BYTE_ORDER and BIG_ENDIAN. * For Linux, we must overrule these settings with those defined in glibc. */ #if !defined __BYTE_ORDER # include +# if defined __APPLE__ +# include +# define __BYTE_ORDER BYTE_ORDER +# endif #endif #if defined __OpenBSD__ || defined __FreeBSD__ # define __BYTE_ORDER BYTE_ORDER # define __LITTLE_ENDIAN LITTLE_ENDIAN # define __BIG_ENDIAN BIG_ENDIAN #endif diff --git a/compiler/libpc300/sclist.c b/compiler/libpc300/sclist.c --- a/compiler/libpc300/sclist.c +++ b/compiler/libpc300/sclist.c @@ -233,17 +233,17 @@ SC_FUNC void delete_aliastable(void) /* ----- include paths list -------------------------------------- */ static stringlist includepaths = {NULL, NULL}; /* directory list for include files */ SC_FUNC stringlist *insert_path(char *path) { char *extra_path = malloc(strlen(path) + 16); strcpy(extra_path, path); -#if defined __linux__ +#if defined __linux__ || defined __APPLE__ strcat(extra_path, "/amxmod_compat/"); #elif defined WIN32 || defined _WIN32 strcat(extra_path, "\\amxmod_compat\\"); #endif insert_string(&includepaths, extra_path); free(extra_path); return insert_string(&includepaths,path); } @@ -439,20 +439,20 @@ SC_FUNC stringlist *insert_dbgsymbol(sym int count=0; #endif funcdisplayname(symname,sym->name); /* address tag:name codestart codeend ident vclass [tag:dim ...] */ #if PAWN_CELL_SIZE==32 if (sym->ident==iFUNCTN) - sprintf(string,"S:%08lx %x:%s %08lx %08lx %x %x",sym->addr,sym->tag, + sprintf(string,"S:%08x %x:%s %08x %08x %x %x",sym->addr,sym->tag, symname,sym->addr,sym->codeaddr,sym->ident,sym->vclass); else - sprintf(string,"S:%08lx %x:%s %08lx %08lx %x %x",sym->addr,sym->tag, + sprintf(string,"S:%08x %x:%s %08x %08x %x %x",sym->addr,sym->tag, symname,sym->codeaddr,code_idx,sym->ident,sym->vclass); #elif PAWN_CELL_SIZE==64 if (sym->ident==iFUNCTN) sprintf(string,"S:%08Lx %x:%s %08Lx %08Lx %x %x",(LONGCAST)sym->addr,sym->tag, symname,sym->addr,sym->codeaddr,sym->ident,sym->vclass); else sprintf(string,"S:%08Lx %x:%s %08Lx %08Lx %x %x",(LONGCAST)sym->addr,sym->tag, symname,sym->codeaddr,code_idx,sym->ident,sym->vclass); diff --git a/compiler/libpc300/scstate.c b/compiler/libpc300/scstate.c --- a/compiler/libpc300/scstate.c +++ b/compiler/libpc300/scstate.c @@ -46,17 +46,17 @@ * Version: $Id: scstate.c 1724 2005-07-24 20:00:55Z dvander $ */ #include #include #include #include #include #include "sc.h" -#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ +#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ #include #endif #if defined FORTIFY #include "fortify.h" #endif typedef struct s_statelist { diff --git a/configs/hamdata.ini b/configs/hamdata.ini --- a/configs/hamdata.ini +++ b/configs/hamdata.ini @@ -256,16 +256,126 @@ weapon_shouldweaponidle 92 weapon_usedecrement 93 cstrike_restart 2 cstrike_roundrespawn 84 cstrike_item_candrop 63 cstrike_item_getmaxspeed 78 @end + +@section cstrike mac + pev 4 + base 0x0 + + spawn 0 + precache 1 + keyvalue 3 + objectcaps 6 + activate 7 + setobjectcollisionbox 8 + classify 9 + deathnotice 10 + traceattack 11 + takedamage 12 + takehealth 13 + killed 14 + bloodcolor 15 + tracebleed 16 + istriggered 17 + mymonsterpointer 18 + mysquadmonsterpointer 19 + gettogglestate 20 + addpoints 21 + addpointstoteam 22 + addplayeritem 23 + removeplayeritem 24 + giveammo 25 + getdelay 26 + ismoving 27 + overridereset 28 + damagedecal 29 + settogglestate 30 + startsneaking 31 + stopsneaking 32 + oncontrols 33 + issneaking 34 + isalive 35 + isbspmodel 36 + reflectgauss 37 + hastarget 38 + isinworld 39 + isplayer 40 + isnetclient 41 + teamid 42 + getnexttarget 43 + think 44 + touch 45 + use 46 + blocked 47 + respawn 48 + updateowner 49 + fbecomeprone 50 + center 51 + eyeposition 52 + earposition 53 + bodytarget 54 + illumination 55 + fvisible 56 + fvecvisible 57 + + player_jump 76 + player_duck 77 + player_prethink 78 + player_postthink 79 + player_getgunposition 80 + player_shouldfadeondeath 66 + player_impulsecommands 83 + player_updateclientdata 82 + + item_addtoplayer 59 + item_addduplicate 60 + item_getiteminfo 61 + item_candeploy 62 + item_deploy 64 + item_canholster 66 + item_holster 67 + item_updateiteminfo 68 + item_preframe 69 + item_postframe 70 + item_drop 71 + item_kill 72 + item_attachtoplayer 73 + item_primaryammoindex 74 + item_secondaryammoindex 75 + item_updateclientdata 76 + item_getweaponptr 77 + item_itemslot 79 + + weapon_extractammo 80 + weapon_extractclipammo 81 + weapon_addweapon 82 + weapon_playemptysound 83 + weapon_resetemptysound 84 + weapon_sendweaponanim 85 + weapon_isusable 86 + weapon_primaryattack 87 + weapon_secondaryattack 88 + weapon_reload 89 + weapon_weaponidle 90 + weapon_retireweapon 91 + weapon_shouldweaponidle 92 + weapon_usedecrement 93 + + cstrike_restart 2 + cstrike_roundrespawn 84 + cstrike_item_candrop 63 + cstrike_item_getmaxspeed 78 +@end + @section dod linux pev 0 base 0x154 spawn 5 precache 6 keyvalue 7 objectcaps 10 @@ -1742,18 +1852,122 @@ weapon_isusable 82 weapon_primaryattack 83 weapon_secondaryattack 84 weapon_reload 85 weapon_weaponidle 86 weapon_retireweapon 87 weapon_shouldweaponidle 88 weapon_usedecrement 89 +@end + +@section valve mac + pev 4 + base 0x0 + spawn 0 + precache 1 + keyvalue 2 + objectcaps 5 + activate 6 + setobjectcollisionbox 7 + classify 8 + deathnotice 9 + traceattack 10 + takedamage 11 + takehealth 12 + killed 13 + bloodcolor 14 + tracebleed 15 + istriggered 16 + mymonsterpointer 17 + mysquadmonsterpointer 18 + gettogglestate 19 + addpoints 20 + addpointstoteam 21 + addplayeritem 22 + removeplayeritem 23 + giveammo 24 + getdelay 25 + ismoving 26 + overridereset 27 + damagedecal 28 + settogglestate 29 + startsneaking 30 + stopsneaking 31 + oncontrols 32 + issneaking 33 + isalive 34 + isbspmodel 35 + reflectgauss 36 + hastarget 37 + isinworld 38 + isplayer 39 + isnetclient 40 + teamid 41 + getnexttarget 42 + think 43 + touch 44 + use 45 + blocked 46 + respawn 47 + updateowner 48 + fbecomeprone 49 + center 50 + eyeposition 51 + earposition 52 + bodytarget 53 + illumination 54 + fvisible 55 + fvecvisible 56 + + player_jump 125 + player_duck 126 + player_prethink 127 + player_postthink 128 + player_getgunposition 119 + player_shouldfadeondeath 60 + player_impulsecommands 130 + player_updateclientdata 129 + + item_addtoplayer 58 + item_addduplicate 59 + item_getiteminfo 60 + item_candeploy 61 + item_deploy 62 + item_canholster 63 + item_holster 64 + item_updateiteminfo 65 + item_preframe 66 + item_postframe 67 + item_drop 68 + item_kill 69 + item_attachtoplayer 70 + item_primaryammoindex 71 + item_secondaryammoindex 72 + item_updateclientdata 73 + item_getweaponptr 74 + item_itemslot 75 + + weapon_extractammo 76 + weapon_extractclipammo 77 + weapon_addweapon 78 + weapon_playemptysound 79 + weapon_resetemptysound 80 + weapon_sendweaponanim 81 + weapon_isusable 82 + weapon_primaryattack 83 + weapon_secondaryattack 84 + weapon_reload 85 + weapon_weaponidle 86 + weapon_retireweapon 87 + weapon_shouldweaponidle 88 + weapon_usedecrement 89 @end + ; Sven-Coop has no linux binaries. This makes disassembly much harder. ; These offsets were contributed by ts2do @section SvenCoop windows pev 4 base 0x0 spawn 0 precache 1 diff --git a/dlls/cstrike/cstrike/CstrikeHacks.cpp b/dlls/cstrike/cstrike/CstrikeHacks.cpp --- a/dlls/cstrike/cstrike/CstrikeHacks.cpp +++ b/dlls/cstrike/cstrike/CstrikeHacks.cpp @@ -1,15 +1,19 @@ #include -#include +#include #include "cstrike.h" -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) #include #define PAGE_EXECUTE_READWRITE PROT_READ|PROT_WRITE|PROT_EXEC + +#if defined(__linux) +#include +#endif #endif /* Utils */ unsigned char *UTIL_CodeAlloc(size_t size); void UTIL_CodeFree(unsigned char *addr); void UTIL_MemProtect(void *addr, int length, int prot); bool UTIL_GetLibraryOfAddress(void *memInBase, char *buffer, size_t maxlength); @@ -60,17 +64,17 @@ void CtrlDetour_ClientCommand(bool set) const unsigned int DetourJmpBytes = 5; static unsigned char *FullDetour = NULL; void *target = (void *)MDLL_ClientCommand; unsigned char *paddr; if (!g_UseBotArgs) { -#if defined __linux__ +#if defined(__linux__) || defined(__APPLE__) /* Find the DLL */ char dll[256]; if (!UTIL_GetLibraryOfAddress(target, dll, sizeof(dll))) { return; } void *handle = dlopen(dll, RTLD_NOW); if (!handle) @@ -97,17 +101,17 @@ void CtrlDetour_ClientCommand(bool set) /* Copy the main trampoline function */ memcpy(FullDetour, DetourOps, DetourBytes); /* Copy our detour call into the trampoline */ paddr = &FullDetour[DetourCallPos]; *(unsigned long *)paddr = (unsigned long)Detour_ClientCommand - (unsigned long)(paddr + 4); /* Copy original bytes onto the end of the function */ - memcpy(&FullDetour[DetourBytes], target, CS_DETOURCOPYBYTES_CLIENTCOMMAND); + memcpy(&FullDetour[DetourBytes], target, CS_DETOURCOPYBYTES_CLIENTCOMMAND); /* Patch and copy the final jmp */ paddr = &FullDetour[DetourJmpPos]; *paddr++ = DetourJmp; *(unsigned long *)paddr = ((unsigned long)target + CS_DETOURCOPYBYTES_CLIENTCOMMAND) - (unsigned long)(paddr + 4); /* Now overwrite the target function with our trampoline */ @@ -137,47 +141,51 @@ int Detour_ClientCommand(edict_t *pEdict } return 0; } unsigned char *UTIL_CodeAlloc(size_t size) { #if defined WIN32 return (unsigned char *)VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE); +#elif defined __GNUC__ +#if defined __APPLE__ + unsigned char *addr = (unsigned char *)valloc(size); #else unsigned char *addr = (unsigned char *)memalign(sysconf(_SC_PAGESIZE), size); +#endif mprotect(addr, size, PROT_READ|PROT_WRITE|PROT_EXEC); return addr; #endif } void UTIL_CodeFree(unsigned char *addr) { #if defined WIN32 VirtualFree(addr, 0, MEM_RELEASE); #else free(addr); #endif } void UTIL_MemProtect(void *addr, int length, int prot) { -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) #define ALIGN(ar) ((long)ar & ~(sysconf(_SC_PAGESIZE)-1)) void *addr2 = (void *)ALIGN(addr); mprotect(addr2, sysconf(_SC_PAGESIZE), prot); #else DWORD old_prot; VirtualProtect(addr, length, prot, &old_prot); #endif } bool UTIL_GetLibraryOfAddress(void *memInBase, char *buffer, size_t maxlength) { -#if defined __linux__ +#if defined(__linux__) || defined(__APPLE__) Dl_info info; if (!dladdr(memInBase, &info)) { return false; } if (!info.dli_fbase || !info.dli_fname) { return false; diff --git a/dlls/cstrike/cstrike/Makefile b/dlls/cstrike/cstrike/Makefile --- a/dlls/cstrike/cstrike/Makefile +++ b/dlls/cstrike/cstrike/Makefile @@ -1,78 +1,123 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../../hlsdk/multiplayer MM_ROOT = ../../../../metamod/metamod +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OPT_FLAGS = -O2 -funroll-loops -s -pipe -fomit-frame-pointer -fno-strict-aliasing -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = cstrike - -BIN_SUFFIX_32 = amxx_i386.so -BIN_SUFFIX_64 = amxx_amd64.so +PROJECT = cstrike OBJECTS = sdk/amxxmodule.cpp CstrikePlayer.cpp cstrike.cpp CstrikeHacks.cpp -LINK = +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -Isdk +C_OPT_FLAGS = -DNDEBUG -O2 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +LINK = -ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(MM_ROOT) -Isdk + +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared endif +LINK += -m32 -lm -ldl + +CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) + ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -DNDEBUG -Wall -Wno-non-virtual-dtor -Werror -fno-exceptions -DHAVE_STDINT_H -fno-rtti -static-libgcc -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -ifeq "$(AMD64)" "true" - BINARY = $(NAME)_$(BIN_SUFFIX_64) - CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -m64 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") else - BINARY = $(NAME)_$(BIN_SUFFIX_32) - CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 - OPT_FLAGS += -march=i586 + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< all: mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/sdk - $(MAKE) cstrike + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -amd64: - $(MAKE) all AMD64=true +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -cstrike: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/sdk/*.o - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Release/$(NAME)_$(BIN_SUFFIX_64) - rm -rf Debug/sdk/*.o - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_64) + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/dlls/cstrike/cstrike/cstrike.cpp b/dlls/cstrike/cstrike/cstrike.cpp --- a/dlls/cstrike/cstrike/cstrike.cpp +++ b/dlls/cstrike/cstrike/cstrike.cpp @@ -44,17 +44,17 @@ bool UTIL_IsPlayer(AMX* amx, edict_t* pP bool player = false; if (strcmp(STRING(pPlayer->v.classname), "player") == 0) player = true; return player; } -void UTIL_TextMsg_Generic(edict_t* pPlayer, char* message) +void UTIL_TextMsg_Generic(edict_t* pPlayer, const char* message) { MESSAGE_BEGIN(MSG_ONE, GET_USER_MSG_ID(PLID, "TextMsg", NULL), NULL, pPlayer); WRITE_BYTE(HUD_PRINTCENTER); // 1 = console, 2 = console, 3 = chat, 4 = center WRITE_STRING(message); MESSAGE_END(); /* The byte above seems to use these: #define HUD_PRINTNOTIFY 1 @@ -741,17 +741,17 @@ static cell AMX_NATIVE_CALL cs_set_user_ if (params[i + 3] != -1) { colour[i] = params[i + 3]; } } pPlayer->v.body = 1; - char* icon; + const char* icon; if (params[6] != -1) { int len; icon = MF_GetAmxString(amx, params[6], 1, &len); } else { icon = "defuser"; } diff --git a/dlls/cstrike/cstrike/cstrike.h b/dlls/cstrike/cstrike/cstrike.h --- a/dlls/cstrike/cstrike/cstrike.h +++ b/dlls/cstrike/cstrike/cstrike.h @@ -39,25 +39,25 @@ #include #include "CstrikePlayer.h" #define GETINFOKEYBUFFER (*g_engfuncs.pfnGetInfoKeyBuffer) #define SETCLIENTKEYVALUE (*g_engfuncs.pfnSetClientKeyValue) #define GETCLIENTKEYVALUE (*g_engfuncs.pfnInfoKeyValue) #define CREATENAMEDENTITY (*g_engfuncs.pfnCreateNamedEntity) -#if defined __linux__ +#if defined(__linux__) || defined (__APPLE__) #define EXTRAOFFSET 5 // offsets 5 higher in Linux builds #define EXTRAOFFSET_WEAPONS 4 // weapon offsets are obviously only 4 steps higher on Linux! #define ACTUAL_EXTRA_OFFSET 20 // actual, byte-addressable offset #else #define EXTRAOFFSET 0 // no change in Windows builds #define EXTRAOFFSET_WEAPONS 0 #define ACTUAL_EXTRA_OFFSET 0 -#endif // defined __linux__ +#endif // defined(__linux__) || defined(__APPLE__) /* Offset history: 041029: Confirmed (pretty much) ALL offsets for 32 bit Windows, 32 bit Linux and amd64 (yes that's all of them). Found out that weapon offsets are only +4 higher on Linux. Also backpack ammo offsets were all obviously 5 steps too high since unknown time... */ @@ -153,16 +153,18 @@ #define OFFSET_SILENCER_FIREMODE 88 + EXTRAOFFSET // +14 // "hostage_entity" entities #define OFFSET_HOSTAGEFOLLOW 51 + EXTRAOFFSET // +21, long=51, int=107! (must use the long* offset because pointers on amd64 are stored the size of longs, 8 bytes, instead of the usual int 4 bytes.) #define OFFSET_HOSTAGEID 516 + EXTRAOFFSET // +29 #endif #if defined __linux__ #define CS_DETOURCOPYBYTES_CLIENTCOMMAND 6 +#elif defined __APPLE__ +#define CS_DETOURCOPYBYTES_CLIENTCOMMAND 5 #else #define CS_DETOURCOPYBYTES_CLIENTCOMMAND 6 #define CS_CLICMD_OFFS_USEBOTARGS 2 #define CS_CLICMD_OFFS_BOTARGS 22 #endif // Ids of weapons in CS diff --git a/dlls/cstrike/cstrike/sdk/amxxmodule.cpp b/dlls/cstrike/cstrike/sdk/amxxmodule.cpp --- a/dlls/cstrike/cstrike/sdk/amxxmodule.cpp +++ b/dlls/cstrike/cstrike/sdk/amxxmodule.cpp @@ -2235,17 +2235,17 @@ static META_FUNCTIONS g_MetaFunctions_Ta GetEntityAPI2, GetEntityAPI2_Post, GetNewDLLFunctions, GetNewDLLFunctions_Post, GetEngineFunctions, GetEngineFunctions_Post }; -C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +C_DLLEXPORT int Meta_Query(const char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) { if ((int) CVAR_GET_FLOAT("developer") != 0) UTIL_LogPrintf("[%s] dev: called: Meta_Query; version=%s, ours=%s\n", Plugin_info.logtag, ifvers, Plugin_info.ifvers); // Check for valid pMetaUtilFuncs before we continue. if(!pMetaUtilFuncs) { UTIL_LogPrintf("[%s] ERROR: Meta_Query called with null pMetaUtilFuncs\n", Plugin_info.logtag); @@ -2329,17 +2329,17 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIM #ifdef FN_META_DETACH FN_META_DETACH(); #endif // FN_META_DETACH return TRUE; } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) // linux prototype C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { #else #ifdef _MSC_VER // MSVC: Simulate __stdcall calling convention C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { @@ -3045,17 +3045,17 @@ char* UTIL_VarArgs( char *format, ... ) return string; } //========================================================= // UTIL_LogPrintf - Prints a logged message to console. // Preceded by LOG: ( timestamp ) < message > //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/cstrike/cstrike/sdk/amxxmodule.h b/dlls/cstrike/cstrike/sdk/amxxmodule.h --- a/dlls/cstrike/cstrike/sdk/amxxmodule.h +++ b/dlls/cstrike/cstrike/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/cstrike/csx/Makefile b/dlls/cstrike/csx/Makefile --- a/dlls/cstrike/csx/Makefile +++ b/dlls/cstrike/csx/Makefile @@ -1,78 +1,123 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../../hlsdk/multiplayer MM_ROOT = ../../../../metamod/metamod +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OPT_FLAGS = -O3 -funroll-loops -s -pipe -fomit-frame-pointer -fno-strict-aliasing -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = csx - -BIN_SUFFIX_32 = amxx_i386.so -BIN_SUFFIX_64 = amxx_amd64.so +PROJECT = csx OBJECTS = sdk/amxxmodule.cpp CRank.cpp CMisc.cpp meta_api.cpp rank.cpp usermsg.cpp -LINK = +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -Isdk +C_OPT_FLAGS = -DNDEBUG -O3 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +LINK = -ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(MM_ROOT) -Isdk + +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared endif +LINK += -m32 -lm -ldl + +CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) + ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -DNDEBUG -Wall -Wno-non-virtual-dtor -Werror -fno-exceptions -DHAVE_STDINT_H -static-libgcc -fno-rtti -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -ifeq "$(AMD64)" "true" - BINARY = $(NAME)_$(BIN_SUFFIX_64) - CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -m64 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") else - BINARY = $(NAME)_$(BIN_SUFFIX_32) - CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 - OPT_FLAGS += -march=i586 + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< all: mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/sdk - $(MAKE) csx + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -amd64: - $(MAKE) all AMD64=true +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -csx: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/sdk/*.o - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Release/$(NAME)_$(BIN_SUFFIX_64) - rm -rf Debug/sdk/*.o - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_64) + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/dlls/cstrike/csx/sdk/amxxmodule.cpp b/dlls/cstrike/csx/sdk/amxxmodule.cpp --- a/dlls/cstrike/csx/sdk/amxxmodule.cpp +++ b/dlls/cstrike/csx/sdk/amxxmodule.cpp @@ -2235,17 +2235,17 @@ static META_FUNCTIONS g_MetaFunctions_Ta GetEntityAPI2, GetEntityAPI2_Post, GetNewDLLFunctions, GetNewDLLFunctions_Post, GetEngineFunctions, GetEngineFunctions_Post }; -C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +C_DLLEXPORT int Meta_Query(const char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) { if ((int) CVAR_GET_FLOAT("developer") != 0) UTIL_LogPrintf("[%s] dev: called: Meta_Query; version=%s, ours=%s\n", Plugin_info.logtag, ifvers, Plugin_info.ifvers); // Check for valid pMetaUtilFuncs before we continue. if(!pMetaUtilFuncs) { UTIL_LogPrintf("[%s] ERROR: Meta_Query called with null pMetaUtilFuncs\n", Plugin_info.logtag); @@ -2329,17 +2329,17 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIM #ifdef FN_META_DETACH FN_META_DETACH(); #endif // FN_META_DETACH return TRUE; } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) // linux prototype C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { #else #ifdef _MSC_VER // MSVC: Simulate __stdcall calling convention C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { @@ -3045,17 +3045,17 @@ char* UTIL_VarArgs( char *format, ... ) return string; } //========================================================= // UTIL_LogPrintf - Prints a logged message to console. // Preceded by LOG: ( timestamp ) < message > //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/cstrike/csx/sdk/amxxmodule.h b/dlls/cstrike/csx/sdk/amxxmodule.h --- a/dlls/cstrike/csx/sdk/amxxmodule.h +++ b/dlls/cstrike/csx/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/dod/dodfun/CMisc.cpp b/dlls/dod/dodfun/CMisc.cpp --- a/dlls/dod/dodfun/CMisc.cpp +++ b/dlls/dod/dodfun/CMisc.cpp @@ -62,17 +62,17 @@ void CPlayer::Init( int pi, edict_t* pe void CPlayer::killPlayer(){ pEdict->v.dmg_inflictor = NULL; pEdict->v.health = 0; pEdict->v.deadflag = DEAD_RESPAWNABLE; pEdict->v.weaponmodel = 0; pEdict->v.weapons = 0; } -void CPlayer::setTeamName( char *szName ){ +void CPlayer::setTeamName( const char *szName ){ for (int i=0;i<16;i++){ *( (char*)pEdict->pvPrivateData + STEAM_PDOFFSET_TEAMNAME + i ) = szName[i]; } } void CPlayer::getTeamName(char * szName ){ for (int i=0;i<16;i++){ diff --git a/dlls/dod/dodfun/CMisc.h b/dlls/dod/dodfun/CMisc.h --- a/dlls/dod/dodfun/CMisc.h +++ b/dlls/dod/dodfun/CMisc.h @@ -27,17 +27,17 @@ * you do not wish to do so, delete this exception statement from your * version. * */ #ifndef CMISC_H #define CMISC_H -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define LINUXOFFSET 0 #else #define LINUXOFFSET 5 #endif #define DODFUN_VERSION "1.0.2" // DoD Player @@ -48,17 +48,17 @@ #define STEAM_PDOFFSET_RCLASS 367 + LINUXOFFSET // random class #define STEAM_PDOFFSET_SCORE 475 + LINUXOFFSET // score #define STEAM_PDOFFSET_DEATHS 476 + LINUXOFFSET // deaths // DoD Control Point struct pd_dcp { int iunk_0; -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) int iunk_1; // windows only #endif int iunk_2; // pointer edict_t* int iunk_3; float origin_x; float origin_y; float origin_z; // 6 @@ -77,17 +77,17 @@ struct pd_dcp { // 19 - spawnflags ? // 20-int , always 1 int unknown_block1[19]; int iunk_35; // pointer entvars_t* int iunk_36; // pointer entvars_t* int unknown_block2[52]; int iunk_89; // pointer entvars_t* -#ifdef __linux__ +#if defined (__linux__) || defined (__APPLE__) int iunk_extra1; int iunk_extra2; int iunk_extra3; int iunk_extra4; #endif int owner; // 90 int iunk_91; int iunk_92; @@ -124,17 +124,17 @@ struct pd_dcp { #define GET_CP_PD( x ) (*(pd_dcp*)x->pvPrivateData) // DoD Capture Area struct pd_dca { int iunk_0; int iunk_1; int iunk_2; -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) int iunk_3; // if def windows #endif float origin_x; float origin_y; float origin_z; // 6 float mins_x; @@ -145,17 +145,17 @@ struct pd_dca { float maxs_y; float maxs_z; float angles_x; float angles_y; float angles_z; // 15 // 16-135 -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) int unknown_block_16[111]; #else int unknown_block_16[116]; // linux +5 more #endif int time_to_cap; // 127 int iunk_128; int allies_numcap; // 129 @@ -258,17 +258,17 @@ public: bool ingame; bool bot; void Init( int pi, edict_t* pe ); void Connect(); void PutInServer(); void Disconnect(); void killPlayer(); - void setTeamName( char *szName ); + void setTeamName( const char *szName ); void getTeamName( char *szName ); inline bool IsBot(){ const char* auth= (*g_engfuncs.pfnGetPlayerAuthId)(pEdict); return ( auth && !strcmp( auth , "BOT" ) ); } inline bool IsAlive(){ return ((pEdict->v.deadflag==DEAD_NO)&&(pEdict->v.health>0)); diff --git a/dlls/dod/dodfun/Makefile b/dlls/dod/dodfun/Makefile --- a/dlls/dod/dodfun/Makefile +++ b/dlls/dod/dodfun/Makefile @@ -1,67 +1,123 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../../hlsdk/multiplayer MM_ROOT = ../../../../metamod/metamod +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OPT_FLAGS = -O3 -funroll-loops -s -pipe -fno-strict-aliasing -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = dodfun - -BIN_SUFFIX = amxx_i386.so +PROJECT = dodfun OBJECTS = sdk/amxxmodule.cpp NBase.cpp CMisc.cpp NPD.cpp Utils.cpp usermsg.cpp moduleconfig.cpp -LINK = +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -Isdk +C_OPT_FLAGS = -DNDEBUG -O3 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +LINK = -ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(MM_ROOT) -Isdk + +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared endif +LINK += -m32 -lm -ldl + +CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) + ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -DNDEBUG -Wall -Wno-non-virtual-dtor -Werror -fno-exceptions -DHAVE_STDINT_H -static-libgcc -fno-rtti -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -BINARY = $(NAME)_$(BIN_SUFFIX) -CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -OPT_FLAGS += -march=i586 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") +else + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) +endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< all: mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/sdk - $(MAKE) dodfun + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -dodfun: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/sdk/*.o - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX) - rm -rf Debug/sdk/*.o - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX) + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/dlls/dod/dodfun/sdk/amxxmodule.cpp b/dlls/dod/dodfun/sdk/amxxmodule.cpp --- a/dlls/dod/dodfun/sdk/amxxmodule.cpp +++ b/dlls/dod/dodfun/sdk/amxxmodule.cpp @@ -2235,17 +2235,17 @@ static META_FUNCTIONS g_MetaFunctions_Ta GetEntityAPI2, GetEntityAPI2_Post, GetNewDLLFunctions, GetNewDLLFunctions_Post, GetEngineFunctions, GetEngineFunctions_Post }; -C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +C_DLLEXPORT int Meta_Query(const char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) { if ((int) CVAR_GET_FLOAT("developer") != 0) UTIL_LogPrintf("[%s] dev: called: Meta_Query; version=%s, ours=%s\n", Plugin_info.logtag, ifvers, Plugin_info.ifvers); // Check for valid pMetaUtilFuncs before we continue. if(!pMetaUtilFuncs) { UTIL_LogPrintf("[%s] ERROR: Meta_Query called with null pMetaUtilFuncs\n", Plugin_info.logtag); @@ -2329,17 +2329,17 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIM #ifdef FN_META_DETACH FN_META_DETACH(); #endif // FN_META_DETACH return TRUE; } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) // linux prototype C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { #else #ifdef _MSC_VER // MSVC: Simulate __stdcall calling convention C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { @@ -3045,17 +3045,17 @@ char* UTIL_VarArgs( char *format, ... ) return string; } //========================================================= // UTIL_LogPrintf - Prints a logged message to console. // Preceded by LOG: ( timestamp ) < message > //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/dod/dodfun/sdk/amxxmodule.h b/dlls/dod/dodfun/sdk/amxxmodule.h --- a/dlls/dod/dodfun/sdk/amxxmodule.h +++ b/dlls/dod/dodfun/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/dod/dodx/CMisc.h b/dlls/dod/dodx/CMisc.h --- a/dlls/dod/dodx/CMisc.h +++ b/dlls/dod/dodx/CMisc.h @@ -32,17 +32,17 @@ #ifndef CMISC_H #define CMISC_H #include "CRank.h" #define DODMAX_CUSTOMWPNS 5 // custom weapons #define DODMAX_WEAPONS 42 + DODMAX_CUSTOMWPNS -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define LINUXOFFSET 0 #else #define LINUXOFFSET 5 #endif #define DOD_VERSION "0.1" #define MAX_TRACE 6 diff --git a/dlls/dod/dodx/Makefile b/dlls/dod/dodx/Makefile --- a/dlls/dod/dodx/Makefile +++ b/dlls/dod/dodx/Makefile @@ -1,67 +1,123 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../../hlsdk/multiplayer MM_ROOT = ../../../../metamod/metamod +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OPT_FLAGS = -O3 -funroll-loops -s -pipe -fno-strict-aliasing -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = dodx - -BIN_SUFFIX = amxx_i386.so +PROJECT = dodx OBJECTS = sdk/amxxmodule.cpp CRank.cpp CMisc.cpp NBase.cpp NRank.cpp usermsg.cpp Utils.cpp moduleconfig.cpp -LINK = +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -Isdk +C_OPT_FLAGS = -DNDEBUG -O3 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +LINK = -ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(MM_ROOT) -Isdk + +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared endif +LINK += -m32 -lm -ldl + +CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) + ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -DNDEBUG -Wall -Wno-non-virtual-dtor -Werror -fno-exceptions -DHAVE_STDINT_H -static-libgcc -fno-rtti -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -BINARY = $(NAME)_$(BIN_SUFFIX) -CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -OPT_FLAGS += -march=i586 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") +else + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) +endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< all: mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/sdk - $(MAKE) dodx + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -dodx: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/sdk/*.o - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX) - rm -rf Debug/sdk/*.o - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX) + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/dlls/dod/dodx/NBase.cpp b/dlls/dod/dodx/NBase.cpp --- a/dlls/dod/dodx/NBase.cpp +++ b/dlls/dod/dodx/NBase.cpp @@ -485,17 +485,17 @@ static cell AMX_NATIVE_CALL get_user_tea int index = params[1]; CHECK_PLAYER(index); CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); int iTeam = pPlayer->pEdict->v.team; if ( params[3] ) { - char *szTeam = ""; + const char *szTeam = ""; switch(iTeam) { case 1: szTeam = "Allies"; break; case 2: szTeam = "Axis"; diff --git a/dlls/dod/dodx/moduleconfig.cpp b/dlls/dod/dodx/moduleconfig.cpp --- a/dlls/dod/dodx/moduleconfig.cpp +++ b/dlls/dod/dodx/moduleconfig.cpp @@ -425,17 +425,17 @@ void DispatchKeyValue_Post( edict_t *pen } } else if ( pkvd->szKeyName[12]=='p' ) g_map.detect_axis_paras=atoi(pkvd->szValue); } } RETURN_META(MRES_IGNORED); } -void SetClientKeyValue(int id, char *protocol, char *type, char *var) +void SetClientKeyValue(int id, char *protocol, const char *type, const char *var) { // ID: Number // protocol: \name\Sgt.MEOW\topcolor\1\bottomcolor\1\cl_lw\1\team\axis\model\axis-inf // type: model // var: axis-inf // Check to see if its a player and we are setting a model if(strcmp(type, "model") == 0 && diff --git a/dlls/dod/dodx/sdk/amxxmodule.cpp b/dlls/dod/dodx/sdk/amxxmodule.cpp --- a/dlls/dod/dodx/sdk/amxxmodule.cpp +++ b/dlls/dod/dodx/sdk/amxxmodule.cpp @@ -2235,17 +2235,17 @@ static META_FUNCTIONS g_MetaFunctions_Ta GetEntityAPI2, GetEntityAPI2_Post, GetNewDLLFunctions, GetNewDLLFunctions_Post, GetEngineFunctions, GetEngineFunctions_Post }; -C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +C_DLLEXPORT int Meta_Query(const char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) { if ((int) CVAR_GET_FLOAT("developer") != 0) UTIL_LogPrintf("[%s] dev: called: Meta_Query; version=%s, ours=%s\n", Plugin_info.logtag, ifvers, Plugin_info.ifvers); // Check for valid pMetaUtilFuncs before we continue. if(!pMetaUtilFuncs) { UTIL_LogPrintf("[%s] ERROR: Meta_Query called with null pMetaUtilFuncs\n", Plugin_info.logtag); @@ -2329,17 +2329,17 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIM #ifdef FN_META_DETACH FN_META_DETACH(); #endif // FN_META_DETACH return TRUE; } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) // linux prototype C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { #else #ifdef _MSC_VER // MSVC: Simulate __stdcall calling convention C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { @@ -3045,17 +3045,17 @@ char* UTIL_VarArgs( char *format, ... ) return string; } //========================================================= // UTIL_LogPrintf - Prints a logged message to console. // Preceded by LOG: ( timestamp ) < message > //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/dod/dodx/sdk/amxxmodule.h b/dlls/dod/dodx/sdk/amxxmodule.h --- a/dlls/dod/dodx/sdk/amxxmodule.h +++ b/dlls/dod/dodx/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/engine/Makefile b/dlls/engine/Makefile --- a/dlls/engine/Makefile +++ b/dlls/engine/Makefile @@ -1,79 +1,124 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../hlsdk/multiplayer MM_ROOT = ../../../metamod/metamod +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OPT_FLAGS = -O2 -funroll-loops -s -pipe -fomit-frame-pointer -fno-strict-aliasing -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = engine - -BIN_SUFFIX_32 = amxx_i386.so -BIN_SUFFIX_64 = amxx_amd64.so +PROJECT = engine OBJECTS = sdk/amxxmodule.cpp amxxapi.cpp engine.cpp entity.cpp globals.cpp forwards.cpp \ - amxmod_compat.cpp + amxmod_compat.cpp -LINK = +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -Isdk +C_OPT_FLAGS = -DNDEBUG -O2 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +LINK = -ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(MM_ROOT) -Isdk + +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared endif +LINK += -m32 -lm -ldl + +CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) + ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -DNDEBUG -Wall -Wno-non-virtual-dtor -Werror -fno-exceptions -DHAVE_STDINT_H -fno-rtti -static-libgcc -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -ifeq "$(AMD64)" "true" - BINARY = $(NAME)_$(BIN_SUFFIX_64) - CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -m64 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") else - BINARY = $(NAME)_$(BIN_SUFFIX_32) - CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 - OPT_FLAGS += -march=i586 + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< all: mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/sdk - $(MAKE) engine + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -amd64: - $(MAKE) all AMD64=true +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -engine: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/sdk/*.o - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Release/$(NAME)_$(BIN_SUFFIX_64) - rm -rf Debug/sdk/*.o - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_64) + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/dlls/engine/amxmod_compat.cpp b/dlls/engine/amxmod_compat.cpp --- a/dlls/engine/amxmod_compat.cpp +++ b/dlls/engine/amxmod_compat.cpp @@ -11,18 +11,18 @@ static int gmsgDamage = 0; static int gmsgDeathMsg = 0; static int gmsgScoreInfo = 0; //From VexdUM (AMX Mod 2006.2) //This is not exposed, and is only provided as a compatibility helper. BOOL is_breakable(edict_t* pBreak) { if (FStrEq("func_breakable", STRING(pBreak->v.classname)) - || FStrEq("func_pushable", STRING(pBreak->v.classname)) - && pBreak->v.spawnflags & SF_PUSH_BREAKABLE) + || (FStrEq("func_pushable", STRING(pBreak->v.classname)) + && pBreak->v.spawnflags & SF_PUSH_BREAKABLE)) { return true; } return false; } //From VexdUM (AMX Mod 2006.2) diff --git a/dlls/engine/entity.cpp b/dlls/engine/entity.cpp --- a/dlls/engine/entity.cpp +++ b/dlls/engine/entity.cpp @@ -1465,17 +1465,17 @@ static cell AMX_NATIVE_CALL find_ent_by_ int oEnt = params[3]; // Check index to start searching at, 0 must be possible for iEnt. CHECK_ENTITY(oEnt); edict_t *pEnt = INDEXENT2(iEnt); edict_t *entOwner = INDEXENT2(oEnt); //optional fourth parameter is for jghg2 compatibility - char* sCategory = NULL; + const char* sCategory = NULL; switch(params[4]){ case 1: sCategory = "target"; break; case 2: sCategory = "targetname"; break; default: sCategory = "classname"; } // No need to check if there is a real ent where entOwner points at since we don't access it anyway. diff --git a/dlls/engine/sdk/CString.h b/dlls/engine/sdk/CString.h --- a/dlls/engine/sdk/CString.h +++ b/dlls/engine/sdk/CString.h @@ -215,17 +215,17 @@ public: if (len < 1) { return; } if (is_space(v[len-1])) { - for (i=len-1; i>=0; i--) + for (i=len-1; i //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/engine/sdk/amxxmodule.h b/dlls/engine/sdk/amxxmodule.h --- a/dlls/engine/sdk/amxxmodule.h +++ b/dlls/engine/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/fakemeta/Makefile b/dlls/fakemeta/Makefile --- a/dlls/fakemeta/Makefile +++ b/dlls/fakemeta/Makefile @@ -1,81 +1,125 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../hlsdk/multiplayer MM_ROOT = ../../../metamod/metamod +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OPT_FLAGS = -O3 -funroll-loops -s -pipe -fno-strict-aliasing -fomit-frame-pointer -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = fakemeta - -BIN_SUFFIX_32 = amxx_i386.so -BIN_SUFFIX_64 = amxx_amd64.so +PROJECT = fakemeta OBJECTS = sdk/amxxmodule.cpp dllfunc.cpp engfunc.cpp fakemeta_amxx.cpp pdata.cpp forward.cpp \ - fm_tr.cpp pev.cpp glb.cpp fm_tr2.cpp misc.cpp + fm_tr.cpp pev.cpp glb.cpp fm_tr2.cpp misc.cpp + +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## + +C_OPT_FLAGS = -DNDEBUG -O3 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang LINK = -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -I$(HLSDK)/pm_shared -Isdk +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(HLSDK)/pm_shared -I$(MM_ROOT) -Isdk -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ -ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared endif +LINK += -m32 -lm -ldl + +CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall -Werror \ + -Wno-invalid-offsetof +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -DNDEBUG -Wall -Wno-non-virtual-dtor -Werror -fno-exceptions -DHAVE_STDINT_H -static-libgcc -fno-rtti -Wno-invalid-offsetof -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -ifeq "$(AMD64)" "true" - BINARY = $(NAME)_$(BIN_SUFFIX_64) - CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -m64 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") else - BINARY = $(NAME)_$(BIN_SUFFIX_32) - CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 - OPT_FLAGS += -march=i586 + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< all: mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/sdk - $(MAKE) fakemeta + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -amd64: - $(MAKE) all AMD64=true - -fakemeta: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) debug: - $(MAKE) all DEBUG=true + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/sdk/*.o - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Release/$(NAME)_$(BIN_SUFFIX_64) - rm -rf Debug/sdk/*.o - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_64) - + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/dlls/fakemeta/dllfunc.cpp b/dlls/fakemeta/dllfunc.cpp --- a/dlls/fakemeta/dllfunc.cpp +++ b/dlls/fakemeta/dllfunc.cpp @@ -2,19 +2,19 @@ //by mahnsawce from his NS module static cell AMX_NATIVE_CALL dllfunc(AMX *amx,cell *params) { int type; int index; int indexb; unsigned char *pset; - char *temp = ""; - char *temp2 = ""; - char *temp3 = ""; + const char *temp = ""; + const char *temp2 = ""; + const char *temp3 = ""; vec3_t Vec1; vec3_t Vec2; int iparam1; int iparam2; int iparam3; entity_state_t *es; int len; cell *cRet; @@ -100,17 +100,17 @@ static cell AMX_NATIVE_CALL dllfunc(AMX case DLLFunc_ClientConnect: // bool) ( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] ); // index,szName,szAddress,szRetRejectReason,size cRet = MF_GetAmxAddr(amx,params[2]); index=cRet[0]; CHECK_ENTITY(index); temp = MF_GetAmxString(amx,params[3],0,&len); temp2 = MF_GetAmxString(amx,params[4],1,&len); //temp3 = GET_AMXSTRING(amx,params[5],2,len); - iparam1 = MDLL_ClientConnect(INDEXENT2(index),STRING(ALLOC_STRING(temp)),STRING(ALLOC_STRING(temp2)),temp3); + iparam1 = MDLL_ClientConnect(INDEXENT2(index),STRING(ALLOC_STRING(temp)),STRING(ALLOC_STRING(temp2)),(char *)temp3); cRet = MF_GetAmxAddr(amx,params[6]); MF_SetAmxString(amx,params[5],temp3,cRet[0]); return iparam1; case DLLFunc_ClientDisconnect: // void ) ( edict_t *pEntity ); cRet = MF_GetAmxAddr(amx,params[2]); index=cRet[0]; CHECK_ENTITY(index); diff --git a/dlls/fakemeta/engfunc.cpp b/dlls/fakemeta/engfunc.cpp --- a/dlls/fakemeta/engfunc.cpp +++ b/dlls/fakemeta/engfunc.cpp @@ -29,25 +29,25 @@ static cell AMX_NATIVE_CALL engfunc(AMX // float fTemp[3]; int index; unsigned char *pset; edict_t *pRet=NULL; // Now start calling.. :/ switch (type) { // pfnPrecacheModel - case EngFunc_PrecacheModel: // int ) (char* s); + case EngFunc_PrecacheModel: // int ) (const char* s); temp = MF_GetAmxString(amx,params[2],0,&len); if (temp[0]==0) return 0; - return (*g_engfuncs.pfnPrecacheModel)((char*)STRING(ALLOC_STRING(temp))); + return (*g_engfuncs.pfnPrecacheModel)((char *)STRING(ALLOC_STRING(temp))); // pfnPrecacheSound - case EngFunc_PrecacheSound: // int ) (char* s); + case EngFunc_PrecacheSound: // int ) (const char* s); temp = MF_GetAmxString(amx,params[2],0,&len); if (temp[0]==0) return 0; return (*g_engfuncs.pfnPrecacheSound)((char*)STRING(ALLOC_STRING(temp))); // pfnSetModel case EngFunc_SetModel: // void ) (edict_t *e, const char *m); diff --git a/dlls/fakemeta/forward.cpp b/dlls/fakemeta/forward.cpp --- a/dlls/fakemeta/forward.cpp +++ b/dlls/fakemeta/forward.cpp @@ -78,20 +78,20 @@ static cell AMX_NATIVE_CALL fm_return(AM return 1; } /* * Begining of Game DLL->Engine hooks */ // pfnPrecacheModel -SIMPLE_INT_HOOK_STRING(PrecacheModel); +SIMPLE_INT_HOOK_CONSTSTRING(PrecacheModel); // pfnPrecacheSound -SIMPLE_INT_HOOK_STRING(PrecacheSound); +SIMPLE_INT_HOOK_CONSTSTRING(PrecacheSound); void ClientUserInfoChanged(edict_t *e, char *infobuffer) { FM_ENG_HANDLE(FM_ClientUserInfoChanged, (Engine[FM_ClientUserInfoChanged].at(i), (cell)ENTINDEX(e), (cell)infobuffer)); RETURN_META(mswi(lastFmRes)); } void ClientUserInfoChanged_post(edict_t *e, char *infobuffer) @@ -256,28 +256,28 @@ void KeyValue(edict_t* entity, KeyValueD void KeyValue_post(edict_t* entity, KeyValueData* data) { g_kvd_hook.kvd = data; FM_ENG_HANDLE_POST(FM_KeyValue, (EnginePost[FM_KeyValue].at(i), (cell)ENTINDEX(entity), (cell)(&g_kvd_hook))); RETURN_META(MRES_IGNORED); } -void AlertMessage(ALERT_TYPE atype, char *szFmt, ...) +void AlertMessage(ALERT_TYPE atype, const char *szFmt, ...) { static char buf[2048]; va_list ap; va_start(ap, szFmt); vsprintf(buf, szFmt, ap); va_end(ap); FM_ENG_HANDLE(FM_AlertMessage, (Engine[FM_AlertMessage].at(i), (cell)atype, buf)); RETURN_META(mswi(lastFmRes)); } -void AlertMessage_post(ALERT_TYPE atype, char *szFmt, ...) +void AlertMessage_post(ALERT_TYPE atype, const char *szFmt, ...) { static char buf[2048]; va_list ap; va_start(ap, szFmt); vsprintf(buf, szFmt, ap); va_end(ap); FM_ENG_HANDLE_POST(FM_AlertMessage, (EnginePost[FM_AlertMessage].at(i), (cell)atype, buf)); RETURN_META(MRES_IGNORED); @@ -288,17 +288,17 @@ SIMPLE_INT_HOOK_CONSTSTRING(ModelIndex); // pfnModelFrames SIMPLE_INT_HOOK_INT(ModelFrames); // pfnSetSize SIMPLE_VOID_HOOK_EDICT_CONSTVECT_CONSTVECT(SetSize); // pfnChangeLevel -SIMPLE_VOID_HOOK_STRING_STRING(ChangeLevel); +SIMPLE_VOID_HOOK_CONSTSTRING_CONSTSTRING(ChangeLevel); // pfnVecToYaw SIMPLE_FLOAT_HOOK_CONSTVECT(VecToYaw); void VecToAngles(const float *rgflVectorIn, float *rgflVectorOut) { PREPARE_VECTOR(rgflVectorIn); PREPARE_VECTOR(rgflVectorOut); @@ -502,17 +502,17 @@ SIMPLE_FLOAT_HOOK_VOID(Time); SIMPLE_VOID_HOOK_CONSTEDICT_FLOAT_FLOAT(CrosshairAngle); SIMPLE_VOID_HOOK_CONSTEDICT_INT_INT_INT_INT(FadeClientVolume); // pfnSetClientMaxspeed SIMPLE_VOID_HOOK_CONSTEDICT_FLOAT(SetClientMaxspeed); // pfnPrecacheGeneric -SIMPLE_INT_HOOK_STRING(PrecacheGeneric); +SIMPLE_INT_HOOK_CONSTSTRING(PrecacheGeneric); // pfnPrecacheEvent SIMPLE_USHORT_HOOK_INT_CONSTSTRING(PrecacheEvent); // pfnGetPhysicsKeyValue SIMPLE_CONSTSTRING_HOOK_CONSTEDICT_CONSTSTRING(GetPhysicsKeyValue); // pfnSetPhysicsKeyValue @@ -595,27 +595,27 @@ SIMPLE_INT_HOOK_CONSTEDICT(CanSkipPlayer SIMPLE_VOID_HOOK_INT_INT(SetGroupMask); // pfnVoice_GetClientListening SIMPLE_BOOL_HOOK_INT_INT(Voice_GetClientListening); // pfnVoice_SetClientListening SIMPLE_BOOL_HOOK_INT_INT_BOOL(Voice_SetClientListening); -SIMPLE_STRING_HOOK_STRING_STRING(InfoKeyValue); +SIMPLE_STRING_HOOK_STRING_CONSTSTRING(InfoKeyValue); -SIMPLE_VOID_HOOK_STRING_STRING_STRING(SetKeyValue); +SIMPLE_VOID_HOOK_STRING_CONSTSTRING_CONSTSTRING(SetKeyValue); -SIMPLE_VOID_HOOK_INT_STRING_STRING_STRING(SetClientKeyValue); +SIMPLE_VOID_HOOK_INT_STRING_CONSTSTRING_CONSTSTRING(SetClientKeyValue); SIMPLE_CONSTSTRING_HOOK_EDICT(GetPlayerAuthId); SIMPLE_UINT_HOOK_EDICT(GetPlayerWONId); -SIMPLE_INT_HOOK_STRING(IsMapValid); +SIMPLE_INT_HOOK_CONSTSTRING(IsMapValid); int CreateInstancedBaseline(int classname, struct entity_state_s *baseline) { g_es_hook = baseline; FM_ENG_HANDLE(FM_CreateInstancedBaseline, (Engine[FM_CreateInstancedBaseline].at(i), (cell)classname, (cell)baseline)); RETURN_META_VALUE(mswi(lastFmRes), (int)mlCellResult); } @@ -720,17 +720,17 @@ SIMPLE_VOID_HOOK_EDICT(SpectatorDisconne // pfnSpectatorThink SIMPLE_VOID_HOOK_EDICT(SpectatorThink); // pfnSys_Error SIMPLE_VOID_HOOK_CONSTSTRING(Sys_Error); // pfnPM_FindTextureType -SIMPLE_CHAR_HOOK_STRING(PM_FindTextureType); +SIMPLE_CHAR_HOOK_CONSTSTRING(PM_FindTextureType); // pfnRegisterEncoders SIMPLE_VOID_HOOK_VOID(RegisterEncoders); // pfnCreateInstancedBaselines SIMPLE_VOID_HOOK_VOID(CreateInstancedBaselines); // pfnAllowLagCompensation diff --git a/dlls/fakemeta/forwardmacros.h b/dlls/fakemeta/forwardmacros.h --- a/dlls/fakemeta/forwardmacros.h +++ b/dlls/fakemeta/forwardmacros.h @@ -70,40 +70,77 @@ RETURN_META(mswi(lastFmRes)); \ } \ void call##_post (int v, char *c, char *cb, char *cc) \ { \ FM_ENG_HANDLE_POST(FM_##call, (EnginePost[FM_##call].at(i),(cell)v,c,cb,cc)); \ RETURN_META(MRES_IGNORED); \ } +#define SIMPLE_VOID_HOOK_INT_STRING_CONSTSTRING_CONSTSTRING(call) \ + void call (int v,char *c, const char *cb, const char *cc) \ + { \ + FM_ENG_HANDLE(FM_##call, (Engine[FM_##call].at(i),(cell)v,c,cb,cc)); \ + RETURN_META(mswi(lastFmRes)); \ + } \ + void call##_post (int v, char *c, const char *cb, const char *cc) \ + { \ + FM_ENG_HANDLE_POST(FM_##call, (EnginePost[FM_##call].at(i),(cell)v,c,cb,cc)); \ + RETURN_META(MRES_IGNORED); \ + } + + #define SIMPLE_VOID_HOOK_STRING_STRING_STRING(call) \ void call (char *c, char *cb, char *cc) \ { \ FM_ENG_HANDLE(FM_##call, (Engine[FM_##call].at(i),c,cb,cc)); \ RETURN_META(mswi(lastFmRes)); \ } \ void call##_post (char *c, char *cb, char *cc) \ { \ FM_ENG_HANDLE_POST(FM_##call, (EnginePost[FM_##call].at(i),c,cb,cc)); \ RETURN_META(MRES_IGNORED); \ } +#define SIMPLE_VOID_HOOK_STRING_CONSTSTRING_CONSTSTRING(call) \ + void call (char *c, const char *cb, const char *cc) \ + { \ + FM_ENG_HANDLE(FM_##call, (Engine[FM_##call].at(i),c,cb,cc)); \ + RETURN_META(mswi(lastFmRes)); \ + } \ + void call##_post (char *c, const char *cb, const char *cc) \ + { \ + FM_ENG_HANDLE_POST(FM_##call, (EnginePost[FM_##call].at(i),c,cb,cc)); \ + RETURN_META(MRES_IGNORED); \ + } + #define SIMPLE_STRING_HOOK_STRING_STRING(call) \ char* call (char *c, char *cb) \ { \ FM_ENG_HANDLE(FM_##call, (Engine[FM_##call].at(i),c,cb)); \ RETURN_META_VALUE(mswi(lastFmRes), (char*)mlStringResult); \ } \ char* call##_post (char *c, char *cb) \ { \ origStringRet = META_RESULT_ORIG_RET(char *); \ FM_ENG_HANDLE_POST(FM_##call, (EnginePost[FM_##call].at(i),c,cb)); \ RETURN_META_VALUE(MRES_IGNORED, (char*)mlStringResult); \ } +#define SIMPLE_STRING_HOOK_STRING_CONSTSTRING(call) \ + char* call (char *c, const char *cb) \ + { \ + FM_ENG_HANDLE(FM_##call, (Engine[FM_##call].at(i),c,cb)); \ + RETURN_META_VALUE(mswi(lastFmRes), (char*)mlStringResult); \ + } \ + char* call##_post (char *c, const char *cb) \ + { \ + origStringRet = META_RESULT_ORIG_RET(char *); \ + FM_ENG_HANDLE_POST(FM_##call, (EnginePost[FM_##call].at(i),c,cb)); \ + RETURN_META_VALUE(MRES_IGNORED, (char*)mlStringResult); \ + } #define SIMPLE_CONSTSTRING_HOOK_EDICT(call) \ const char* call (edict_t *e) \ { \ FM_ENG_HANDLE(FM_##call, (Engine[FM_##call].at(i),(cell)ENTINDEX(e))); \ RETURN_META_VALUE(mswi(lastFmRes), mlStringResult); \ } \ const char* call##_post (edict_t *e) \ { \ @@ -170,16 +207,29 @@ RETURN_META_VALUE(mswi(lastFmRes), (char)mlCellResult); \ } \ char call##_post (char *s) \ { \ origCellRet = META_RESULT_ORIG_RET(char); \ FM_ENG_HANDLE_POST(FM_##call, (EnginePost[FM_##call].at(i), s)); \ RETURN_META_VALUE(MRES_IGNORED, (char)mlCellResult); \ } +#define SIMPLE_CHAR_HOOK_CONSTSTRING(call) \ + char call (const char *s) \ + { \ + FM_ENG_HANDLE(FM_##call, (Engine[FM_##call].at(i), s)); \ + RETURN_META_VALUE(mswi(lastFmRes), (char)mlCellResult); \ + } \ + char call##_post (const char *s) \ + { \ + origCellRet = META_RESULT_ORIG_RET(char); \ + FM_ENG_HANDLE_POST(FM_##call, (EnginePost[FM_##call].at(i), s)); \ + RETURN_META_VALUE(MRES_IGNORED, (char)mlCellResult); \ + } + #define SIMPLE_VOID_HOOK_CONSTSTRING(call) \ void call (const char *s) \ { \ FM_ENG_HANDLE(FM_##call, (Engine[FM_##call].at(i), s)); \ RETURN_META(mswi(lastFmRes)); \ } \ void call##_post (const char *s) \ { \ diff --git a/dlls/fakemeta/pdata.cpp b/dlls/fakemeta/pdata.cpp --- a/dlls/fakemeta/pdata.cpp +++ b/dlls/fakemeta/pdata.cpp @@ -1,10 +1,22 @@ #include "fakemeta_amxx.h" +#if defined PAWN_CELL_SIZE +# if PAWN_CELL_SIZE == 16 +# define CELL_MIN SHRT_MIN +# elif PAWN_CELL_SIZE == 32 +# define CELL_MIN INT_MIN +# elif PAWN_CELL_SIZE == 64 +# define CELL_MIN _I64_MIN +# endif +#else +# define CELL_MIN _I32_MIN +#endif + #if defined WIN32 #define WINDOWS_LEAN_AND_MEAN #include #else //implement these with setjmp later. bool IsBadReadPtr(void *l, size_t size) { return false; @@ -19,71 +31,104 @@ static cell AMX_NATIVE_CALL set_pdata_in { int index=params[1]; CHECK_ENTITY(index); int iOffset=params[2]; if (iOffset <0) return 1; #ifdef __linux__ iOffset += params[4]; +#elif defined __APPLE__ + // Use Linux offset in older plugins + if (params[0] / sizeof(cell) == 4) + iOffset += params[4]; + else + iOffset += params[5]; #endif int iValue=params[3]; *((int *)INDEXENT2(index)->pvPrivateData + iOffset) = iValue; return 1; } static cell AMX_NATIVE_CALL get_pdata_int(AMX *amx, cell *params) { int index=params[1]; CHECK_ENTITY(index); int iOffset=params[2]; if (iOffset <0) return 0; #ifdef __linux__ iOffset += params[3]; +#elif defined __APPLE__ + // Use Linux offset in older plugins + if (params[0] / sizeof(cell) == 3) + iOffset += params[3]; + else + iOffset += params[4]; #endif + return *((int *)INDEXENT2(index)->pvPrivateData + iOffset); } // Float static cell AMX_NATIVE_CALL set_pdata_float(AMX *amx, cell *params) { int index=params[1]; CHECK_ENTITY(index); int iOffset=params[2]; if (iOffset <0) return 1; #ifdef __linux__ iOffset += params[4]; +#elif defined __APPLE__ + // Use Linux offset in older plugins + if (params[0] / sizeof(cell) == 4) + iOffset += params[4]; + else + iOffset += params[5]; #endif + float fValue=amx_ctof(params[3]); *((float *)INDEXENT2(index)->pvPrivateData + iOffset) = fValue; return 1; } static cell AMX_NATIVE_CALL get_pdata_float(AMX *amx, cell *params) { int index=params[1]; CHECK_ENTITY(index); int iOffset=params[2]; if (iOffset <0) return 1; #ifdef __linux__ iOffset += params[3]; +#elif defined __APPLE__ + // Use Linux offset in older plugins + if (params[0] / sizeof(cell) == 3) + iOffset += params[3]; + else + iOffset += params[4]; #endif + return amx_ftoc(*((float *)INDEXENT2(index)->pvPrivateData + iOffset)); } static cell AMX_NATIVE_CALL get_pdata_string(AMX *amx, cell *params) { int index=params[1]; CHECK_ENTITY(index); int iOffset=params[2]; if (iOffset <0) return 1; #ifdef __linux__ iOffset += params[6]; +#elif defined __APPLE__ + // Use Linux offset in older plugins + if (params[0] / sizeof(cell) == 6 || params[7] == CELL_MIN) + iOffset += params[6]; + else + iOffset += params[7]; #endif edict_t *pEdict = INDEXENT2(index); char *szData; if (params[5]) { szData = *((char **)pEdict->pvPrivateData + iOffset); @@ -106,16 +151,22 @@ static cell AMX_NATIVE_CALL set_pdata_st int index=params[1]; CHECK_ENTITY(index); int iOffset=params[2]; if (iOffset <0) return 1; #ifdef __linux__ iOffset += params[5]; +#elif defined __APPLE__ + // Use Linux offset in older plugins + if (params[0] / sizeof(cell) == 5 || params[6] == CELL_MIN) + iOffset += params[5]; + else + iOffset += params[6]; #endif edict_t *pEdict = INDEXENT2(index); char *szData; int len; char *data = MF_GetAmxString(amx, params[3], 0, &len); if (params[4] == -1) @@ -147,16 +198,22 @@ static cell AMX_NATIVE_CALL get_pdata_en { int index=params[1]; int iOffset=params[2]; CHECK_ENTITY(index); #ifdef __linux__ iOffset += params[3]; +#elif defined __APPLE__ + // Use Linux offset in older plugins + if (params[0] / sizeof(cell) == 3) + iOffset += params[3]; + else + iOffset += params[4]; #endif edict_t *pEdict = *(edict_t **)((char *)(INDEXENT2(index)->pvPrivateData) + iOffset); if (pEdict == NULL) { return -1; } diff --git a/dlls/fakemeta/sdk/CString.h b/dlls/fakemeta/sdk/CString.h --- a/dlls/fakemeta/sdk/CString.h +++ b/dlls/fakemeta/sdk/CString.h @@ -239,17 +239,17 @@ public: if (len < 1) { return; } if (is_space(v[len-1])) { - for (i=len-1; i>=0; i--) + for (i=len-1; i //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/fakemeta/sdk/amxxmodule.h b/dlls/fakemeta/sdk/amxxmodule.h --- a/dlls/fakemeta/sdk/amxxmodule.h +++ b/dlls/fakemeta/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/fun/Makefile b/dlls/fun/Makefile --- a/dlls/fun/Makefile +++ b/dlls/fun/Makefile @@ -1,78 +1,123 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../hlsdk/multiplayer MM_ROOT = ../../../metamod/metamod +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OPT_FLAGS = -O2 -funroll-loops -s -pipe -fomit-frame-pointer -fno-strict-aliasing -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = fun - -BIN_SUFFIX_32 = amxx_i386.so -BIN_SUFFIX_64 = amxx_amd64.so +PROJECT = fun OBJECTS = sdk/amxxmodule.cpp fun.cpp -LINK = +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -Isdk +C_OPT_FLAGS = -DNDEBUG -O2 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +LINK = -ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(MM_ROOT) -Isdk + +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared endif +LINK += -m32 -lm -ldl + +CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) + ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -DNDEBUG -Wall -Wno-non-virtual-dtor -Werror -fno-exceptions -DHAVE_STDINT_H -fno-rtti -static-libgcc -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -ifeq "$(AMD64)" "true" - BINARY = $(NAME)_$(BIN_SUFFIX_64) - CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -m64 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") else - BINARY = $(NAME)_$(BIN_SUFFIX_32) - CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 - OPT_FLAGS += -march=i586 + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< all: mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/sdk - $(MAKE) fun + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -amd64: - $(MAKE) all AMD64=true +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -fun: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/sdk/*.o - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Release/$(NAME)_$(BIN_SUFFIX_64) - rm -rf Debug/sdk/*.o - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_64) + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/dlls/fun/sdk/amxxmodule.cpp b/dlls/fun/sdk/amxxmodule.cpp --- a/dlls/fun/sdk/amxxmodule.cpp +++ b/dlls/fun/sdk/amxxmodule.cpp @@ -2235,17 +2235,17 @@ static META_FUNCTIONS g_MetaFunctions_Ta GetEntityAPI2, GetEntityAPI2_Post, GetNewDLLFunctions, GetNewDLLFunctions_Post, GetEngineFunctions, GetEngineFunctions_Post }; -C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +C_DLLEXPORT int Meta_Query(const char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) { if ((int) CVAR_GET_FLOAT("developer") != 0) UTIL_LogPrintf("[%s] dev: called: Meta_Query; version=%s, ours=%s\n", Plugin_info.logtag, ifvers, Plugin_info.ifvers); // Check for valid pMetaUtilFuncs before we continue. if(!pMetaUtilFuncs) { UTIL_LogPrintf("[%s] ERROR: Meta_Query called with null pMetaUtilFuncs\n", Plugin_info.logtag); @@ -2329,17 +2329,17 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIM #ifdef FN_META_DETACH FN_META_DETACH(); #endif // FN_META_DETACH return TRUE; } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) // linux prototype C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { #else #ifdef _MSC_VER // MSVC: Simulate __stdcall calling convention C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { @@ -3045,17 +3045,17 @@ char* UTIL_VarArgs( char *format, ... ) return string; } //========================================================= // UTIL_LogPrintf - Prints a logged message to console. // Preceded by LOG: ( timestamp ) < message > //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/fun/sdk/amxxmodule.h b/dlls/fun/sdk/amxxmodule.h --- a/dlls/fun/sdk/amxxmodule.h +++ b/dlls/fun/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/geoip/Makefile b/dlls/geoip/Makefile --- a/dlls/geoip/Makefile +++ b/dlls/geoip/Makefile @@ -1,86 +1,127 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../hlsdk/multiplayer MM_ROOT = ../../../metamod/metamod +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OPT_FLAGS = -O3 -funroll-loops -s -pipe -fno-strict-aliasing -fomit-frame-pointer -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = geoip - -BIN_SUFFIX_32 = amxx_i386.so -BIN_SUFFIX_64 = amxx_amd64.so +PROJECT = geoip OBJECTS = sdk/amxxmodule.cpp GeoIP.c geoip_amxx.cpp -LINK = +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -Isdk +C_OPT_FLAGS = -DNDEBUG -O3 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +LINK = -ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(MM_ROOT) -Isdk + +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared endif +LINK += -m32 -lm -ldl + +CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) + ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -DNDEBUG -Wall -Werror -fno-exceptions -DHAVE_STDINT_H -static-libgcc -fno-rtti -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -# Strip C++ options for compiling *.c files -C_CFLAGS := $(shell echo $(CFLAGS) | sed -e 's/-fvisibility-inlines-hidden//' | sed -e 's/-fno-rtti//') - -ifeq "$(AMD64)" "true" - BINARY = $(NAME)_$(BIN_SUFFIX_64) - CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -m64 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") else - BINARY = $(NAME)_$(BIN_SUFFIX_32) - CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 - OPT_FLAGS += -march=i586 + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) -OBJ_LINUX := $(OBJ_LINUX:%.c=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +OBJ_BIN := $(OBJ_BIN:%.c=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< $(BIN_DIR)/%.o: %.c - $(CPP) $(INCLUDE) $(C_CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< all: mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/sdk - $(MAKE) geoip + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -amd64: - $(MAKE) all AMD64=true +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -geoip: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/sdk/*.o - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Release/$(NAME)_$(BIN_SUFFIX_64) - rm -rf Debug/sdk/*.o - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_64) + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -f $(BIN_DIR)/$(BINARY) diff --git a/dlls/geoip/sdk/amxxmodule.cpp b/dlls/geoip/sdk/amxxmodule.cpp --- a/dlls/geoip/sdk/amxxmodule.cpp +++ b/dlls/geoip/sdk/amxxmodule.cpp @@ -2235,17 +2235,17 @@ static META_FUNCTIONS g_MetaFunctions_Ta GetEntityAPI2, GetEntityAPI2_Post, GetNewDLLFunctions, GetNewDLLFunctions_Post, GetEngineFunctions, GetEngineFunctions_Post }; -C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +C_DLLEXPORT int Meta_Query(const char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) { if ((int) CVAR_GET_FLOAT("developer") != 0) UTIL_LogPrintf("[%s] dev: called: Meta_Query; version=%s, ours=%s\n", Plugin_info.logtag, ifvers, Plugin_info.ifvers); // Check for valid pMetaUtilFuncs before we continue. if(!pMetaUtilFuncs) { UTIL_LogPrintf("[%s] ERROR: Meta_Query called with null pMetaUtilFuncs\n", Plugin_info.logtag); @@ -2329,17 +2329,17 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIM #ifdef FN_META_DETACH FN_META_DETACH(); #endif // FN_META_DETACH return TRUE; } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) // linux prototype C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { #else #ifdef _MSC_VER // MSVC: Simulate __stdcall calling convention C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { @@ -3045,17 +3045,17 @@ char* UTIL_VarArgs( char *format, ... ) return string; } //========================================================= // UTIL_LogPrintf - Prints a logged message to console. // Preceded by LOG: ( timestamp ) < message > //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/geoip/sdk/amxxmodule.h b/dlls/geoip/sdk/amxxmodule.h --- a/dlls/geoip/sdk/amxxmodule.h +++ b/dlls/geoip/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/hamsandwich/Makefile b/dlls/hamsandwich/Makefile --- a/dlls/hamsandwich/Makefile +++ b/dlls/hamsandwich/Makefile @@ -1,74 +1,124 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../hlsdk/multiplayer MM_ROOT = ../../../metamod/metamod +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### +PROJECT = hamsandwich -OPT_FLAGS = -O3 -funroll-loops -s -pipe -fomit-frame-pointer -fno-strict-aliasing -DNDEBUG +OBJECTS = sdk/amxxmodule.cpp amxx_api.cpp config_parser.cpp hook_callbacks.cpp hook_native.cpp \ + srvcmd.cpp call_funcs.cpp hook_create.cpp DataHandler.cpp pdata.cpp -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -#CPP = gcc-2.95 -NAME = hamsandwich +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -BIN_SUFFIX = amxx_i386.so +C_OPT_FLAGS = -DNDEBUG -O3 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang -OBJECTS = sdk/amxxmodule.cpp amxx_api.cpp config_parser.cpp \ -hook_callbacks.cpp hook_native.cpp srvcmd.cpp \ -call_funcs.cpp hook_create.cpp DataHandler.cpp pdata.cpp +LINK = +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(HLSDK)/pm_shared -I$(MM_ROOT) -Isdk -LINK = +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -I$(HLSDK)/pm_shared -I./tableentries -Isdk +OS := $(shell uname -s) -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared +endif + +LINK += -m32 -lm -ldl + +CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - - ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden - endif - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -Wall -Wno-non-virtual-dtor -fno-exceptions -DHAVE_STDINT_H -fno-rtti -Werror -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -BINARY = $(NAME)_$(BIN_SUFFIX) -CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -OPT_FLAGS += -march=i586 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") +else + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) +endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< all: mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/sdk - $(MAKE) hamsandwich + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -hamsandwich: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/*.o - rm -rf Release/sdk/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX) - rm -rf Debug/*.o - rm -rf Debug/sdk/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX) - + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/dlls/hamsandwich/Trampolines.h b/dlls/hamsandwich/Trampolines.h --- a/dlls/hamsandwich/Trampolines.h +++ b/dlls/hamsandwich/Trampolines.h @@ -41,20 +41,22 @@ #define WIN32_LEAN_AND_MEAN #endif // WIN32_LEAN_AND_MEAN #if _MSC_VER >= 1400 #ifdef offsetof #undef offsetof #endif // offsetof #endif // _MSC_VER >= 1400 #include -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) #include +#if defined (__linux__) #include #endif +#endif #include // size_t #include // memcpy #include // memalign #include namespace Trampolines { @@ -108,24 +110,24 @@ namespace Trampolines const unsigned int codePushParamReplace = 2; /** * Takes the "this" pointer from the trampoline and * pushes it onto the target's stack. */ const unsigned char codePushThis[] = { - #if defined _WIN32 + #if defined(_WIN32) 0x51 // push ecx - #elif defined __linux__ + #elif defined(__linux__) || defined(__APPLE__) 0xFF, 0x75, 0x04 // pushl [ebp+0x08h] #endif }; -#if defined __linux__ +#if defined(__linux__) || defined(__APPLE__) const int codePushThisReplace = 2; #endif /** * Pushes a raw number onto the target's stack */ const unsigned char codePushID[] = { 0x68, 0xDE, 0xFA, 0xAD, 0xDE // push DEADFADEh @@ -405,34 +407,34 @@ namespace Trampolines return; } unsigned char code[sizeof(::Trampolines::Bytecode::codePushThis)]; memcpy(&code[0],&::Trampolines::Bytecode::codePushThis[0],sizeof(::Trampolines::Bytecode::codePushThis)); -#if defined __linux__ +#if defined(__linux__) || defined(__APPLE__) unsigned char *c=&code[0]; union { int i; unsigned char b[4]; } bi; bi.i=m_paramstart+8; c+=::Trampolines::Bytecode::codePushThisReplace; *c++=bi.b[0]; #endif Append(&code[0],sizeof(::Trampolines::Bytecode::codePushThis)); -#if defined __linux__ +#if defined(__linux__) || defined(__APPLE__) m_mystack+=4; #endif m_calledstack+=4; }; /** * Frees what is estimated as the stack usage of the trampoline. */ @@ -526,17 +528,17 @@ namespace Trampolines /** * Takes a parameter passed on the trampoline's stack and inserts it into the callee's stack. * * @param which The parameter number to push. 1-based. "thiscall" trampolines automatically compensate for the off-number on GCC. */ void PushParam(int which) { -#if defined __linux__ +#if defined(__linux__) || defined(__APPLE__) if (m_thiscall) { which++; } #endif which=which*4; which+=m_paramstart+4; @@ -603,20 +605,24 @@ namespace Trampolines //void *ret=(void *)m_buffer; if (size) { *size=m_size; } // Reallocate with proper flags -#if defined _WIN32 +#if defined(_WIN32) void *ret=VirtualAlloc(NULL, m_size, MEM_COMMIT, PAGE_EXECUTE_READWRITE); -#elif defined __linux__ +#elif defined(__GNUC__) +# if defined(__APPLE__) + void *ret = valloc(m_size); +# else void *ret=memalign(sysconf(_SC_PAGESIZE), m_size); +# endif mprotect(ret,m_size,PROT_READ|PROT_WRITE|PROT_EXEC); #endif memcpy(ret, m_buffer, m_size); m_size=0; free(m_buffer); @@ -670,27 +676,27 @@ inline void *CreateGenericTrampoline(boo { tramp.PushThis(); } tramp.PushNum(reinterpret_cast(extraptr)); tramp.Call(callee); tramp.FreeTargetStack(); if (voidcall) { -#if defined _WIN32 +#if defined(_WIN32) tramp.VoidEpilogueAndFree(); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) tramp.VoidEpilogue(); #endif } else { -#if defined _WIN32 +#if defined(_WIN32) tramp.ReturnEpilogueAndFree(); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) tramp.ReturnEpilogue(); #endif } return tramp.Finish(NULL); }; diff --git a/dlls/hamsandwich/amxx_api.cpp b/dlls/hamsandwich/amxx_api.cpp --- a/dlls/hamsandwich/amxx_api.cpp +++ b/dlls/hamsandwich/amxx_api.cpp @@ -74,18 +74,20 @@ void OnAmxxAttach(void) MF_AddNatives(RegisterNatives); MF_AddNatives(ReturnNatives); MF_AddNatives(pdata_natives); } else { #ifdef _WIN32 MF_Log("Error: pev and base not set for section \"%s windows\", cannot register natives.", MF_GetModname()); -#elif defined __linux__ +#elif defined(__linux__) MF_Log("Error: pev and base not set for section \"%s linux\", cannot register natives.", MF_GetModname()); +#elif defined(__APPLE__) + MF_Log("Error: pev and base not set for section \"%s mac\", cannot register natives.", MF_GetModname()); #endif } } else { MF_Log("Error: Cannot read config file, natives not registered!"); } } diff --git a/dlls/hamsandwich/call_funcs.cpp b/dlls/hamsandwich/call_funcs.cpp --- a/dlls/hamsandwich/call_funcs.cpp +++ b/dlls/hamsandwich/call_funcs.cpp @@ -109,181 +109,181 @@ inline void *_GetFunction(void *pthis, i gDoForwards=true; \ } cell Call_Void_Void(AMX *amx, cell *params) { SETUP(0); -#ifdef _WIN32 +#if defined(_WIN32) reinterpret_cast(__func)(pv, 0); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(__func)(pv); #endif return 1; } cell Call_Int_Void(AMX *amx, cell *params) { SETUP(0); -#ifdef _WIN32 +#if defined(_WIN32) return reinterpret_cast(__func)(pv, 0); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) return reinterpret_cast(__func)(pv); #endif } cell Call_Void_Entvar(AMX *amx, cell *params) { SETUP(1); int id3=*MF_GetAmxAddr(amx, params[3]); CHECK_ENTITY(id3); entvars_t *ev1=&(INDEXENT_NEW(id3)->v); -#ifdef _WIN32 +#if defined(_WIN32) reinterpret_cast(__func)(pv, 0, ev1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(__func)(pv, ev1); #endif return 1; } cell Call_Void_Cbase(AMX *amx, cell *params) { SETUP(1); int id3=*MF_GetAmxAddr(amx, params[3]); CHECK_ENTITY(id3); void *pv1=(INDEXENT_NEW(id3)->pvPrivateData); -#ifdef _WIN32 +#if defined(_WIN32) reinterpret_cast(__func)(pv, 0, pv1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(__func)(pv, pv1); #endif return 1; } cell Call_Int_Float_Int(AMX *amx, cell *params) { SETUP(2); float f3=amx_ftoc2(*MF_GetAmxAddr(amx, params[3])); int i4=*MF_GetAmxAddr(amx, params[4]); -#ifdef _WIN32 +#if defined(_WIN32) return reinterpret_cast(__func)(pv, 0, f3, i4); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) return reinterpret_cast(__func)(pv, f3, i4); #endif } cell Call_Void_Entvar_Int(AMX *amx, cell *params) { SETUP(2); int id3=*MF_GetAmxAddr(amx, params[3]); int i4=*MF_GetAmxAddr(amx, params[4]); CHECK_ENTITY(id3); entvars_t *ev3=&(INDEXENT_NEW(id3)->v); -#ifdef _WIN32 +#if defined(_WIN32) reinterpret_cast(__func)(pv, 0, ev3, i4); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(__func)(pv, ev3, i4); #endif return 1; } cell Call_Int_Cbase(AMX *amx, cell *params) { SETUP(1); int id3=*MF_GetAmxAddr(amx, params[3]); CHECK_ENTITY(id3); void *pv1=(INDEXENT_NEW(id3)->pvPrivateData); -#ifdef _WIN32 +#if defined(_WIN32) return reinterpret_cast(__func)(pv, 0, pv1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) return reinterpret_cast(__func)(pv, pv1); #endif } cell Call_Void_Int_Int(AMX *amx, cell *params) { SETUP(2); int i3=*MF_GetAmxAddr(amx, params[3]); int i4=*MF_GetAmxAddr(amx, params[4]); -#ifdef _WIN32 +#if defined(_WIN32) reinterpret_cast(__func)(pv, 0, i3, i4); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(__func)(pv, i3, i4); #endif return 1; } cell Call_Int_Int_Str_Int(AMX *amx, cell *params) { SETUP(3); int i3=*MF_GetAmxAddr(amx, params[3]); char *sz4=MF_GetAmxString(amx, params[4], 0, NULL); int i5=*MF_GetAmxAddr(amx, params[5]); -#ifdef _WIN32 +#if defined(_WIN32) return reinterpret_cast(__func)(pv, 0, i3, sz4, i5); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) return reinterpret_cast(__func)(pv, i3, sz4, i5); #endif } cell Call_Int_Int(AMX *amx, cell *params) { SETUP(1); int i3=*MF_GetAmxAddr(amx, params[3]); -#ifdef _WIN32 +#if defined(_WIN32) return reinterpret_cast(__func)(pv, 0, i3); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) return reinterpret_cast(__func)(pv, i3); #endif } cell Call_Int_Entvar(AMX *amx, cell *params) { SETUP(1); int id3=*MF_GetAmxAddr(amx, params[3]); CHECK_ENTITY(id3); entvars_t *ev3=&(INDEXENT_NEW(id3)->v); -#ifdef _WIN32 +#if defined(_WIN32) return reinterpret_cast(__func)(pv, 0, ev3); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) return reinterpret_cast(__func)(pv, ev3); #endif } cell Call_Int_Entvar_Entvar_Float_Int(AMX *amx, cell *params) { SETUP(4); @@ -293,19 +293,19 @@ cell Call_Int_Entvar_Entvar_Float_Int(AM int i6=*MF_GetAmxAddr(amx, params[6]); CHECK_ENTITY(id3); CHECK_ENTITY(id4); entvars_t *ev3=&(INDEXENT_NEW(id3)->v); entvars_t *ev4=&(INDEXENT_NEW(id4)->v); -#ifdef _WIN32 +#if defined(_WIN32) return reinterpret_cast(__func)(pv, 0, ev3, ev4, f5, i6); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) return reinterpret_cast(__func)(pv, ev3, ev4, f5, i6); #endif } cell Call_Int_Entvar_Entvar_Float_Float_Int(AMX *amx, cell *params) { SETUP(5); @@ -316,32 +316,32 @@ cell Call_Int_Entvar_Entvar_Float_Float_ int i7=*MF_GetAmxAddr(amx, params[7]); CHECK_ENTITY(id3); CHECK_ENTITY(id4); entvars_t *ev3=&(INDEXENT_NEW(id3)->v); entvars_t *ev4=&(INDEXENT_NEW(id4)->v); -#ifdef _WIN32 +#if defined(_WIN32) return reinterpret_cast(__func)(pv, 0, ev3, ev4, f5, f6, i7); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) return reinterpret_cast(__func)(pv, ev3, ev4, f5, f6, i7); #endif } cell Call_Void_Int(AMX *amx, cell *params) { SETUP(1); int i3=*MF_GetAmxAddr(amx, params[3]); -#ifdef _WIN32 +#if defined(_WIN32) reinterpret_cast(__func)(pv, 0, i3); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(__func)(pv, i3); #endif return 1; } cell Call_Void_Cbase_Cbase_Int_Float(AMX *amx, cell *params) { @@ -353,19 +353,19 @@ cell Call_Void_Cbase_Cbase_Int_Float(AMX float f6=amx_ctof(*MF_GetAmxAddr(amx, params[6])); CHECK_ENTITY(id3); CHECK_ENTITY(id4); void *p3=IndexToPrivate(id3); void *p4=IndexToPrivate(id4); -#ifdef _WIN32 +#if defined(_WIN32) reinterpret_cast(__func)(pv, 0, p3, p4, i5, f6); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(__func)(pv, p3, p4, i5, f6); #endif return 1; } cell Call_Void_Entvar_Float_Vector_Trace_Int(AMX *amx, cell *params) { @@ -387,19 +387,19 @@ cell Call_Void_Entvar_Float_Vector_Trace MF_LogError(amx, AMX_ERR_NATIVE, "Null traceresult provided."); return 0; } CHECK_ENTITY(id3); entvars_t *ev3=&(INDEXENT_NEW(id3)->v); -#ifdef _WIN32 +#if defined(_WIN32) reinterpret_cast(__func)(pv, 0, ev3, f4, v5, tr6, i7); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(__func)(pv, ev3, f4, v5, tr6, i7); #endif return 1; } cell Call_Void_Float_Vector_Trace_Int(AMX *amx, cell *params) { @@ -417,55 +417,55 @@ cell Call_Void_Float_Vector_Trace_Int(AM if (tr5==NULL) { MF_LogError(amx, AMX_ERR_NATIVE, "Null traceresult provided."); return 0; } -#ifdef _WIN32 +#if defined(_WIN32) reinterpret_cast(__func)(pv, 0, f3, v4, tr5, i6); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(__func)(pv, f3, v4, tr5, i6); #endif return 1; } cell Call_Str_Void(AMX *amx, cell *params) { SETUP(2); -#ifdef _WIN32 +#if defined(_WIN32) char *v=reinterpret_cast(__func)(pv, 0); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) char *v=reinterpret_cast(__func)(pv); #endif return MF_SetAmxString(amx, params[3], v == NULL ? "" : v, *MF_GetAmxAddr(amx, params[4])); } cell Call_Cbase_Void(AMX *amx, cell *params) { SETUP(0); -#ifdef _WIN32 +#if defined(_WIN32) void *ret=reinterpret_cast(__func)(pv, 0); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) void *ret=reinterpret_cast(__func)(pv); #endif return PrivateToIndex(ret); } cell Call_Vector_Void(AMX *amx, cell *params) { SETUP(1); -#ifdef _WIN32 +#if defined(_WIN32) Vector ret=reinterpret_cast(__func)(pv, 0); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) Vector ret=reinterpret_cast(__func)(pv); #endif float *out=(float *)MF_GetAmxAddr(amx, params[3]); out[0]=ret.x; out[1]=ret.y; out[2]=ret.z; return 1; @@ -476,19 +476,19 @@ cell Call_Vector_pVector(AMX *amx, cell SETUP(2); Vector v3; float *fl3=(float *)MF_GetAmxAddr(amx, params[3]); v3.x=fl3[0]; v3.y=fl3[1]; v3.z=fl3[2]; -#ifdef _WIN32 +#if defined(_WIN32) Vector ret=reinterpret_cast(__func)(pv, 0, &v3); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) Vector ret=reinterpret_cast(__func)(pv, &v3); #endif float *out=(float *)MF_GetAmxAddr(amx, params[4]); out[0]=ret.x; out[1]=ret.y; out[2]=ret.z; fl3[0]=v3.x; @@ -503,19 +503,19 @@ cell Call_Int_pVector(AMX *amx, cell *pa SETUP(1); Vector v3; float *fl3=(float *)MF_GetAmxAddr(amx, params[3]); v3.x=fl3[0]; v3.y=fl3[1]; v3.z=fl3[2]; -#ifdef _WIN32 +#if defined(_WIN32) int ret=reinterpret_cast(__func)(pv, 0, &v3); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) int ret=reinterpret_cast(__func)(pv, &v3); #endif fl3[0]=v3.x; fl3[1]=v3.y; fl3[2]=v3.z; return ret; @@ -528,114 +528,114 @@ cell Call_Void_Entvar_Float_Float(AMX *a int id3=*MF_GetAmxAddr(amx, params[3]); float f4=amx_ctof2(*MF_GetAmxAddr(amx, params[4])); float f5=amx_ctof2(*MF_GetAmxAddr(amx, params[5])); CHECK_ENTITY(id3); entvars_t *ev3=&(INDEXENT_NEW(id3)->v); -#ifdef _WIN32 +#if defined(_WIN32) reinterpret_cast(__func)(pv, 0, ev3, f4, f5); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(__func)(pv, ev3, f4, f5); #endif return 1; } cell Call_Int_pFloat_pFloat(AMX *amx, cell *params) { SETUP(2); float f3=amx_ctof2(*MF_GetAmxAddr(amx, params[3])); float f4=amx_ctof2(*MF_GetAmxAddr(amx, params[4])); -#ifdef _WIN32 +#if defined(_WIN32) return reinterpret_cast(__func)(pv, 0, &f3, &f4); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) return reinterpret_cast(__func)(pv, &f3, &f4); #endif } cell Call_Void_Entvar_Float(AMX *amx, cell *params) { SETUP(2); int id3=*MF_GetAmxAddr(amx, params[3]); float f4=amx_ctof2(*MF_GetAmxAddr(amx, params[4])); CHECK_ENTITY(id3); entvars_t *ev3=&(INDEXENT_NEW(id3)->v); -#ifdef _WIN32 +#if defined(_WIN32) return reinterpret_cast(__func)(pv, 0, ev3, f4); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) return reinterpret_cast(__func)(pv, ev3, f4); #endif } cell Call_Void_Int_Int_Int(AMX *amx, cell *params) { SETUP(2); int i3=*MF_GetAmxAddr(amx, params[3]); int i4=*MF_GetAmxAddr(amx, params[4]); int i5=*MF_GetAmxAddr(amx, params[5]); -#ifdef _WIN32 +#if defined(_WIN32) reinterpret_cast(__func)(pv, 0, i3, i4, i5); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(__func)(pv, i3, i4, i5); #endif return 1; } cell Call_Void_ItemInfo(AMX *amx, cell *params) { SETUP(1); void *ptr=reinterpret_cast(*MF_GetAmxAddr(amx, params[3])); if (ptr==0) { MF_LogError(amx, AMX_ERR_NATIVE, "Null ItemInfo handle!"); return 0; } -#ifdef _WIN32 +#if defined(_WIN32) reinterpret_cast(__func)(pv, 0, ptr); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(__func)(pv, ptr); #endif return 1; } cell Call_Float_Void(AMX *amx, cell *params) { SETUP(1); -#ifdef _WIN32 +#if defined(_WIN32) float ret=reinterpret_cast(__func)(pv, 0); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) float ret=reinterpret_cast(__func)(pv); #endif *MF_GetAmxAddr(amx, params[3])=amx_ftoc2(ret); return 1; } cell Call_Void_Float_Int(AMX* amx, cell* params) { SETUP(2); -#ifdef _WIN32 +#if defined(_WIN32) reinterpret_cast(__func)(pv, 0, amx_ctof2(params[3]), static_cast(params[4])); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(__func)(pv, amx_ctof2(params[3]), static_cast(params[4])); #endif return 1; } cell Call_Deprecated(AMX *amx, cell *params) { MF_LogError(amx, AMX_ERR_NATIVE, "Ham function is deprecated."); diff --git a/dlls/hamsandwich/config/hamdata.ini b/dlls/hamsandwich/config/hamdata.ini --- a/dlls/hamsandwich/config/hamdata.ini +++ b/dlls/hamsandwich/config/hamdata.ini @@ -32,17 +32,17 @@ ; eg: If they work on non-Steam CS 1.6 this is coincidental, if they do ; not work on non-Steam CS 1.6 this will not be officially fixed. ; ; Mirrors: These take the name of one mod, and copy all of its data to another ; name. An example of a use for this would be cstrike and czero: they ; use the same binary so all of its vtable offsets are guaranteed to ; be identical. Mirrors should always come first in the file! ; -; Version: $Id$ +; Version: $Id: hamdata.ini 3687 2008-03-04 18:51:35Z sawce $ @mirror cstrike czero @mirror ns nsp ; TODO: check these - all are estimates @section cstrike linux pev 4 @@ -256,16 +256,126 @@ weapon_shouldweaponidle 92 weapon_usedecrement 93 cstrike_restart 2 cstrike_roundrespawn 84 cstrike_item_candrop 63 cstrike_item_getmaxspeed 78 @end + +@section cstrike mac + pev 4 + base 0x0 + + spawn 0 + precache 1 + keyvalue 3 + objectcaps 6 + activate 7 + setobjectcollisionbox 8 + classify 9 + deathnotice 10 + traceattack 11 + takedamage 12 + takehealth 13 + killed 14 + bloodcolor 15 + tracebleed 16 + istriggered 17 + mymonsterpointer 18 + mysquadmonsterpointer 19 + gettogglestate 20 + addpoints 21 + addpointstoteam 22 + addplayeritem 23 + removeplayeritem 24 + giveammo 25 + getdelay 26 + ismoving 27 + overridereset 28 + damagedecal 29 + settogglestate 30 + startsneaking 31 + stopsneaking 32 + oncontrols 33 + issneaking 34 + isalive 35 + isbspmodel 36 + reflectgauss 37 + hastarget 38 + isinworld 39 + isplayer 40 + isnetclient 41 + teamid 42 + getnexttarget 43 + think 44 + touch 45 + use 46 + blocked 47 + respawn 48 + updateowner 49 + fbecomeprone 50 + center 51 + eyeposition 52 + earposition 53 + bodytarget 54 + illumination 55 + fvisible 56 + fvecvisible 57 + + player_jump 76 + player_duck 77 + player_prethink 78 + player_postthink 79 + player_getgunposition 80 + player_shouldfadeondeath 66 + player_impulsecommands 83 + player_updateclientdata 82 + + item_addtoplayer 59 + item_addduplicate 60 + item_getiteminfo 61 + item_candeploy 62 + item_deploy 64 + item_canholster 66 + item_holster 67 + item_updateiteminfo 68 + item_preframe 69 + item_postframe 70 + item_drop 71 + item_kill 72 + item_attachtoplayer 73 + item_primaryammoindex 74 + item_secondaryammoindex 75 + item_updateclientdata 76 + item_getweaponptr 77 + item_itemslot 79 + + weapon_extractammo 80 + weapon_extractclipammo 81 + weapon_addweapon 82 + weapon_playemptysound 83 + weapon_resetemptysound 84 + weapon_sendweaponanim 85 + weapon_isusable 86 + weapon_primaryattack 87 + weapon_secondaryattack 88 + weapon_reload 89 + weapon_weaponidle 90 + weapon_retireweapon 91 + weapon_shouldweaponidle 92 + weapon_usedecrement 93 + + cstrike_restart 2 + cstrike_roundrespawn 84 + cstrike_item_candrop 63 + cstrike_item_getmaxspeed 78 +@end + @section dod linux pev 0 base 0x154 spawn 5 precache 6 keyvalue 7 objectcaps 10 @@ -1742,18 +1852,122 @@ weapon_isusable 82 weapon_primaryattack 83 weapon_secondaryattack 84 weapon_reload 85 weapon_weaponidle 86 weapon_retireweapon 87 weapon_shouldweaponidle 88 weapon_usedecrement 89 +@end + +@section valve mac + pev 4 + base 0x0 + spawn 0 + precache 1 + keyvalue 2 + objectcaps 5 + activate 6 + setobjectcollisionbox 7 + classify 8 + deathnotice 9 + traceattack 10 + takedamage 11 + takehealth 12 + killed 13 + bloodcolor 14 + tracebleed 15 + istriggered 16 + mymonsterpointer 17 + mysquadmonsterpointer 18 + gettogglestate 19 + addpoints 20 + addpointstoteam 21 + addplayeritem 22 + removeplayeritem 23 + giveammo 24 + getdelay 25 + ismoving 26 + overridereset 27 + damagedecal 28 + settogglestate 29 + startsneaking 30 + stopsneaking 31 + oncontrols 32 + issneaking 33 + isalive 34 + isbspmodel 35 + reflectgauss 36 + hastarget 37 + isinworld 38 + isplayer 39 + isnetclient 40 + teamid 41 + getnexttarget 42 + think 43 + touch 44 + use 45 + blocked 46 + respawn 47 + updateowner 48 + fbecomeprone 49 + center 50 + eyeposition 51 + earposition 52 + bodytarget 53 + illumination 54 + fvisible 55 + fvecvisible 56 + + player_jump 125 + player_duck 126 + player_prethink 127 + player_postthink 128 + player_getgunposition 119 + player_shouldfadeondeath 60 + player_impulsecommands 130 + player_updateclientdata 129 + + item_addtoplayer 58 + item_addduplicate 59 + item_getiteminfo 60 + item_candeploy 61 + item_deploy 62 + item_canholster 63 + item_holster 64 + item_updateiteminfo 65 + item_preframe 66 + item_postframe 67 + item_drop 68 + item_kill 69 + item_attachtoplayer 70 + item_primaryammoindex 71 + item_secondaryammoindex 72 + item_updateclientdata 73 + item_getweaponptr 74 + item_itemslot 75 + + weapon_extractammo 76 + weapon_extractclipammo 77 + weapon_addweapon 78 + weapon_playemptysound 79 + weapon_resetemptysound 80 + weapon_sendweaponanim 81 + weapon_isusable 82 + weapon_primaryattack 83 + weapon_secondaryattack 84 + weapon_reload 85 + weapon_weaponidle 86 + weapon_retireweapon 87 + weapon_shouldweaponidle 88 + weapon_usedecrement 89 @end + ; Sven-Coop has no linux binaries. This makes disassembly much harder. ; These offsets were contributed by ts2do @section SvenCoop windows pev 4 base 0x0 spawn 0 precache 1 diff --git a/dlls/hamsandwich/config_parser.cpp b/dlls/hamsandwich/config_parser.cpp --- a/dlls/hamsandwich/config_parser.cpp +++ b/dlls/hamsandwich/config_parser.cpp @@ -235,18 +235,20 @@ int read_start_section(char *data) { if (strncmp(data, CurrentModName, strlen(CurrentModName))==0) { data+=strlen(CurrentModName)+1; trim_line(data); #ifdef _WIN32 if (strcmp(data, "windows")==0) -#elif defined __linux__ +#elif defined(__linux__) if (strcmp(data, "linux")==0) +#elif defined(__APPLE__) + if (strcmp(data, "mac")==0) #endif { return 1; } } return 0; } int read_number(char *input) diff --git a/dlls/hamsandwich/hook.h b/dlls/hamsandwich/hook.h --- a/dlls/hamsandwich/hook.h +++ b/dlls/hamsandwich/hook.h @@ -59,48 +59,48 @@ public: int **ivtable=(int **)vtable; func=(void *)ivtable[entry]; // now install a trampoline // (int thiscall, int voidcall, int paramcount, void *extraptr) tramp=CreateGenericTrampoline(true, voidcall, paramcount, (void*)this, target); // Insert into vtable -#if defined _WIN32 +#if defined(_WIN32) DWORD OldFlags; VirtualProtect(&ivtable[entry],sizeof(int*),PAGE_READWRITE,&OldFlags); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) void *addr = (void *)ALIGN(&ivtable[entry]); mprotect(addr,sysconf(_SC_PAGESIZE),PROT_READ|PROT_WRITE); #endif ivtable[entry]=(int*)tramp; size_t len=strlen(name); ent=new char[len+1]; snprintf(ent,len+1,"%s",name); }; ~Hook() { // Insert the original function back into the vtable int **ivtable=(int **)vtable; -#if defined _WIN32 +#if defined(_WIN32) DWORD OldFlags; VirtualProtect(&ivtable[entry],sizeof(int*),PAGE_READWRITE,&OldFlags); -#elif defined __linux_ +#elif defined(__linux_) || defined(__APPLE__) void *addr = (void *)ALIGN(&ivtable[entry]); mprotect(addr,sysconf(_SC_PAGESIZE),PROT_READ|PROT_WRITE); #endif ivtable[entry]=(int *)func; -#if defined _WIN32 +#if defined(_WIN32) VirtualFree(tramp, 0, MEM_RELEASE); -#elif __linux__ +#elif defined(__linux__) || defined(__APPLE__) free(tramp); #endif delete[] ent; CVector::iterator end=pre.end(); for (CVector::iterator i=pre.begin(); diff --git a/dlls/hamsandwich/hook_callbacks.cpp b/dlls/hamsandwich/hook_callbacks.cpp --- a/dlls/hamsandwich/hook_callbacks.cpp +++ b/dlls/hamsandwich/hook_callbacks.cpp @@ -161,19 +161,19 @@ void Hook_Void_Void(Hook *hook, void *pt { PUSH_VOID() MAKE_VECTOR() PRE_START() PRE_END() -#if defined _WIN32 +#if defined(_WIN32) reinterpret_cast(hook->func)(pthis,0); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(hook->func)(pthis); #endif POST_START() POST_END() KILL_VECTOR() POP() @@ -187,19 +187,19 @@ int Hook_Int_Void(Hook *hook, void *pthi MAKE_VECTOR() PRE_START() PRE_END() -#if defined _WIN32 +#if defined(_WIN32) origret=reinterpret_cast(hook->func)(pthis,0); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) origret=reinterpret_cast(hook->func)(pthis); #endif POST_START() POST_END() KILL_VECTOR() POP() @@ -217,19 +217,19 @@ void Hook_Void_Entvar(Hook *hook, void * MAKE_VECTOR() P_ENTVAR(entvar, iOther) PRE_START() , iOther PRE_END() -#if defined _WIN32 +#if defined(_WIN32) reinterpret_cast(hook->func)(pthis, 0, entvar); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(hook->func)(pthis, entvar); #endif POST_START() , iOther POST_END() KILL_VECTOR() @@ -245,19 +245,19 @@ void Hook_Void_Cbase(Hook *hook, void *p MAKE_VECTOR() P_CBASE(other, iOther) PRE_START() , iOther PRE_END() -#if defined _WIN32 +#if defined(_WIN32) reinterpret_cast(hook->func)(pthis, 0, other); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(hook->func)(pthis, other); #endif POST_START() , iOther POST_END() KILL_VECTOR() @@ -274,19 +274,19 @@ int Hook_Int_Float_Int(Hook *hook, void P_FLOAT(f1) P_INT(i1) PRE_START() , f1, i1 PRE_END() -#if defined _WIN32 +#if defined(_WIN32) origret=reinterpret_cast(hook->func)(pthis, 0, f1, i1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) origret=reinterpret_cast(hook->func)(pthis, f1, i1); #endif POST_START() , f1, i1 POST_END() KILL_VECTOR() @@ -304,19 +304,19 @@ void Hook_Void_Entvar_Int(Hook *hook, vo P_ENTVAR(ev1, iOther) P_INT(i1) PRE_START() , iOther, i1 PRE_END() -#if defined _WIN32 +#if defined(_WIN32) reinterpret_cast(hook->func)(pthis, 0, ev1, i1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(hook->func)(pthis, ev1, i1); #endif POST_START() , iOther, i1 POST_END() KILL_VECTOR() @@ -334,19 +334,19 @@ int Hook_Int_Cbase(Hook *hook, void *pth MAKE_VECTOR() P_CBASE(cb1, iOther) PRE_START() , iOther PRE_END() -#if defined _WIN32 +#if defined(_WIN32) origret=reinterpret_cast(hook->func)(pthis, 0, cb1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) origret=reinterpret_cast(hook->func)(pthis, cb1); #endif POST_START() , iOther POST_END() KILL_VECTOR() @@ -362,19 +362,19 @@ void Hook_Void_Int_Int(Hook *hook, void MAKE_VECTOR() P_INT(i1) P_INT(i2) PRE_START() ,i1, i2 PRE_END() -#if defined _WIN32 +#if defined(_WIN32) reinterpret_cast(hook->func)(pthis, 0, i1, i2); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(hook->func)(pthis, i1, i2); #endif POST_START() ,i1, i2 POST_END() KILL_VECTOR() @@ -393,19 +393,19 @@ int Hook_Int_Int_Str_Int(Hook *hook, voi P_INT(i1) P_STR(a) P_INT(i2) PRE_START() ,i1, a.c_str(), i2 PRE_END() -#if defined _WIN32 +#if defined(_WIN32) origret=reinterpret_cast(hook->func)(pthis, 0, i1, a.c_str(), i2); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) origret=reinterpret_cast(hook->func)(pthis, i1, a.c_str(), i2); #endif POST_START() ,i1, a.c_str(), i2 POST_END() KILL_VECTOR() @@ -424,19 +424,19 @@ int Hook_Int_Int(Hook *hook, void *pthis MAKE_VECTOR() P_INT(i1) PRE_START() ,i1 PRE_END() -#if defined _WIN32 +#if defined(_WIN32) origret=reinterpret_cast(hook->func)(pthis, 0, i1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) origret=reinterpret_cast(hook->func)(pthis, i1); #endif POST_START() ,i1 POST_END() KILL_VECTOR() @@ -455,19 +455,19 @@ int Hook_Int_Entvar(Hook *hook, void *pt MAKE_VECTOR() P_ENTVAR(ev1, iOther) PRE_START() ,iOther PRE_END() -#if defined _WIN32 +#if defined(_WIN32) origret=reinterpret_cast(hook->func)(pthis, 0, ev1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) origret=reinterpret_cast(hook->func)(pthis, ev1); #endif POST_START() , iOther POST_END() KILL_VECTOR() @@ -492,19 +492,19 @@ int Hook_Int_Entvar_Entvar_Float_Int(Hoo P_FLOAT(damage) P_INT(damagebits) PRE_START() ,iInflictor, iAttacker, damage, damagebits PRE_END() -#if defined _WIN32 +#if defined(_WIN32) origret=reinterpret_cast(hook->func)(pthis, 0, inflictor, attacker, damage, damagebits); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) origret=reinterpret_cast(hook->func)(pthis, inflictor, attacker, damage, damagebits); #endif POST_START() ,iInflictor, iAttacker, damage, damagebits POST_END() KILL_VECTOR() @@ -527,19 +527,19 @@ int Hook_Int_Entvar_Entvar_Float_Float_I P_FLOAT(unknown) P_INT(damagebits) PRE_START() ,iInflictor, iAttacker, damage, unknown, damagebits PRE_END() -#if defined _WIN32 +#if defined(_WIN32) origret=reinterpret_cast(hook->func)(pthis, 0, inflictor, attacker, damage, unknown, damagebits); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) origret=reinterpret_cast(hook->func)(pthis, inflictor, attacker, damage, unknown, damagebits); #endif POST_START() ,iInflictor, iAttacker, damage, unknown, damagebits POST_END() KILL_VECTOR() @@ -554,19 +554,19 @@ void Hook_Void_Int(Hook *hook, void *pth MAKE_VECTOR() P_INT(i1) PRE_START() , i1 PRE_END() -#if defined _WIN32 +#if defined(_WIN32) reinterpret_cast(hook->func)(pthis, 0, i1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(hook->func)(pthis, i1); #endif POST_START() ,i1 POST_END() KILL_VECTOR() @@ -585,19 +585,19 @@ void Hook_Void_Cbase_Cbase_Int_Float(Hoo P_INT(i1) P_FLOAT(f1) PRE_START() ,iCaller, iActivator, i1, f1 PRE_END() -#if defined _WIN32 +#if defined(_WIN32) reinterpret_cast(hook->func)(pthis, 0, cb1, cb2, i1, f1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(hook->func)(pthis, cb1, cb2, i1, f1); #endif POST_START() ,iCaller, iActivator, i1, f1 POST_END() KILL_VECTOR() @@ -615,19 +615,19 @@ void Hook_Void_Entvar_Float_Vector_Trace P_VECTOR(v1) P_TRACE(tr1) P_INT(i1) PRE_START() ,iev1, f1, MF_PrepareCellArrayA(reinterpret_cast(&v1), 3, false), tr1, i1 PRE_END() -#if defined _WIN32 +#if defined(_WIN32) reinterpret_cast(hook->func)(pthis, 0, ev1, f1, v1, tr1, i1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(hook->func)(pthis, ev1, f1, v1, tr1, i1); #endif POST_START() , iev1, f1, MF_PrepareCellArrayA(reinterpret_cast(&v1), 3, false), tr1, i1 POST_END() KILL_VECTOR() @@ -643,19 +643,19 @@ void Hook_Void_Float_Vector_Trace_Int(Ho P_VECTOR(v1) P_TRACE(tr1) P_INT(i1) PRE_START() , f1, MF_PrepareCellArrayA(reinterpret_cast(&v1), 3, false), tr1, i1 PRE_END() -#if defined _WIN32 +#if defined(_WIN32) reinterpret_cast(hook->func)(pthis, 0, f1, v1, tr1, i1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(hook->func)(pthis, f1, v1, tr1, i1); #endif POST_START() , f1, MF_PrepareCellArrayA(reinterpret_cast(&v1), 3, false), tr1, i1 POST_END() KILL_VECTOR() @@ -667,19 +667,19 @@ const char *Hook_Str_Void(Hook *hook, vo String origret; MAKE_VECTOR() PUSH_STRING() PRE_START() PRE_END() -#if defined _WIN32 +#if defined(_WIN32) origret.assign(reinterpret_cast(hook->func)(pthis, 0)); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) origret.assign(reinterpret_cast(hook->func)(pthis)); #endif POST_START() POST_END() KILL_VECTOR() POP() @@ -694,69 +694,69 @@ void *Hook_Cbase_Void(Hook *hook, void * void *origret=NULL; PUSH_CBASE() MAKE_VECTOR() PRE_START() PRE_END() -#if defined _WIN32 +#if defined(_WIN32) origret=reinterpret_cast(hook->func)(pthis, 0); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) origret=reinterpret_cast(hook->func)(pthis); #endif POST_START() POST_END() KILL_VECTOR() POP() CHECK_RETURN() return ret; } #ifdef _WIN32 void Hook_Vector_Void(Hook *hook, void *pthis, Vector *out) -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) void Hook_Vector_Void(Hook *hook, Vector *out, void *pthis) #endif { Vector ret; Vector origret; PUSH_VECTOR() MAKE_VECTOR() memset(&ret, 0x0, sizeof(Vector)); memset(&origret, 0x0, sizeof(Vector)); PRE_START() PRE_END() -#if defined _WIN32 +#if defined(_WIN32) reinterpret_cast(hook->func)(pthis, 0, &origret); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) origret=reinterpret_cast(hook->func)(pthis); #endif POST_START() POST_END() KILL_VECTOR() POP() CHECK_RETURN_VEC() memcpy(out, &ret, sizeof(Vector)); } #ifdef _WIN32 void Hook_Vector_pVector(Hook *hook, void *pthis, Vector *out, Vector *v1) -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) void Hook_Vector_pVector(Hook *hook, Vector *out, void *pthis, Vector *v1) #endif { Vector ret; Vector origret; PUSH_VECTOR() @@ -765,19 +765,19 @@ void Hook_Vector_pVector(Hook *hook, Vec memset(&ret, 0x0, sizeof(Vector)); memset(&origret, 0x0, sizeof(Vector)); PRE_START() , MF_PrepareCellArrayA(reinterpret_cast(v1), 3, false) PRE_END() -#if defined _WIN32 +#if defined(_WIN32) reinterpret_cast(hook->func)(pthis, 0, &origret, v1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) origret=reinterpret_cast(hook->func)(pthis, v1); #endif POST_START() , MF_PrepareCellArrayA(reinterpret_cast(v1), 3, false) POST_END() KILL_VECTOR() @@ -795,19 +795,19 @@ int Hook_Int_pVector(Hook *hook, void *p MAKE_VECTOR() P_PTRVECTOR(v1) PRE_START() , MF_PrepareCellArrayA(reinterpret_cast(v1), 3, false) PRE_END() -#if defined _WIN32 +#if defined(_WIN32) origret=reinterpret_cast(hook->func)(pthis, 0, v1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) origret=reinterpret_cast(hook->func)(pthis, v1); #endif POST_START() , MF_PrepareCellArrayA(reinterpret_cast(v1), 3, false) POST_END() KILL_VECTOR() @@ -826,19 +826,19 @@ void Hook_Void_Entvar_Float_Float(Hook * P_ENTVAR(ev1, cev1) P_FLOAT(f1) P_FLOAT(f2) PRE_START() , cev1, f1, f2 PRE_END() -#if defined _WIN32 +#if defined(_WIN32) reinterpret_cast(hook->func)(pthis, 0, ev1, f1, f2); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(hook->func)(pthis, ev1, f1, f2); #endif POST_START() , cev1, f1, f2 POST_END() KILL_VECTOR() @@ -855,19 +855,19 @@ int Hook_Int_pFloat_pFloat(Hook *hook, v MAKE_VECTOR() P_PTRFLOAT(f1) P_PTRFLOAT(f2) PRE_START() , f1 != NULL ? *f1 : 0, f2 != NULL ? *f2 : 0 PRE_END() -#if defined _WIN32 +#if defined(_WIN32) origret=reinterpret_cast(hook->func)(pthis, 0, f1, f2); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) origret=reinterpret_cast(hook->func)(pthis, f1, f2); #endif POST_START() , f1 != NULL ? *f1 : 0, f2 != NULL ? *f2 : 0 POST_END() KILL_VECTOR() @@ -884,19 +884,19 @@ void Hook_Void_Entvar_Float(Hook *hook, MAKE_VECTOR() P_ENTVAR(ev1, cev1) P_FLOAT(f1) PRE_START() , cev1, f1 PRE_END() -#if defined _WIN32 +#if defined(_WIN32) reinterpret_cast(hook->func)(pthis, 0, ev1, f1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(hook->func)(pthis, ev1, f1); #endif POST_START() , cev1, f1 POST_END() KILL_VECTOR() @@ -911,19 +911,19 @@ void Hook_Void_Int_Int_Int(Hook *hook, v P_INT(i1) P_INT(i2) P_INT(i3) PRE_START() ,i1, i2, i3 PRE_END() -#if defined _WIN32 +#if defined(_WIN32) reinterpret_cast(hook->func)(pthis, 0, i1, i2, i3); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(hook->func)(pthis, i1, i2, i3); #endif POST_START() ,i1, i2, i3 POST_END() KILL_VECTOR() @@ -935,19 +935,19 @@ void Hook_Void_ItemInfo(Hook *hook, void MAKE_VECTOR() P_ITEMINFO(iteminfo) PRE_START() ,iteminfo PRE_END() -#if defined _WIN32 +#if defined(_WIN32) reinterpret_cast(hook->func)(pthis, 0, iteminfo); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(hook->func)(pthis, iteminfo); #endif POST_START() ,iteminfo POST_END() KILL_VECTOR() @@ -959,19 +959,19 @@ float Hook_Float_Void(Hook *hook, void * float ret=0.0; float origret=0.0; PUSH_FLOAT() MAKE_VECTOR() PRE_START() PRE_END() -#if defined _WIN32 +#if defined(_WIN32) origret=reinterpret_cast(hook->func)(pthis, 0); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) origret=reinterpret_cast(hook->func)(pthis); #endif POST_START() POST_END() KILL_VECTOR() POP() @@ -985,19 +985,19 @@ void Hook_Void_Float_Int(Hook* hook, voi MAKE_VECTOR() P_FLOAT(f1) P_INT(i1) PRE_START() , f1, i1 PRE_END() -#if defined _WIN32 +#if defined(_WIN32) reinterpret_cast(hook->func)(pthis, 0, f1, i1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) reinterpret_cast(hook->func)(pthis, f1, i1); #endif POST_START() , f1, i1 POST_END() KILL_VECTOR() diff --git a/dlls/hamsandwich/hook_callbacks.h b/dlls/hamsandwich/hook_callbacks.h --- a/dlls/hamsandwich/hook_callbacks.h +++ b/dlls/hamsandwich/hook_callbacks.h @@ -125,25 +125,25 @@ const int PC_Cbase_Void = 0; void *Hook_Cbase_Void(Hook *hook, void *pthis); // HACK: I'm too lazy to fix up trampoline generator to deal with // special return values. this is so much easier. const bool RT_Vector_Void = true; const int PC_Vector_Void = 1; #ifdef _WIN32 void Hook_Vector_Void(Hook *hook, void *pthis, Vector *out); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) void Hook_Vector_Void(Hook *hook, Vector *out, void *pthis); #endif const bool RT_Vector_pVector = true; const int PC_Vector_pVector = 2; #ifdef _WIN32 void Hook_Vector_pVector(Hook *hook, void *pthis, Vector *out, Vector *v1); -#elif defined __linux__ +#elif defined(__linux__) || defined(__APPLE__) void Hook_Vector_pVector(Hook *hook, Vector *out, void *pthis, Vector *v1); #endif const bool RT_Int_pVector = false; const int PC_Int_pVector = 1; int Hook_Int_pVector(Hook *hook, void *pthis, Vector *v1); const bool RT_Void_Entvar_Float_Float = true; diff --git a/dlls/hamsandwich/pdata.cpp b/dlls/hamsandwich/pdata.cpp --- a/dlls/hamsandwich/pdata.cpp +++ b/dlls/hamsandwich/pdata.cpp @@ -52,16 +52,22 @@ // Return -1 on null, -2 on invalid, and the the index of any other. static cell AMX_NATIVE_CALL get_pdata_cbase_safe(AMX *amx, cell *params) { int index=params[1]; FM_CHECK_ENTITY(index); int iOffset=params[2]; #ifdef __linux__ iOffset += params[3]; +#elif defined __APPLE__ + // Use Linux offset in older plugins + if (params[0] / sizeof(cell) == 3) + iOffset += params[3]; + else + iOffset += params[4]; #endif if (iOffset <0) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid offset provided. (got: %d)", iOffset); return 0; } void *ptr=*((void **)((int *)INDEXENT_NEW(index)->pvPrivateData + iOffset)); @@ -82,17 +88,24 @@ static cell AMX_NATIVE_CALL get_pdata_cb } static cell AMX_NATIVE_CALL get_pdata_cbase(AMX *amx, cell *params) { int index=params[1]; FM_CHECK_ENTITY(index); int iOffset=params[2]; #ifdef __linux__ iOffset += params[3]; +#elif defined __APPLE__ + // Use Linux offset in older plugins + if (params[0] / sizeof(cell) == 3) + iOffset += params[3]; + else + iOffset += params[4]; #endif + if (iOffset <0) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid offset provided. (got: %d)", iOffset); return 0; } void *ptr=*((void **)((int *)INDEXENT_NEW(index)->pvPrivateData + iOffset)); return PrivateToIndex(ptr); @@ -105,16 +118,22 @@ static cell AMX_NATIVE_CALL set_pdata_cb if (target != -1) { FM_CHECK_ENTITY(target); } int iOffset=params[2]; #ifdef __linux__ iOffset += params[4]; +#elif defined __APPLE__ + // Use Linux offset in older plugins + if (params[0] / sizeof(cell) == 4) + iOffset += params[4]; + else + iOffset += params[5]; #endif if (iOffset <0) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid offset provided. (got: %d)", iOffset); return 0; } if (target == -1) diff --git a/dlls/hamsandwich/sdk/CString.h b/dlls/hamsandwich/sdk/CString.h --- a/dlls/hamsandwich/sdk/CString.h +++ b/dlls/hamsandwich/sdk/CString.h @@ -239,17 +239,17 @@ public: if (len < 1) { return; } if (is_space(v[len-1])) { - for (i=len-1; i>=0; i--) + for (i=len-1; i //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/hamsandwich/sdk/amxxmodule.h b/dlls/hamsandwich/sdk/amxxmodule.h --- a/dlls/hamsandwich/sdk/amxxmodule.h +++ b/dlls/hamsandwich/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/hamsandwich/srvcmd.cpp b/dlls/hamsandwich/srvcmd.cpp --- a/dlls/hamsandwich/srvcmd.cpp +++ b/dlls/hamsandwich/srvcmd.cpp @@ -38,17 +38,17 @@ #include "offsets.h" #include "forward.h" #include "hook.h" extern hook_t hooklist[]; extern CVector hooks[HAM_LAST_ENTRY_DONT_USE_ME_LOL]; -void print_srvconsole(char *fmt, ...) +void print_srvconsole(const char *fmt, ...) { va_list argptr; static char string[384]; va_start(argptr, fmt); vsnprintf(string, sizeof(string) - 1, fmt, argptr); string[sizeof(string) - 1] = '\0'; va_end(argptr); diff --git a/dlls/mysqlx/Makefile b/dlls/mysqlx/Makefile --- a/dlls/mysqlx/Makefile +++ b/dlls/mysqlx/Makefile @@ -1,92 +1,131 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../hlsdk/multiplayer MM_ROOT = ../../../metamod/metamod - -### EDIT BELOW FOR OTHER PROJECTS ### - -OPT_FLAGS = -O2 -funroll-loops -s -pipe -fomit-frame-pointer -fno-strict-aliasing -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = mysql -#MYSQL_DIR = ../../../mysql-5.0.22 MYSQL_DIR = ../../../mysql-5.0 -BIN_SUFFIX_32 = amxx_i386.so -BIN_SUFFIX_64 = amxx_amd64.so +##################################### +### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OBJECTS = basic_sql.cpp handles.cpp module.cpp threading.cpp sdk/amxxmodule.cpp oldcompat_sql.cpp -OBJECTS += thread/BaseWorker.cpp thread/ThreadWorker.cpp thread/PosixThreads.cpp -OBJECTS += mysql/MysqlQuery.cpp mysql/MysqlResultSet.cpp mysql/MysqlDatabase.cpp mysql/MysqlDriver.cpp +PROJECT = mysql -LINK = -lgcc -static-libgcc $(MYSQL_DIR)/lib/libmysqlclient_r.a -lz -lpthread +OBJECTS = basic_sql.cpp handles.cpp module.cpp threading.cpp sdk/amxxmodule.cpp oldcompat_sql.cpp \ + thread/BaseWorker.cpp thread/ThreadWorker.cpp thread/PosixThreads.cpp \ + mysql/MysqlQuery.cpp mysql/MysqlResultSet.cpp mysql/MysqlDatabase.cpp mysql/MysqlDriver.cpp -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -I$(MYSQL_DIR)/include -L$(MYSQL_DIR)/lib -Ithread \ - -Imysql -Isdk +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +C_OPT_FLAGS = -DNDEBUG -O2 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang -ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +LINK = $(MYSQL_DIR)/lib/libmysqlclient_r.a -lz -lpthread -L$(MYSQL_DIR)/lib + +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(MM_ROOT) -I$(MYSQL_DIR)/include -Ithread -Imysql -Isdk + +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared endif +LINK += -m32 -lm -ldl + +CFLAGS += -DSM_DEFAULT_THREADER -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H \ + -Dstricmp=strcasecmp -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) + ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -DNDEBUG -Wall -Wno-non-virtual-dtor -Werror -fno-exceptions -DHAVE_STDINT_H -Dstricmp=strcasecmp -fno-rtti -static-libgcc -CFLAGS += -DSM_DEFAULT_THREADER -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -ifeq "$(AMD64)" "true" - BINARY = $(NAME)_$(BIN_SUFFIX_64) - CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -m64 - INCLUDE += -Lextra/lib_linux64 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") else - BINARY = $(NAME)_$(BIN_SUFFIX_32) - CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 - OPT_FLAGS += -march=i686 - INCLUDE += -Lextra/lib_linux + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< all: + mkdir -p $(BIN_DIR) + mkdir -p $(BIN_DIR)/mysql mkdir -p $(BIN_DIR)/thread - mkdir -p $(BIN_DIR)/mysql mkdir -p $(BIN_DIR)/sdk - mkdir -p $(BIN_DIR) - $(MAKE) mysql + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -amd64: - $(MAKE) all AMD64=true +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -mysql: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/thread/*.o - rm -rf Release/mysql/*.o - rm -rf Release/sdk/*.o - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Release/$(NAME)_$(BIN_SUFFIX_64) - rm -rf Debug/thread/*.o - rm -rf Debug/mysql/*.o - rm -rf Debug/sdk/*.o - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_64) + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/mysql/*.o + rm -rf $(BIN_DIR)/thread/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/dlls/mysqlx/mysql/MysqlDriver.cpp b/dlls/mysqlx/mysql/MysqlDriver.cpp --- a/dlls/mysqlx/mysql/MysqlDriver.cpp +++ b/dlls/mysqlx/mysql/MysqlDriver.cpp @@ -37,17 +37,17 @@ IDatabase *MysqlDriver::_Connect(Databas if (!mysql) { if (errcode) *errcode = -1; if (error && maxlength) { snprintf(error, maxlength, "Initialization failed"); } - return false; + return NULL; } if (do_timeout && info->max_timeout) { mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&(info->max_timeout)); } if (mysql_real_connect(mysql, @@ -62,17 +62,17 @@ IDatabase *MysqlDriver::_Connect(Databas if (errcode) { *errcode = mysql_errno(mysql); } if (error && maxlength) { snprintf(error, maxlength, "%s", mysql_error(mysql)); } - return false; + return NULL; } MysqlDatabase *pMysql = new MysqlDatabase(mysql, this); return static_cast(pMysql); } int MysqlDriver::QuoteString(const char *str, char buffer[], size_t maxlen, size_t *newsize) diff --git a/dlls/mysqlx/sdk/amxxmodule.cpp b/dlls/mysqlx/sdk/amxxmodule.cpp --- a/dlls/mysqlx/sdk/amxxmodule.cpp +++ b/dlls/mysqlx/sdk/amxxmodule.cpp @@ -2235,17 +2235,17 @@ static META_FUNCTIONS g_MetaFunctions_Ta GetEntityAPI2, GetEntityAPI2_Post, GetNewDLLFunctions, GetNewDLLFunctions_Post, GetEngineFunctions, GetEngineFunctions_Post }; -C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +C_DLLEXPORT int Meta_Query(const char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) { if ((int) CVAR_GET_FLOAT("developer") != 0) UTIL_LogPrintf("[%s] dev: called: Meta_Query; version=%s, ours=%s\n", Plugin_info.logtag, ifvers, Plugin_info.ifvers); // Check for valid pMetaUtilFuncs before we continue. if(!pMetaUtilFuncs) { UTIL_LogPrintf("[%s] ERROR: Meta_Query called with null pMetaUtilFuncs\n", Plugin_info.logtag); @@ -2329,17 +2329,17 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIM #ifdef FN_META_DETACH FN_META_DETACH(); #endif // FN_META_DETACH return TRUE; } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) // linux prototype C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { #else #ifdef _MSC_VER // MSVC: Simulate __stdcall calling convention C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { @@ -3045,17 +3045,17 @@ char* UTIL_VarArgs( char *format, ... ) return string; } //========================================================= // UTIL_LogPrintf - Prints a logged message to console. // Preceded by LOG: ( timestamp ) < message > //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/mysqlx/sdk/amxxmodule.h b/dlls/mysqlx/sdk/amxxmodule.h --- a/dlls/mysqlx/sdk/amxxmodule.h +++ b/dlls/mysqlx/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/mysqlx/sdk/sh_list.h b/dlls/mysqlx/sdk/sh_list.h --- a/dlls/mysqlx/sdk/sh_list.h +++ b/dlls/mysqlx/sdk/sh_list.h @@ -14,17 +14,17 @@ // MSVC8 fix for offsetof macro redefition warnings #ifdef _MSC_VER #if _MSC_VER >= 1400 #undef offsetof #endif #endif #include -#include +#include namespace SourceHook { //This class is from CSDM for AMX Mod X /* A circular, doubly-linked list with one sentinel node diff --git a/dlls/mysqlx/sdk/sh_string.h b/dlls/mysqlx/sdk/sh_string.h --- a/dlls/mysqlx/sdk/sh_string.h +++ b/dlls/mysqlx/sdk/sh_string.h @@ -191,17 +191,17 @@ public: if (len < 1) { return; } if (is_space(v[len-1])) { - for (i=len-1; i>=0; i--) + for (i=len-1; itime; } void MysqlThread::SetQuery(const char *query) { m_query.assign(query); } diff --git a/dlls/ns/CString.h b/dlls/ns/CString.h --- a/dlls/ns/CString.h +++ b/dlls/ns/CString.h @@ -240,17 +240,17 @@ public: if (len < 1) { return; } if (is_space(v[len-1])) { - for (i=len-1; i>=0; i--) + for (i=len-1; i 0) + --m_CurrentUsedSize; FreeMemIfPossible(); } bool resize(size_t newSize) { if (!ChangeSize(newSize)) return false; diff --git a/dlls/ns/Makefile b/dlls/ns/Makefile --- a/dlls/ns/Makefile +++ b/dlls/ns/Makefile @@ -1,98 +1,128 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../hlsdk/multiplayer MM_ROOT = ../../../metamod/metamod +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### +PROJECT = ns -CRAZY_OPT_FLAGS = -DCRAZY_OPTS -O3 -funroll-loops -ffast-math -s -pipe -fomit-frame-pointer -fno-strict-aliasing -DNDEBUG -fmerge-all-constants -fmodulo-sched -fgcse-sm -fgcse-las -fgcse-after-reload -floop-optimize2 -funsafe-loop-optimizations -ftree-loop-linear -ftree-loop-im -ftree-loop-ivcanon -fivopts -ftree-vectorize -fvariable-expansion-in-unroller -funsafe-math-optimizations -ffinite-math-only -fpeel-loops -funswitch-loops -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wno-unknown-pragmas -Wno-deprecated -fno-exceptions -DHAVE_STDINT_H -static-libgcc -fno-rtti -Wpointer-arith -Wcast-qual -Wcast-align -Wconversion -Wsign-compare -Wmissing-noreturn -Winline -Wlong-long -Wunsafe-loop-optimizations -Wctor-dtor-privacy -Wno-non-virtual-dtor -Wreorder -Woverloaded-virtual -Wsign-promo -Wsynth -shared +OBJECTS = sdk/amxxmodule.cpp dllapi.cpp utils.cpp amxxapi.cpp engineapi.cpp TitleManager.cpp \ + ParticleManager.cpp MessageHandler.cpp GameManager.cpp natives/general.cpp \ + natives/player.cpp natives/player_memory.cpp natives/structure.cpp natives/weapons.cpp \ + natives/particles.cpp natives/memberfuncs.cpp -CRAZY_LINK_FLAGS = -#-fwhole-program -#-fwhole-program -combine +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -SANE_OPT_FLAGS = -O3 -funroll-loops -s -pipe -fomit-frame-pointer -fno-strict-aliasing -DNDEBUG +C_OPT_FLAGS = -DNDEBUG -O3 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang -OPT_FLAGS = +LINK = -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = ns +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(HLSDK)/pm_shared -I$(MM_ROOT) -Isdk -BIN_SUFFIX = amxx_i386.so +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ -OBJECTS = sdk/amxxmodule.cpp dllapi.cpp utils.cpp amxxapi.cpp engineapi.cpp \ -TitleManager.cpp ParticleManager.cpp MessageHandler.cpp GameManager.cpp \ -natives/general.cpp natives/player.cpp natives/player_memory.cpp \ -natives/structure.cpp natives/weapons.cpp natives/particles.cpp \ -natives/memberfuncs.cpp +OS := $(shell uname -s) -LINK = +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared +endif -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -I$(HLSDK)/pm_shared +LINK += -m32 -lm -ldl -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else - ifeq "$(CRAZY)" "true" - BIN_DIR = Optimized - OPT_FLAGS = $(CRAZY_OPT_FLAGS) - LINK = $(CRAZY_LINK_FLAGS) - else - BIN_DIR = Release - OPT_FLAGS = $(SANE_OPT_FLAGS) - endif - ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden - endif - CFLAGS = $(OPT_FLAGS) + BIN_DIR = Release + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -Wall -Wno-non-virtual-dtor -Werror -fno-exceptions -DHAVE_STDINT_H -static-libgcc -fno-rtti -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -BINARY = $(NAME)_$(BIN_SUFFIX) -CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -OPT_FLAGS += -march=i586 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") +else + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) +endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< all: mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/sdk mkdir -p $(BIN_DIR)/natives - $(MAKE) ns + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -ns: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all -crazy: - $(MAKE) all CRAZY=true +clean: + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -rf $(BIN_DIR)/natives/*.o + rm -f $(BIN_DIR)/$(BINARY) -clean: - rm -rf Release/*.o - rm -rf Release/sdk/*.o - rm -rf Release/natives/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX) - rm -rf Debug/*.o - rm -rf Debug/sdk/*.o - rm -rf Debug/natives/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX) - rm -rf Optimized/*.o - rm -rf Optimized/sdk/*.o - rm -rf Optimized/natives/*.o - rm -rf Optimized/$(NAME)_$(BIN_SUFFIX) - diff --git a/dlls/ns/engineapi.cpp b/dlls/ns/engineapi.cpp --- a/dlls/ns/engineapi.cpp +++ b/dlls/ns/engineapi.cpp @@ -44,17 +44,17 @@ #include "GameManager.h" #include "ParticleManager.h" #include "CPlayer.h" // Parse log messages here for any desired information (structure_built, etc.) // The following logs are needed: // "sawce<1>" triggered "structure_built" (type "defensechamber")` -void AlertMessage_Post(ALERT_TYPE atype, char *szFmt, ...) +void AlertMessage_Post(ALERT_TYPE atype, const char *szFmt, ...) { if (atype != at_logged) { RETURN_META(MRES_IGNORED); } char *MessageStart; // original pointer to start of the message char *TypePointer; // pointer to the structure type diff --git a/dlls/ns/natives/particles.cpp b/dlls/ns/natives/particles.cpp --- a/dlls/ns/natives/particles.cpp +++ b/dlls/ns/natives/particles.cpp @@ -53,17 +53,17 @@ typedef enum partsystype_e PSYS_TYPE_STRING }partsystype; typedef struct partsyskey_s { const char *Name; partsystype type; }partsyskey; -cell PSKeyValueI(char *name, AMX *amx, cell *params) +cell PSKeyValueI(const char *name, AMX *amx, cell *params) { if (params[1]==0) { MF_LogError(amx,AMX_ERR_NATIVE,"Invalid particle system handle provided!"); return 0; } KeyValueData kvd; @@ -76,17 +76,17 @@ cell PSKeyValueI(char *name, AMX *amx, c kvd.szValue=&StrData[0]; kvd.fHandled=0; //printf("\"%s\" \"%s\"\n",kvd.szKeyName,kvd.szValue); MDLL_KeyValue(reinterpret_cast(params[1]),&kvd); return 1; } -cell PSKeyValueF(char *name, AMX *amx, cell *params) +cell PSKeyValueF(const char *name, AMX *amx, cell *params) { if (params[1]==0) { MF_LogError(amx,AMX_ERR_NATIVE,"Invalid particle system handle provided!"); return 0; } KeyValueData kvd; @@ -101,17 +101,17 @@ cell PSKeyValueF(char *name, AMX *amx, c //printf("\"%s\" \"%s\"\n",kvd.szKeyName,kvd.szValue); MDLL_KeyValue(reinterpret_cast(params[1]),&kvd); return 1; } -cell PSKeyValueS(char *name, AMX *amx, cell *params) +cell PSKeyValueS(const char *name, AMX *amx, cell *params) { if (params[1]==0) { MF_LogError(amx,AMX_ERR_NATIVE,"Invalid particle system handle provided!"); return 0; } KeyValueData kvd; diff --git a/dlls/ns/ns.h b/dlls/ns/ns.h --- a/dlls/ns/ns.h +++ b/dlls/ns/ns.h @@ -58,17 +58,17 @@ extern edict_t *player_edicts[33]; // St void PlayerPreThink(edict_t *pEntity); void PlayerPreThink_Post(edict_t *pEntity); void PlayerPostThink_Post(edict_t *pEntity); void UpdateClientData( const struct edict_s *ent, int sendweapons, struct clientdata_s *cd ); void StartFrame(void); edict_t* CreateNamedEntity_Post(int className); -void AlertMessage_Post(ALERT_TYPE atype, char *szFmt, ...); +void AlertMessage_Post(ALERT_TYPE atype, const char *szFmt, ...); typedef struct tagAMX_HEADER { int32_t size PACKED; /* size of the "file" */ uint16_t magic PACKED; /* signature */ char file_version; /* file format version */ char amx_version; /* required version of the AMX */ int16_t flags PACKED; diff --git a/dlls/ns/sdk/amxxmodule.cpp b/dlls/ns/sdk/amxxmodule.cpp --- a/dlls/ns/sdk/amxxmodule.cpp +++ b/dlls/ns/sdk/amxxmodule.cpp @@ -2235,17 +2235,17 @@ static META_FUNCTIONS g_MetaFunctions_Ta GetEntityAPI2, GetEntityAPI2_Post, GetNewDLLFunctions, GetNewDLLFunctions_Post, GetEngineFunctions, GetEngineFunctions_Post }; -C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +C_DLLEXPORT int Meta_Query(const char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) { if ((int) CVAR_GET_FLOAT("developer") != 0) UTIL_LogPrintf("[%s] dev: called: Meta_Query; version=%s, ours=%s\n", Plugin_info.logtag, ifvers, Plugin_info.ifvers); // Check for valid pMetaUtilFuncs before we continue. if(!pMetaUtilFuncs) { UTIL_LogPrintf("[%s] ERROR: Meta_Query called with null pMetaUtilFuncs\n", Plugin_info.logtag); @@ -2329,17 +2329,17 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIM #ifdef FN_META_DETACH FN_META_DETACH(); #endif // FN_META_DETACH return TRUE; } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) // linux prototype C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { #else #ifdef _MSC_VER // MSVC: Simulate __stdcall calling convention C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { @@ -3045,17 +3045,17 @@ char* UTIL_VarArgs( char *format, ... ) return string; } //========================================================= // UTIL_LogPrintf - Prints a logged message to console. // Preceded by LOG: ( timestamp ) < message > //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/ns/sdk/amxxmodule.h b/dlls/ns/sdk/amxxmodule.h --- a/dlls/ns/sdk/amxxmodule.h +++ b/dlls/ns/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/ns/sh_list.h b/dlls/ns/sh_list.h --- a/dlls/ns/sh_list.h +++ b/dlls/ns/sh_list.h @@ -14,17 +14,17 @@ // MSVC8 fix for offsetof macro redefition warnings #ifdef _MSC_VER #if _MSC_VER >= 1400 #undef offsetof #endif #endif #include -#include +#include //namespace SourceHook //{ //This class is from CSDM for AMX Mod X /* A circular, doubly-linked list with one sentinel node Empty: diff --git a/dlls/ns/utilfunctions.h b/dlls/ns/utilfunctions.h --- a/dlls/ns/utilfunctions.h +++ b/dlls/ns/utilfunctions.h @@ -119,17 +119,17 @@ int UTIL_FindBuildingHive(void); BOOL UTIL_CheckForPublic(const char *publicname); BOOL UTIL_CheckForNative(const char *NativeName); class CPlayer; CPlayer *UTIL_PlayerByCID(int CID); // Converts something such as RESOURCES into OFFSET_WIN_RESOURCES or OFFSET_LIN_RESOURCES -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) #define MAKE_OFFSET(Offset) OFFSET_LIN_##Offset #define MAKE_MEMBER_OFFSET(Offs) (Offs - OFFSET_LIN_MEMBERFUNCSTART) #else #define MAKE_OFFSET(Offset) OFFSET_WIN_##Offset #define MAKE_MEMBER_OFFSET(Offs) (Offs - OFFSET_WIN_MEMBERFUNCSTART) #endif // __linux__ template diff --git a/dlls/nvault/Journal.cpp b/dlls/nvault/Journal.cpp --- a/dlls/nvault/Journal.cpp +++ b/dlls/nvault/Journal.cpp @@ -1,11 +1,11 @@ #include #include -#if defined __linux__ +#if defined(__linux__) || defined(__APPLE__) #include #endif #include "Journal.h" Journal::Journal(const char *file) { m_File.assign(file); } diff --git a/dlls/nvault/Makefile b/dlls/nvault/Makefile --- a/dlls/nvault/Makefile +++ b/dlls/nvault/Makefile @@ -1,79 +1,123 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../hlsdk/multiplayer MM_ROOT = ../../../metamod/metamod +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OPT_FLAGS = -O3 -funroll-loops -s -pipe -fno-strict-aliasing -fomit-frame-pointer -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = nvault - -BIN_SUFFIX_32 = amxx_i386.so -BIN_SUFFIX_64 = amxx_amd64.so +PROJECT = nvault OBJECTS = sdk/amxxmodule.cpp amxxapi.cpp Binary.cpp Journal.cpp NVault.cpp -#LINK = /lib/libgcc_eh.a /lib/libstdc++-3.4.a -LINK = +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -Isdk +C_OPT_FLAGS = -DNDEBUG -O3 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +LINK = -ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(MM_ROOT) -Isdk + +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared endif +LINK += -m32 -lm -ldl + +CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) + ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -DNDEBUG -Wall -Werror -DHAVE_STDINT_H -fno-rtti -static-libgcc -fno-exceptions -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -ifeq "$(AMD64)" "true" - BINARY = $(NAME)_$(BIN_SUFFIX_64) - CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -m64 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") else - BINARY = $(NAME)_$(BIN_SUFFIX_32) - CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 - OPT_FLAGS += -march=i586 + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< all: mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/sdk - $(MAKE) nvault + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -amd64: - $(MAKE) all AMD64=true +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -nvault: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/sdk/*.o - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Release/$(NAME)_$(BIN_SUFFIX_64) - rm -rf Debug/sdk/*.o - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_64) + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/dlls/nvault/NVault.cpp b/dlls/nvault/NVault.cpp --- a/dlls/nvault/NVault.cpp +++ b/dlls/nvault/NVault.cpp @@ -1,15 +1,15 @@ #include #include "amxxmodule.h" #include "NVault.h" #include "Binary.h" #include "CString.h" -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) #define _snprintf snprintf #endif /** * :TODO: This beast calls strcpy()/new() way too much by creating new strings on the stack. * That's easily remedied and it should be fixed? * ---bail */ diff --git a/dlls/nvault/amxxapi.cpp b/dlls/nvault/amxxapi.cpp --- a/dlls/nvault/amxxapi.cpp +++ b/dlls/nvault/amxxapi.cpp @@ -4,17 +4,17 @@ #include "CQueue.h" #ifdef WIN32 #define MKDIR(p) mkdir(p) #else #define MKDIR(p) mkdir(p, 0755) #endif -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) #include #include #include #else #include #endif CVector g_Vaults; diff --git a/dlls/nvault/sdk/CString.h b/dlls/nvault/sdk/CString.h --- a/dlls/nvault/sdk/CString.h +++ b/dlls/nvault/sdk/CString.h @@ -215,17 +215,17 @@ public: if (len < 1) { return; } if (is_space(v[len-1])) { - for (i=len-1; i>=0; i--) + for (i=len-1; i //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/nvault/sdk/amxxmodule.h b/dlls/nvault/sdk/amxxmodule.h --- a/dlls/nvault/sdk/amxxmodule.h +++ b/dlls/nvault/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/nvault/sdk/sh_list.h b/dlls/nvault/sdk/sh_list.h --- a/dlls/nvault/sdk/sh_list.h +++ b/dlls/nvault/sdk/sh_list.h @@ -14,17 +14,17 @@ // MSVC8 fix for offsetof macro redefition warnings #ifdef _MSC_VER #if _MSC_VER >= 1400 #undef offsetof #endif #endif #include -#include +#include //namespace SourceHook //{ //This class is from CSDM for AMX Mod X /* A circular, doubly-linked list with one sentinel node Empty: diff --git a/dlls/nvault/sdk/sh_tinyhash.h b/dlls/nvault/sdk/sh_tinyhash.h --- a/dlls/nvault/sdk/sh_tinyhash.h +++ b/dlls/nvault/sdk/sh_tinyhash.h @@ -427,17 +427,17 @@ public: { iterator old(*this); _Inc(); return old; } void erase() { if (end || !hash || curbucket < 0 || curbucket >= static_cast(hash->m_numBuckets)) - return true; + return; iterator tmp = *this; ++tmp; delete (*iter); hash->m_Items--; hash->m_Buckets[curbucket]->erase(iter); *this = tmp; } diff --git a/dlls/regex/Makefile b/dlls/regex/Makefile --- a/dlls/regex/Makefile +++ b/dlls/regex/Makefile @@ -1,80 +1,124 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../hlsdk/multiplayer MM_ROOT = ../../../metamod/metamod +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OPT_FLAGS = -O3 -funroll-loops -s -pipe -fomit-frame-pointer -fno-strict-aliasing -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = regex - -BIN_SUFFIX_32 = amxx_i386.so -BIN_SUFFIX_64 = amxx_amd64.so +PROJECT = regex OBJECTS = sdk/amxxmodule.cpp module.cpp CRegEx.cpp +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## + +C_OPT_FLAGS = -DNDEBUG -O3 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang + LINK = -lpcre -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -Isdk +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(MM_ROOT) -Isdk -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ -ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 -Llib_darwin +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared -Llib_linux endif +LINK += -m32 -lm -ldl + +CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) + ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -DNDEBUG -Wall -Werror -fno-exceptions -DHAVE_STDINT_H -static-libgcc -fno-rtti -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -ifeq "$(AMD64)" "true" - BINARY = $(NAME)_$(BIN_SUFFIX_64) - CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -m64 - INCLUDE += -Llib_linux64 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") else - BINARY = $(NAME)_$(BIN_SUFFIX_32) - CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 - OPT_FLAGS += -march=i586 - INCLUDE += -Llib_linux + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< + all: mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/sdk - $(MAKE) regex + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -amd64: - $(MAKE) all AMD64=true +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -regex: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/sdk/*.o - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Release/$(NAME)_$(BIN_SUFFIX_64) - rm -rf Debug/sdk/*.o - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_64) + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/dlls/regex/sdk/amxxmodule.cpp b/dlls/regex/sdk/amxxmodule.cpp --- a/dlls/regex/sdk/amxxmodule.cpp +++ b/dlls/regex/sdk/amxxmodule.cpp @@ -2235,17 +2235,17 @@ static META_FUNCTIONS g_MetaFunctions_Ta GetEntityAPI2, GetEntityAPI2_Post, GetNewDLLFunctions, GetNewDLLFunctions_Post, GetEngineFunctions, GetEngineFunctions_Post }; -C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +C_DLLEXPORT int Meta_Query(const char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) { if ((int) CVAR_GET_FLOAT("developer") != 0) UTIL_LogPrintf("[%s] dev: called: Meta_Query; version=%s, ours=%s\n", Plugin_info.logtag, ifvers, Plugin_info.ifvers); // Check for valid pMetaUtilFuncs before we continue. if(!pMetaUtilFuncs) { UTIL_LogPrintf("[%s] ERROR: Meta_Query called with null pMetaUtilFuncs\n", Plugin_info.logtag); @@ -2329,17 +2329,17 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIM #ifdef FN_META_DETACH FN_META_DETACH(); #endif // FN_META_DETACH return TRUE; } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) // linux prototype C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { #else #ifdef _MSC_VER // MSVC: Simulate __stdcall calling convention C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { @@ -3045,17 +3045,17 @@ char* UTIL_VarArgs( char *format, ... ) return string; } //========================================================= // UTIL_LogPrintf - Prints a logged message to console. // Preceded by LOG: ( timestamp ) < message > //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/regex/sdk/amxxmodule.h b/dlls/regex/sdk/amxxmodule.h --- a/dlls/regex/sdk/amxxmodule.h +++ b/dlls/regex/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/sockets/Makefile b/dlls/sockets/Makefile --- a/dlls/sockets/Makefile +++ b/dlls/sockets/Makefile @@ -1,78 +1,124 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../hlsdk/multiplayer MM_ROOT = ../../../metamod/metamod +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OPT_FLAGS = -O2 -funroll-loops -s -pipe -fno-strict-aliasing -fomit-frame-pointer -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = sockets - -BIN_SUFFIX_32 = amxx_i386.so -BIN_SUFFIX_64 = amxx_amd64.so +PROJECT = sockets OBJECTS = sdk/amxxmodule.cpp sockets.cpp -LINK = +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -Isdk +C_OPT_FLAGS = -DNDEBUG -O2 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +LINK = -ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(MM_ROOT) -Isdk + +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared endif +LINK += -m32 -lm -ldl + +CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) + ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -DNDEBUG -Wall -Werror -fno-exceptions -DHAVE_STDINT_H -static-libgcc -fno-rtti -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -ifeq "$(AMD64)" "true" - BINARY = $(NAME)_$(BIN_SUFFIX_64) - CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -m64 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") else - BINARY = $(NAME)_$(BIN_SUFFIX_32) - CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 - OPT_FLAGS += -march=i586 + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< + all: mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/sdk - $(MAKE) sockets + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -amd64: - $(MAKE) all AMD64=true +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -sockets: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/sdk/*.o - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Release/$(NAME)_$(BIN_SUFFIX_64) - rm -rf Debug/sdk/*.o - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_64) + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/dlls/sockets/sdk/amxxmodule.cpp b/dlls/sockets/sdk/amxxmodule.cpp --- a/dlls/sockets/sdk/amxxmodule.cpp +++ b/dlls/sockets/sdk/amxxmodule.cpp @@ -2235,17 +2235,17 @@ static META_FUNCTIONS g_MetaFunctions_Ta GetEntityAPI2, GetEntityAPI2_Post, GetNewDLLFunctions, GetNewDLLFunctions_Post, GetEngineFunctions, GetEngineFunctions_Post }; -C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +C_DLLEXPORT int Meta_Query(const char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) { if ((int) CVAR_GET_FLOAT("developer") != 0) UTIL_LogPrintf("[%s] dev: called: Meta_Query; version=%s, ours=%s\n", Plugin_info.logtag, ifvers, Plugin_info.ifvers); // Check for valid pMetaUtilFuncs before we continue. if(!pMetaUtilFuncs) { UTIL_LogPrintf("[%s] ERROR: Meta_Query called with null pMetaUtilFuncs\n", Plugin_info.logtag); @@ -2329,17 +2329,17 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIM #ifdef FN_META_DETACH FN_META_DETACH(); #endif // FN_META_DETACH return TRUE; } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) // linux prototype C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { #else #ifdef _MSC_VER // MSVC: Simulate __stdcall calling convention C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { @@ -3045,17 +3045,17 @@ char* UTIL_VarArgs( char *format, ... ) return string; } //========================================================= // UTIL_LogPrintf - Prints a logged message to console. // Preceded by LOG: ( timestamp ) < message > //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/sockets/sdk/amxxmodule.h b/dlls/sockets/sdk/amxxmodule.h --- a/dlls/sockets/sdk/amxxmodule.h +++ b/dlls/sockets/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/sockets/sockets.cpp b/dlls/sockets/sockets.cpp --- a/dlls/sockets/sockets.cpp +++ b/dlls/sockets/sockets.cpp @@ -13,17 +13,17 @@ * - code structure renewed * v0.2 * - added socket_send2 to send data containing null bytes (FALUCO)(AMXX v1.65) */ #include #include #include -#include +#include #ifdef _WIN32 /* Windows */ #include #include #define socklen_t int #else /* Unix/Linux */ diff --git a/dlls/sqlite/Makefile b/dlls/sqlite/Makefile --- a/dlls/sqlite/Makefile +++ b/dlls/sqlite/Makefile @@ -1,112 +1,146 @@ -#(C)2004-2006 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../hlsdk/multiplayer MM_ROOT = ../../../metamod/metamod - -### EDIT BELOW FOR OTHER PROJECTS ### - -OPT_FLAGS = -O3 -funroll-loops -s -pipe -fomit-frame-pointer -fno-strict-aliasing -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -CC = gcc-4.1 -NAME = sqlite SQL = sqlite-source -BIN_SUFFIX_32 = amxx_i386.so -BIN_SUFFIX_64 = amxx_amd64.so +##################################### +### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -CPP_OBJECTS = basic_sql.cpp handles.cpp module.cpp threading.cpp sdk/amxxmodule.cpp oldcompat_sql.cpp -CPP_OBJECTS += thread/BaseWorker.cpp thread/ThreadWorker.cpp thread/PosixThreads.cpp -CPP_OBJECTS += sqlitepp/SqliteQuery.cpp sqlitepp/SqliteResultSet.cpp sqlitepp/SqliteDatabase.cpp sqlitepp/SqliteDriver.cpp +PROJECT = sqlite -C_OBJECTS = $(SQL)/alter.c $(SQL)/analyze.c $(SQL)/attach.c $(SQL)/auth.c $(SQL)/btree.c $(SQL)/build.c \ - $(SQL)/callback.c $(SQL)/complete.c $(SQL)/date.c $(SQL)/delete.c $(SQL)/expr.c $(SQL)/func.c \ - $(SQL)/hash.c $(SQL)/insert.c $(SQL)/legacy.c $(SQL)/loadext.c $(SQL)/main.c $(SQL)/opcodes.c \ - $(SQL)/os.c $(SQL)/os_unix.c $(SQL)/pager.c $(SQL)/parse.c $(SQL)/pragma.c $(SQL)/prepare.c \ - $(SQL)/printf.c $(SQL)/random.c $(SQL)/select.c $(SQL)/table.c $(SQL)/tokenize.c $(SQL)/trigger.c \ - $(SQL)/update.c $(SQL)/utf.c $(SQL)/util.c $(SQL)/vacuum.c $(SQL)/vdbe.c $(SQL)/vdbeapi.c \ - $(SQL)/vdbeaux.c $(SQL)/vdbefifo.c $(SQL)/vdbemem.c $(SQL)/vtab.c $(SQL)/where.c \ +OBJECTS = basic_sql.cpp handles.cpp module.cpp threading.cpp sdk/amxxmodule.cpp oldcompat_sql.cpp \ + thread/BaseWorker.cpp thread/ThreadWorker.cpp thread/PosixThreads.cpp \ + sqlitepp/SqliteQuery.cpp sqlitepp/SqliteResultSet.cpp sqlitepp/SqliteDatabase.cpp \ + sqlitepp/SqliteDriver.cpp +OBJECTS += $(SQL)/alter.c $(SQL)/analyze.c $(SQL)/attach.c $(SQL)/auth.c $(SQL)/btree.c \ + $(SQL)/build.c $(SQL)/callback.c $(SQL)/complete.c $(SQL)/date.c $(SQL)/delete.c \ + $(SQL)/expr.c $(SQL)/func.c $(SQL)/hash.c $(SQL)/insert.c $(SQL)/legacy.c \ + $(SQL)/loadext.c $(SQL)/main.c $(SQL)/opcodes.c $(SQL)/os.c $(SQL)/os_unix.c \ + $(SQL)/pager.c $(SQL)/parse.c $(SQL)/pragma.c $(SQL)/prepare.c $(SQL)/printf.c \ + $(SQL)/random.c $(SQL)/select.c $(SQL)/table.c $(SQL)/tokenize.c $(SQL)/trigger.c \ + $(SQL)/update.c $(SQL)/utf.c $(SQL)/util.c $(SQL)/vacuum.c $(SQL)/vdbe.c $(SQL)/vdbeapi.c \ + $(SQL)/vdbeaux.c $(SQL)/vdbefifo.c $(SQL)/vdbemem.c $(SQL)/vtab.c $(SQL)/where.c -CFLAGS = -Wall -Werror -m32 -CPPFLAGS = -Wall -Wno-non-virtual-dtor -Werror -m32 +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -LINK = -lgcc -static-libgcc -lpthread +C_OPT_FLAGS = -DNDEBUG -O3 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -I$(SQL) -I./sqlitepp -I./sdk -I./thread +LINK = + +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(MM_ROOT) -I$(SQL) -Isqlitepp -Ithread -Isdk + +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared +endif + +LINK += -m32 -lm -ldl -lpthread + +CFLAGS += -DSM_DEFAULT_THREADER -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H \ + -Dstricmp=strcasecmp -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS += $(DEBUG_FLAGS) - CPPFLAGS += $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS += $(OPT_FLAGS) - CPPFLAGS += $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -ifeq "$(GCC_VERSION)" "4" - CFLAGS += -fvisibility=hidden - CPPFLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") +else + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) endif -CPPFLAGS += -DNDEBUG -Wno-deprecated -fno-exceptions -DHAVE_STDINT_H -fno-rtti -CPPFLAGS += -DSM_DEFAULT_THREADER -Dstricmp=strcasecmp -CFLAGS += -DNDEBUG -DHAVE_STDINT_H -DSM_DEFAULT_THREADER -Dstricmp=strcasecmp - -ifeq "$(AMD64)" "true" - BINARY = $(NAME)_$(BIN_SUFFIX_64) - CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -m64 - CPPFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -m64 -else - BINARY = $(NAME)_$(BIN_SUFFIX_32) - CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 - CPPFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 - OPT_FLAGS += -march=i586 +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) endif -OBJ_LINUX_CPP := $(CPP_OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +OBJ_BIN := $(OBJ_BIN:%.c=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CPPFLAGS) -o $@ -c $< - -OBJ_LINUX_C := $(C_OBJECTS:%.c=$(BIN_DIR)/%.o) + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< $(BIN_DIR)/%.o: %.c - $(CC) $(INCLUDE) $(CFLAGS) -c -o $@ $< + $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< all: + mkdir -p $(BIN_DIR) + mkdir -p $(BIN_DIR)/sdk mkdir -p $(BIN_DIR)/thread mkdir -p $(BIN_DIR)/sqlitepp - mkdir -p $(BIN_DIR)/sdk - mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/$(SQL) - $(MAKE) sqlite + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -amd64: - $(MAKE) all AMD64=true +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -sqlite: $(OBJ_LINUX_C) $(OBJ_LINUX_CPP) - $(CPP) $(INCLUDE) $(CPPFLAGS) $(OBJ_LINUX_C) $(OBJ_LINUX_CPP) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/$(SQL)/*.o - rm -rf Release/sdk/*.o - rm -rf Release/sqlitepp/*.o - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Release/$(NAME)_$(BIN_SUFFIX_64) - rm -rf Debug/$(SQL)/*.o - rm -rf Debug/sdk/*.o - rm -rf Debug/sqlitepp/*.o - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_32) - rm -rf Debug/$(NAME)_$(BIN_SUFFIX_64) + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -rf $(BIN_DIR)/thread/*.o + rm -rf $(BIN_DIR)/sqlitepp/*.o + rm -rf $(BIN_DIR)/$(SQL)/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/dlls/sqlite/module.cpp b/dlls/sqlite/module.cpp --- a/dlls/sqlite/module.cpp +++ b/dlls/sqlite/module.cpp @@ -55,17 +55,17 @@ void OnAmxxAttach() MF_AddNatives(g_OldCompatNatives); MF_OverrideNatives(g_OldCompatNatives, MODULE_NAME); char path[255]; MF_BuildPathnameR(path, sizeof(path)-1, "%s/sqlite3", MF_GetLocalInfo("amxx_datadir", "addons/amxmodx/data")); if (!DirExists(path)) { mkdir(path -#if defined __linux__ +#if defined(__linux__) || defined(__APPLE__) , 0775 #endif ); } } void OnAmxxDetach() { diff --git a/dlls/sqlite/sdk/amxxmodule.cpp b/dlls/sqlite/sdk/amxxmodule.cpp --- a/dlls/sqlite/sdk/amxxmodule.cpp +++ b/dlls/sqlite/sdk/amxxmodule.cpp @@ -2235,17 +2235,17 @@ static META_FUNCTIONS g_MetaFunctions_Ta GetEntityAPI2, GetEntityAPI2_Post, GetNewDLLFunctions, GetNewDLLFunctions_Post, GetEngineFunctions, GetEngineFunctions_Post }; -C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +C_DLLEXPORT int Meta_Query(const char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) { if ((int) CVAR_GET_FLOAT("developer") != 0) UTIL_LogPrintf("[%s] dev: called: Meta_Query; version=%s, ours=%s\n", Plugin_info.logtag, ifvers, Plugin_info.ifvers); // Check for valid pMetaUtilFuncs before we continue. if(!pMetaUtilFuncs) { UTIL_LogPrintf("[%s] ERROR: Meta_Query called with null pMetaUtilFuncs\n", Plugin_info.logtag); @@ -2329,17 +2329,17 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIM #ifdef FN_META_DETACH FN_META_DETACH(); #endif // FN_META_DETACH return TRUE; } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) // linux prototype C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { #else #ifdef _MSC_VER // MSVC: Simulate __stdcall calling convention C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { @@ -3045,17 +3045,17 @@ char* UTIL_VarArgs( char *format, ... ) return string; } //========================================================= // UTIL_LogPrintf - Prints a logged message to console. // Preceded by LOG: ( timestamp ) < message > //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/sqlite/sdk/amxxmodule.h b/dlls/sqlite/sdk/amxxmodule.h --- a/dlls/sqlite/sdk/amxxmodule.h +++ b/dlls/sqlite/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/sqlite/sdk/sh_list.h b/dlls/sqlite/sdk/sh_list.h --- a/dlls/sqlite/sdk/sh_list.h +++ b/dlls/sqlite/sdk/sh_list.h @@ -14,17 +14,17 @@ // MSVC8 fix for offsetof macro redefition warnings #ifdef _MSC_VER #if _MSC_VER >= 1400 #undef offsetof #endif #endif #include -#include +#include namespace SourceHook { //This class is from CSDM for AMX Mod X /* A circular, doubly-linked list with one sentinel node diff --git a/dlls/sqlite/sdk/sh_string.h b/dlls/sqlite/sdk/sh_string.h --- a/dlls/sqlite/sdk/sh_string.h +++ b/dlls/sqlite/sdk/sh_string.h @@ -191,17 +191,17 @@ public: if (len < 1) { return; } if (is_space(v[len-1])) { - for (i=len-1; i>=0; i--) + for (i=len-1; ipRight = pRight; pNew->iAgg = -1; if( pToken ){ assert( pToken->dyn==0 ); pNew->span = pNew->token = *pToken; }else if( pLeft ){ if( pRight ){ sqlite3ExprSpan(pNew, &pLeft->span, &pRight->span); - if( pRight->flags && EP_ExpCollate ){ + if( pRight->flags & EP_ExpCollate ){ pNew->flags |= EP_ExpCollate; pNew->pColl = pRight->pColl; } } - if( pLeft->flags && EP_ExpCollate ){ + if( pLeft->flags & EP_ExpCollate ){ pNew->flags |= EP_ExpCollate; pNew->pColl = pLeft->pColl; } } return pNew; } /* diff --git a/dlls/sqlite/sqlitepp/SqliteDriver.cpp b/dlls/sqlite/sqlitepp/SqliteDriver.cpp --- a/dlls/sqlite/sqlitepp/SqliteDriver.cpp +++ b/dlls/sqlite/sqlitepp/SqliteDriver.cpp @@ -22,17 +22,17 @@ bool SqliteDriver::IsCompatDriver(const const char *SqliteDriver::NameString() { return "sqlite"; } int busy_handler(void *unused1, int unused2) { -#if defined __linux__ +#if defined __linux__ || defined __APPLE__ usleep(100000); #else Sleep(100); #endif return 1; } IDatabase *SqliteDriver::Connect2(DatabaseInfo *info, int *errcode, char *error, size_t maxlength) diff --git a/dlls/sqlite/thread/ThreadSupport.h b/dlls/sqlite/thread/ThreadSupport.h --- a/dlls/sqlite/thread/ThreadSupport.h +++ b/dlls/sqlite/thread/ThreadSupport.h @@ -1,10 +1,10 @@ #ifndef _INCLUDE_SOURCEMOD_THREAD_SUPPORT_H #define _INCLUDE_SOURCEMOD_THREAD_SUPPORT_H -#if defined __linux__ +#if defined __linux__ || defined __APPLE__ #include "PosixThreads.h" #elif defined WIN32 #include "WinThreads.h" #endif #endif //_INCLUDE_SOURCEMOD_THREAD_SUPPORT_H diff --git a/dlls/tfcx/CMisc.h b/dlls/tfcx/CMisc.h --- a/dlls/tfcx/CMisc.h +++ b/dlls/tfcx/CMisc.h @@ -1,17 +1,17 @@ #ifndef CMISC_H #define CMISC_H #include "amxxmodule.h" #include "CRank.h" -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define LINUXOFFSET 0 #define CLIP_LINUXOFFSET 0 #else #define LINUXOFFSET 3 #define CLIP_LINUXOFFSET 4 #endif #define TFCMAX_CUSTOMWPNS 5 @@ -100,24 +100,24 @@ enum { TFC_PC_HWGUY, TFC_PC_PYRO, TFC_PC_SPY, TFC_PC_ENGENEER, TFC_PC_CIVILIAN, }; struct weaponsVault { - char* name; - char* logName; + char name[32]; + char logName[32]; short int ammoSlot; bool melee; }; struct traceVault { - char * szName; + const char* szName; char szTag[6]; int iId; int iAction; float fDel; int start; int stop; }; diff --git a/dlls/tfcx/Makefile b/dlls/tfcx/Makefile --- a/dlls/tfcx/Makefile +++ b/dlls/tfcx/Makefile @@ -1,67 +1,124 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../hlsdk/multiplayer MM_ROOT = ../../../metamod/metamod +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OPT_FLAGS = -O3 -funroll-loops -s -pipe -fno-strict-aliasing -fomit-frame-pointer -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = tfcx +PROJECT = tfcx -BIN_SUFFIX = amxx_i386.so +OBJECTS = sdk/amxxmodule.cpp CRank.cpp CMisc.cpp NBase.cpp NRank.cpp usermsg.cpp Utils.cpp \ + moduleconfig.cpp -OBJECTS = sdk/amxxmodule.cpp CRank.cpp CMisc.cpp NBase.cpp NRank.cpp usermsg.cpp Utils.cpp moduleconfig.cpp +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -LINK = +C_OPT_FLAGS = -DNDEBUG -O3 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -Isdk +LINK = -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(MM_ROOT) -Isdk -ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared endif +LINK += -m32 -lm -ldl + +CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) + ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -DNDEBUG -Wall -Wno-non-virtual-dtor -Werror -fno-exceptions -DHAVE_STDINT_H -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -BINARY = $(NAME)_$(BIN_SUFFIX) -CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -OPT_FLAGS += -march=i586 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") +else + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) +endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< all: mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/sdk - $(MAKE) tfcx + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -tfcx: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/sdk/*.o - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX) - rm -rf Debug/sdk/*.o - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX) + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/dlls/tfcx/sdk/amxxmodule.cpp b/dlls/tfcx/sdk/amxxmodule.cpp --- a/dlls/tfcx/sdk/amxxmodule.cpp +++ b/dlls/tfcx/sdk/amxxmodule.cpp @@ -2235,17 +2235,17 @@ static META_FUNCTIONS g_MetaFunctions_Ta GetEntityAPI2, GetEntityAPI2_Post, GetNewDLLFunctions, GetNewDLLFunctions_Post, GetEngineFunctions, GetEngineFunctions_Post }; -C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +C_DLLEXPORT int Meta_Query(const char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) { if ((int) CVAR_GET_FLOAT("developer") != 0) UTIL_LogPrintf("[%s] dev: called: Meta_Query; version=%s, ours=%s\n", Plugin_info.logtag, ifvers, Plugin_info.ifvers); // Check for valid pMetaUtilFuncs before we continue. if(!pMetaUtilFuncs) { UTIL_LogPrintf("[%s] ERROR: Meta_Query called with null pMetaUtilFuncs\n", Plugin_info.logtag); @@ -2329,17 +2329,17 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIM #ifdef FN_META_DETACH FN_META_DETACH(); #endif // FN_META_DETACH return TRUE; } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) // linux prototype C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { #else #ifdef _MSC_VER // MSVC: Simulate __stdcall calling convention C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { @@ -3045,17 +3045,17 @@ char* UTIL_VarArgs( char *format, ... ) return string; } //========================================================= // UTIL_LogPrintf - Prints a logged message to console. // Preceded by LOG: ( timestamp ) < message > //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/tfcx/sdk/amxxmodule.h b/dlls/tfcx/sdk/amxxmodule.h --- a/dlls/tfcx/sdk/amxxmodule.h +++ b/dlls/tfcx/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/tfcx/tfcx.h b/dlls/tfcx/tfcx.h --- a/dlls/tfcx/tfcx.h +++ b/dlls/tfcx/tfcx.h @@ -44,17 +44,17 @@ #ifndef GETPLAYERAUTHID #define GETPLAYERAUTHID (*g_engfuncs.pfnGetPlayerAuthId) #endif extern AMX_NATIVE_INFO stats_Natives[]; extern AMX_NATIVE_INFO base_Natives[]; -extern weaponsVault weaponData[MAX_WEAPONS]; +extern weaponsVault weaponData[TFCMAX_WEAPONS]; extern traceVault traceData[MAX_TRACE]; typedef void (*funEventCall)(void*); extern funEventCall modMsgsEnd[MAX_REG_MSGS]; extern funEventCall modMsgs[MAX_REG_MSGS]; extern void (*function)(void*); extern void (*endfunction)(void*); diff --git a/dlls/ts/tsfun/Makefile b/dlls/ts/tsfun/Makefile --- a/dlls/ts/tsfun/Makefile +++ b/dlls/ts/tsfun/Makefile @@ -1,67 +1,123 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../../hlsdk/multiplayer MM_ROOT = ../../../../metamod/metamod +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OPT_FLAGS = -O3 -funroll-loops -s -pipe -fno-strict-aliasing -fomit-frame-pointer -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = tsfun - -BIN_SUFFIX = amxx_i386.so +PROJECT = tsfun OBJECTS = sdk/amxxmodule.cpp -LINK = +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -Isdk +C_OPT_FLAGS = -DNDEBUG -O3 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +LINK = -ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(MM_ROOT) -Isdk + +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared endif +LINK += -m32 -lm -ldl + +CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) + ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -DNDEBUG -Wall -Werror -fno-exceptions -DHAVE_STDINT_H -static-libgcc -fno-rtti -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -BINARY = $(NAME)_$(BIN_SUFFIX) -CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -OPT_FLAGS += -march=i586 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") +else + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) +endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< all: mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/sdk - $(MAKE) tsfun + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -tsfun: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/sdk/*.o - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX) - rm -rf Debug/sdk/*.o - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX) + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/dlls/ts/tsfun/sdk/amxxmodule.cpp b/dlls/ts/tsfun/sdk/amxxmodule.cpp --- a/dlls/ts/tsfun/sdk/amxxmodule.cpp +++ b/dlls/ts/tsfun/sdk/amxxmodule.cpp @@ -2235,17 +2235,17 @@ static META_FUNCTIONS g_MetaFunctions_Ta GetEntityAPI2, GetEntityAPI2_Post, GetNewDLLFunctions, GetNewDLLFunctions_Post, GetEngineFunctions, GetEngineFunctions_Post }; -C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +C_DLLEXPORT int Meta_Query(const char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) { if ((int) CVAR_GET_FLOAT("developer") != 0) UTIL_LogPrintf("[%s] dev: called: Meta_Query; version=%s, ours=%s\n", Plugin_info.logtag, ifvers, Plugin_info.ifvers); // Check for valid pMetaUtilFuncs before we continue. if(!pMetaUtilFuncs) { UTIL_LogPrintf("[%s] ERROR: Meta_Query called with null pMetaUtilFuncs\n", Plugin_info.logtag); @@ -2329,17 +2329,17 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIM #ifdef FN_META_DETACH FN_META_DETACH(); #endif // FN_META_DETACH return TRUE; } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) // linux prototype C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { #else #ifdef _MSC_VER // MSVC: Simulate __stdcall calling convention C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { @@ -2543,16 +2543,24 @@ C_DLLEXPORT int AMXX_Query(int *interfac return AMXX_OK; } // request function #define REQFUNC(name, fptr, type) if ((fptr = (type)reqFnptrFunc(name)) == 0) return AMXX_FUNC_NOT_PRESENT // request optional function #define REQFUNC_OPT(name, fptr, type) fptr = (type)reqFnptrFunc(name) +C_DLLEXPORT int AMXX_CheckGame(const char *game) +{ +#ifdef FN_AMXX_CHECKGAME + return FN_AMXX_CHECKGAME(game); +#else + return AMXX_GAME_OK; +#endif +} C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc) { // Check pointer if (!reqFnptrFunc) return AMXX_PARAM; g_fn_RequestFunction = reqFnptrFunc; @@ -3037,17 +3045,17 @@ char* UTIL_VarArgs( char *format, ... ) return string; } //========================================================= // UTIL_LogPrintf - Prints a logged message to console. // Preceded by LOG: ( timestamp ) < message > //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/ts/tsfun/sdk/amxxmodule.h b/dlls/ts/tsfun/sdk/amxxmodule.h --- a/dlls/ts/tsfun/sdk/amxxmodule.h +++ b/dlls/ts/tsfun/sdk/amxxmodule.h @@ -5,30 +5,36 @@ // prevent double include #ifndef __AMXXMODULE_H__ #define __AMXXMODULE_H__ // config #include "moduleconfig.h" +#include // size_t // metamod include files #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -50,24 +56,27 @@ struct amxx_module_info_s }; // return values from functions called by amxx #define AMXX_OK 0 /* no error */ #define AMXX_IFVERS 1 /* interface version */ #define AMXX_PARAM 2 /* Invalid parameter */ #define AMXX_FUNC_NOT_PRESENT 3 /* Function not present */ +#define AMXX_GAME_OK 0 /* This module can load on the current game mod. */ +#define AMXX_GAME_BAD 1 /* This module can not load on the current game mod. */ + // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -299,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -386,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -824,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -848,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1252,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1405,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1429,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1833,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2018,16 +2027,20 @@ int FN_ShouldCollide_Post(edict_t *pentT #endif // USE_METAMOD #ifdef FN_AMXX_QUERY void FN_AMXX_QUERY(void); #endif // FN_AMXX_QUERY +#ifdef FN_AMXX_CHECKGAME +int FN_AMXX_CHECKGAME(const char *); +#endif // FN_AMXX_CHECKGAME + #ifdef FN_AMXX_ATTACH void FN_AMXX_ATTACH(void); #endif // FN_AMXX_ATTACH #ifdef FN_AMXX_DETACH void FN_AMXX_DETACH(void); #endif // FN_AMXX_DETACH @@ -2103,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2162,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/dlls/ts/tsx/CMisc.h b/dlls/ts/tsx/CMisc.h --- a/dlls/ts/tsx/CMisc.h +++ b/dlls/ts/tsx/CMisc.h @@ -34,30 +34,30 @@ #include "amxxmodule.h" #include "CRank.h" #define TSMAX_CUSTOMWPNS 5 #define TSMAX_WEAPONS 39 + TSMAX_CUSTOMWPNS -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define TSKNIFE_OFFSET 31 // owner offset in knife entity #else #define TSKNIFE_OFFSET 35 #endif #define TSPWUP_SLOWMO 1 #define TSPWUP_INFAMMO 2 #define TSPWUP_KUNGFU 4 #define TSPWUP_SLOWPAUSE 8 #define TSPWUP_DFIRERATE 16 #define TSPWUP_SJUMP 256 -#if defined __linux__ +#if defined(__linux__) || defined(__APPLE__) #define EXTRAOFFSET 5 #else #define EXTRAOFFSET 0 #endif #define TSX_SDUCK_OFFSET (27+EXTRAOFFSET) #define TSX_SPEED1_OFFSET (85+EXTRAOFFSET) #define TSX_PHYSICS_OFFSET (86+EXTRAOFFSET) diff --git a/dlls/ts/tsx/Makefile b/dlls/ts/tsx/Makefile --- a/dlls/ts/tsx/Makefile +++ b/dlls/ts/tsx/Makefile @@ -1,68 +1,124 @@ -#(C)2004-2005 AMX Mod X Development Team +# (C)2004-2013 AMX Mod X Development Team # Makefile written by David "BAILOPAN" Anderson -HLSDK = ../../../../hlsdk +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HLSDK = ../../../../hlsdk/multiplayer MM_ROOT = ../../../../metamod/metamod +##################################### ### EDIT BELOW FOR OTHER PROJECTS ### +##################################### -OPT_FLAGS = -O2 -funroll-loops -s -pipe -fno-strict-aliasing -fomit-frame-pointer -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -NAME = tsx +PROJECT = tsx -BIN_SUFFIX = amxx_i386.so +OBJECTS = sdk/amxxmodule.cpp CMisc.cpp CRank.cpp NBase.cpp NRank.cpp Utils.cpp moduleconfig.cpp \ + usermsg.cpp -OBJECTS = sdk/amxxmodule.cpp CMisc.cpp CRank.cpp NBase.cpp \ - NRank.cpp Utils.cpp moduleconfig.cpp usermsg.cpp \ +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## -LINK = +C_OPT_FLAGS = -DNDEBUG -O2 -funroll-loops -fomit-frame-pointer -pipe +C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 +C_GCC4_FLAGS = -fvisibility=hidden +CPP_GCC4_FLAGS = -fvisibility-inlines-hidden +CPP = gcc +CPP_OSX = clang -INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ - -I$(MM_ROOT) -I$(HLSDK)/common -Isdk +LINK = -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared \ + -I$(MM_ROOT) -Isdk -ifeq "$(GCC_VERSION)" "4" - OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + LIB_SUFFIX = _amxx + CFLAGS += -DOSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + LIB_SUFFIX = _amxx_i386 + CFLAGS += -DLINUX + LINK += -shared endif +LINK += -m32 -lm -ldl + +CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -DHAVE_STDINT_H -fno-strict-aliasing -m32 -Wall -Werror +CPPFLAGS += -fno-exceptions -fno-rtti + +BINARY = $(PROJECT)$(LIB_SUFFIX).$(LIB_EXT) + ifeq "$(DEBUG)" "true" BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) + CFLAGS += $(C_DEBUG_FLAGS) else BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) + CFLAGS += $(C_OPT_FLAGS) + LINK += -s endif -CFLAGS += -DNDEBUG -Wall -Wno-non-virtual-dtor -Werror -fno-exceptions -DHAVE_STDINT_H -static-libgcc -fno-rtti -m32 +IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") -BINARY = $(NAME)_$(BIN_SUFFIX) -CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 -OPT_FLAGS += -march=i586 +ifeq "$(IS_CLANG)" "1" + CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") + CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") +else + CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) + CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) +endif -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(C_GCC4_FLAGS) + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +# Clang >= 3 || GCC >= 4.7 +ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" + CFLAGS += -Wno-delete-non-virtual-dtor +endif + +# OS is Linux and not using clang +ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" + LINK += -static-libgcc +endif + +OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) + +# This will break if we include other Makefiles, but is fine for now. It allows +# us to make a copy of this file that uses altered paths (ie. Makefile.mine) +# or other changes without mucking up the original. +MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< all: mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)/sdk - $(MAKE) tsx + $(MAKE) -f $(MAKEFILE_NAME) $(PROJECT) -tsx: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) +$(PROJECT): $(OBJ_BIN) + $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) -debug: - $(MAKE) all DEBUG=true +debug: + $(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true default: all clean: - rm -rf Release/sdk/*.o - rm -rf Release/*.o - rm -rf Release/$(NAME)_$(BIN_SUFFIX) - rm -rf Debug/sdk/*.o - rm -rf Debug/*.o - rm -rf Debug/$(NAME)_$(BIN_SUFFIX) + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/sdk/*.o + rm -f $(BIN_DIR)/$(BINARY) + diff --git a/dlls/ts/tsx/sdk/amxxmodule.cpp b/dlls/ts/tsx/sdk/amxxmodule.cpp --- a/dlls/ts/tsx/sdk/amxxmodule.cpp +++ b/dlls/ts/tsx/sdk/amxxmodule.cpp @@ -2235,17 +2235,17 @@ static META_FUNCTIONS g_MetaFunctions_Ta GetEntityAPI2, GetEntityAPI2_Post, GetNewDLLFunctions, GetNewDLLFunctions_Post, GetEngineFunctions, GetEngineFunctions_Post }; -C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +C_DLLEXPORT int Meta_Query(const char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) { if ((int) CVAR_GET_FLOAT("developer") != 0) UTIL_LogPrintf("[%s] dev: called: Meta_Query; version=%s, ours=%s\n", Plugin_info.logtag, ifvers, Plugin_info.ifvers); // Check for valid pMetaUtilFuncs before we continue. if(!pMetaUtilFuncs) { UTIL_LogPrintf("[%s] ERROR: Meta_Query called with null pMetaUtilFuncs\n", Plugin_info.logtag); @@ -2329,17 +2329,17 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIM #ifdef FN_META_DETACH FN_META_DETACH(); #endif // FN_META_DETACH return TRUE; } -#ifdef __linux__ +#if defined(__linux__) || defined(__APPLE__) // linux prototype C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { #else #ifdef _MSC_VER // MSVC: Simulate __stdcall calling convention C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { @@ -3045,17 +3045,17 @@ char* UTIL_VarArgs( char *format, ... ) return string; } //========================================================= // UTIL_LogPrintf - Prints a logged message to console. // Preceded by LOG: ( timestamp ) < message > //========================================================= -void UTIL_LogPrintf( char *fmt, ... ) +void UTIL_LogPrintf( const char *fmt, ... ) { va_list argptr; static char string[1024]; va_start ( argptr, fmt ); vsnprintf ( string, sizeof(string), fmt, argptr ); va_end ( argptr ); diff --git a/dlls/ts/tsx/sdk/amxxmodule.h b/dlls/ts/tsx/sdk/amxxmodule.h --- a/dlls/ts/tsx/sdk/amxxmodule.h +++ b/dlls/ts/tsx/sdk/amxxmodule.h @@ -15,21 +15,26 @@ #ifdef USE_METAMOD #include #include #include "osdep.h" #endif // #ifdef USE_METAMOD // DLL Export #undef DLLEXPORT -#ifndef __linux__ +#if defined(WIN32) || defined(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__linux__) && !defined(LINUX) #define LINUX +#elif defined(__APPLE__) && !defined(OSX) +#define OSX #endif #undef C_DLLEXPORT #define C_DLLEXPORT extern "C" DLLEXPORT // ***** AMXX stuff ***** // module interface version was 1 @@ -61,17 +66,17 @@ struct amxx_module_info_s // *** Small stuff *** // The next section is copied from the amx.h file // Copyright (c) ITB CompuPhase, 1997-2005 #if defined HAVE_STDINT_H #include #else - #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__ #if defined HAVE_INTTYPES_H #include #else #include #endif #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L /* The ISO C99 defines the int16_t and int_32t types. If the compiler got * here, these types are probably undefined. @@ -303,17 +308,17 @@ typedef int (AMXAPI *AMX_DEBUG)(struct t #if defined __GNUC__ #define PACKED __attribute__((packed)) #else #define PACKED #endif #if !defined AMX_NO_ALIGN - #if defined LINUX || defined __FreeBSD__ + #if defined LINUX || defined __FreeBSD__ || defined __APPLE__ #pragma pack(1) /* structures must be packed (byte-aligned) */ #elif defined MACOS && defined __MWERKS__ #pragma options align=mac68k #else #pragma pack(push) #pragma pack(1) /* structures must be packed (byte-aligned) */ #if defined __TURBOC__ #pragma option -a- /* "pack" pragma for older Borland compilers */ @@ -390,28 +395,28 @@ enum { AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ AMX_ERR_USERDATA, /* unable to set user data field (table full) */ AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ AMX_ERR_PARAMS, /* parameter error */ AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ }; #if !defined AMX_NO_ALIGN - #if defined __linux__ + #if defined(__linux__) || defined(__APPLE__) #pragma pack() /* reset default packing */ #else #pragma pack(pop) /* reset previous packing */ #endif #endif // ***** declare functions ***** #ifdef USE_METAMOD -void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_LogPrintf( const char *fmt, ... ); void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); short FixedSigned16( float value, float scale ); unsigned short FixedUnsigned16( float value, float scale ); #ifdef FN_META_QUERY void FN_META_QUERY(void); #endif // FN_META_QUERY @@ -828,21 +833,21 @@ int FN_InconsistentFile_Post(const edict #ifdef FN_AllowLagCompensation_Post int FN_AllowLagCompensation_Post(void); #endif // FN_AllowLagCompensation_Post #ifdef FN_PrecacheModel -int FN_PrecacheModel(char *s); +int FN_PrecacheModel(const char *s); #endif // FN_PrecacheModel #ifdef FN_PrecacheSound -int FN_PrecacheSound(char *s); +int FN_PrecacheSound(const char *s); #endif // FN_PrecacheSound #ifdef FN_SetModel void FN_SetModel(edict_t *e, const char *m); #endif // FN_SetModel #ifdef FN_ModelIndex int FN_ModelIndex(const char *m); @@ -852,17 +857,17 @@ int FN_ModelIndex(const char *m); int FN_ModelFrames(int modelIndex); #endif // FN_ModelFrames #ifdef FN_SetSize void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize #ifdef FN_ChangeLevel -void FN_ChangeLevel(char *s1, char *s2); +void FN_ChangeLevel(const char *s1, const char *s2); #endif // FN_ChangeLevel #ifdef FN_GetSpawnParms void FN_GetSpawnParms(edict_t *ent); #endif // FN_GetSpawnParms #ifdef FN_SaveSpawnParms void FN_SaveSpawnParms(edict_t *ent); @@ -1256,37 +1261,37 @@ void FN_RunPlayerMove(edict_t *fakeclien int FN_NumberOfEntities(void); #endif // FN_NumberOfEntities #ifdef FN_GetInfoKeyBuffer char *FN_GetInfoKeyBuffer(edict_t *e); #endif // FN_GetInfoKeyBuffer #ifdef FN_InfoKeyValue -char *FN_InfoKeyValue(char *infobuffer, char *key); +char *FN_InfoKeyValue(char *infobuffer, const char *key); #endif // FN_InfoKeyValue #ifdef FN_SetKeyValue -void FN_SetKeyValue(char *infobuffer, char *key, char *value); +void FN_SetKeyValue(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue #ifdef FN_SetClientKeyValue -void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue #ifdef FN_IsMapValid -int FN_IsMapValid(char *filename); +int FN_IsMapValid(const char *filename); #endif // FN_IsMapValid #ifdef FN_StaticDecal void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal #ifdef FN_PrecacheGeneric -int FN_PrecacheGeneric(char *s); +int FN_PrecacheGeneric(const char *s); #endif // FN_PrecacheGeneric #ifdef FN_GetPlayerUserId int FN_GetPlayerUserId(edict_t *e ); #endif // FN_GetPlayerUserId #ifdef FN_BuildSoundMsg void FN_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -1409,21 +1414,21 @@ const char *FN_GetPlayerAuthId(edict_t * #endif // FN_GetPlayerAuthId #ifdef FN_PrecacheModel_Post -int FN_PrecacheModel_Post(char *s); +int FN_PrecacheModel_Post(const char *s); #endif // FN_PrecacheModel_Post #ifdef FN_PrecacheSound_Post -int FN_PrecacheSound_Post(char *s); +int FN_PrecacheSound_Post(const char *s); #endif // FN_PrecacheSound_Post #ifdef FN_SetModel_Post void FN_SetModel_Post(edict_t *e, const char *m); #endif // FN_SetModel_Post #ifdef FN_ModelIndex_Post int FN_ModelIndex_Post(const char *m); @@ -1433,17 +1438,17 @@ int FN_ModelIndex_Post(const char *m); int FN_ModelFrames_Post(int modelIndex); #endif // FN_ModelFrames_Post #ifdef FN_SetSize_Post void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); #endif // FN_SetSize_Post #ifdef FN_ChangeLevel_Post -void FN_ChangeLevel_Post(char *s1, char *s2); +void FN_ChangeLevel_Post(const char *s1, const char *s2); #endif // FN_ChangeLevel_Post #ifdef FN_GetSpawnParms_Post void FN_GetSpawnParms_Post(edict_t *ent); #endif // FN_GetSpawnParms_Post #ifdef FN_SaveSpawnParms_Post void FN_SaveSpawnParms_Post(edict_t *ent); @@ -1837,37 +1842,37 @@ void FN_RunPlayerMove_Post(edict_t *fake int FN_NumberOfEntities_Post(void); #endif // FN_NumberOfEntities_Post #ifdef FN_GetInfoKeyBuffer_Post char *FN_GetInfoKeyBuffer_Post(edict_t *e); #endif // FN_GetInfoKeyBuffer_Post #ifdef FN_InfoKeyValue_Post -char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +char *FN_InfoKeyValue_Post(char *infobuffer, const char *key); #endif // FN_InfoKeyValue_Post #ifdef FN_SetKeyValue_Post -void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +void FN_SetKeyValue_Post(char *infobuffer, const char *key, const char *value); #endif // FN_SetKeyValue_Post #ifdef FN_SetClientKeyValue_Post -void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, const char *key, const char *value); #endif // FN_SetClientKeyValue_Post #ifdef FN_IsMapValid_Post -int FN_IsMapValid_Post(char *filename); +int FN_IsMapValid_Post(const char *filename); #endif // FN_IsMapValid_Post #ifdef FN_StaticDecal_Post void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); #endif // FN_StaticDecal_Post #ifdef FN_PrecacheGeneric_Post -int FN_PrecacheGeneric_Post(char *s); +int FN_PrecacheGeneric_Post(const char *s); #endif // FN_PrecacheGeneric_Post #ifdef FN_GetPlayerUserId_Post int FN_GetPlayerUserId_Post(edict_t *e ); #endif // FN_GetPlayerUserId_Post #ifdef FN_BuildSoundMsg_Post void FN_BuildSoundMsg_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); @@ -2111,17 +2116,17 @@ enum LibType typedef void (*AUTHORIZEFUNC)(int player, const char *authstring); typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef int (*PFN_ADD_NEW_NATIVES) (const AMX_NATIVE_INFO * /*list*/); typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); -typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef void (*PFN_PRINT_SRVCONSOLE) (const char * /*format*/, ...); typedef const char * (*PFN_GET_MODNAME) (void); typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); @@ -2170,18 +2175,18 @@ typedef void * (*PFN_ALLOCATOR) (co typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, const unsigned int /*type*/, const void* /*addr*/ ); #endif typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); -typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); -typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); diff --git a/installer/amxmodx-installer.nsi b/installer/amxmodx-installer.nsi --- a/installer/amxmodx-installer.nsi +++ b/installer/amxmodx-installer.nsi @@ -1,13 +1,13 @@ ;(C)2004 AMX Mod X Development Team ; Licensed under the GNU General Public License ; Originally written by -=HaXoMaTiC=- !define PRODUCT_NAME "AMX Mod X Installer" -!define PRODUCT_VERSION "1.8.1" +!define PRODUCT_VERSION "1.8.2" !define PRODUCT_PUBLISHER "AMX Mod X Dev Team" !define PRODUCT_WEB_SITE "http://www.amxmodx.org/" !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Installer.exe" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" !define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir" !include "MUI.nsh" @@ -144,39 +144,51 @@ Section "MainSection" SEC01 File "installer\files\base\addons\amxmodx\data\lang\statscfg.txt" File "installer\files\base\addons\amxmodx\data\lang\statsx.txt" File "installer\files\base\addons\amxmodx\data\lang\stats_dod.txt" File "installer\files\base\addons\amxmodx\data\lang\telemenu.txt" File "installer\files\base\addons\amxmodx\data\lang\time.txt" File "installer\files\base\addons\amxmodx\data\lang\timeleft.txt" SetOutPath "$INSTDIR\files\base\dlls" File "installer\files\base\addons\amxmodx\dlls\amxmodx_mm.dll" + File "installer\files\base\addons\amxmodx\dlls\amxmodx_mm.dylib" File "installer\files\base\addons\amxmodx\dlls\amxmodx_mm_i386.so" File "installer\files\base\addons\amxmodx\dlls\metamod.dll" + File "installer\files\base\addons\amxmodx\dlls\metamod.dylib" File "installer\files\base\addons\amxmodx\dlls\metamod_i386.so" SetOutPath "$INSTDIR\files\base\modules" File "installer\files\base\addons\amxmodx\modules\nvault_amxx.dll" + File "installer\files\base\addons\amxmodx\modules\nvault_amxx.dylib" File "installer\files\base\addons\amxmodx\modules\nvault_amxx_i386.so" File "installer\files\base\addons\amxmodx\modules\engine_amxx.dll" + File "installer\files\base\addons\amxmodx\modules\engine_amxx.dylib" File "installer\files\base\addons\amxmodx\modules\engine_amxx_i386.so" File "installer\files\base\addons\amxmodx\modules\fakemeta_amxx.dll" + File "installer\files\base\addons\amxmodx\modules\fakemeta_amxx.dylib" File "installer\files\base\addons\amxmodx\modules\fakemeta_amxx_i386.so" File "installer\files\base\addons\amxmodx\modules\fun_amxx.dll" + File "installer\files\base\addons\amxmodx\modules\fun_amxx.dylib" File "installer\files\base\addons\amxmodx\modules\fun_amxx_i386.so" File "installer\files\base\addons\amxmodx\modules\geoip_amxx.dll" + File "installer\files\base\addons\amxmodx\modules\geoip_amxx.dylib" File "installer\files\base\addons\amxmodx\modules\geoip_amxx_i386.so" File "installer\files\base\addons\amxmodx\modules\sqlite_amxx.dll" + File "installer\files\base\addons\amxmodx\modules\sqlite_amxx.dylib" File "installer\files\base\addons\amxmodx\modules\sqlite_amxx_i386.so" File "installer\files\base\addons\amxmodx\modules\mysql_amxx.dll" + File "installer\files\base\addons\amxmodx\modules\mysql_amxx.dylib" File "installer\files\base\addons\amxmodx\modules\mysql_amxx_i386.so" File "installer\files\base\addons\amxmodx\modules\regex_amxx.dll" + File "installer\files\base\addons\amxmodx\modules\regex_amxx.dylib" File "installer\files\base\addons\amxmodx\modules\regex_amxx_i386.so" File "installer\files\base\addons\amxmodx\modules\sockets_amxx.dll" + File "installer\files\base\addons\amxmodx\modules\sockets_amxx.dylib" File "installer\files\base\addons\amxmodx\modules\sockets_amxx_i386.so" File "installer\files\base\addons\amxmodx\modules\hamsandwich_amxx.dll" + File "installer\files\base\addons\amxmodx\modules\hamsandwich_amxx.dylib" File "installer\files\base\addons\amxmodx\modules\hamsandwich_amxx_i386.so" SetOutPath "$INSTDIR\files\base\plugins" File "installer\files\base\addons\amxmodx\plugins\admin.amxx" File "installer\files\base\addons\amxmodx\plugins\adminchat.amxx" File "installer\files\base\addons\amxmodx\plugins\admincmd.amxx" File "installer\files\base\addons\amxmodx\plugins\adminhelp.amxx" File "installer\files\base\addons\amxmodx\plugins\adminslots.amxx" File "installer\files\base\addons\amxmodx\plugins\adminvote.amxx" @@ -202,17 +214,19 @@ Section "MainSection" SEC01 File "installer\files\base\addons\amxmodx\scripting\adminchat.sma" File "installer\files\base\addons\amxmodx\scripting\admincmd.sma" File "installer\files\base\addons\amxmodx\scripting\adminhelp.sma" File "installer\files\base\addons\amxmodx\scripting\adminslots.sma" File "installer\files\base\addons\amxmodx\scripting\adminvote.sma" File "installer\files\base\addons\amxmodx\scripting\amxxpc" File "installer\files\base\addons\amxmodx\scripting\amxxpc.exe" File "installer\files\base\addons\amxmodx\scripting\amxxpc32.dll" + File "installer\files\base\addons\amxmodx\scripting\amxxpc32.dylib" File "installer\files\base\addons\amxmodx\scripting\amxxpc32.so" + File "installer\files\base\addons\amxmodx\scripting\amxxpc_osx" File "installer\files\base\addons\amxmodx\scripting\antiflood.sma" File "installer\files\base\addons\amxmodx\scripting\cmdmenu.sma" File "installer\files\base\addons\amxmodx\scripting\compile.exe" File "installer\files\base\addons\amxmodx\scripting\compile.sh" File "installer\files\base\addons\amxmodx\scripting\dlsym" File "installer\files\base\addons\amxmodx\scripting\dlsym64" File "installer\files\base\addons\amxmodx\scripting\imessage.sma" SetOutPath "$INSTDIR\files\base\scripting\include" @@ -327,18 +341,20 @@ Section "MainSection" SEC01 File "installer\files\cstrike\addons\amxmodx\configs\modules.ini" File "installer\files\cstrike\addons\amxmodx\configs\plugins.ini" File "installer\files\cstrike\addons\amxmodx\configs\stats.ini" SetOutPath "$INSTDIR\files\cstrike\data" File "installer\files\cstrike\addons\amxmodx\data\csstats.amxx" File "installer\files\cstrike\addons\amxmodx\data\WinCSX.exe" SetOutPath "$INSTDIR\files\cstrike\modules" File "installer\files\cstrike\addons\amxmodx\modules\cstrike_amxx.dll" + File "installer\files\cstrike\addons\amxmodx\modules\cstrike_amxx.dylib" File "installer\files\cstrike\addons\amxmodx\modules\cstrike_amxx_i386.so" File "installer\files\cstrike\addons\amxmodx\modules\csx_amxx.dll" + File "installer\files\cstrike\addons\amxmodx\modules\csx_amxx.dylib" File "installer\files\cstrike\addons\amxmodx\modules\csx_amxx_i386.so" SetOutPath "$INSTDIR\files\cstrike\plugins" File "installer\files\cstrike\addons\amxmodx\plugins\miscstats.amxx" File "installer\files\cstrike\addons\amxmodx\plugins\restmenu.amxx" File "installer\files\cstrike\addons\amxmodx\plugins\statsx.amxx" File "installer\files\cstrike\addons\amxmodx\plugins\stats_logging.amxx" SetOutPath "$INSTDIR\files\cstrike\scripting" File "installer\files\cstrike\addons\amxmodx\scripting\csstats.sma" @@ -351,18 +367,20 @@ Section "MainSection" SEC01 File "installer\files\dod\addons\amxmodx\configs\cvars.ini" File "installer\files\dod\addons\amxmodx\configs\maps.ini" File "installer\files\dod\addons\amxmodx\configs\modules.ini" File "installer\files\dod\addons\amxmodx\configs\plugins.ini" SetOutPath "$INSTDIR\files\dod\data" File "installer\files\dod\addons\amxmodx\data\dodstats.amxx" SetOutPath "$INSTDIR\files\dod\modules" File "installer\files\dod\addons\amxmodx\modules\dodfun_amxx.dll" + File "installer\files\dod\addons\amxmodx\modules\dodfun_amxx.dylib" File "installer\files\dod\addons\amxmodx\modules\dodfun_amxx_i386.so" File "installer\files\dod\addons\amxmodx\modules\dodx_amxx.dll" + File "installer\files\dod\addons\amxmodx\modules\dodx_amxx.dylib" File "installer\files\dod\addons\amxmodx\modules\dodx_amxx_i386.so" SetOutPath "$INSTDIR\files\dod\plugins" File "installer\files\dod\addons\amxmodx\plugins\plmenu.amxx" File "installer\files\dod\addons\amxmodx\plugins\stats.amxx" File "installer\files\dod\addons\amxmodx\plugins\statssounds.amxx" File "installer\files\dod\addons\amxmodx\plugins\stats_logging.amxx" SetOutPath "$INSTDIR\files\dod\scripting" File "installer\files\dod\addons\amxmodx\scripting\dodstats.sma" @@ -410,16 +428,17 @@ Section "MainSection" SEC01 File "installer\files\tfc\addons\amxmodx\configs\cvars.ini" File "installer\files\tfc\addons\amxmodx\configs\maps.ini" File "installer\files\tfc\addons\amxmodx\configs\modules.ini" File "installer\files\tfc\addons\amxmodx\configs\plugins.ini" SetOutPath "$INSTDIR\files\tfc\data" File "installer\files\tfc\addons\amxmodx\data\tfcstats.amxx" SetOutPath "$INSTDIR\files\tfc\modules" File "installer\files\tfc\addons\amxmodx\modules\tfcx_amxx.dll" + File "installer\files\tfc\addons\amxmodx\modules\tfcx_amxx.dylib" File "installer\files\tfc\addons\amxmodx\modules\tfcx_amxx_i386.so" SetOutPath "$INSTDIR\files\tfc\plugins" File "installer\files\tfc\addons\amxmodx\plugins\plmenu.amxx" File "installer\files\tfc\addons\amxmodx\plugins\stats.amxx" File "installer\files\tfc\addons\amxmodx\plugins\statssounds.amxx" File "installer\files\tfc\addons\amxmodx\plugins\stats_logging.amxx" SetOutPath "$INSTDIR\files\tfc\scripting" File "installer\files\tfc\addons\amxmodx\scripting\plmenu.sma" @@ -522,16 +541,17 @@ Section Uninstall Delete "$INSTDIR\files\tfc\scripting\statssounds.sma" Delete "$INSTDIR\files\tfc\scripting\stats.sma" Delete "$INSTDIR\files\tfc\scripting\plmenu.sma" Delete "$INSTDIR\files\tfc\plugins\stats_logging.amxx" Delete "$INSTDIR\files\tfc\plugins\statssounds.amxx" Delete "$INSTDIR\files\tfc\plugins\stats.amxx" Delete "$INSTDIR\files\tfc\plugins\plmenu.amxx" Delete "$INSTDIR\files\tfc\modules\tfcx_amxx_i386.so" + Delete "$INSTDIR\files\tfc\modules\tfcx_amxx.dylib" Delete "$INSTDIR\files\tfc\modules\tfcx_amxx.dll" Delete "$INSTDIR\files\tfc\data\tfcstats.amxx" Delete "$INSTDIR\files\tfc\configs\plugins.ini" Delete "$INSTDIR\files\tfc\configs\modules.ini" Delete "$INSTDIR\files\tfc\configs\maps.ini" Delete "$INSTDIR\files\tfc\configs\cvars.ini" Delete "$INSTDIR\files\tfc\configs\core.ini" Delete "$INSTDIR\files\ns\scripting\unstuck.sma" @@ -562,18 +582,20 @@ Section Uninstall Delete "$INSTDIR\files\dod\scripting\stats.sma" Delete "$INSTDIR\files\dod\scripting\plmenu.sma" Delete "$INSTDIR\files\dod\scripting\dodstats.sma" Delete "$INSTDIR\files\dod\plugins\stats_logging.amxx" Delete "$INSTDIR\files\dod\plugins\statssounds.amxx" Delete "$INSTDIR\files\dod\plugins\stats.amxx" Delete "$INSTDIR\files\dod\plugins\plmenu.amxx" Delete "$INSTDIR\files\dod\modules\dodx_amxx_i386.so" + Delete "$INSTDIR\files\dod\modules\dodx_amxx.dylib" Delete "$INSTDIR\files\dod\modules\dodx_amxx.dll" Delete "$INSTDIR\files\dod\modules\dodfun_amxx_i386.so" + Delete "$INSTDIR\files\dod\modules\dodfun_amxx.dylib" Delete "$INSTDIR\files\dod\modules\dodfun_amxx.dll" Delete "$INSTDIR\files\dod\data\dodstats.amxx" Delete "$INSTDIR\files\dod\configs\plugins.ini" Delete "$INSTDIR\files\dod\configs\modules.ini" Delete "$INSTDIR\files\dod\configs\maps.ini" Delete "$INSTDIR\files\dod\configs\cvars.ini" Delete "$INSTDIR\files\dod\configs\core.ini" Delete "$INSTDIR\files\cstrike\scripting\stats_logging.sma" @@ -581,21 +603,23 @@ Section Uninstall Delete "$INSTDIR\files\cstrike\scripting\restmenu.sma" Delete "$INSTDIR\files\cstrike\scripting\miscstats.sma" Delete "$INSTDIR\files\cstrike\scripting\csstats.sma" Delete "$INSTDIR\files\cstrike\plugins\stats_logging.amxx" Delete "$INSTDIR\files\cstrike\plugins\statsx.amxx" Delete "$INSTDIR\files\cstrike\plugins\restmenu.amxx" Delete "$INSTDIR\files\cstrike\plugins\miscstats.amxx" Delete "$INSTDIR\files\cstrike\modules\csx_amxx_i386.so" + Delete "$INSTDIR\files\cstrike\modules\csx_amxx.dylib" Delete "$INSTDIR\files\cstrike\modules\csx_amxx.dll" Delete "$INSTDIR\files\cstrike\modules\cstrike_amxx_i386.so" + Delete "$INSTDIR\files\cstrike\modules\cstrike_amxx.dylib" Delete "$INSTDIR\files\cstrike\modules\cstrike_amxx.dll" Delete "$INSTDIR\files\cstrike\data\csstats.amxx" - Delete "$INSTDIR\files\cstrike\data\WinCSX.amxx" + Delete "$INSTDIR\files\cstrike\data\WinCSX.exe" Delete "$INSTDIR\files\cstrike\configs\stats.ini" Delete "$INSTDIR\files\cstrike\configs\plugins.ini" Delete "$INSTDIR\files\cstrike\configs\modules.ini" Delete "$INSTDIR\files\cstrike\configs\maps.ini" Delete "$INSTDIR\files\cstrike\configs\cvars.ini" Delete "$INSTDIR\files\cstrike\configs\core.ini" Delete "$INSTDIR\files\cstrike\configs\cmds.ini" Delete "$INSTDIR\files\cstrike\configs\amxx.cfg" @@ -734,38 +758,50 @@ Section Uninstall Delete "$INSTDIR\files\base\plugins\admin_sql.amxx" Delete "$INSTDIR\files\base\plugins\adminvote.amxx" Delete "$INSTDIR\files\base\plugins\adminslots.amxx" Delete "$INSTDIR\files\base\plugins\adminhelp.amxx" Delete "$INSTDIR\files\base\plugins\admincmd.amxx" Delete "$INSTDIR\files\base\plugins\adminchat.amxx" Delete "$INSTDIR\files\base\plugins\admin.amxx" Delete "$INSTDIR\files\base\modules\nvault_amxx_i386.so" + Delete "$INSTDIR\files\base\modules\nvault_amxx.dylib" Delete "$INSTDIR\files\base\modules\nvault_amxx.dll" Delete "$INSTDIR\files\base\modules\sockets_amxx_i386.so" + Delete "$INSTDIR\files\base\modules\sockets_amxx.dylib" Delete "$INSTDIR\files\base\modules\sockets_amxx.dll" Delete "$INSTDIR\files\base\modules\regex_amxx_i386.so" + Delete "$INSTDIR\files\base\modules\regex_amxx.dylib" Delete "$INSTDIR\files\base\modules\regex_amxx.dll" Delete "$INSTDIR\files\base\modules\sqlite_amxx_i386.so" + Delete "$INSTDIR\files\base\modules\sqlite_amxx.dylib" Delete "$INSTDIR\files\base\modules\sqlite_amxx.dll" Delete "$INSTDIR\files\base\modules\mysql_amxx_i386.so" + Delete "$INSTDIR\files\base\modules\mysql_amxx.dylib" Delete "$INSTDIR\files\base\modules\mysql_amxx.dll" Delete "$INSTDIR\files\base\modules\geoip_amxx_i386.so" + Delete "$INSTDIR\files\base\modules\geoip_amxx.dylib" Delete "$INSTDIR\files\base\modules\geoip_amxx.dll" Delete "$INSTDIR\files\base\modules\fun_amxx_i386.so" + Delete "$INSTDIR\files\base\modules\fun_amxx.dylib" Delete "$INSTDIR\files\base\modules\fun_amxx.dll" Delete "$INSTDIR\files\base\modules\fakemeta_amxx_i386.so" + Delete "$INSTDIR\files\base\modules\fakemeta_amxx.dylib" Delete "$INSTDIR\files\base\modules\fakemeta_amxx.dll" Delete "$INSTDIR\files\base\modules\engine_amxx_i386.so" + Delete "$INSTDIR\files\base\modules\engine_amxx.dylib" Delete "$INSTDIR\files\base\modules\engine_amxx.dll" Delete "$INSTDIR\files\base\modules\hamsandwich_amxx_i386.so" + Delete "$INSTDIR\files\base\modules\hamsandwich_amxx.dylib" Delete "$INSTDIR\files\base\modules\hamsandwich_amxx.dll" Delete "$INSTDIR\files\base\dlls\metamod_i386.so" + Delete "$INSTDIR\files\base\dlls\metamod.dylib" Delete "$INSTDIR\files\base\dlls\metamod.dll" Delete "$INSTDIR\files\base\dlls\amxmodx_mm_i386.so" + Delete "$INSTDIR\files\base\dlls\amxmodx_mm.dylib" Delete "$INSTDIR\files\base\dlls\amxmodx_mm.dll" Delete "$INSTDIR\files\base\data\lang\timeleft.txt" Delete "$INSTDIR\files\base\data\lang\time.txt" Delete "$INSTDIR\files\base\data\lang\telemenu.txt" Delete "$INSTDIR\files\base\data\lang\stats_dod.txt" Delete "$INSTDIR\files\base\data\lang\statsx.txt" Delete "$INSTDIR\files\base\data\lang\statscfg.txt" Delete "$INSTDIR\files\base\data\lang\scrollmsg.txt" diff --git a/installer/builder/Build.cs b/installer/builder/Build.cs --- a/installer/builder/Build.cs +++ b/installer/builder/Build.cs @@ -12,31 +12,35 @@ namespace AMXXRelease public Build(Config cfg) { m_Mods = new ArrayList(); m_Cfg = cfg; CoreMod core = new CoreMod(); ModCstrike cstrike = new ModCstrike(); + ModDoD dod = new ModDoD(); + ModTFC tfc = new ModTFC(); m_Mods.Add(core); m_Mods.Add(cstrike); + m_Mods.Add(dod); + m_Mods.Add(tfc); - ModDoD dod = new ModDoD(); - ModEsf esf = new ModEsf(); - ModNs ns = new ModNs(); - ModTFC tfc = new ModTFC(); - ModTs ts = new ModTs(); + // These mods don't have OS X builds + if (!Releaser.IsOSX) + { + ModEsf esf = new ModEsf(); + ModNs ns = new ModNs(); + ModTs ts = new ModTs(); - m_Mods.Add(dod); - m_Mods.Add(esf); - m_Mods.Add(ns); - m_Mods.Add(tfc); - m_Mods.Add(ts); + m_Mods.Add(esf); + m_Mods.Add(ns); + m_Mods.Add(ts); + } } public virtual int GetMods() { return m_Mods.Count; } public virtual AMod GetMod(int i) diff --git a/installer/builder/CoreMod.cs b/installer/builder/CoreMod.cs --- a/installer/builder/CoreMod.cs +++ b/installer/builder/CoreMod.cs @@ -26,24 +26,27 @@ namespace AMXXRelease { return null; } //annoyingly complicated file exclusion filter public override sealed bool ExcludeCopy(string file) { if ( ((file.IndexOf(".so")!=-1) || (ABuilder.GetFileName(file).CompareTo("amxxpc")==0)) - && (Releaser.IsWindows) ) + && (Releaser.IsWindows || Releaser.IsOSX) ) + return true; + if ( ((file.IndexOf(".dylib")!=-1) || (ABuilder.GetFileName(file).CompareTo("amxxpc_osx")==0)) + && (!Releaser.IsOSX) ) return true; if ( (file.IndexOf(".sh")!=-1) && Releaser.IsWindows ) return true; if ( ((file.IndexOf(".exe")!=-1) || (file.IndexOf(".dll")!=-1)) && (!Releaser.IsWindows) ) return true; - if ( (file.IndexOf("dlsym")!=-1) && Releaser.IsWindows ) + if ( (file.IndexOf("dlsym")!=-1) && (Releaser.IsWindows || Releaser.IsOSX) ) return true; if (ABuilder.GetFileName(file).CompareTo("svn_version.tpl") == 0) { return true; } return base.ExcludeCopy(file); } diff --git a/installer/builder/LinuxBuilder.cs b/installer/builder/LinuxBuilder.cs --- a/installer/builder/LinuxBuilder.cs +++ b/installer/builder/LinuxBuilder.cs @@ -34,17 +34,17 @@ namespace AMXXRelease chmod.WorkingDirectory = dir; chmod.Arguments = "-R 755 " + file_list; chmod.UseShellExecute = false; Process c = Process.Start(chmod); c.WaitForExit(); c.Close(); - info.Arguments = "zcvf \"" + target + ".tar.gz\" " + file_list; + info.Arguments = "zcvf \"" + target + "-linux.tar.gz\" " + file_list; info.UseShellExecute = false; Process p = Process.Start(info); p.WaitForExit(); p.Close(); } public override void AmxxPc(string inpath, string args) diff --git a/installer/builder/MacBuilder.cs b/installer/builder/MacBuilder.cs new file mode 100644 --- /dev/null +++ b/installer/builder/MacBuilder.cs @@ -0,0 +1,111 @@ +using System; +using System.Diagnostics; +using System.IO; + +namespace AMXXRelease +{ + //Build process for Mac OS X + public class MacBuilder : ABuilder + { + private string m_AmxxPc; + + public override void OnBuild() + { + m_AmxxPc = PropSlashes(m_Cfg.GetSourceTree() + "/plugins/amxxpc_osx"); + } + + public override void CompressDir(string target, string dir) + { + ProcessStartInfo info = new ProcessStartInfo(); + + info.FileName = m_Cfg.CompressPath(); + info.WorkingDirectory = dir; + + string [] files = Directory.GetFiles(dir); + string file_list = ""; + for (int i=0; i + + - \ No newline at end of file + diff --git a/installer/builder/builder.exe b/installer/builder/builder.exe index 1dc67f9a7586e5ebd936faf88868984f37439f25..f9a44acd1c8e5fe1a5da4fc8feae9f05af6a1193 GIT binary patch literal 19968 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 FzX7h9Y19A! diff --git a/installer/builder/mac.info b/installer/builder/mac.info new file mode 100644 --- /dev/null +++ b/installer/builder/mac.info @@ -0,0 +1,6 @@ +compress = /usr/bin/zip +source = /Users/Scott/Code/hl/amxmodx-central +makeopts = +output = /Users/Scott/Code/hl/amxmodx-bin +devenv = /usr/bin/make +release = amxmodx-1.8.2 diff --git a/plugins/amxxpc b/plugins/amxxpc index 58ac0e05fb44e4d53a5f48da59912dda2021e3ac..5f060f06c09d685b7bbbb49046e556191cfa3d1c GIT binary patch literal 150762 zc$~Do3t&{$wJDRoyjdriKl%^);_u1dNf!KJe~Z(sZ-aj` zqwV-xI@V(OaJq%Y#d<3w?l&ciyD-|0zvGa{U$i*}{%W9m4UCPyc%&zyE@l{f%-SRB zi~pw1fAVL5(^b)S{JEeIf1&yrP;VLGzZkRrrrL$~-c&pPhT4UTeJgKVzU0Q6MY+?Y zJ%3uM$?HL$d>4LM@JoW<9q{`;{1Q#Lx4`dm_>F?!?eI&3-vszgHtD(^em{WU6!_g> z_PHqnuS_!qHd?NYD0jmz1AaHc?>hLU!!HGXmzwpS$hjK!pKPW!GqsPth;}&FR`dCLW_pF0PJ-W6@S6xf2mHps?`pH|I~E~} z_}?{V8fOvwPk>)C{9w9BzVW}?;CJf?cs8K;_C5#C3TKMe34X8tse7csuwgm=*FKM9x<5B-zO z`ZBY=Q4;k9P~R5O-)D}0*sR}e=Es})#nArMP0@Co_i->gr_6ehw^&x0d8bvhUlp1h zlfI|S=f9fxF{sbXAEZw)@k2Spd3h1>i{NLeS)XU(^D7hHIx|1btbfsj--hEy!2cWM zpNxRl3;DSb{5faB``GLs2ZG%)b+En1tj{p%y9w%_kEqX(hW5V$`)5ZH{7XR!e`ofO zGyDI<%>UZN|3_xtWA#mv8H z!XIN9{116FX;^-``CMzZpBqs}`Vn;e{ixf2V5z!mMb+I4ezb78x?ovO?Y!m77c93_ zRsHDxC5x+;tMitrRaMw{eyy+s^J^C@Tef5wr1#Y>S-t?$?OO~n7rD`FJI8R+rwX|mbGU_o;wNx)( zu;9m#nZIx`7Qz25zQtgPer#E`KygRch^W#JXzUe4w@Jo|3X@Daln;_pMwx@7{$g zQf~HCRV`ftyjrlVN?lR~G~J6&4=!C$wQzCu5-;_bsisW67m!@A^1cO2)rCtIhta-o z-s1Zf)S8Vv;ci%PClp{OlXt@hPKg|N=x{?3gy-c8tL{VjxM;(aTLIv`^Oi3d(yD6l zg1V}jd5ckc!dNc>q(=rYZ`rbW4_-+AMG5&qRn>yUzWYb$HOQ|K2OE(l;B_*NhQ$l# zn?-5&60eu5ke_zJY~-eRSB${8l&Y!~_y04TLl#&27T<@kF5Yl5HJm^1{soKGd9_2^ zUNE~bv-dAtjLXdAKS8{6g`i=Or6Kh1yim-BK}AG;ix;e1y5K%_!Tdq6`Gt38=TzN% zLnM z0aI{jk}w5lG#OKHwo@?$r!);ya2PW%1t&8TQ!pO6n1XXzfGIfHg_wc^UyLajtrASZ zQLn%hob%b3g0Y*6DNN{mOu^Bw!4#Z;T1;;jHZ=+y(p8X;f$3h2DbU=6DLBE+n1Z9d z5mPXxEtrC%{}`s=Fh7YY7_4V71;_Unn1a*tOH3iCcpg)5u3x|u9Ox~Wg5&%$rr!<4n{PV7{30 zI3qR1n9rm<&P+`O=94LpGgO0aNHCuAI8!x9P|!(voUxjvn72?KXRc-?=1&e_9%ry- zHPKIboXMJIqM!0Oqctr=Kjm>|Yn~+fDUUN;^9!P%@;K8q&lCNW#~H8LLiAG}XTD|| z(NB4lfSNXnv+C7 zz zyso~j2}ZN1j-EKJP5uujWQ>E)VZxpMgT9_UQCKfQC(-^nXJ)kB-=6E(DSN7}0{pw9!IfaDBDt8i#a{~<7c#Es<1QyM6 z3ORyCZ~$7{9oNZv*>Q-0Y$j0T;Dv;e3;MNO7` zQ3b0X0-~m@eh7$4_3vZ7s-0&$ug`Wc$$v~8&9hznE@$FiW=m=F_o@z_9n0@=B_3hX zDQ&an;4rg@{yCkqhy!yviGPJ|m?tE-TI;i`4lN)v30S48-?Q-SRAsAd4d+oX05b=- z@nSbGNKkfFj7~hj_C9s`9BT()PG(POyJuEsh`z}7@w~wOP1+~%g5-bL9?I-MfCC6< z&5q8H8!zdi(23}r)tM39IDx~I-2;&B9u1s0gph!mS)D*y&&SYJPH964^2|t5Q#>=0 zw_$hn`<@x8+t58wuky@D+lJdysto+=+=f0%g#4AP$-o(7PGAtplQZQYNP!)u+{J1E zuUdC33Wf@Nu1fO!uUg5cC-1;9JbzGU@ch&rIEv?W)ywPBJYT7vl!GvnY5slGM!m`3 zMh(>O`FpovaJ~b_S7Ujcn890@*m0^CF*h`t62L)W;5cE$ILN4Y-R1eiBBAG_uZ=u?ZbPLoKP zCHvcyre|&9IptW20ouuta*XD-fXQy{xQzjLrHLc4`?WoC``OrCC@M_{8B9@gsYPkR z%?1tdlU~6JAwP4lz^YDSZ|uT+`#ERRvF1uiX+jh73Ko&TX=iOpQ=%B(p*#MJIOiYg zYtFsOvU=4`fM`?q5c$_SZ0wx&zK#0fCRap1(M_+CRGnF9{DB-BcW8Z4>NQ$l zbc^E09W@X@IlsB&Dhqe*L|pv`m8Lm>H?jxHFNrMA!}44zkBTh65z9w_bNSc685kHD z&PP!0S%q9dX9OYY`4a0AP}hNQQY-YifG=`$3GjNQ6w&`bp+=NiBT8GsrM8IDhr*?D zMCtr+X;eh%v~X#3L}^;MG$x|-8Ym6k3WT@tv9N@2;RJKQOX9aTBp_0#*S!5Y~Vq3Xvh28KY=NFks>zv-*|RGHdf3=r~7eE|Z$)SoH_` zl-8@KV=JX~nq<~DM>kKiLIdsZ^2KWrou+j#C^XX-_iLZY!`i|~{h{_stJl_?2RIbL zW2v>d($-vL1wqjl_hA(@?Q72K8=?A?S$(QG@09j;C-GodBgOv^hyxfRQzsFd8~u_Fh4dg#VY&41wN;)&>a&vbG5pp`L97SDnY&R~GkTN=o8E=zR>DnEzl=a^nBsnL3|jO!xTovDL>kr4{$VQlPY!or|5t<`E_F9_MK>l%+nsFU*V`eh zd-&B_hYVU#3(9O#&sH3u=h+ay;{YF*8E2s%6c2dC0+0msbo{Wa9B3tbccAi9n*I%G zu1eT}=f&*EcP*f+s?mgMSgusBc@Ux^#s3cERzDbRS2nMqCy0(7W@CAllh1G^cCfNI zaN@4da8BYG7i`bRqPJA03 z$H3mtfbuzV%0WKO-6hkB3x+DJ8#Ooj`{?Uqn70FCkDd=u{s1U1cL=zw%mJ$TSEf5? z#t$&gB3MAjMru7j72Slst>uroS7YmE+_>YxvlDuE zXDa?!2qyWfRI>vQ*Lj`Y->WqJ92nZW+qq*rakNFk(_v^sJSAqIhSb*Cv!czkKL*UlLsY^KM;awy<;#X|zQpjX=s4xmxek?BR#5Y)#6O6V2t#NuQl%{*eqfhEk{C9~Nr~yGE zjB`o=i468|1;8t0GiUF>^G+gS>fGQDQ2$oiwbvnf2OL7U0FR(`8q8UZ)WN5)iLjVz z!nH7qsQpk;NpEw7-70E8Br=TSTCF=1!>L@o9(O6yKox1P+i~`#lT5yX#{hs@00vY@ zK`!YFWif7>%#(Ss?C%8$t57!KVK59-qc63muY}l15wTW90l4SFj2ngS3T=-){dT44 z3*nrr%g`ym7o2i+8oK0Dz$FK@t6mFUxvE68?-<(scSEzk9Gd;<(Cm<*)rWzWiX#7~ zu+}Qn2lPC9dK%lKE*NZZkM0{liu9$<^p#F^s$O{>q#Uxb=__N^485oy*aq47^p)}I z4Z81~Xq=F~GC{psuRJRnC#SDWRu%2j7#v4mnwGvY&F6=>g%*WzT=&YzV++kq;STgf zd6Ss^mGNXBD`JCF(eW*{=ta~PR02=MV7`V+(9LJjE2$i3EF%S`JA(wG-eSU5Ng8sc z0q(jQ#Jz?Fs|-OySwY2cl*>1hRxn}Khhe%>xIB)bSfT(Fg{o#_)fg_1r(Q8)L|?cU znni#uo#7xk8CH_QXp$GR(JHeMG?u!!YmyiwgBrnLxa5^h?~Ds;g!DYOqJ89~#g)b# zR$zWjgw#_9V3M-w)p6l9pAL&xd&r4_wpD3z;yODEp>P&F+$G{cTze+}ARdgsj|fIw zLVO3-3Fg#?Iw0EyXdY~$o!6v3S2}@PF*zN<8WGqV*fvB7@V7KH&C*`O z&aGnE0u1YV8j|~8iE0N51IxaaN~e8%ne@d_8d^O+Z5EPV{5sHM#$&-`^O;8C@|(oh^M}1EOZqnh0kz%a4@ZH>_~%M3n3W}b|s|RfX!4mz(c*P zAGyp9k+JHrY9GWfS-~2uUB=CcO?|>oZ~Aw#q>^xKv~yPVe(jtM^-YO(PF8Q%&PAyS z+BxvY$Dw^rLn@7>DgYRV!~&YzF<9^|v;b@yrlAhkK8dGhaSC=~ zs)yRLTn{e58aCVGFw320xyvk%HOu3)_IQBS_*-*Mknhj9n~=?=#EbtOYZ{%6RLUe6 zFL%%afl#xDUF6v=uK<;qni$Z|I#`ZV@n<+mS_=6KqH*PHvQ0&EgHQLt3~74oo3_*c zbHpJe_bRyMl`?w|C`&wTstwlQBwlX!Sf5jH}h9T zz%4?xA??*`WKAu4d7Um$2uaRoQ~*mIud$FcS#}TT{&ojYLpi{Nk>Wub_h~lOG+;~6)HLvs8EYS z3cpLH+q0xbiw4yw`Xss1AG_qssn#akLZ!7s>uXdtzcYGpij`I{ZyJQ$n-j)FOgxaC zaxfjp7)BY2ZOXoMkRj!#?L!O(fbjrT%1=6A7?wMXWye5$)+mp6vf0C6wRsTM6Kz9! ztisU=+M`29Cs64K>e&lG5mG<9VDweg1z|liv(Ous&gD0wzm3ZN$)AfQf-2$XFMV^*I98#zG_D+`-V& zfDs)DqtrBn8Kk=$w^G}%B}DrztYNNnmdO)``UNFq&@!mDgE>U)5U&GSoH~ZNCX+G? z+g;&MWbo7pEbdmay}n2%2hkTxKTZ0Ar%q(@tt5xx{Er~PQ9scAGmfOFCU z4+TooZy+%_5=|10m}ltnv%)bt1PjRw1k*_&4MU=cqM<$wf<6-NBc>ni@_B@76>4s<^zFe?t=cOV74(X{@?ez0UAHpuBQ2r&5>c;)@JQDfdt9-!%2=JjDQYd9qePm015qA(x| zKh*vn@A-pom+trtTC+qHH=F)r(=TU{zCJP#{hP4FnI;qFc!(V_CxE9;B7KSiotth> zpCpTY9$uRcPBuHDwK=2!!~N1lGOAsg4)z%}QH8K1zKx=uF&4K%1!iK-zd(a_R%Ob!OigL7w>lQ|o15-Wdo~+HV(JB~3hT5Z(u>OjO z_JhMJ`WfpGG_f2p-TY2OxxgnK@!7b|IvgLe(3_sL4q*cJQC>VWWKKiw&!PEd{8(h# zAt(@$V@S&$sx>uh$Ou9K1>8z2j7ha&?+6Q44KJ8K)bqei%AHZdWThNDjRtE_082~( ztii3Uld_1v*db{5<%J*Al(FMX^C~S)I z;yXk9A83u6r?*Futs;xYjy!dmY~qxsP8*4b*jrd&TmUenmv-0Ex&AEHjaz@pi*L}H zz?G6THl>#r-eyTLK;#PmKq2m;Nc&kWgfp<(f(Jfp++-2r7&GZ^G-E5{yF!fms_wU>O9A)2z*J%?^rodbUuK*f$QT}uaNM!KK(+v;HJ|AIGI0)$3r#22GI~Fzb5zqW(3>0 z4^K{Nf^$w&e>^v;3C=i86Oc4UCU+arfnqH!v)o8`Px0hrxl^pf6!R?UUK{r=V1&9Y}%2rt-y1zU@ zL<)-!i>DeK>0sSgf`w%2aplV6g7Y-((9K|qX-?n!Wb@8A^FyFzOKcP5HTL?Bl|yM?~l0Irai&ILS* ziOPB>5E=h5!75}`@f;WN65Lv-2wDTgio(zqYjOOJG2+Ccm@SPBe(*72SSSk37@v0U zi&=hbaQDZ^T8A&6ydrbCm6eEHc~DtwP6g0X$fnJvF&EDb{zUXp|48K>Y^uQK$Faec zADft%+aNPTHH7CqSZf~hAd|9j6R4Oy6uSdgR50D7PT(2ZeF^J_ICE4y%*0Wbh>hf` z*r4@eQ+rWIvD?NT6xBZj`ago|(AGu?^v+;QD(JAbZnj{;Tte@akIeI4aXuDD3n`IT zy16ew*;O<;@h=RIOK4lbMVl#hWm6lvW~tYw9K#!+LELy_z4{y(&mrmHHOAkjmZLYQ zfnXWRW4Z1t!3J&mh42$oQ;xxUrpp_-;$*buARelUt64blIb1%fXB-76mw=H^Ydo}i zmHSGI?@dH#8y?0%M;8RUc-7MhE$nKd^hbWX-|&5c%NP2+Q?1pHwk!T>yrWYlOP}C5 zZm`NAmE!V$>KlWn#A~J{;5!7+$EEF#qhll*Nqst4f=%(*PTjzwaonEG!|$KOLBDvS zdA8eap3NqhXR=9jMhg*q7T&D9c2A7BR@vpXScHT*h97-qL^o#gEC+ueIq{^j>w(cv zogVOX*5AytlG%Q622Uz4c2;Wxc0JCj=g8`JSO%Vl%YmXpfM_eUJkPUIdv?-g z$DU`{UOrWp_V&Eh54h0i;;2t^-3fG3pG(KIfzSR7K_`$~+N=zF!WI_~(M1bT>@Wry9^8LG*6u0K&E1Ni=7~-uftg zxzzI?P-b2~h`4WvvNw2_SX^>+@hkZ9B%YJ3?3yYL?&!eI)7Nk#+pE0TRjr+|>#nQy zRI8pRt4VlsCL~mo58}0?l!L(NByjx^UiXkI#YgxYSvu15#!&tg0)OV}!hFa&VgfWi zdzkoBFqA(9z@Hi6Ye}wX*4-WeJ~@F)xd+Y-=hKx2@o7HJTnWtF@;~9ywlsWCu&h7; zY`{bR8e&)%ZLn#(3yD!GagJdKoYF?Rb#kbR*6&657teFt7x3?Uz&7?r<;By)LiuL( zMm+qRZSpS;=C#`}fO{A4Ep*<#QkKrKBRy{pldlX^e!#yplYg;D`%Q<4e`!Pcmj?X1 zGt56nG}}*dHX3*r!MAG#-%3J!OaEhtZ#n27rU^g|y8zP)!8aRT8qs!VMDXnqpr8U) z${*@SNw7o>bDF59}4rc6A~X-H6B`~&+!I;&@l=94gntOM`ei`~IMxFn_N3UTk& zWmV(M)?Z5J^o%iRNfbZce8a}xp^&IFIzyFPz?1I>~;3gl!iXcVKH z$9S$RG--J(|U z@AKV640_!*lxnC^{4SU=FQVXU1|?vs((Oci;RVDuS%(ro@l8Q|2au=Bwk``1pE*eU z1U%XMaKA}>2@vl>;uX}YH$dm$eK7ns8ZGyN(XJUb+6!-p(MoVMhpkJZ(Xxh(w&H@( zXa;scr{FO#Fkd&Z`0i_!D zp0*67?bJRo+B5quwnTRB9nMLjEe1!s5(CQVGCL{l4L0I)6+RycE*o93>Ib8v zlue(<&^?%~KXC*ZiZ%g=JjwZ+3S%jNNNlNP^E!UkCW8mu@N457G z54}GMeD&3h*zrSwic_yQs4+XQw8loX0wGS)I%52|&yl1w{oZVjuZp0@6u0_8gz|H< zxcLAKSz)jv+VRFixF6&kg(pziG0>FWw$Xxk`6CvQez2CtT{2)ISutRC8zqdEQ@?90 z(g{#vwE)={9PGhc^d;w!IIZI{vu73NU0SW%DMx@ngo(!HI1r-V&dl)Z9!Zmw&DV%K zc1gSN-rFnq)}J8%NaEXA-2R#E&~feK7zCts*tN6J#wtO=)_R=KfR(9n8xU^fC$j;=W1kfr;RyYaiW_xQAhkY4#?|e@;^8 z;?<4ovEQB8sX=1r+RsgD?}1K}u+v{6JCTsCf+27hCu2MgaiIOor1l`R9t~ohj6MDs zYTZilDWOEiE90O&BFqkjMwkfg?@auQe;*E_H2Ezd>gwx<4KqkdXqY`_%b7R;ld09) z?Z%|`&!E*5XrX5fBo5%+P_yB62vX0Jw4e=uKGpuoM5$Xlen(K}h zuw72C#r?ADZFmLsD)D|%Ds55B-d#**2&;DEh3Qm?hm*5Ie315Q@86M#S0YmZNUrSv zRN4GAZm2bp1_M9!RZ^NPhQBOy+TvJNa!bFdGI^by&v5Y{Iunnw@;JUQmS;Ixd2HhA z+NXFoaEY5OiC3DoSm}_fg#hX=xL3kMR}Q_0Z-R&6D4E2UJNU!SuFM4d231!keKiZl zA{0v8_QcbmASr4qJxn`pSkar62!nhe(JI??E4py0llkRq&eH1K{0vmE&r^Qd{nK~<9A!6wt(li#?4m6Z6QQXI{KrX&e?UK<1wtOITiG-pz^35! z$AsYDP&;pQ&p?mn1xf%z{blil7P-5_!1pc!D^Y<8Kf{T5LwAg&S8Q-@Hq~Iumj&aiiSfa;rWHQ|Rvh<< zg^5i$Xzt;I5yx5NzsBz(v4!)4_5plpqiO(1`^>ftzgSj;Mgt6|uzl@+jTr^zZ}mf{ z(I=gO5faY=wVx{fWBs(HmPXsUlY;$_rF-SU@AVl*SH3;@C$c@5i;jnDto}n;I>g=y zrlP+gj|GY_6vs=~|AiA$Aki5nl*Q|DSF?6$xn28fj6Ty2RwEwb7W}x7f1i2}z6w%+ zuYzP~XKZS+c1CVduf4ZlwDC~bC0rx&$bwdWPX)J?|vC^`5 zX<34_ELmEXCN0YZ)r@U?@8U^^Uii8kTns#uQjv<_eKbGz;H-f`p|49=^AXO)nm?k8 z#Oe})p8{_}?~9j+_nDQ}Y`IzD*$$Rv=h=3aC37pwa&&4Z96Jh*M%l^vFyGmj+lC=8 zZqs4z3jj^;%CK&Hzw?6kwH#ftdn!N(Y~KmPCT#1=bwt_ZTQT@ zb3Z=Ui|4p^;rRjaT!POF#PehL{6q2lCO#L5XXpRIbC!6{#pheZb2C0Cisu*b`6}`J zE5KuvSmv+|Brx~gbZ~1*?6(%zqO=i5( zng`ujuhR5Gv!mbaSdSg=R9Yp3dbe5mpjr7qWM!UNIbc@yQYDP3_?xY?r|!~c-)O~f z;8!)I`(o*s1n8^>Ug&WN^v(^wu&oO9)d~dTTUVR*K!4ABihfF1E*C7VO#ygLJcoW9 zi3@^f|64>mFg?FV)S5B zYw^D4biD6*Gu`)eDXp`wGq7Xx71T9B8X2ThTxy5%+1AMReP4sZam&c<_kK$P z%O{HR^b)sIyuYg7BV~EMG~cGdSCM8)(4{rkMhz#ab%Ox2u%|xL>iI&QXO>v0#0DkP z%@P}x$WU^dSt3(O6qHR1%<6JcJ)qAV!0KDg>JqcM5M%9` z=SlF-D@`lUqd7on^{a-EE&sz93_c_Umx~v7({M-SU_U*(*tx_*`Z7s>*w9N7tQZ0J zEU<{zu^ecZV*{N#@XoQJ&yE7eD&ssY*JKn*=?l_t;EbGnMU1q0il~l7ID7}4EX7uL z$;megh^e?KE(h9o(AZ&y;gOlYSMk>YPQf3Ew}{hl`%A-uvWSA0@c7d!-X~7OgLaRB zBHDRL*|ZWAgLoOdT;7R2*xpy@+&OR>T;!P5Q*Kb2o&trk6We5Y z{-87+wul$QeyshAFT_{FQ}88}%eiZ_9;YJ~1acm_ z9DmFjRyudY(gh=y&L6RK&WNS=jaYiGC*}-M|KpBw(?O-F8o#!H z^S+%Jg0F-Y3NK_WxOKr#2SNa143hVr9U_b0M56aue=YK{q5RV#A0NtZ5cvc%AFMM` z3hnRuzlS0`FZ6z_XnkFHKPs3%y!|YEb3J8f`zOwa+fNwY{t;|14Qb!>1(1~`)*Cw? zqVO?%3pe=oz_9-Ku6?k5V90ns9USk!hPU60?H>uXAABQN_Zpsd^)vE(cZQ{pKI5-j_{Ja~p2>>4omQFo-mv zlIC9VGAZo4z`3u&7Y+iSR^e-dPV9Xh)S>*mVq%DwiyXX;>TZ9Tl=57TRN%G2-L>ZX zxu~sN^!jd&9i^_&f$vl}@bM9V&6nHtnGTlYB4ATPE;3>r_5a4F2A3KFrBTlrmxYXwROdcB42q`+HW8b%Z7W89&6#VQH@nvDXFAmelC z_DU-5B6V8DasRez0fOErs{JjQ*VOGxv9ORP96adK-(qn0AIK8%ZXjxX{0_=1PYQK_ zqr8c1>xPF@Vg88^h-`XL43)GUuZ`{61zr02Ju>^tm;b3cX$N&z2ZDjTuR1W}OY-&i z9Ss5DH{jRz(69ZU-%%A!$<6Tm8qruwqu+xx{^oarMq1ux#Y0%}@^1%w_WjoMHt^e5 zF7fTFKhvx0x#ANqC?v=FLi+~z3Fz&A3$X*L`d*^@689^FUQ)$BG zq1TF2MMS)^pH|nNTz7^XD1c_z-1(B&zlc9C@>?LUwb^ip*JjgFmRTp}K86n4Vvd=! z1T9wx49NcO8jlsL#IZq^ z8ur?9L9b@4glR08CfHH1#hm{a30il!L+}Kc1GXp7SVa3*f$xL;AKV|n*k5K&ao^yZ z<{>twxx_h%D+8+4TT^36heJ2rLZ49lw z&nkfK3-0>}*EH8158`(v*&}lw1bv96Hg%M;GuM43;$aRF$Oq^t`*z?+<{%NhHdGAx z9@ItP<2Qi_e(Ny!AK!Tq_}5(k-#Q3?Vr0v?A^5w%;zq(>e=+#`%l}#UmJs}{!{C4a zV(=GT0AC)29~;^77v~AS-3-3M;P)0>1pJtCoa28Ae&*M}uelif|1KK>AIvp=4lMzM zHcHzaI}1M`7%%oe5U!i#6}#fKA?WV@4aw_ab1WgPr}OC|su-(eP+spS8%bXOnf3O< zMb=wL9^H}rXcn74@i^?0Lhj{Ao|NQYgeOmwBA%`PEc~<);GfF72>e@z!nck9znVo1 z@bEem`ShabJtb~|C&q-(qT7RhCSn`N^MH$h=No+=AW zMVIx6zs)yc+d2I7i<9+o@4GC9DsO~JeZlh(+wALPy(8kqD`Wq8)MgT9#Uo($q%8uo z%W3eJ?87h{#Oraa>I`89c=1v@ULkZy-R+-@)pM<5_C@_+)?(foCHzkw)kSY za@@I4rqw$P$ao$2Jvtu9MswTcGvX>k_njr`>mr zX2djH1x*@b0g7eSrSR{lMu%1(XITY!#n~F1+wfbwLHtsh9A!jUJspG*z!1bHTU+jyja$dAl$+;hmNy6cLB>w;zhAq zdkmXaKowY=3&n-JG*;^v#kx;_x9xb8{lF)ztQbaHWHnZ}!(-(oUs#l;?T$A~a|cT^ zXq4#C5bGYhoRD868?E>lZrIMI+4iopmNw_S@?Fsh6=LIk4+jpf={rXLCw;Ub52aWM!FrTJfRxmDWrtrQ_PN zLMTWvw9fOa@|5SjI;`Y*nZWCIYM+~CO=-V&S|OX3$X z)F@kg%9;k68y^a_tX}$DG0stbtYFI@Kn-b)PK(my#l5@Rd0ss8_VZE)D~m_=DSq4# z2ew%iKSu1l%+B*%dt~P%BhMAi@W_lkGGqByGa!6rE_}#arS**hf_9>aNR3f2vyJvG za?fb=$G2E|tXr(j^5}491Nwk8J|LFlA`AX6;P>EnvJw3`30h}g`v;EIf3k-l+Gz-> zQBFD7bA|X!USCv$Lhoj2ebK%s`u1J>`_ZEgX$|u&s!e+%euv+g4QlT62Z@Ic^hihB zKaoM_9gj-v)+;8NqYDbyk@kQc@C(z|9Or~*0+h?klldGwpXNe^8QUyhVG^F_YX8L9 z>_SE=TdR^U4k=9J+*@&Th{U+TWl>9bc^tpT#q*sY#8%enKc@ZwMc7#8H0m6Iv;S@w zQk8?}$4M1VsmhgD<%H+N3Kw)k5D&RPfbi%v+llhwyCPVCf`Ae=mY4Q>N*#^SC{R8p z&y#O61q^D{*ym=O0*0m{SZg(VU8yzHT6~wGkSa~10Ty*qnhct$K9~eu&IG}`yNt{J zg5$Uc!aDTq0Ys)xs*5pI41R=MJ8K0%D7F3_&^!1)maslPD=GfpkZy2DzHwxsTEO!3 zWQcmfsjTUT!J0IvMp0$`KWR=mh!tjGx5{O`C+?YuZMfAico zW9HbdJo@T=N?Q<5h=`A0g6i_OHC{rBIe3diVFSKr?q464rVaVYrUX!y=O+)!1eGXT z^KTxKZ_S?^nct9a9}2*JA%M}t0E~frPrmv6!EZrgFJ$H92v*+vi;J)_f{(+Q0+qrE3OIq`=)ET}U^ka^iR< zew$tanJgw_=r+1h0I(wC>nhT|t|EDa3dkDE<3a^pIrs#=jdC|_XgkV-;TFTzWmh){)o2^9g;TRXyK6H-%#WA zeeB^l4mQWv&${}z|4$V5g*=NDp2O0xKfz1;$Vg)8vcb}#K9)7;Xgm;hG!SxrhHxyl z4sk5@usSgF@gPdDmSH`RC(%frM6Yi=IRIHel|T|-8iX-;mRo}GuD_U9_8ZHS?+&E@ z+%RAWo^O^L%hQayw169n^K-E*UKD2-bs2$6evXT{ALPqeZa3=ef&QOCyBs^8=}hck z-F&(oypwzv!)#nxY=gs82IlcwJC!xn!Oyrl;x!InYlbCtZZ^3l+E&t!0Ut-D#G^T*6o>~1eL8Nb}O5? zQrYUVvq$kT5KCnCXfr+L+M`*H+Lc3B(YkUm-Bdj z8uOmymc1kayu%TJD?EoE@AP4eAlrni{s4e3RJ+x0|Aq|rQP7r`%sOmk^Yy23DBTf5SlqiITT084eD`P_Rv@q^E;|dU z_hp!As+lHvjxJ9ypX1Fm)=ZsdY8R>cYT}`7M9vYgCyit1VxRclIcuolWwoAeP{iGY z;SimJa^c3=$*<+*slbd<6p=*uH{T75Qg5;g!B|!Yi&>Y!-1g5XzB};j)A$B-Ut)eu zV*dQZ{1QGrm*;2bt^!nw;7V8aX&nQ~R%^PqZ`s)Ey?xcp3erUOh5m}ioxb;Q$>*nG zmvBqF*)qy(^EU_t_#~bq;|~6IvQ6{(^kiv2pI$5N2MJ|+(tZ6aY@pdduSBQp>nUNq zi6>c(Oo}-cBLq;z{bj~v&?tdxZUml;2mbh6gM~#m;qe%`R8$7DTO4S63M|xQX}O(! zjs)e`qVA}Lo-4k?>yknIl~z|WE6?Or#q1r73UZ?{EGRF8vNeshQ7{p84j!Yel)-;_ z4sR!z>LSE@)4zu>75{Jx&v$5T=RDqiWnDh4ss7*{;rNr6*V7uEgbN=n|K@pxZE42WiB}q6iI5 zIf%jh!~-BXBCu*-wrY`OhX3Fy2V&FR6GQfk@R|8d@VWV$cL^S^pZ|9@%}W zJYYXhULKUfoZuO=a8n-@o}?UdE{c&1km>GXKs-huZY7+bo%9cIo*aR5!xI<5`2vJ} z6C+WO+Il9YwDnvr=AWEJav!6_UnViVpU5?AZh!=TZKX>kD{kY{fsV{W@AJC(Kmy2T zvNa^1*VZNRsx(-w5RMi@IJz9ILRBU&hl2e1P;ie{-)~Xxgtc}(sR1#W9d)qVK=EJn+?7h@kT;h~pIya-+AqVS2^t_VX}I z4S10A6Fd16PvREAdNjk;EUuV8L0bmvv9#IYH0WWf(%P=HuFecb*{hAF^(`{KD09w$ z1*UB6#EOrj>^)Yx{bc=s>#er0}z4W$Uya|Pw= zk}sl7dP>nBCxzqW&qlDTONQS3*$9TYVgPCx2`fs#-sQB^x_n%v=UtIYO z7VCjWztLiK4O^@(Sgg(qmucjF&aid5-Zp%lPB+)7eNe`x50$a0C}YzjWb7_pUct(j za`0O6XM-@&h9@rFRq5p`m)Bjeeiw|ievf|jHS715)1mbX0;}~!)qPLfMVl$=<)Y_t1S?`p40!%hjA+;WUP3ppLRtTUL^BOCueF^APh-RMr9uhJ&ippCfHOi1 zT#EMP8)yP>XKS+oVbTLy+W^a7D%O9o1ooDE!MZ8oDWds_9h{%4BtAW2etvl2{Nyhs z9k3L2!1G=C!aWbM$s7g0jI>h1Z3_re%1eYOj}f9A9k!R(UU6}8R+?fZ+6@bd^gzo$ zT#|~PUQZ&)4!$$EztT9@BJR_nw}nKPI1Rpei0UbT=gpC-$9@sj<9leRo*65M8)fQ4 zq7Qfe|7mq|%|E6sv|>Tkfx-)|+myB--t~o+q-Oo=%rOPwYxUSj{JD0*H&AER&EH6!IftpUuT^Cc`z<~@j5(gqiSr**9a=-Y zMUB=P+!mj?&4T;uU3o5&_dL5uVnvc9LRG56>t8v5TdcpW9=CaNV&Qqm1ElQLs2%v1 zv)N1;9d_s79_TaIf)_t_Fkg5L?enp`-eO) zv_`u{9gF8|Qh6Xb07}%`@0qhoy@kzL#Y_97qwVj9!v5URR+a~0zdV|)6JdYuXql}u z!~W6HEKlWLr#LtPZ9P1O5PJ?q4t+*U`zJPOzn*nRdmviRb&jFEu$gfXAY7(Bl%V(& z?V$q2HwySMBXHY?`1eQxp>sUw56xnDcAUS>7b9rAiZ#EC;(K?Td4g1Mt=C!2)^52R zr7h3YP#Bh4r2Btmu6-L?X3PF}Y z&9g7obd=x+dSxfC@2~F4U5{7ks5X;%ceBzrZ_B{l=*{>i%6KXGLdV7ZpQ7E|_a=|q z1igUm&syQ1^;U5D(tUx3XzmLb-VcHM)l7ZT3I?IEfR`SxHsoa~2h%H0tQy0PT<<-> zi%xRa8Uo;WR+n#9UTg={q;#^5al27qHb37F4(jBca^Pib$T91;$e`Cd|vt{D?MTW+3^4RBiyw)y|k|} zi5DUHk61k?)k*C0#CD=aege>i#UgD+QUn`XtW*8Re7m^sFa+Jtg<_F4C-9P^In5Bl zzROD;pk{b1&vei^HT}(6nAEN{1+@4<3#`G(xeZ^&^y2+Ii|#wld@UaD;re@N_Gvmx z?Q1%U@$YWbALib7f$(h>^?I6kgrl#N*iL)^beON3scU3j-@Qkk0Fk~KKYI^z-@70W z>#WH0!$7j9{_v_TDEw=&rw|+V(^Ue$HSIVWE7}NStl2{X=xai!X%Tyi#JX4lhOj4S z^pbV5R^Kf(jy7P*>bu#Lp6D+6lhfSFyl?VS7*}2^0q$?^krk9+qZt_q(=Zm8{fZTk zNL-7;fC_0nf`pM8o~^UE&+ZOSf&1$EC^R>!SJZscq$}-0?eJ-zM5_3$?x8Hzw3} z!iuY5aC1P%v&^>_&$%CJS@|Tl74y+{h|_ z>FEL%)Jg33Dh>QRkK4i>+dyo9te*o}o5C#kWtau8QQOMrx#Jb?+ag%7We5vI+sly! zFYwRju)?2P zIq>Npi9vjZTCy9T*7>R$64f5}q2>v~D0sjE+XTto`cF{6XHt)xGp@@5Ww!w&Vd_55- zCO`L)evEc19W%=V<@BP8Go?*jbSrA%zNTthZrOm;2K=0nt({dGPNW=5uk3D2=Drrv zsi4ilO}P?Jexx=)KKX7i3(0}n2^hx6&jPp{Xy0&1|5XJHH@Ih$B({gUy!2PSL0u|a zi><8mlzDlFKB-7wwM5I|8@*!#=Ftx`-4$Ns^nkA3d~Xz;AM(mmtg;WZHJEZ`>+J2( ztn!rMJ?SYuS$|1BtN+kb*{3vp7e8TI-%ok(Nk#7>#n^{t(|baHoK7}M1ExJZp=^CM zWd#&%qd%A0$2Xxn;AwA|&%FU&3e|B|{CY$6sCDQPn8%Lv9C@x-t+cLtX|QY^0@+Rw z+YgHD z0tHhdg9W&4S$}f0viVw!#J29-F#?nB0VZwxKVecVuxQ&qWYHxJ3%+F*eJREVuL>O0 z4};m_KEMUcvYE^(?FS3?Vem@9qMcvEqF4XVSoG>YWYMUGdx=F~eQPW_ZL+ASKMTBD z&=DqozKY;ajLDzM{v1~Mp{YgjY`Xq9Y0$BQ8nh=K?^~Yoc>8<~`ny-6bo8Lk1y7q5 z_47)n=N)C!b7v#CL~#CtzOhiU zL6p!R;x592cyLEIMH_~BZBy6ioY~v0^914H=)Xg?#e7FVNqf8}l+E}7Hl35oD%#7s zx$gw|>m@Hm=cm`7thal*#e1ab^>5Z+!hL(IrHpkw>Gb!G+tj#p?i2?yT3>Bw zs1JIs4(U&0bmJH(#1+spiuJ-H&U6Zd3#R~m=TP)}uJLqJS#(6%*r7xl5D*EpH{FdE z?$LPS69#sIPkiktYN*|f^@AE-Sz8i<5t631qfKv^;+Dg277u$QlDcih_ zm`2?2zRAFSd>7g&TMMC`_c%C{9^Y|b$zG)iLuXIv@p=aYZQz7gORn`jw*W^brh7jG zj`-dLj;srDBu>2lQGa}N@6lgOmtzP0+wSVvFy3pvzJPu!zGSLstkyQ>H{8d z88*$pFb}t04;Rl2bbVnM+wprJN^8{Z??>5r=@E!-)>?d*?@WU1o!S{|!x*JiPN7ou zGyW)rlO1FA+&gVj2cs<88*wi;>|5}9Cx4vQL|_koKMW#IcV-T*r=xG?8LF3gFz zFy{9 z2iz?p|jQO@u74~GS5qCfJpY+1pAe(QQ03w*@3rY zH?I%z7z}5nvh}J=tc&1nLnKyH5QB!HSWWp_-U27}Tx*0!7=^&YplwC{g0XaWaW6(B zgrJ`N72ov25bLh^$4u)pnb!Az$F#nSGp#Rz zX^)~tUWdFwH9O+nX^v)!0w%3-m8GF(bz_{>=b#P#%2DEK=K*xE)Puklr*!x zK2GGXqkKFyA2?0BxSaODwD!^MK^uSKm&B#f?Vs2Hl4pP2B|W3ex1P(Q*a1CH2J^H2 z35rkf1e0!@Zw@W#S)e44vh_rGm7SNnHmna#W4=q20MpjL6fRS?dR_d9VR~@An5!?@ z6M|``{t1J|B}{`ZlFC5$09}6p(u4SSpgsE)|NnVuQdv||L8%%XgCMcouz+5`Wa_Uc@YSh=GrVPF|1kox& zRQ{I`{fj_!h#G%(Bvj>*P(@e0n6F2F22&TM<$*PQqzUz{h;o_!EaE(~Jn%Tq{_c48 z1v{cYi_Xe+{Mu!dDu?&5`|o`4tL;~z&}6HTMd%giIR#`-BFd|~)^CK)lBH`siXXX8 z>wgh`dOrO0r1_-PyDaJ`65{jGgI7mdB6V}NolIV4!hu7hG zmeQJGg%G3UR_Sb=@fb0t$Z1h-;HSqbpv zS0dEI$sm4l1>)V-^>|7Q-Yad0JhmoUCR-~|><**&BM1Zt%V*Zg^0yW<@uCxhnD$&N z_Gf6Arl)b32!v0Vaf|m9Zeu=q{CJcd--K#FHM=eIlPLRerk1h3Z|pn0JrvE5)zous zAsojY`nY=3PKxQ?32jvLuc`0H)4;k*A*xbZIi9YwqEkKNDgNqj55y>~EqJ_+?p4t# z2$z(ttGM-oeGQ%H$E>2N<%E2`&YqIe7TITZUdGkdiyD2WqlER zEd`RkF=I>nBLdbD*m~Ka1^swlVq*4AD2VS%f1K_gtbGzc1%MK|-6~%g%2(3jdeZXk zN#+pVp+K&+$Rh;wgwh&BiIIIBj4kZkYu8)Ib8SJZ*|jFS#yTudz8|;hOUl) zQIEmr@RgBRx-z1PdkmU+WrU8%FMRg^>=EZ7+g{2}B2zV*uc>xE)3reh%~y^~l)!vx zFNMpLt$X;R!z{ZNvg}mRbLpXvsz?1UWYW1X>4wi~_#86>qphZD51kFq+)`m^a+OWx48#Xy>LnddI$s3rvl!GZo%04=~@sN2T^`?QC?zDeY`y<5>136?H*TW5cQT&#dC(oQ;>UFC*HE!iLX1XOzd= zfWGGJxUelVr6lDb-FH5s9hXLR9O#h_-s#`hc=Es}tb0~OJB=o)&))F8e>6KiF0p^o zaOs6DtGhH)jJ1~sDIYe5)0h3vNx%rudQwCCGkq})2_qn20tkr;b?g&3gkHX-b@P8l zZnvmL-7KajCZwrcWk)~)QRyT{99*bXA|Gn z&ML|#yksEa0i`usYM0(nTJt0`wVJ8TOl33uf9$<|d=%C7Fut=Hk_jx#BCDdJM2!{{ zH9^`Eh?+z;iAW$I3o4@G3)R*agqZ}Wfeo`O8OPNqP^slF zDp;dN3^?mXTp%W!7_!ef=g#a~!t?Ftd48Yo=lOj;&p+ABeLeTybI;4Y=bkgf_%+L? z8NY(@n{NCLHGYQ~zc%A{xbZu}_!aS2X|yZ#A%y9KlKMWqmbB)<3-w(K`ehtNY5H{-J6b2gTca0I#rlYh^yW zHYnn&9NAuq#vy!ct#E=}grFrt_d#!$bXiw@igfXN8PIE0(?lzg+PZ*ny-g{YDGh;4 zSy%t5^p6#vIsx4C}t2-)i z&4|2BQF&?y?u@;LKS7jfbTrMuq6CqeO-qDQZ?`~xaa zoV_CWCZJD-{%3m2{3IY2f6xFHjAZz#m}J0cvWNN zPoxg&UuLul+G>fQqx0L!J%7vK@ZF_a(dS!-u;(0HIuu0pJk4D^s1+^=@gKTsOWl_r$azXV-}!8Z=( zU%!pun>f~-eEpz>%uJO)767O=YLkG-)2#mx~E8UrASqH5Ff}VWmw}!nQJ-{=wamh`B#K%GTYH2zMmH z?2CQ*DN0+PW=G$|KsfDcQv$YBYa@NP@F12SRlZ)LMC{Uen%v5ra#wt1S#dx+C-@=e z3&GD-xixr9df|J4O|u!IYu39m7HKqPSW;%Fv~fzd>y zYhe#7ZA+AJhIHMki8WT8SP{YkbzE32u!%Jsd{h;jtDf@ZbNX>QjSH#u+&-yC)Ud6p;2g>+LgCx&Q@sJpJyXo{jJ3DA^Xb^YnC|lwlEIvgA0M=oOJg@q}gK4 zUggU)jKFcjs&kc|6txTHyN8#q*Pp!0nD4#v>AIsv%2ZBd>B|B4w8GKastmMIF0`RxZ(*kDY}X2j8a_0HQNvOwr(cBL*n71s;LT_f z<7`Fi{krU0y`E;E2@Tu%OwHM#ou`ZBcu#%^lC$?}+t3b&<-wAlX3ppGO@DUxV~p%| z=n7D&hkdB6JHni4lKW#I5BeVvibnlvKuG<{9_D%UBLykgegy7*Xhk0}WB|P;8zMvK zc~U>og_H1)(IE8T%Nl{xDjd=Uo*VJ>&()wFRGn|AuFbd^#^^61 zI=jZ;W^f+SdvHdb`+Y!(LHIG6*uEIISO=`QbBE~J7kzI&wc?PdJWU4|@+a9XfEzo} zO}-d5cC{dr3R3tP*x_6gbSf$qGRSQ+dcX%?zd|X- z*=|69DP@=^I#&t8J^Ev)Ni{dYf5prmuW5$Qc2kgHz( z+c07IUo^R$5Rn2N6~meat~aIthP`yOHV3xb8?e}}?V^`1qg@mv;@Y9e`kve&Sd75O zI0!iv2O!@^VT4(H5g2Y&H*xdP*~~NYv`hgp4BF^@z+xd6ljNCpMij%2K7ie9r+5G? z<=zKaZ)s+4#i9p;VtBh&ysEk0@Rc+m^8UMrke5*RM*9DKSg)W5P=X7?(6$Diq@gu| z664$+SO_05A7hbx_tNg)tak%$P2$kOH~Nhad_m=#yPLUY&9zDI!9efMR#<}dwZVU9 zM=1D^yJ8QF6+=e>p5bT$FQK>TE*&2q>&FdA^snCoalqHyut?VL8IAbU>Uf$!XTTup zA3KGFpuquzV4aS5WmSiw3})v4o$_Cy{BTmf(&5nmNckSfkGKT=?s?2J^0oM0_v8S1 zaXA&9?_m0wLj5s#BhkP~@#TxD{Et|9Y`-R2j>-R&pJuifj<&aZu=Y&(|0L1>QB3}q z08%YWtpnW)l(B2Id6TrlB17WUyUn1ub|LmG1o1wwRs3T!^b@@;=aEtpLGuVnpy zcpCbDwLfk?&?BzPhC{SdZ{MB6p=Ux4hUqJ4F3;5Rc;C_tbea!8&_tve+etZv3Y@8o zATvh)ru~Dh2YSeN3i?|iZ2fs?o%Cw~H;V&sqJZfP1r-bjpAN^j;bJZ(kC_tkfNuuB zQ_xCnn$w{TMKg?PndnfI_OR22pgG73e`L0OZ=!Y=zrLdgyi+4-eR2Agt;kGk1vM4N zd-+f{e}5hluY@stI`SP>eP<-YCs$lmiqfE`v!jG4{%xW1YtL4GM>>-~6X9D%mFC33 zw>}=emm_Su4jTl%$yD|Hxc=71_xDho0!8HoD*v_pEalN3@a+TO`{xO)^p-sa-u*bZe;7+AVg4SX@WBoP6_a_KR>)S--Uprg*BWVfc4fxhkrKMsFzP5z*O=Iv~JqUcaQ`Miw_1BiL zzG+GDjid5uXDdHBZ7}>h-9hwkL=3+76V}&&PqPk$ZwFO9^WR(Q`tD^Eh zJ6rjUse{emZB%Ju9DMEZ@ZF!v;0tmC;Tug=yNAd6Yme`5Tx!z%=|L>-KU?|mkR{M1rj zu7}c^9q4;xj%^ZXnzg}Z)_?Y1wt}WkMSjKX+I%~(9h`?Nk*d$L0a@3ECUqXA>S9e3 zj=9M^bQr*Y@N7b#_zjM0B#g@p0FyQ=Mko^b0bvkg)tLZRY8{69yEFz7=xG?0Hjmd* z6S@5meKu-fg{^e1+8xJV>HN{6<@Ldc_AvTSjjkOQ!=I*j{3(v3uliv;AFEpcWm!|& z^G&9Xhb8oPD1YkN^5f_qb$ZUQ*#6iUzdyDa^ch2&4WNHI(Z8WFcsItwyFBiIj?q6V z|JvEg7aROWvt{lv<;4wDMH-6o;`T&&(d2(rV$RSQ{I&7$qdrXhZxHw=Q`Ph1;Hiy= zXGb!B5vcsv>1Qcl)t@k4BjThi=*?f#`FA=Zi#&wFqajH5-im6Ce2?}XjVuk&FT)HI zz=WwAsRZgHat`Lpx~bMb^EImVwK26m#0~*arPtQI5}^PDy#Dv^*@-`D9fmx0Y8jKK zrhJzmPi5D}gs1=Hn;kPAn}+o}9d&sP3O&tULfPL-^2@EuB6U*m}Iz3@Qz^rIyI@Ui|5C9H2x z68`O=@-LpP{N$bl{3C$}IJRve2o7x5CfF}Q{=Doit;E4fp>zQh!A|7XpKlZBhsX0T zl~Y3l=>fa{fEs!R!4*m2$dNyjflvYwC`QW+7LpF{b)SkDk?uUTa)wp}WY7-6%#2K= zhg60_%<+c!wXhSPFop+_Mht#|cRMb!t1KCh!?9? z5knozj2Hn^i)`7oN<$V>`>7=vQXaY@L1_@UPzHr%lE(l%7*Gznz?dRr-yt!0 zO<2dU7I1o@yyol#Amq1!fCCGdF9d&Q__I_hZ2j^J{vsQWKd4p@7!TgGP0G~d(Nm%G zC-F3lUg(u%N}04m4qPFdnys$jVR^^{!KBRWS`CF)loYYd7%X#0T_FU&8l-(DpN^)r zL5r%Ke(9%LzJL)!SSTGAt^!Vgz*r*)g&8PMJL4~y8Giz4ayAeA1@Qwql|Bu=J;?fG z0Mp2E+5r_rkA~ICZLI!Gr9UD)rcLX1Y_UqG)cUHrx?aKkC0A9_EscPwIwO6C$iZn2 zI~1}5d?g`RWn2w&B}(kvK4RZ4n*ps>5(0pgaEe;L>bLHSZi_S$U+3)O?pB-cF|J(k zsRawsUgDs~y;>3SVbQyYUalFLQF&wn3{=ni0`Yq+$61K2y6n^~pa7j>l9ccUU4Mw) zJ5Vix`J5wk)!S89t9dpoXv=N!@eXHUXj#v{2rpaF-wktTWCUtKFGq8G90oU6n-A($ zbu>Aj%Bfw>R!*vg(N{HRcV%)_&ab?CB?rtNU2B?iCfm7>vDdj_yU*FqM1DeCXH4E7 zjVGUYu&Pvq1nEA_sl(K*I@ewCsij&Tp|qV*ow_MsA(@zsPM}KgKW?hCUG(mwvu>#j z#ybltrx)-PFZXIX9(QOz=Lzh)gvFl( z;zjW7XJ%KP-3~pX zSFB75DR0-D89C0;qUX1$vqL(1Q!(~T8M zaPcvEw0t{Z1w#Pbf=$}oI){3=E+XJqhGFoQk2qND+{rLe@^B5vpyX3D_ihF+R6)oD)4W$qWelTrR-2{{@AhcKUK7b`Fk zZKztw?FKnu_74a`b_;G8nwEv=z69@R(3ZFrFDL5ZPgfm>_6V6>1$IEm#$o&h3b@<=8R z8IZ4_8MAq7m)`+c9mNXr51ml3_>3_-zao06m1Hp1HHJ(~W-wk$EXx6ES)?>W^{dW9 zfeXxPZy^&Y$pG~otGUJydoHOZSt+?@BkY^NVVIl`n7f5TbZ7YyB`k@N8N{3Go+WMD-C%D!@g;FOU!PD-WY&Fr)_q&`of^SDKGo*^3rqjS7Bn`u&A0xbF#^v?YA@-t34E z7~GRgFoxMAb0*}@pd?)BghKD3h11R~qWf)HnqiG-i-wN%DG$}NYrX?h5gS9^TKQ%u zN0;_(6qj%c9*=)l|IS47O^@4t61i z&0ajP*(pY|Q=q*5uN){!6?R^O1Gfw^icLm^bgb|SR8V@Yl87mfAAyv8Ftx$2;gjTN zeF3By2cH5(T2vbW;2CsqYuho*fXAmSFk0OS=I ziD(e^FT({4 zc5tsLpSc8Yi~LFO9pgKyPeAvmARN%IVztpFD-T;{M1t~Ajc>VNW|r{kashJ8^rZJ1 z@$LP)pW3teE$0qaGim?1)Ovj`9*EZ+`JRkYj!9#bDOZ)B51Y_axp5CnN>ii_#AX=9 z*T7E~X4mdnNXTNm=fNs!z4Rl^s)TtdbLl0Det{CUmY=81;k_-@P$|Ja5$gk+(>*Zi zg>;3F`dLE!L1zCXXvH?MW~AC=5H@%3V^ywh$q5X(dqP%jdii{9mMyzW-0kf4Icj`T zX|uY|myfEWS|`@b;i{Uk6jUh#F+K$AX6^o5X%GN4fYjuxvuqd)4%)_{R5`oNX3JjB z?h1Ys2M@>w$L6Vx@=%b2#NGBh46@hzkn|&^w@eyxcXlnTMMy8i9av~1BgsOWyZ0XX zm@#a~9G{SxU3>RJC;$WBW4woA_H;O6khDrV#TrX+if6ApE%#RWi3s#o(aBxVq7-JO zDo4*K^%rIDRYPXPch`D(KgbljSGT1 zJ$t2BlTt4XzLFimDGHNtl#H*9r2EpM;5_3n=SrYU$Ke)Cn|lR!k9?Ic-NdcfazGM*3|{ZDknKe#`l!Cernx3^$>U^2S8+Gt^1d%ph*z9$LmI zy_k>Ijkp}kZJ_VzpEe`i*m(-Yn)7`{Y~;5|Lt&<}Ye^3gYi4o2A}eO}+#`DG5Tlw1 zM;B(dB*AZFWceH|;_f=%-0Ef;w2;SY%U={sotIJZvQ{_-=1${*KMK?b)XUGkp#14* zy}iLkmR9x~tx%}bQ{ZBD$Wqsfl)Bz0N(RjXxBlhFDQJzho z{1KghhY&^W?%o+pl!pB&dd8qO*t<*~?q1FKgvX1X>&epZDk&2?`W%<0m=D&YzXxR`wP=;M15{`b7)*nI9PAos=ha9t!muj( z#4zCLtGH(2Xxo8>A`Rv^#gm7BKEr=bl5B%#Phq{U8$_K6<|nrE4WtAXpukA$o!H*+ zAMo7Pid-bD*OI8G!+*a@CAp@^=AL|uR0hvxl%t`Ph;*M#U+ z22oZNqMsu~*To9=Fbwec_(Vw>-f^3?&068JSX5@zxij`$?GCS&bg*lnEM8nty@ zz}hSN&w?+-HeJ|H_kZ6azKnGDE|rG5d*=b3_ueYs1ned3bA>3D2R-!>la>>@d<{pN ziZ<$Dx*q{@@Nd{P!NY17vEAwAAL4zvN14{Zgeu=`PMr^AE}zQ<0{H?6zeokewI~L| ztWv}lV#vgTza4)N8gA)g07#>t1hIu8WDBBaffdEF;0%M?hxO4Y&W=SLh_OWw5yN^) z7cE6#9_|~ns41M@aO(G z0B%N5FHQpWS_9O|_>zHMLN!9W;aCg96(YyR8hxFB3zsnL%t8|&sC{#M?LR~9otGu` z)7Z)S!KVn~?s^~Z_H9?je22dHVfYRxA$8KSr~56J8d4@u%{)F*ghzf{QC6UXbl2I2 z999Nsc8_Fpf0OU-y+B-xz5ugZpc!A7I$}FZ^uBY304=wX)0j9U|FHp36)Ui~o9(lD zv*Hq#J|c`ziJn{FGg!mkZy4h|4MNDyOOnR<`DxZ{_8FWJYjzha>+hpIn;GrC2FeAF zutHEIFd?=df6>d(RP?&eP`uDL87O-U`Wg~F|HQBplg|~s`{17dekIAfO#VZQfA{3+ z(lQ@<6YgY6eH+2*Y6r>AQ!8cXI;CrX6JNIGSq^OsZR0^o8x1FMsbrdi1=-dTlkl-4vlvk!)Djx#*U0G>Qmp=poG`=t^yVigy zxHI~EK&{((CADVCqtBwzq^ljqZIwR3`!8pE;GRhGc*&jsI1h|hlRNa4exycs1dtjD z7*=JTt*YddSX0UYC3g3e0aR74)1n96ak(o_-7k7RM0sLcH7rW@-Vd@70$DfZ?eO>} zwZ86~v0T08)DQOh93$0_>yGnWqn4`5Z2%BR`lo=uPf3;2;os9!3OVVLCrA6Hb2&W# zro0`J*@-{2IBp=Oit2mvmHfwfQX=)?9^&GDO-}ok zG-K^Tsx7_Z?OMJW)?t(1GCr!C1*_c^r_0Ra`3`+LZpf?R5fxJ>K?{NVp~wJv*sv}F z3Q*C<#B*cI{S)6(pCyeZ5kI=;oms(BK!$q0`Nm0 zP*L|cH@kbevJq%%wU?P%H9@IW6JR96$lBvUC48=QFKKJ}>P(>0H%oWAd#B0&Fcy(S z=4{ckourb9qGuERlO?|aIK?q7>GF^P;YMh7y`Mb8;rp%?f|}0<&~3Cc*O_U1Uz1K^H*t~ZEJvIm#4Yqv88WcS!@Zu@#RLr-eGOgWcIEB@r3yFR34> z1F$G`N|`0FhzfLK0mKJ7BTbY?QD3DSDUihe+JLz1J8no~w@KHyd+(IW+`ThJ&+ixy zm`;*`LAX3Kt#qHk1n4~=q)DRZUCyA6kDoSKyHQ>~7h0*I*=b3Vfc-nVidg`t zKw2*Dr7-as9b<=szKnd>*(TN?H_mm6o&eI}u2}z2gK@n1HYNouWN7a^Bpm_1WjJvS z;Hj#y-(U-UidZH-^#X0rPj41IRqVfM%o`T`cbn+Rq+5wkZ(-^Y{5Mzh{+vmozdnf* zVxE_vVZY?qY1kH_K+~%K^aPf`hNN==4EGeLWLHl?)k{v%zFGu{s@y8pSUt5>&QGP; zY&YJ^*xn~d%^QP%1a`cvTJ-#dEyK;GfcB@8jAwK*11sd|%vYmc`z;os7YbU*q3kYp z6BYPJzw!P+3P7O`hZv4xq2#TRIO*{|==NR0qIF08MqmBknhR>M=Y`**!lD#qr9k!3 z{bnxkSDKW-x5%nzTWJ|}ivcNO5Csv2HCp#i)Dd3&mZastO*mqlm?5mF_g~19x&jx{ z3yDviAa8rKiO#gbh+ttk(bGqa+FHO+!uu_rq|2ee&(4_g1!ETo3R+DUptnDYj+9txb z{WA`w9%>v76BAB}qIY%&tz#nn14@niJonjI&&$8-2GYjoDYW>Yj_=}P7TQlJeY{s6{Oc84)1840a zV?P)bA2cg2!-^x4Dvn?kzh)ws1xGkCsYozDMH*O<&wzmJv?Ud3Vnu$BcRr724Mq76 zi=`(O`#meRk`)^QDbHasA*t9(R_r#`;eJr7c8*FaGM^R6VntrZBIhI(nZ$|=KVvS; zfb(BEpHmMfp3vPR4No{vMu{9{Sj@XqZdZF@|KPD6)CX=qwr?=`Vm?Wyc50YI4l>V{ zI|Cm@+OzlGtu`UsTEX4J9GJrfewwiizx25>`BKIVw0XcfLMW)Yr#vP-qPjY>_ad2a zN@F~=>Ona*_!dxrzoP5_UF16Dlfe1M*WnZLkiHM2aP`nDTF^N4tMRig{-h9y))KN2 zv8zqU#OT!{-qEUc!NUbA^*s^U`dUy;v{E~=(4XVB$V0hy5c$-6e>(v064Za-m23NTcrBEw*%&4IG0qKa2RMHAS&ViL%^V)BShTf*y?ypLr0 z%xCxnP@16?3)&JJw=d@uQ0;OtI92V+kwa<`ua?`&uGNZouFH5)tIx3Jg}Ql(BIT~wq@sO zg}mB>9?S|8u2Vw9clF)K+6%G5QK%4Xq4})rXu`!@*r_+~B>U%9j0|8LI(layHQj)s zhUnRdxK1e`U_+6QrP10h%+f@qXJXlCmZyimN%9S%d9=Jn#!rmuZ`0pm!Iyt7Op&{A*KlEKXK==E$6*NU6eW(8@)}&UYu_{WQaIWT~&R7$(c^$=p;0B}DHQ&&E;Zv;b zuG9?CJLOz}mjPIWgMM7wfO)=>R<)wdw16paU^uV>yE+~I(T&FE^ZHQ|gWA!1|E?Ky zhozP~MDOL;cp5Z*AuETw?R$!UC`<)RRs!&UBX7+Bb|kRIx-3w-16wP0Xf%`h$CrVe z^+~@umM#k~ddo+l8xw)StCm!0<-F#sVtoTLa820!+9~8fv(t`3k?mC(&z> zrsbTJKM%Cvi#G;OsWD~xgJ?Li<4m;aC3cD;%Fx$9gFFFXL!RkH4mJ5lqW4L>E^1kQ zX~6G@#tX%CbWSkc@OS6ghLM)?1lasvq5e}G>x4DC#Np3l@gHI2pY@rOW-hfzOAW|0 z%>AS_k}GM2EB+kp2f)LLB|@0&YhlW%$` zcoB@HmNz`;>NQuU zD-9?|&InX~fn7)n_Q8b)mB)G%W(WzwSiU@(us+`!Zb zIF_LqN|7+kqsLlLh`9w&Mx;#e6EED)v^K!*(zvv zwQ+dd&N8WG;dT;%nD+^U$UQr8&;=q!u;&WOPf=H1f+5ypGYe}yo2CAUQg^XTb#gvpD8?(+Wy zbVI1c8)7XEp%%Zu7B3pmqKSnEPbXm^hB=I3p}@zmFmUFydH)<+@R77uPox=Z_0Yo) zJOFF;;A0uM;Ez1KXc?>(qlR`|uaSY5dJ_G5OzDBTqDVaJv8ru@s}QSvj=B?gIO z`)js<(DOryDO-m!X=t9gOmE=5$AMFWKzt!V{PB>);ocs<$D)J2F!1H6gt=mKePD=5 zr5|1@!Eoh8kHCfyq=)3kV6K0WAw3?Q>uaNo3zZRes=+Au5+1{q{x@qSC(!9N*u!WL(V0L>Z-3_pUn5FS5sr=lc}v>|5It8cQ?K1Mz0iIaoO zZaPiSTSEroLn9Cln38luonp)MHjvoBIBdw&AX%?*N+e#s4bUS&Jb5Vuzi44BKbk;s z<+K>ZeK;*%X-s6CcZSSfwduH#N2(udbATtM&?X*{9^J(3EWRE$@x1RMbOz33sp{h#w^pZ&lRa-++*@!cfdjgVO3{3$gSDy0xmkQfj)H}=`$Mz;|-7cvFgRx!9M33 zs<$+P2ac$+8U@Q&0#btH|FA*#+FAG7Pw*+nib$0888V`vb0?ycw~NNM z%Av`xVCkDqpuUA5aAgxT1`E@2P=R3$oEM>R%K9&DsK`-S`AZ{@Em5&Ue-?!Mz{zjX z$ih^Lrova?^bZ4B;2%05LKxF40SF+-9ca7@@JN#iy#! z7%rmj!spV#@n|(z+#GRMYtHH%A|~Qfi%G9s&cNrIR4$b_9lm+Y!#A68__l!_gL$}m+=y|fZ`Tct#Gk&|kn8;L zP11_&#V&URpvz~wqgf(lEyJuoVAgA~Ssq1MC{yceF)Q*-BuRHVV?7&L=5;Mx>h)=&moW%apqz}+8PI+o5Fqlj6k!23|S7z4bnwL>h~*VZ1zA z3==s4`MWhxO-uVgR4N1R6F@kDATL6KjPL)5Aio~?Q4B-T@Kp~Vhvu5TP3+?-tAC>JN<$8V(1 zdkB*Q^S(*Mn)?udp}KJl++|6=1~8CwJ66vV0(%278Kgs%Lnt{qJJjj+z~8@#+c3&x zi|Ae6fxBd)=o!Jq32phu*;ZRy4gYAKZ8pDg#ZuD2N~p!4^8)2#wr|9v1Kr(;)Aq(O zWMwB4=HSmK6K1INWa20q?Kx!+A zU1LBCajpL}p|>Z(C7;)QOOGslShUJ!%>$OrkfaDSanLpb+fJL;#PRi(-C*u>T%SX+ zi;0-nkD71!BoaCoFM4Dd0RA8WUUDoE#Wu9ZtwBJIHf3na9Y~c=eubF)g^>uwS{6_1^v^2*H0d zu_~_G=U7dp?FhwoQ8DxDZ}@d&puI)BJ-zY5? z=HW+3x(DAr%op(3z&!RSyAb|W!#IQS)!uB2L_k^(4Pb?BmWc5%fbqe^yJTp72_O8+ z0DCR-#iL)d>S+Y?@m+Y|m7;_%D<7tLlyL@qR8J*6iUKdNy0~a9ZZAynzW5@kROCG@lFE+XvB+x%cgczq(=xd@9x_h|I3sl7 zBVTQly*#e$`K;_!ST^3@N8;SEdfP3rdRrKux)SRJTjJrQ{HKmVz9GP#vllg&{=@;Z zW3A0tYABVu2upq3Z?H>AVwa_a{^O+KIe-m|Vq-!%W@XY8rcjF*Z6)qRBj7<>sVmul z;uoOfbA#7FOKqQ{`FVdV;Q%BAe@({5K|gV;haX+^Gddt%v=px^R^U~|(7<7nnce^R zqf6*EV>xCBf!+N{@&r%YN45CDr3xkj1`!mzPFB_)E4NWaK|K?mmE#Z^gBK?p^x@Ek6oA&8(lhry)6pqZLRn=g=wrn^jM&x*I;xdWr}YdTwFt zbCFmx!wOR5IH}CtbCrB+@Nv_g8tqHcv;u)pxX^(xM{yF(>;8;yQjnS$@*-;)y>iAe z<_u|U4xSm-no>KGrb1fz4=u4<=np8{&Mt%o>FcJxh9Qg``Hv z-43~d$)*?y2`_&_W`cp0aSQz%qy^WTUzPAx9l%Eh2qnsRqW3m*5rdB};`i6Q+w`Z_ z>Ddiqs)tmg8F zH3dTMwW8-msETjvp2Ocv(X*B!8mzbboydDEqNk8EoU1@3tz?rXZ&DxJs5Wy=TFH9V zxkYnsQeCg8uC3~+x}#POM3wh_yj7{c#K(K_)s%8Hq_l;`H>f3V_-16DKmL$!TITu6 zmzd~{_?Zj(}bF|PXg2K1ZRV-Z*>_saBJq+j}!Y4`-UV)MKBDn@OLTK+jbO6@S_U}Q7J zF@px^txR^ry_~yK^!kxD4K;11zxdc3s&~ABrgF8K%H9^6{wk{dR$Q6vmcT?zR<0b- zHQlWR*MJJ*w~$kvZxZ-3`h#`~XfL_>dBpP7+bk@kj19&{F78CnTeQTIfQCP-5g$rI zWT~yUvUdW`HqrAME3?q>ce3*P{>ap{WjAWBHWmwx*WZER8o6WOUsZ0a)?^3NN!MHs z=1K>$6JM`R%G5*OW3>>B;b65lB6ouP>2!E&={{CYH_#>ccWi_G@3)@8GxTj#3^WF3 zG{Zs}FOi!YXO#CHCwfujxLfobTg_~pX!gN=Vtx4sQ&Xt{qy4M^VM>yMn32D+n{o? zKLd(awv4LJf$INdyfP8nh{h|sYyW?1ys|%$v1?qsvRk4FuhDu@ys|&~DE`UcEdOD= zvfPvXXN^}j&hSS)XuPr@KJ}$|Whc=~R}LV{ zxtsmm!+sXBpS#%4{qSRJtbBm|Jji|)v!9=_pNH7bB39vE{8`voNh`mH%}1ub;TiJ( z{a0jtAx5!FAP%}kyg~`M7f`tS9;beC)pO=C@gBrRT8p=5g=%JPzQMXnj zhgT?`(N?^X)n?BScjrIAHRm*n${UvGJ7RjzBo>J^2i4{)P?m$GV6yuSZW0nufV-iV z{zcby?w;$)S81Mg)dq%XavPc%XQ3g3+@?KMZDD57F5z8_m`w*125HU>0gWvY)HktA z9KPpNw3c0rJ`i0;3|OZFtOXBnO#thfyOHA)#z9`? z4^m7}C@0puwSzK_fHZgg85Z9v8a8VV#hAm!ob9apz;$N5v?A?k23(zwPgU1Y?#KvL z5Z_5t{8sIGmS2zgtoBLr?;vQ9%@0z&g**`8qkg@Id=U`T`lmhADvSjnseFSq8aI~T zM5~d#sY?JU+>cyiMm--`MX$uNyYOk}3q8^CK;=3VOhNJ^J(A^8y?juNtnb$A=R7$R6{#BQ;%( zf@+|Zro97zI2AS*4_MS1>?82O8KVW73Zt2QVXC3mhuL`E+-x-2p;l5Y^$cZ@%QbBJ zU3`74R#LIBuHiF7EY0}?_na|jK&H+^yYYkt8)cJ=-7KJPVDh;Gf$O5>odkqV{tOZ@ zPG{XG1AQ(lS6Pn`>hld41VFT{2$%LW)poCENMQ`0{4BBwq-q&##M<+3un||X;`PS3 zpYJoC*6m=v=0kQi80NPhR@}#LK*#$yumVmAkA>cyp|Z~cw^KhyfZ^2NtN()DvInO1 znM1v^I}RI5x)~0aByTcTsQZYCk^+V^?bu3$AoC*Scqp*%2lIZy(1*&_B2{y}juKL? z>TKG9L`ZctpzpZsTGME$sH2}k2$s(9=iN*4S02U(wxI030v}S>&Lz@X(uCyCH_b{O z=K|xHCx-oo9_0d+r$LkVYXx^HjXc|onsYxs2WwQj6@R)aH=|SR^k9F)y(;}dpCb+5 zhkA0TazkZ3jzqr=tu^rr2d!_wFS*&hO5pItIYrOKOgu`|$92&=u9AkvO1x5t7}VH( z(@N2EL5it)v-3!xC7xPoV(tufe3?5(^jwR-rO-eA-X?l~hmDss6g5_&;>=ME`6I2Q z4Ly#oW?ouxgsG}66Q+V|L=pLvQqSvuV}bg_nx~M?<$~7E^U?FC>mr4U%7tBu0>p{Dg1`ZWH^y_$PS z^zK4h0DBGiK}myJ`998L!H~eK_&^68C_Re~Q^P!4bLL<1a-HFPadBlGkp{Vej)b(? zV^lg<-a+QYPtn^mxk+u-Ruw~;@!<~yN=H)Q%bzg58N)1Rz)#_5U;a4!6@2-b_-ps& zJMcHlmv6`4$-ey2_&d&*KN)}XvTOZ?Jb5QA9K(KW?8m`=Cb6Gf_A`O~Od~3@8<(l^ zDMD0pezI!=f2NnN$c1cZULuEpoHnZRp}NbyC0dVx3-_&t%vlhSdhn& z*)YOHKUljS0cvZNj?=+Z@LXEoT&r{m5V&d2+47a1QPO4F25d;1wy!UjtD2UxK>j?M z62?-&Bh2WJuFcUpV6j?syXJJm&z*?6_$IVUE#iY~qV&}m8eRP`y| z*|i`}Za}X`st@}U6?6;FSjF4>X#<^KRMian;e?djb>-ujf2Y!aFu~B>3pjfSpS<@9 zqUS>^A}#DV^nntj*#)_2_DcX8!MfG9~49)X4 zekcK}x}ljK12$0}c|G>{s2~GQ+kk26dP>uLSXh0ADwEF#))&&U;ix40VttAqknp#i zHRfzb@%aKM0>Z{Q5i}yiLY(;QzYvbU5ak(L@I(^_y}U+OMLpNTx%s4$ys7zxW(aV?a!bDZ$Sh-X(xzv}5qk zP~gOw_{nQNV@{sCcdR)9#>|DJ%f+?7BMeKG9(DI#VEP~NzC=DSMfDHx3o-|^x)D8E zkkpM|PoFWD0l%J%%9k&kh=+IXnL**bf#4;lSqY$C5d}3c{Y>0C4nGrHI^Pjveuadp z-;fC;E3&~{f@3IN6>e3+BgN#5$CjsEzXV^1`+bGgRIz&S ziYut1R?^NjVeOUF6;1!+@b9H>zfWlKz5&UCKJ)9>-Tjz=uR_MNLK~=%D-`%iLLo@F zBAOunEu>OuRSpG4KyrFg-QFL}qDad_fp5^OR~uEf+WXy}^M z%laRPrctW6zLuP(QPNbF^gk%+vG}ClQPP6=q~B6faeUGyO8Rkp^BXAXGK8(m-Fvxo zk-K+2I{wK(ecRg$N@zDtx8(=6Zn}P62isOU2g!k6MqS;#R_Ow9?N<2g-zR$ODVcE3 zkN>_y|GwWFbpY{!DL<=+=MfjXO~39*BDuBUu`ck|UM(=OHh(XlqftP{N!vf`r3Qkesjo0xG#M2$;`oOk+ z<9&~DezSwE&vPqreIDC{>(fC38*gYh8}LF=^^GBzK*#|7;|`c=HLRA;@V%Xd$*1%K zr3OnCY*!h;i&bJhHzNN79Erp$LDeQbpVdq;4 zJKs{+`If@Yw-k21rLglYh0eE(k;{*3UIP4-;a}hHY~tyMu7QmCD6*q}8zO=hG z4ISnZ`V`A-HfEnPH=o^p-Sk;Mjq^&HV;q@9_65+*W3@i&v*hzr77qr`p$hE!H7jt2 zZNEY75ko|KDoioP_a06P-UrOs+J}!n=5Fotwn$?@#u%M*P;!VhMHFk!h{mR`gpLY} zl>T$%4?&#IuGLoBy%9+;gO6ygR&)6a?D8Zi0@%N_7?Q__wCVR!F^-(0n5By45ypfR z*aHtEMil}1AKafC2x<2(r}$qlF(Hka?&!mj&i-n{wm&4evrrijNc$?uJOs2~DTt70L^V_8qtB50vBZZ~nEpRaEZ;BxPRO z3f^&8XD-F}I06fpqfxHvD#DRZ)Hd8sYk>82bP z2@jE&x&(U-fMyLUvi?n(T5!>yf+J(qenejUGKgiN;%^2DSM-;F{eCb1>S#KA7a# z#5*X^gAmz(kieR4QTm5STj-QV%4ZdfRub#5l@fNC0TBpU)ke{S6ayBHxj9T2MH8S> zATwh6Ypd)CTbRKUX?u7wPQGf;^X~`=vGUsuXwW0wVd5lGR>a9!J%+2a48)Twv-ZEO6g*K>0#21vB-CQ$qE}QPp#?sz5n4_C&@d;_@GP) zuivl?2Q+2_4HyT5C;tK)@CSs6tTPD@XyZrqp z_(8A6yQkv`gLlq zSOEpyE3n5P|9c-B(eSe`&mY47=~hhk7xw?_`)lU^@)%4Q8r?Zuu>yemC^;1ubj(~Z9aa7>g-(gCg{sPeiscFw77b08pp%LQkzzG zm)Jo}7Mt}zVYS=mcneAd@JWMdJ{@O&#NhYk3)(F_Et0M_9n{svnQBSr@^OjrO1e%oW%!wc2_!TtTL zmiYVo&IA9w_xF9t_xI5Rc7M;}L&}2qPN7{rRi~%GZ0U3+R$}wHI+Z#>^-~@YnqDLO zd(?v=&4=L*qB&3$Gmo%?KDz76adyIXYKaDPjK$j+qd)N|&S2?tfPBl--OJNgVvvn7 z#?e1&MCAwj>F~zY=9`wrQ9KINrjO7gSb>us04ZEwiRTNhHnm@0@&jtn^Er3#9QlG^ zF3qpIcZU2Yv1Xn%uMm>eF6jz)Z>b#c6?1sE0JGr8#L&yD^~>q7Yn~O0$)7@|>FYT! z`1?ftgYfI^N67!_vxHwaMz2()%Mrg)q)|$kXZUrIKD(LltDDZb5qIw-X%haS%a&kA zc5P6vPLzk0jx4l#D>kupQ>RFtrvaE(SXtOCgLbLhdTyccNN%qX@aku zAK#cGw@R0R#5T2`T^6FBL;wf9kO1-lG=@DXyOxq8IGb{t4`?qCvsrXY9MX3iw~9FF zY8_H;k?<4kEur0=5t4aQ%18Qaf5+AgV_08l#Ovx5y>$Pc2(Wh+S-&X_SuBi=VQ*{9 zpKIX!efk3(%%UG_(et?_Hh(#6{$>dvDP4fmW`}KO2Xdf3xkkuS3)p&U=c5}#jJ}gc zzScJVSMxROOu~HK^+VEpp^1g04l-9S{6O=fo%yflWhTx`B4FO1G5OGls+;isXP){o zM(mxUI-C7YG;XJuh3Om`rWmtf8pTc0oXrvEksQ1DR0}dYJ3^SiFGi>#uF1E=oDVWe zA#?g;zM1^^x}1Z+Fhx%dvF>*L3~knCu_mlKfm9yG^JEkY(dM#QD+cm+ML5l3S$sn{ z&4{8{(k#A{Z>(RAvsD`5zQxYR>}6o*!@T)s3e0El!d}wl=Akd^r5TZ6w|EY`RV18`|!bVHDm-VB3SjCwttwRb^0*TGY-9cJIUH~l9%rCCS~g1f5FV~bd^<0X(emxSZCQ^Z{%(IA zS4m3uDOpRf`|ZH^y)7y`VsmX2J-I^+7i?$bz!Rp#UN9iu||+C0XYjLqmm=q zwC4mS9#xZgwB1{~9F*20!Iz9inpY8mE0c~29fbl!lYh^YqPsnjTqrQy?j!Tbd^vi`HY3T^xY%ZsF z={~=6J(GLa$DM<^k6NL3&#hc^iOI|D5p-A3XqbS*Ea)Sc0X{4==iKaVk%Kg#&Du=+ z6_LnT#Fe_XVU=G-0QB@a!b5eYJ;%9ON@t1i1;ue+pTet;dnxK>HFk+nmiCM96htX& zvtEf;>LvTN6(D0aAw|ijIdArX=!t^7aYX1*j*F^%NOie`!_@AaiUv^`O_oy)Xq4e{ z`zDD8PiWJ&f;zDtc!VPpqzbg*fF4$NkzsS426_^o2{c-Nw2MRyoUm=0s{^BeJ|nKd zn5%`V+z|Xdn<(!+R<=w4J1lC+Gx`QP+g+bHtC(GC(?20AvTE3iY?7wi=@Au7mJhIF zrVWVluh2taLm%D=06gRn1TdRU+JhHq97TLq4dHO_dLPM0o9O95sX+$qI23(&;8C6K zpr}@$ zz2@?ukZaieUDye1FitLRHh~`A`JA&D@3O-|vSi}vr^h{O$g|=;D zKH1-APhDm6t-}u>`GpP)1dNeQ?*x%EByZCd=om^!?Y?;qt;_*A3Ey1p-IM%Ym+Z5hf_}~-oQjic0BK2-Bfr+hvCn7FG1_(;=kIu2!i+xX;jDi6 zUaVRJRn;OM&HvNrFrf%L_7}0+GP;j(&$44I0IkSA9O=Jz?_#yc4)dnq{Ha9_^*#J2 zVFi5KXtcn>A8G)elUNdypTJ4kZ;lt}3a#+8OdHybu*mV#qVewWDbwCW`{CR4(FA^X zC0f@xKoLjxFZ!SM^he?=|@c7Bt|jRR3?x2gS?j!{hRWVg1bAIHXoL zbblTo#b|SOo~iGTm_cec;&xsbHiHokyiY-Wxx%KE^S&Z}d`KrhXfR_j!cs;y5}hc^ z8&su%tR?Jt%ru<`k_7bVWGK1XO<1VJ&NL(>Nm%pg@6N7GgZ_^5ffkjSG_VvmSyaMc z6E}FX=)DTL!h5t+Bl4&KhHt_1o7E0v)#%HA>QCW&=?RJ_^5gFrk=idk3XB(}V)h7j zKQfJB9O*n5t=Xy-3BZTMcZyID=qj@FAPlg;%VJH4o=g7x1c?QSgL?Y}4GNnmfECQXDLI4Dj*dJiTDU~5dSg!`E?9*^W04Sgt7Oa&n($1f1FB=vdMf%!Qd-+gb zv4ebZ%clUNpffcGioMFl<-v3H7y^92}$*}khF(r@_v+1%;lSie%#PAy$=*k zy3TB?M80|?QH3%*;>F&g(Rm}Z`=>g(^sMTq(-PgVSPjuvE1O$q8}fK(JIoP#lU)|o zFG%l{f#cfstM0;;PhSNqUtt@orE04L@kQ_I2$OIM@Cnle?p>=18@zXMiT0;{=SKE} z4PpcTlf5^AhwA(P$L}y0SretGrbsAzNt>m`5=EgTVlWuS%w)#aB1L6MB_(ZWMTcL|q_n-W&Uw+=;By<)wf-z3dPd*vl132yPbqGbwt|1$Om1dS?SJz-QSU7-+{ zBruOe39%i5D`wS%RHTzMUp*mq6ZE{~*hp;P8wo87el`jd=PwJ2EUG;S*j4X87ewQTzEG^F==*b5|(6?FtZrl{+c+mSYb8# z2I8!Qj^uIGP<&Wd!{Wb~8--SzgHe@lMNf-fnVBOPnksk@e}r`6%p8T-&w?(PlZ405 zE+th|ze*;f@5o}L^NnWgw%@ku-i1&@=Tmf)K6`bdK7u2#W@ z^{)9)S)^}COUMb8Xwg0U2%H;b1+5}H!@;_`#`Q?DgBZoACK)C-!3tZjr59XV zpbtzaCiN#(C6lElN^&KWW*$M?G`QyD4?)9(VNCj(5GC6hfmYPBC`qBRNz)W3!*Y4{ zmV~hQ1X!2HnIRDj{@LkCVJFb%;X{=Z1bw)57+N}?KhwqU`Mn$Gmgf0r4!snK&YrT# zv768bluOWGosRPzV#yqSY!{y=3;mg|d}I0B(bWs+_k9v3cy+c04;zK$H){0U=N@X@C7g+pG?sKSOA;> z^9#uoeSkUO(Qz`R17K7DwgHhKPX|;0ngCsZDIkvoWCQ#m%|1XSpbhX1KsiCC3w7pQDIb_PoTrx%d5cCDW2Ea5Z&s@MF zRPKFb$_IeheljHycrzd$a0}1{>0cpz=m(Mz4)wttIXniN#hrxFLLxDJ1Na-s@ij5l z=d!Ws><|uvNjEXZIKEz-PzHX;zFtZG$21Jk4+ zLqp7!OADY+qE7J#Eq!hX&78W3jpyXq57V>2^z;JhOb+H0O6PK^G*%Qfm>z|U`LbC& z1}lsX#`J025X_3prHA;S4B25kP8g5M4fFM-)BWgv0u3lFrf)Ud%?*q2!Dg^oC>=Oy zJ*z3Kun==9mBwTQutMl89+knO`b6>QTq@h2$_u1Z{b)QIl}is02x%-oK_r()^9@Gn zX;j=1xzc_W!sZ>-SG+!Q-&H@306@a#u7bZf-PSy6K`_sahys3IR z$gb}c7A=HsE-=G^DncLqpi?0Y6xW9yI+;q>574I?8ILy>SX#hf`LQFoR0kT=ik=aE zY%@4CULceW@@0g>fiObpzC3nl6cxpT+|Lj%JBv-_MuqsWnG9bl`dC3|2o1HsSR@Dy zW9ji2khO0h-8YykuxC{t5>IMGC{Oi&ZlI~sv7n5nbbepELQQi&NT6piZXY)(`tBOs7R)%Mk)8cm!yLC@IG z$b@R=GEJZt<`f8ZHCDuc3!N6yPcR?2LM7^1po7Eb9lVk0c#k9IrGA1u!kB)j-Kk8r zFKR1PB9U6x?@LE?v_qM-iGwDNSqG(=DX2DHXcU?uAaA@ih!mh8kdGCqC0xM=?I0J0 zrd4BoBhm9aj1qq)%3C0zc2^Bl%Xp|3Llf#OI*p~rWQTF6Hei(*MeS>yQ2vEXA!B5W zg76LbB``$@;eJVs3jc6F8R8YO{2y>021fBhe+>M?{Z#N_B;-dvF%m|`{bD5WDL;=Mrb1&Lnxr}_1^-`k!f0Vx6$0@4Kf5s)DuOF)jm|CAG! z5tTu)zY<1~l9uczAw!lGmlKmGDL|eSY(2mMa04(Fa0I{vyaA{Kb^$y9j{s8urGVvt z9{@4HYQQu=1z;p#FTe-z6aYD5n*s9xH2`Bk0U#9c5zr5i2$%)92G9i@0t5kG0fqo} z0Neo&0FwY`080U#07<}FfHmMUKnrjX;16g93(~Bw%}Bd*JK9*MY|Xj{!amd>A+w zI2iaf@M~Z-U^U>Kz&n8#0WSi62>cLuGVo;J65tZxWx&gTzXN{pOe^=lC!}YH&T+;~G z3BomuaP2}N)+uOhg1!!qeuPH9a-bh|QDQ0p?dWL;FauZu&>k}001hAqkOe3QH2qmAG|%pb0w@Jk`MGU7sz;mbgG5klx8a2bvX?kwP9E)TBxLWqE1y^ni; z30Qs@iwAIk49eiSvV^T*%%KKjEl7PL{&&8+M+$G!pTq9Q#T-5JCXHL<0W_rQ2`&UaIT7D}% z@{Cz$9OltD^S0dmM+>J`A3kDOuQds4m>V;ReI#i4htX3+Hd&dgivmfwRRK z#bVl&cnPn9dfCgGtun{gEoU3_cL;PlJd}2Rs-FMJO;(S>C6_!Tl~QZcbrtWmC9FBV zWO&g@$pg>NWt!YAZrOWPDstR6OkqQgbed|q{F4&7pp|-4Lnzyrekmjm-{$tY!NEQ> zrh1(rea#%q=i}S0lFVfXNNVTXDXSM;RQP5#KTJWJvA)3YjvP;R_)fhsUa7u_kVA{e=Wzf{Zg{$OF=uh@Id+I3jOgS~S`0dHUb30_8o)q6v zbDTHP=H9Dg5jDG2v>uXU2R`B|$@o5to9ws6JSapi$31AN%x(GSyZO?oqw}zS$1|i> z%t%#uU$c+0F7P91SXYH4!*hYp*XsfFm?fsn!7n9)S>bATyPC$_NpN5KK=H<`#{uld z)8D?em2H?_c52YQ4f)5-*tk?&`Zw@S5wMgsqmnRYV>t|lr*foU0~D7FEUjBc=l{!#hGh{sfEr5_npv` zFs(Y1Dp`9|XF-F@xqx~N{iXhe#j|J^#nb{lw~S%yPAHQ(v1fzq1+_*A_vAJ)^l=f) z%1CYSY9CYM3(k6D$d{OYGutCptj%_xeDGj6M=ubZn>F-uXS-uVuvJ#w>E8_l&gPhYvYXhLmKx_Vk%ti-}}wbiP**v^NY zdigu9o923YMl`E4nfyiztGgNU?l<>p#%+D3lDVF0U64(S$Sphgq~*iQs!uJNu?-jK z1(zNi%JcMmooPKo`$jOE@skst7i=`K&0Uu|R$59X#7tf3lc{xMft2UvB`%z|hV3eDBpfkyF@=*=Bqs-b0rtqUaam#F5f>x+qvYMjX;3nZ1 z^?pXQPwP58$BN79E)PkGDqAc|3oO+GEfDZRF#f9{PdHJwl1q+aj*>{06zIFiK-)R zWSe;ZEY&^sMDysoDvJ|(u}YcD0_nAfHEplHQgN=*v5x*87(svfCCb9!l&z*IPfdF0 zcwHs($5Lne!erZdoCbQ7QCqZk*Qe%}=PG`7El;VsH#O_}jZV|V*b=Ff9g!}j$0yRW zbL`V&C-=)uA9=O2NIL#{o}!~?o0mMZ-TJ0QeaL$G3f^=j_fKLPRutDHgdK>BQ!5>kXtiWfiF;srOT_g0dZzm@M?Dp2It27bT8O$E}dDh(k$+9zNY%v4=PgQjjeTuaU+bRPCVh*ey$3hYZ`04 zG@`)McTR2Rb%o|9H8+ZGd`ph2ZJMQ&c1%Vi`D7(0Yj=WGNu0H(hPV{dY{*3m6{9us z^4inV9RtL3U82i7qg+>A_i-40$!yi)c8&Di+46;t(o_zqVJnFd+TVJ)Ug zlX9h`HG*6;DP!ms{hvo=ryZ~@-RQ5DvVXL0;@PIs>mTnpK<*mFtYj*3HwFM*Lh<6ik2A?jC(aypXe=9@HFD(kW~$03%@NusB6Wv1oEc;7{X=I-KXdJN z^(A^2!VAalsQj#dbngU%^5h+yuP@z}ez{mOw9xfLUPZZF@@i-}4dHZAg67J2Ez6Xu&4>OHqR(p4Je|FZ-?~M3J|71o}0QGvU?Vvp> zc5{Y1+ed|^%=+Qm;CNkHea_}n?hXeYr_WB`anbtNdr6xwb1Y|`*IYeghVe}+uA73T zZnNFAq3e^TI|Y7l2@o@JH7^ZYAbtPT{PpD>&LxK?&3mf6-05C)+1!?iPu&}xsf*UW z^v!Q9rB zE9uG~t2m@nZE4;2X%{oTh2?p4*tTMyR>oF*)S4RizW)O24_mCH+xLyR{<(8&^4FVu z$1mQVk@X8EoT-yf`0-%kGxLX~pO-WwWfnHpjQITch5dv_b+W;=ZT`9UPu8{FT~(lW zkG$Wf%H&p7br7fdj^_}~8pW=~mqu^dbun7^!DTy3)hjpVFR1uFW$T5#tM8oO+S0!~ z=h*D)nU^*~OI@w}&|l^%Pin@E=^<-x4!Ki)Tko{kEz7iHDG@(HHtA0rvw5&~Yw9lZ zgK39d{I-33HFE2vn5HcqS4uN)AC1mP8(_9;PgLh_O?FZG0Evk0vr3G1uBiUB!*F~; zvXqzo`o&M=HZYQIZ+x>mCh_6dX-TW?$O%Onm*eC8cEp~OcU#?@KP;yD!J}0!H&Ww# z56)dPNp;XVxzKxSv#OrvZaYKGxkdIr^o_Ou@bbvldG<;=$CQq+kB+*0^oZ)J57`E< zO%8^;hV8eqICbEnPDj?K>67*x`ni1H?rmjztGE}7UJjN#QI>6aGU4XxQ?d_l7EC^_ zQ0Svzcifeplpi>DW^{)Hk8ITsh@qY*!|qwap`4f{L=$Ui<2s) z54}59q_kk0&qm|-4HF)D1&=yyR=c}R`^2S0N6HGnrn79)I#O-%x%;yo*9CnviD+z^ zujuQRxnQtUr{RGXSjRW8PoP+-9q5IMUs5LB`WB zY`c}Il+RaIWLw@-E&mZRrz&&&m{S_bmsHa-vsUVk9&GdT%yO!g*yfGxieFo7bEdi} z?{u@s(KxwjsL`FTdlG_fhbt@OTs!haYGqlR_XWusPS)a6gVdWB7U#B4X;g7o^RlA4 zDJGgBZ*YBCux-SJy$W*IuLK_F>Rchy9I}e*Kc};2Y~tVf5$)vvPHn=2`Ljo#me;nF zIC;4(fB(LCS@j|L4_B?M4Vah`Su>`6I4f2BtJY-yO*>-aEeulLx~1y4c+WUtB-J6? zm@|9WncE)@zG>Xtl~Am29WZF8ix_A0n-bgiOBxIut{TRCd+7RdrthvSi{NipV($zJ zG(8`xkQjA+g6H!*rzakke3v<+(p$c8?3Wx?!n7eTBhg64;n8d1_#gfj;{T@q1xx=>yr&$ z^EOCVOlU1yT5pX7mX0W`dS%oYzj3~=A?@4!k>re^9cK@om8v^WI%mo{anxCwqOxO7 z=up1StpoknE<440az){0z2fGavLm|I{Rf+Agdd0r^S@lDNLuRMm3KRI=T+{tkstOi zut`&G%bj@i=Z(evXG*@C9qya(;a0NNj7Ke29e#7848DyUmTL9jxR&#|`#WB@UjA0N ze$Px9ANlu#r5Fx-%I5Bz^3Zg2-1zOA)112W^|zmP(fZNQlA*N3bA80XC*yAEo8}(2 zOYA?h*+QJUDz+p%rRmv#FCL42E^M_+H+TIoLUJ{82F?8Lp<79pZ|6>kHnUoJ-&5-X zt1uya`Tcj-F0$_rUD)sVo+r-&W- z4_gnW1k4?tn}1{JEm__c+G+m}k`m|zTr5J$FzuZ@ZR~dGxo4z8E)M1dwQp?oJup7Q zZ|gq!hw;WykBav<-D@4Tt)@O+`lQ2{=;O=JzAV<0+H`Jc%Ft7aenI)vkDpF2v5hOU zY8dk1?uwAd&tJFSEt(s9XU&xX%=Gzw!8zqWeZDPCq+flbO!9E_m1Nd;DopiFrpSGs z%%WC0FccTx^R{}vH(*KV6!GWP_T;-ZHF9fy9_UvTJiaKWb6P<<^I^%=`$tN@SsK?d zpUrIa2zzv2?)Ks8sSCC04Uf!iz$R7J&W$-&MH@KcM0?Tv!iyTW&uraZeD;8Xwpek7 zmqa|}vTS|9ahX<41NQQDZh;Q{&(nq;KIyMFHT;p)Cep(tlIbG@UZBd^rvoLE>mb&&oExmBmmdQ2`q!#w)7IF`EOT;WOalTT%N$7^=H zx@R+ScTL1G@_s~JZ67|4*U==$ojz%zy(aD6b-bO|e1@@3auweW;HW118nEOiffJnP1{(~ay6 zWo_REohqB|oxkDU{rme`_Ee`vo7GiZbZq=Muev1Q!@<%80TxA)k8KM~?d#;mJUG@* z&B0WB))y=CQtw9ZwhK7{jjl$l4Q1-Dlk7V%rpp8cqP?My|Yb788X=81g=&s3R8 z+^m&Mb!k|jqfsAluF!v}{zclXV$VP|FcU z#-={2$LKj<@MB&guZU=$Io~~dt)o@imCE`=N_9nvU1wWM;qm+lWsCBnXJ^Ff zZCIDCetTAh(p=|y4aLZI&K+8t)n@&?TGt6h&C2TOMYR&KacQg7(iiT;a#i#7Iv?hm zUfJ7Xo%H(aH)Xq z>6v$EhIQs^cJK}DaL!N0M5Ew5s;+yRjFj|PC3UlqMr+egmp!El-f~=)vyq4vl6HrFY1tbGB&Xf-xPeK}tTnP_ zb^0VlJaN8uro_`_Ulvm(KH1`aN}Bw(hT3$eD>riczj@MG^SSeSYN$`GM{rd0P)nDh zhJ}uCnFHmO+!Rza25Xve9!%A++DZQzoV~o+y?McP=}~j4%=}0xdHYloGoPAd-x#4= z`qTTU=96P5EUMmRD#hxpl`ddjwbeXa<*f4Rd$hIAQ+h<8fko68Q%&1bL#5StWF_74 z_Rggr=h-F~M$sEM-qCGFFPlGgb^WY3cdsgC`HkyYQ)3fNJ9nf=l^id1iOk8SPn;Z^ zZa*?Tx1V%T=T*hL>+xP~o{rY-O!<&{i<`U(`SqXNm8QS4(hxh(;&! z*iWo=_5B-6pRBwjl?9jozOz5kM~W4EdZCtEvEMK*B|s-LOY8ZiyyBk?ncwbzx-sc? z%g<#oxxuB|3*3JeWJ;SKjx$?1R$ViHyp+m^VY=4FQbrM6Th5acbAzisFSU*}_4O=> zxZYVir{+ns!nYemH=1hWl8>b+%{rN^A+tM+QyEucl_0L+X+6Y@DP^Q$aZy`deocU5 z`m|`5TyfW^&T#J6oT^gRQ(Z0A)K702em9$4MTrjmCjz;daK0e!TMLE~mJ#if5 z)EPa0S*_kypBw6T^^y|@j7uw-H@u`JMKY_tYH{?ZH#YQ&qfFZrR+w{^!6YTq77b~s zT#BYkP=5>hn6&Ju=Nn6H5A07-^FN!YJNo1G(x%r{$$QFwHu%&xw`nMsJ~=CwUG+mN zG1kH&r68J9rFoihU8Q4Mv-RXfKO>etq6ZgUigs^*=PW(ptF2jhv2@Q75qd}5i~(O?k-Erx@@78bj~Bm>lLrb$;%5Q90#tEA27FAp?dO0xovCi%euBb zksk8Rk5ZTF+%H3~pNxmiRCTR=oT1OJ+6>ILkP#rY`nIl8q(srsIZmby0DEh24 z{$u5Uuj%~$$F&YBavf4srnoCBcNuC7EZ(qm(9-9#&1PFSP24!PcJkHD8z#wgoVJ+p zZi@NZIGHKsljcnobE2Cr9^^J**9!Ld2Nz7ospgW57MzPS+5!#4NF~0&bqej^0lALQvLjp=o#zSW}OYJ&P}bsMQfQs5pNa+ z8qE`9d@>vFb8IEWH$=sPHs-LuckB7N^n0^eb4>r#Fj-==f;KpZ`Zo* zUw7Q|b;>voo$um{*)!d}jv9nK8Lt-8^mWOpr^j!^U~rj#f!VPjK2IpH~NaIrCr5>`8O_Xo$~$soz;8G`?qYpKKoeC zwT+iDE3YoQd{w6ZhZ{4bcsJLEOut=zXUHwF(|Re#(kwTH{D{~*W}1F#tM=fugXX)o z`MDh4I`Y-WEln|(GE1*?WJDjmy~}Js+V0M%J?TYk&Fv8q19lpf%-Zp(dPQ==c*FJf zUQ!$6o-E#YJBg7Pv-?fbw66~n$absaFKZOV?(mCW?IwRNW>|jnsz(p1<5F+9teJbz zcikY>No((g%H=+-%F3ah*>=dEeCzOj*0;RZk;{+iDA^xnA5l7T^zx|e535uUn!GmH zALbf<;FN_`R)@~TJ(H$?+PD1Yp}l3>b{AdbR-KR>{PLt_cG;=bHxmkOK9ns~I6nEf zoq|t(65X|=c4Xig6W0ci{U!$#6|BRm44lju+unG|u37m0>C_k7*3s9l ztA0GG>BQ}gj_wgA+7_>#E3TdA7V*sTZJk`l+;f5N$8_wm-IjULeWao8(~JdT<>Qjhl09TfXj8cAKh^ zW8r2rbkoU%JzwuAhu;o5axF)pY^Br_$qU|bi?cX2&FX_rwdWQubWmxWQeE+K4I?_H zY1wrH`3n)Y!Pn&!_HvI0UZIh%=+qZyIm}?EfBtcYzv-R7Q}p}?6V&8SkDh%}!cu#G ze%obr+4y~{9_A037*M-%Oig4;DrTrx;ko>!iB9Ju$=EMYcoAXxQwW z#)BVjpXu7%_{LhlIKgG-pnx}{IbuuR+m>8)Flc!AEymDy=1bRLi>zIDVy}EVZyGo# zDp4Wyx#xuI9#5R|=D6@JzqF)}%1esp4xG?7ki6Qmqttx#?h&oSHMhG)S|v5r9y9UC zzxH~IrSv)tPAl%h!oL(W=0*)Q>9?fF4=ItIr+&zWUBGW=6wM*p<*F=dg|ZS_MV z+ppS}+ve%l{3MkJS@|FMnzmToQFmgLXJ*>A7aAWv&JG?d@wqnI`=w9y2Cs&buPdZC z%v)O2Iw26VuCFQ`Q5xT9^vck8{>G8_ztMICWss%L9z1)FbiVHB36`k}McR32=$st~ zZt3t(EnC}P;mQ-j08AQ#sN*y-NS?lBF?m+sEtccR6XfoZg<%((q%w=MtrHPXv!;~rMIK)U*tIVF`N7pZow-_a#9edRjLS*44nNYR%k?#k_o(Nx*~0xth$ zHmJ{Kt@R(6ZT?_M#aMR3*e!QX+ewpGy+2;uymgY~`opHznA?75E!1m$_~pXf zfRuwb@^gptWN$6?KTX@xAR+m|`&k$NC}2GR`C|Z@y|4?gMMN(8?7$o&LoYAi$Vi$G zBizV%qL&wkEqDani^ui~p`#ZSym(O@x)*v(e`X)g9`s0WB%1!OQvE6Y1W1pbga4+g%9BKB?k1ZZ!nJ_+ZQY$or4jd|3Vwbdo4bHCZK5)pMM2VFb2v9s0Q5D z(j;uYi;LhbJ`BAN#|sS;ob;*TJQ{icR3Ok}u=Fs&tPj&W9`!3EcnPm(ls^lPfFkIH zGeUV`G$u^vVXR>EmKWp_P77twSUfl_@WMh_BBCH#IE^|Topx{o0b#UIKdM0eS6RAW zplLV^)LFoiRSn@G^z3_IzV?_N7{0UkN*Aj*VB6bfETU5m8 zDf<5NU8G8JQTfiNZy3$erWreYxu zm@fQfU?EH_Bm~pb!&o$oMUMdEEIKw~DmDURMW6_bJr7$x6=Sop<;yXS12$$V#$jR{ zNMf#waX8qRF&Kx7ad;5MmV{xUv$0WAu~28s+#Dzb8-;~(!H;nnOX;v|z_?2>A2ypQ z_(P|$F!WwD#$>~A@MDKT@5202v_#bpGrps{=dX`$UASk(UtbjKn~ z-61bn2=%nV4P=M%uy8i4n<9`sFJ8~IxB-2A{onh+6r?|vDu~CEhSC^3t{~c+i2v1% z@K~xjCTfT1DSv4QB@s=-{%@pV{L@5=PJF&6UjervXDOXrK0ce1=fGR-wy#MpyLq2Bn;aC7`JYd~N zVDDm_oq%5gcK}Oz;W`M931~z7L_j>qW&`{I-#ziP??r57c>WF)FDmOxkKRW*A>IH6 zdjId@u-E@C>i(CZ?1i_n$Ksy-CLb^Y>SsK_8sH8H_U`UqtHGZ}gbxCj0%`y)MBEQx z1sb0}5-=WM3s?lGV)OY!IUr}_{`Y__y&wy6GN)TkQWKx7NXD>LFc+lry7=fD@3ygB zd?(=e{ayU!z^b`j{QW3g(8YfPTnS8;z_6UcF1|W&U2zxR7KKZ@_&nhFvt9gjVAZlN zekpJya1(H4MHhdpB!*Egbnz{Lwqr;o59+e3>UPKXpIdV59|S)4jc(w2fPJX71rM;fNg=RkUsDm;9_7|8K^H{ zZD3WnPM87g2J8nM4;%wr47>}t1Gp4en+p9A=>fL`rvod?LV1A=fjfX5fXznm`ApzI z;CSG4;QhdLz!!ljBVjF%^nib$cwluounTKzOW+n@Z(vopR>%UbMAr*P#aA-GDn1q1}`qJ{9U)34Jvj$_pHy z2G;_>w%g$P1h_aI+6%aHI~*@?&JO4=1HjHsK7TB*_HIZA+ycx4b~^z51-SAs`56R>I?)HiT3@Fw6E;3L45$N2mk%J^$&$dQ&hVWj00 z32f6i35qP498c?{FIS!9Zu8hEVaDOU2b zR`QBg^2*cYV@RH&`Z-~Dm5|8pl?+98}lPTH~M10RO z8j6;2Ie>GYOt~W7r!G~fi^_nuy@y3#r8M0!SG+E3VY6Ufk%NntD;%mvV z5-|DxRog2PW}(_Oqox}P@EqirdJ&5OHIAv z&=#YXPkY8?AwZm~NF4esBKE914wb1Al@sDIn&98bw zSyP*MEaRJ(a*+0 zdQ(*PbuvBb=J&F%))JQe*DK4Aw%@P3q24ikE}nvH|3T)47-Zu_%Z%aW;i0r3v*@Ef zREd7-0rIhZ)N?*+>po=2E}B#0{=zQWPIvzw>{8Iizkjfc`st0ou!}Yge)9*r-srt> z<-YAM2br?+pY84f`M5sPA{p8$)%Fi|?}E(ZFYLC1eEA>jD#Ap%=?`|tf^7d^*mVH; z#Xr~$1XcK?n8#^Rvl!1ga6!brhq)|4|%$QEWHnz zV15GGk-xCJ1XoAsnAoa4p@V&)52;(|vA0 zpS6qunMtqyjBMXU^T~GnT1E7@=B$HjMxxvu=zP87ciX65l%amcfoxjOx#HKkbR5Xr zLH?E`l9uS-C@f)}wUGLO_m{m9q=CE-(3&r#Bwk68 zK1xY^mBLnu$Js4L=FwYVTRu@#_KH3a+D{p;85B zy8j~%eN0f4dpmUBVV;U4MO=i14*iB#Jy4P&FT(eM(NDoXfF|(w7vUGcXiHV}F^iAj zNBh>ds7g|-MPv*>7vVP?EGhUsSZ0tU1?_3i1`HmA%lrtL79m6TsKycgbdVVXPaA}n z>95>e&~X6>_v2px{$_x1OIUaCdy2@t!M~W0BRHsbhmqVD{QiVKat!b@MdU2-FA+)4 z1%J4R{V4D+2T%z48t{)B*sUKA;Us`05#9{`ts?fffq#dHz1`r?5|Qr({{azs4)}Fc zyTgYeJVdoyKM%sIMf8t@|HL4?AE2-&=oX2{i@{$a5-tOOsYw3k!GBRieg*v3M8Y@0 zUn`=%_g$oXKf#ZQ)So!``-{|{B>1IOyX#91{EDjG~96Y_uR%7|kZGIB+#`1~d0 zKe>xU`Gt(;->XF1EEQ>w2denoEIeM6Pc`_JL>RTxbD}PV{C7@!mL$b#iUdUw;5|cv z!U0rSNKj&c-&;!j<@e=~8wcs%L)v^~V{*^*oPUts64K|Rbd!J2-*EEZr+0w#o2E)o zoThfC$L#R*NbUx5LvuJ5LQb9BQ|<@yDv)n7?>jvQ@8$#&4C-jC9dhZFn5rm!wp{Ht#hes27D2()U z3B9p|o+Y7YNa$G-dM1S4ctS6b(3?o;1rmBw2t9K`Zxf+6jnLaf=*=YbYzVz#LeHMi zD<<^j5PD98UK63`Lg+OSdJ71>g@hi(4i9@0dMJ$aya_!YLeG%U^C$ES2|Wg(7fk56 z5qfMw&yCOvCG>cNUJRiZN$AB8ddmpC6@*?6p|^_A%OUjQ2)(t0UKOF2Na$4&ddY;| zMnbQH&`TxsItaZqLNA@rqt3#^y9hlLMtYeL*0zWGk(H#Nv4;FvBK{`ut2^L+s$93< zTg0Cw;%_4S!tr+mjlXFy{s2{0-Q%?w;uRsT$qJ80Y4<=`P<$Zx3yE^xMf1;em^-F- z>zya`1pNTQ<<>CXth>kGCO{Lw(gE_F12X$R&l7LZvDm=4xA{H2H;m&ZfZ|`I??Cke zc{k1cJv|lD=FfsM%2+l3>tH^@$ znAtkA;M}hrOBS5RqsjR9s?c+HDn$9wIfgSEU!$m!@b5#Qb1M2xJSUkfIKNh|CkxI` zO#t+}89MkbKA&v{@o?$FMmF99pG^Ae@0tE@J57;({|@S`3n0IdOc@5y2bcrq02TvS zfM~!5Kn5TWPzJaKXaKwebOGcyL3)5bz#K3Kuo%DsL<2SeG5~piGQcfB1K=H?3m~7; zU1zeEFs`3M-)w?4C$z;dfC9vqH$&fgg7-P}Jck0I-$cZrHbLtR^jNCmL6571HgjBcsN?jF^o^;;hK8m_Mn>ZW-!KfNGwC!gU5BbYgYLtiu>?9s zdd5aN*uN?ND=CfjCyv)2hmsl@85$b@(iXAsf3^PqzgqL(l>esuH|4)6|F20YcxDK{ zZ-d{xpu!quq{upItU#_r63SHmE zZx#Ga0Ym}3>>RzgJU<4@D~wAQJPL`e=q?;dSh#5beSHIN6xWZ=;TkYZ%uEgFOn(C| zj~2?)cg73?*&%cTS{NL)iLpTdli}lw|J5_rH_f@(oOmXJu_<>lZniMY}u_0gHpwgh-@7Ib?FG1T$J%Q2G4 zh;dU#jTBd4HuUHb)U?tQ8KCvAjbL@y#ribjXH z3~7YHh^g))0s;&S+((QUAt)yZ(WD`+0m7+b5_k-nKEzE3bumeZT>XEroUHD0qIpSN zn)It^Xnqn`A_)tN`poqI;$%uxwqUOe!9E+mcE;$j>ju6dN4KoU)*Sy~SI6`2VX@b= zD!c#{+;=n5H$=bf{l5{1>2sq(cr+hiUMS9iLZ4uxK@O(RV)N+wR@3bCc(edaKaj=^ z#Pt25Sdb8BUMQv?zzWkBe%4Vm-~}?MG^B@nI7}Y0%z(c_i_X_k2?GAxSUteMiJTJi(LXg^r%f<8s+uuMja0>E;M97dJt5CL}e6$dTFBo9+ z1b^@X;F;kT*db^;K!~IJgavrfLTRi3I#(Fvg!u@zIueEjThR$seSAXc;ldD;!J-TO zf+|7PhW%5ghIN0((`6Nz;zGjjDF~hLw<$EMND+F0pchCy>o0V|b2(~T2|^Fui$c%m zXOX()!tbq5!0`J~NDtkk(njwLk@2)7LI>TeLhpSDe`7=Uw9KUNds)59XM+jub+C~h zx)*g4jQ@Hc6YKu&J9^%~i_k;&u*_uf_j4q$?$3}ShbBpBA`Q9+Rw;|$0~0+C)UTN$ zdgz{6jvRh3jZ7S$P%n%qE4n9#rakl?|DZnVk0YX22YPk#_;c%`dI-xz^w8OW+8@LG zW_16Os7UZC5j`}y#<`Myy~81z?>elzA7p`E7U*@@bn8(G-YBA%K2(yDzMF(8i?oN( zyIVx>$OuWwkv$~rk>c-q*&=%ARqXfz5~fJ{T@SrCfa*~kMOaEwuyPV6dc#qucaE?p z`2FlJ^e&6&Q9zIK2fdpjdWxW@2zul`^lC)(sGvthda~VmRDv5Zye*I(x+kf5gCyuz z5+e3cIa);Qk!MR%$TvxXz9yP4!dnqNbT5|!dg*=WeGxt0IdHtUNLZkVp77Xz5PqZ= z19}|L^RxQ>I7p>&xO?`03corKSmLKpw2=kW^dp?m8+ ze&c;i!ry!Cr6(L4LKpd*gmFwT3|(`@lDg+f>0b6)28m%}WAI-~n81Kcx-vY!1JsqEC@i1O9mA}Gx>!W!S4@(QeXnw@Qg14jv z^B^9^pM;>M2*daQL-QIQ#-C2e`W421y+`vD9>(vUqxlFA;}a5^cknRrM1iF+tkf%v zpBX8?!uT6$ioe46FDukv;emp%@V5tXV#Y_~84u%c!f}3u2jlkV2*dbGDKWpoYM7`K z?=h33@X%i2VZFk`dxfdJ!XtWxNA?P9^a^YC3Xkd)*6Pvk$k+$IY_G6(udqR{@T6Yh zXbivVMqx2%{|&w5f_Jot`X@nqq4NvnS6CSasbSe@omMA7(H28tdF)azeY8izraAa?DMLOxZ=$4|;EJ>?bmXOTxoJ5YB2RQ}z(@6%d~BnM{cyLT71;bO?($udAzG zbyrfGwe%7g4a=Z_kOl<9nnpnaG7?1@7zi|ojtGo#L>OdrGJ*(-Lljp=hX3!}dtTjB zOOkf}Gx@;l_kDL?&bjB__wKDb!Sw#k%m4jT^}Dy#%#Tp|KhtYo#7|Lq!JBI|zc5w5 z!}G$wO76cj@&BCMe`(y`1s{g?IE?$>2jB&QKZ<%fUGUs#I{$BQ`A!0V-m=vBJj8yo zt52}(`CK2TfuHz@Wk1U9UEqAJW#7Z?(L0UKps?)gnft+aApDgaek1sv<1Kq5^C<0K zooCsvF<%MpJj$~D+cJD2ZOaAJXFzsLMK_|fZ)Jp7jSLX$pd*G%^3INXn5_gQQJQi2Cy zyf_oweyZ*t6yG}V7>P6s zogLF)*(v60!MpsX{A1u_0)}q}|3$dp2Hqoh8~F2r?*Y#c;qRw&p9FsuocWlg&hVl1 z-?M1^Hv05b2yXj&%RYtOPX}kfS2LeYf_=Vaukh*%90CWJ9q<_VH0Dj%@34Rp<9nN`EQlC(|_l0K6+^ z*+1d@{VR9^;jiHQyiVyOKj(6MzXkWDEp@gP@f7rg-QXskIa+fo z^_-h6`%he+9&l!hWk1L1Uu0ANvF!Ujc>#}IXW8@E|1fy`Cd z7cBc#j_=Eq{(942AHdz+g1?HprvyKYyIq1G#oeCurSdd!zTus?dqnUvxO-OcKjCgP zZ1_doJ?t3%A@2Sl_*LAk>NEWBxO-FZ&v91}{43mT6Z{+8)rs`}NcG!q_ygSiTDVU` zN9hpm)4?l+`yt@33qBnDS;0qvFWzYQc<}uj49^G87Vb;HZGs!X@r2c{OFw6L4fykdd%^!L_(JgWf*m^Nbc^8__)CJ5lpn!)@Oy$U z0nZ*Yd^xyH@YUcx!DHY%1%Cnjq~N>2ZwS5@{E-_BKM1b7-Pk{mfit%o`{z60?_RIJ zc_;heHE`{n#{T&ec=w&g{y7*^{>)vlr|vR`8R zwhtV7$g*$e@gWc1v%|8_W4;Rftg!cPCI4Ty?58=suY&6yHulW~@i#2{3Fe=Y|3@tQ zAdc^S@a8*3{{_D&nAQXz6g(X~F8E+@r{G!OCj=h>{)XUVXhJbR zu;5|v-Gcv?$|v{=@E-(U4Q~IE;VodlDF4miv~Z^*6}Jn%o9bWiec<2UZ}{)Qdj!*X zIrG8N@p9rT!oGn2^B*w$7@aRH{67UA68vrO8sYzWI)_-q_XF_#f?uKYi$(aKP(4;JqK1^$t6rvq0m7VZavuljq#2Z4_gJPUlb;3L6Tiu@c0 zenG@{61YyJw+MWL2p<67E4T&xh~P88-xJ&ceob&U__u=30Uz*H!{>o#3;sBGvEVRx zncx9B|5^aOUz++Ea>OCZJ7`*2h%cgUmh|?6`3zmI7$9D~# zpDpzFEp%S?7Q^>~X9)f}c(<6pKLrkbAM;NhFJ2>e;eQW!u(+N!*Y`dxDQ_|BYc+?U ze}X5N4+FRF6#W}~o#11^3BmKgeS#N&YXmO=Un)2V&I@ii#H=q*nL5YUPD|Xpp6HwU zn-9+|<7gQd4l(P`Q>Gs2ySB{zF7S@Udj33<^cVT>wA3Cq;#Uqa=l{-}iuneWr_EB| zjFJ2FTD?DpB0L`R%|mF({fQcz);-BToj1N+xSs&-d(pCg&F&4gdcTh6-bV3#%(9y~ z{&QeyVAl9-W`Q zxx=y-b9}!8`-S^|f!hR6Jrw@Y|Ce!mv%q63O!zavwAbV$_8$YcFF(LOk@K^ac(rBI z*?{DK3JkH#%{6MDBgJU;2u$bYruZg z|FIlCO!55#>@g0137GaUoyh*b1g1TRUjAPIkKI&bFJS+#k)e2^rS`Cp`!6VdxG!e+ zKg`tob7pY)4wyyuW{v&WRPBBkc=JlVUP|t#%rfVilY1-p7LormXPL9B$=w0d{;(Q$ z9{{)CVcPRk;4Q-aD)2nP*UvKNk(2+2>AZT;KOU#^>_z)NL-D_j{yT-<5gzROK6tB$ z?-eS~!z_=8?`=BYzT3q28!+u(I*aS;Kop$zKzj8{=ibvkCeM8ZAF9})*yp-x7L7`BaVlIJ=(?o)G090Mj129_9zYhl=+9`W$m^J%!%|9)HQQ*RcQH zVDFrNa-WKUc!KuFad~GQVb0Sh_aJy|yH)hx38p>AUVb)$X-{4)^A+GGk)Laip!ZKT z#s2dEc!tm?kAwX?Yt(upxqs&f^P2@q{~V$BIeP8&4tVzp(?0KkHw*oG6b(esFLfMW zqkg5Uz7L`HU4EoFSD)OY;0yTu+wrLXOTl%hkHs9{yU`o}WzFY0F{_${G7&IQ+r`pV4J`;xu>I|LqsKG??bU&ZGpetL>7 z-!0&YWhTE5%{A}yXZk+k`zCmosK1@yM+H9%t`+vfOW-}|uMcp3eg=*Uef<`dN96aw zqo}`{_E^HN%wOXCodwQ3Z`lp(e?9oKb(Vdz*T2EEC-o`j?||2d`g;+4tl*cxJ4F5c z8+aV@H^A|~1wLH(f0yzH`5I;S55Tk^^aOUF2SdGG)b~R0H6pzKXua2u&h@AKbsequ z>w5mz^CtnbxV!`49nW)nA-yZWr;GZ#8oW#Bn=vr$Y4yhMd%#byeSIj|&tTe*@Aa>L zJDSemw(L&kw<-L#8vA2xzr6>h{jpwuIPe&~AKuIFLEvSge20OrM104y|KpD_zokL( zEj>oR|7+p#ryJaPqJIBM90Joh0iJwcLoC|o2JmKKzrM_$Oz84K7MN?N>iYZhG4wkM zMqZ|fPbx^p4+e+6XBGAT$>1wR{VoQ#KWf>}vHNM@%pE*lfqTI#MEoBIkBRZ|GBE8^ zUd#Lrc#qJ>a}d!5qWz8q)BfftyI%mNz1uT6{uF-#@*k{^J`K)_{L*30N1#3r~27uS5R-8{GGtWxvhtMizDe|_?clRT`#(hf1wT@!_kDZ%{W&o0VfXU$ z<2qmQH&-aV_bGqfdVP@cw~0TQS z;nn{p`ou`|r)~4}IUt_V7p@LO-z*jqV#6#OS)42FKS8_TOxHE%>uSUtKic{O%XIN5E$b`P&E{|DKs2UN>K# zgW<`~!{9MtpS=JM33>mJ^M5p#cP13gX3-vV7ijkfSYIt(V18GM(mMw{A@tMV;HFmO zKL*|^IJrQd{!aDeaiRIXbf)hh-*oV0!hh{To&Iu8{{(QIn18PZ z)0s$~eYu5rPmTQ~+b_2-G`|f;>D{x?{KgjXvmF2TxV~Se_zyZj^(VDHw9x$aoRUur zl$)Qdu{SZ#2JgoF<_pXx(m?vU(SM!bKCzzhaq_>?=!3tb_%Od%>FKvq^tnQw{EVMM zsqtG`PZk^Rr>eei$VA{u{8 z|M}t~T|Ymart4=Xc)O5?XTg3^zBkza8QflfBzM>|U*zz~_tdCcvi% z&Vp;j`r=jfI=%Ir-qw2an{t$&$G~(>k~hEl_j>(3wKt#H1MU*>{{g%M_Q01p{=b0h z#QbV16hlnN|8(#e`d2HbHwR2-5_$G_0ld4_Qu9&btzbHz$y=X&`c!=mn%5q0g7e4e z@B7IAyWo&mAD-rieJ=7l-LKE@Dz2~l^|?-7d?)#7?6T}{bNB|{z|g?;)#=yY^WMVl zYru4N8?7&#K=wblPmG6;kh|z_JHhve^}ZK4e$QTi2fXVJt0?d9gX_e2I|GL5I?>-7 z0{UDfuRNUrTHiM5tpa<$0jbt!!4C_2Jp-mQl@4LP0=(xo{rxMYHx917rAFH~v>pVe zbFRGdJqZqp`RyCv9kP`72_P z-zn%A?a%Z2Kk|DFn9dDbz~Q^Wp%;w1)1c20^!nRpz;B`d-o^3V08R^e*$SS4@z0w- zeF@yR$jk@6M(OuLzq0j!b7E zu4Df$@q}4_$$>8v;V%Kx`AIKx`rE;Dewf!EzTa3{zdvP8aQp0OG;V75NVq?~L~Ug4 z_3i7J0^Tf4e`sSWZvQv7@<+mngfoy#ryP|I?Rn1S3$YlYcbtxO=d5*BclWMy98hNo zt?Vd5B%RD8+`JpDZ)y$(d>Q-+w82X>?F=N+{o#b8Ho-dK!iZ0Ap^X-j$x$zXuAWX4 zzX!|LE?v`ABudP?H?c;FvHowI84ym6)JHNIpL5YgfkuGS6VAtn-0oB?-4#gD<5qgw zHR49Pw1;#il8(BGcrH(YM=}u=J`-^=*?1}+^DT>~!r4*vkg6!_=5nakfk-6i5XTd! zF<;b;CBkU@2>hgC@qt1X$)Y**USf7dswlViKL@8 zGShZ(HjUt0GZ|SfY>{#PhsE`>UP&XvRf-XGReu9oblH9!3P9Iw@q7 zwDH4Dg?v1L>Ip{^Znhyv4VH~~f4RBT6DJYR=ZnxEAMm+JH;ckVM)i(*gZ+>+)S-Eh zEacr0>T5lLM#mXQ6&$tIJrzy_`~%3n?)hCqUCsIqUIW3b8;&}KgxenowuV*>hBla| zIrB75Pn#){aCAc<2XS>W`D|!aZ@!JHL+u~$4LG6D5IhE3RdD19Jv{0Rg%brAb&?-+ zs3iwCc*z6}VBlDog&zpc~o9d-6$?av3*L#dB%VLql<2{pyBhy7=i5pi2ub z!B)C!q)QXU-++c084>YE5^gwE$OPKFqO5hpIXv$`g@ghv-qS8GfNI}1-Mo>Jkzk8M zvfH0V)u64D&>E2H!ElN?8k#x~@Ses~1HLH4cOz;bnaPiOK;757r!xV(`&^;l7tbj@ zsZ=mT7JgISX$XVi97HK!$fmSFM4eP2*^mAhb=0tsj>RA`L_^Le3*kgO7Dq^M9;qwU zgZ2z3@c@z?$;MS4(-b@$jZ)&dd^}%JB`!kZfp23e$13Srs~$E@UIclDH#E zG<7WLjGLu2JV(wq`JqUX(6_)s%FAxF=+Vn^I6FWo_J^}jqlHvND_b2+BoT%Va8V1a zAu>=K&_&5`Y9Qe{q-4+r$}Ly!=;e$e_i|1m;k6lgD!SZw=*z&`*=;sHs<~owNxNQKN?!e>NK)tqAL=Q7u|59y&isK^y)LkaPq{Is!qG z33X{8ISIC@YZG0S3#K$Rm_bl=0+8Bql&qyQD0ltm11aW@~dk=U4!b{pstPT+N7?{>Z-yv zsjy8dY_kg6tim>{u+1uLvkKd+!Zxe0%_?lOsy3D9rWSowVOvz#78SNdg>6w`TU6K< z6}CmC+oIBK^{aT4|5g>Yl|r?tI%!otTb0jN<+HUlpsqpHV8I6chpAEjY0`h1^`92~ zr&a&a4Xv_`KLPzG=#wLjPYy7?=x{h2LysPCs8927xUVt9S9Rdf18&vGTo_&$9i2!l zjDDIPAk9-4<}+Eya)3NTeR$sR1cLy2J^U0hQF4yx5e5@NJW~moC+QS44pO89bM-CF z=qbt*qJbtX30WGOuc-9H@tj-K@lFWZ)eRP1m#3l9q73X-zgqVl)!0<=x)V{ms1DZ5 z?WL}|VN|=Y1gch1G8hP`1`eo(4XAbvsAdhQRt>1I0Tni=!UnbYs<66q=uW|XLWR;D zL-z~SErN||aBNi4%vUATjY_5)wI3zHO2UFl!h%Y|f=a@IO2UGwgh3@?K~?ymDt%B% zSWrn=P*p%s)j&|yQczV+gDPo5K;Jj1tICxsX@e?hgDPo*Drti%X+uzJDiv0hv_X}$ zL6xyVm9aq&^XU1psEZNA>z1TzF;;jJm-KK7CPapjZgXi&n^b3xWz$I~(yvTR@g&{9 z!Hwiqw7Iw%E4+cB7&%!sk+^a2seWG}9CVORIP2taAp;&pvX4eub)&|vcx;rDbJ7^) zwF`R}*+|Am+-PMkFnVruv-QobZGJj?%7yu@15q3TI0d#&bp<`R(Cn2-n@{JkuciPb&bIX z`>m(Mc7ze@z|Ja;#F;L#p?d;BJp(*H8%N~?{OWIaDj#U>%E7%iAMm4}jlepEF-{@Y zbq~`_687T&hF=%~^eAF*Y&x1r@jLtWksRL8X{UYZvb zwVEXKpsxDEYDSihbOu%Bz-dJPNh0+u7nsk~qPp`_o<_p`@ge9e2a?0qS+UZK5lzCc zslCCj%oM9->{00Efk$%?200ktGi$dFal6%io%$Utb- z(ApkMuc)hNzhwRu68SDw-MwzUC^f3SThW)og@M7m>2^cP=NdPuTRETAvs#{>QcZZ3 zT@0e@s5mRh6(D6Wp4W0iSJYlWR!T`#?AKRkpi5`4r;yYgC+FLgi1)AO$%bB0NxG}` zf&g`y-h3-{3uTUSCG_UAr2eS2Pzep>EXA%ZH<%uV8cAey)Av^qvw-@0o|dz`?qjPW zvTu@jrBl6HzLj%7|0Q{7QQ?CtS@A5!z>f}BpRj@;KGTrdR9>sD^G>b<+G7wroDZ|>h5J7 zPO#q3LakCp3UUk1I}RdoVmE}=6& zR3XPzq?42eWH?62W>nvGa@j~%9PJod)$4b9gH9DqGYJKMhqD#&R<9;cWcJq$0=gSSXnC}&Y;`C!w1K4|Dr;e_T25-CKU(1+ zA%|9$ok*^r>=0VHY9#mN@dVXVI+O@CU_ujWrE@lycdzbZZD$gzOrVwiER9C9T`C_H zlb%TkrdJ1YcxW6R4ClS!cvZ48-Hu?F$S0}u4!v-_JP{tqsn&p)t_u&S6-R0qDkZ7; zcqkNMC2z)l-Qi-DgYjO+ou*JC2vw{qOeo;2ODdwYE0^`mHm_s0c7=VN=htW5Sbeqp zte>R$P@-@r+o8&A1E>;h2l%Vm0nSCyM5uBg*h`=Gd+p|F>A0@lDnnvvE0V8K9tPCP zl6p6gDdcly^;t0hYimNiSkRgyrvFBjdTuLfW+TE&$&yz2%T?)IfwF9^-@gt^s&*?K zP*Mkge+4WPRbqjmZYnh z=Ov4frh~Fku`CT`&qH-OG%Fh*+@H?o%SK;_?MTsVp(Q99?c6F2r94N< zO!*>qy7c;0zF(l2H%!71o2()Wsw#+%rc@ool?EeKS?G5*A_qm?*4yCpHaS|uAvF#l zRNSO=ThMEaXn_!1}rOyt_(ojFk_1Y`315bF-ba zhDU|u5<^Zg!@_^kKM+&D@)%Z#7H8t`RhUPEAsgl(I9sqZLXr zSY?v9?F~+THL95$6$-MeN`zI%lj35SL!T97;{$`<+5!)1tHQ;}i|!43pGGtUy(zv}HdA9H zeL>+ZGfZZQEMUf93>j{I@)I$y>rhu+*}ZNrZ#k;zqcSyE?6;*RX}Rs!D;I+*M&N4g zJc%hQC0%Oz%f%$6=F9`Gr%*OtWd(9Sg67}bm{8f#mEFzDZ(OInYPpoOQJH01oJcC0 zyY!o+V!`%i4#taLwFFrpM^zL{6Y+smpc&EkBWrpTN{02SR4o$AoaOTR3me0$$Qmv#!LG+M zj*I_Bs+X_Aa8ch#>7KEPzRF1E2K4%r5`JYV=}+8b-Zn*wqrRLfd#m(%wK-JH!u5Fz zC2)`UP)m`_XnCpkuj~AKF=fl_qx~)Nuo~!q7WaAI`|Y*fwaql>i$xOYoNMwNs4}su zGPbB0k+x4WyXI2lW-K`!yrVhje+wQgb=uOqIXtMmO3gcL8qXft83THdQq zkV?J5Og78>U3zs~mte@}j>M}>J@w0qq3Y_a+Co0ssPY3f6-j=Q23wPP=t&@(m*q=6 z-im8?$a@K^)C;9tGKhEU71=6A+Fo7*cI!GuiJRzsf>_w#I;--toy1fcIua; z%KIL@a!3v9_T^>FoHU14texas<$u0hSDN#H=-EbgDqk({MelX*e;Sd`dMl@;c0IoW z>eZb%;Z3Z|mMuKvl)ksj`C{peoOT9^%5PEwU=b&(>AFK9 zRk8A5^dvQLxkXtmeWTM#G){NfvIuhHstI)mR|UUj@m3{DbVhHvfvZQqLN@EB@<)R2X;r8XjJ$dh8QQV zKf!S_gL04x);FqVLOqvTnU&&OWep283&po`sQ6V%2gwsJPSGOwHco?&Vz*1eCt@7`PtpET3 diff --git a/plugins/amxxpc.exe b/plugins/amxxpc.exe index 51f9ed04ed81aa3f988f6af481b3b7d2eec65ab3..760fe2d0e31c39b979c33bdebd6cbc89ac31e17e GIT binary patch literal 101376 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 aasRk~+&}Ig_mBI>{p0>||G59l?*9Ws9lLD+ diff --git a/plugins/amxxpc32.dll b/plugins/amxxpc32.dll index 7dd0a44f0b2aad822f896eac29031e2ede6e32a9..969e69d08011f50cd04b6ecc9993faee55283086 GIT binary patch literal 261120 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

&(C#`1Rih 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

q~^okVT1ovt^4Jeur-}mFPDoNcVz$)Rq+Z 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 DdclS6 diff --git a/plugins/amxxpc32.dylib b/plugins/amxxpc32.dylib new file mode 100644 index 0000000000000000000000000000000000000000..d8281c57cb9e478bef0651fa5ff8d7026df0c2a6 GIT binary patch literal 173104 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

IcfYK)lYLpY{&UE)v>V1Fqj|lk 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⋙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 N!JW}}_GVDv^Pej-a(Dm$ diff --git a/plugins/amxxpc32.so b/plugins/amxxpc32.so index 844212940d5cfac2ed2b59a1370261f8b4fe8046..c6aa6b74db6f865995b363f9675ec4e645d51d44 GIT binary patch literal 207368 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�-%!R2TVG1_X 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 diff --git a/plugins/amxxpc_osx b/plugins/amxxpc_osx new file mode 100644 index 0000000000000000000000000000000000000000..d0cd8f805779a3a8b07c4480cce87b226b331637 GIT binary patch literal 66960 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 temp.txt + $pc $sourcefile -ocompiled/$amxxfile >> temp.txt echo "done" done less temp.txt rm temp.txt diff --git a/plugins/include/amxmodx.inc b/plugins/include/amxmodx.inc --- a/plugins/include/amxmodx.inc +++ b/plugins/include/amxmodx.inc @@ -197,16 +197,19 @@ native is_user_connecting(index); native is_user_alive(index); /* Returns 1 or 0. */ native is_dedicated_server(); /* Returns 1 or 0. */ native is_linux_server(); +/* Returns 1 or 0 */ +native is_mac_server(); + /* Returns 1 or 0. */ native is_jit_enabled(); /* Returns AMXX's version string of the current gameserver */ native get_amxx_verstring(buffer[], length); /* If player is not attacked function returns 0, in other * case returns index of attacking player. On second and third diff --git a/plugins/include/fakemeta.inc b/plugins/include/fakemeta.inc --- a/plugins/include/fakemeta.inc +++ b/plugins/include/fakemeta.inc @@ -94,41 +94,42 @@ native pev_serial(entindex); * Example: * new model[128] * new ptr = pev(id, pev_viewmodel) * global_get(glb_pStringBase, ptr, model, 127) */ native global_get(_value, any:...); /* Returns an integer from private data. _linuxdiff is added into the _Offset if it's used on a linux server. */ -native get_pdata_int(_index,_Offset,_linuxdiff=5); +native get_pdata_int(_index,_Offset,_linuxdiff=5,_macdiff=5); /* Sets an integer from private data. _linuxdiff is added into the _Offset if it's used on a linux server. */ -native set_pdata_int(_index,_Offset,_Value,_linuxdiff=5); +native set_pdata_int(_index,_Offset,_Value,_linuxdiff=5,_macdiff=5); /* Returns a float from private data. _linuxdiff is added into the _Offset if it's used on a linux server. */ -native Float:get_pdata_float(_index,_Offset,_linuxdiff=5); +native Float:get_pdata_float(_index,_Offset,_linuxdiff=5,_macdiff=5); /* Sets a float from private data. _linuxdiff is added into the _Offset if it's used on a linux server. */ -native set_pdata_float(_index,_Offset,Float:_Value,_linuxdiff=5); +native set_pdata_float(_index,_Offset,Float:_Value,_linuxdiff=5,_macdiff=5); /** * Tries to retrieve an edict (entity encapsulation) pointer from an entity's private data. * * This function is byte-addressable. Unlike get_pdata_int() which searches in byte increments of 4, * get_pdata_end searches in increments of 1. * * @param _index Entity index. * @param _offset Offset to search. - * @param _linuxdiff Linux difference. + * @param _linuxdiff Linux difference. + * @param _macdiff Mac OS X difference. * @return -2 if an invalid entity was found. * -1 if an empty entity was found. * Otherwise, an entity index is returned. */ -native get_pdata_ent(_index, _offset, _linuxdiff=20); +native get_pdata_ent(_index, _offset, _linuxdiff=20, _macdiff=20); /* Registers a forward. * Returns an id you can pass to unregister_forward */ native register_forward(_forwardType,const _function[],_post=0); /* Unregisters a forward. * The registerId must be from register_forward, and @@ -212,27 +213,29 @@ native set_es(es_handle, EntityState:mem // Use 0 for uc_handle to specify the global usercmd handle native get_uc(uc_handle, UserCmd:member, {Float,_}:...); native set_uc(uc_handle, UserCmd:member, {Float,_}:...); //NOTE that for the string offsets below, on AMD64, a byref (char **) offset is NOT the same as an int offset //In fact it's QWORD aligned rather than DWORD aligned, so the offset will be exactly half. //Gets a string from a private offset. If byref is false, the string is treated as static rather than dynamic. //linux value is what to add to the offset for linux servers. +//mac value is what to add to the offset for os x servers. //this cannot use a default value due to older version using an awkward default value. -native get_pdata_string(entity, offset, dest[], maxlength, byref=1, linux); +native get_pdata_string(entity, offset, dest[], maxlength, byref=1, linux, mac=cellmin); //Sets a string in a private offset. //realloc = -1 - nonbyref copy (static //realloc = 0 - copy byref, no realloc *(char **) //realloc = 1 - reallocate new string with free+malloc //realloc = 2 - reallocate new string with delete[]+new[] //linux value is what to add to the offset for linux servers. +//mac value iswhat to add to the offset for os x servers. //this cannot use a default value due to older version using an awkward default value. -native set_pdata_string(entity, offset, const source[], realloc=2, linux); +native set_pdata_string(entity, offset, const source[], realloc=2, linux, mac=cellmin); // Copies the given infoBuffer pointer into out[] // An infoBuffer pointer is returned by EngFunc_GetInfoKeyBuffer native copy_infokey_buffer(infoBuffer, out[], maxlen); /** * Looks up the sequence for the entity. diff --git a/plugins/include/hamsandwich.inc b/plugins/include/hamsandwich.inc --- a/plugins/include/hamsandwich.inc +++ b/plugins/include/hamsandwich.inc @@ -310,46 +310,49 @@ native bool:IsHamValid(Ham:function); * This requires the mod to have the pev and base fields set in hamdata.ini. * Note this dereferences memory! Improper use of this will crash the server. * This will return an index of the corresponding cbase field in private data. * Returns -1 on a null entry. * * @param id The entity to examine the private data. * @param offset The windows offset of the data. * @param linuxdiff The linux difference of the data. + * @param macdiff The mac os x difference of the data. * @return The index of the corresponding pdata field. -1 for none set. */ -native get_pdata_cbase(id, offset, linuxdiff=5); +native get_pdata_cbase(id, offset, linuxdiff=5, macdiff=5); /** * This is used to compliment fakemeta's {get,set}_pdata_{int,float,string}. * This requires the mod to have the pev and base fields set in hamdata.ini. * This will set the corresponding cbase field in private data with the index. * Pass -1 to null the entry. * * @param id The entity to examine the private data. * @param offset The windows offset of the data. * @param value The index to store, -1 for invalid * @param linuxdiff The linux difference of the data. + * @param macdiff The mac os x difference of the data. */ -native set_pdata_cbase(id, offset, value, linuxdiff=5); +native set_pdata_cbase(id, offset, value, linuxdiff=5, macdiff=5); /** * This is similar to the get_pdata_cbase, however it does not dereference memory. * This is many times slower than get_pdata_cbase, and this should only be used * for testing and finding of offsets, not actual release quality plugins. * This will return an index of the corresponding cbase field in private data. * Returns -1 on a null entry. -2 on an invalid entry. * * @param id Entry to examine the private data. * @param offset The windows offset of the data. * @param linuxdiff The linux difference of the data. + * @param macdiff The mac os x difference of the data. * @return The index of the corresponding pdata field, -1 for null, -2 for invalid. */ -native get_pdata_cbase_safe(id, offset, linuxdiff=5); +native get_pdata_cbase_safe(id, offset, linuxdiff=5, macdiff=5); // This is the callback from the module, this handles any fatal errors. // This will in turn call the "HamFilter(Ham:id, HamError:err, const reason[])" public, if it exists. // Return PLUGIN_HANDLED from within the HamFilter to stop the plugin from failing. // Any other return value will fail the plugin.