diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..32e3f7a --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +Debug.*/ +Release.*/ +*.zip +*.so diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..daf9c2e --- /dev/null +++ b/Makefile @@ -0,0 +1,206 @@ +# (C)2004-2010 Metamod:Source Development Team +# Makefile written by David "BAILOPAN" Anderson + +########################################### +### EDIT THESE PATHS FOR YOUR OWN SETUP ### +########################################### + +HL2SDK_ORIG = hl2sdk +HL2SDK_OB = hl2sdk-ob +HL2SDK_CSS = hl2sdk-css +HL2SDK_OB_VALVE = hl2sdk-ob-valve +HL2SDK_L4D = hl2sdk-l4d +HL2SDK_L4D2 = hl2sdk-l4d2 +HL2SDK_CSGO = hl2sdk-csgo +MMSOURCE19 = metamod-source +ENGINE ?= orangeboxvalve +TICK_RATE ?= 125 + +##################################### +### EDIT BELOW FOR OTHER PROJECTS ### +##################################### + +PROJECT = unlocked_tickrate +OBJECTS = plugin.cpp + +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## + +OPT_FLAGS = -O3 -funroll-loops -pipe +GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden +DEBUG_FLAGS = -g -ggdb3 -D_DEBUG +CPP = g++ +CPP_OSX = clang +CFLAGS += -DTICK_RATE=$(TICK_RATE) + +########################## +### SDK CONFIGURATIONS ### +########################## + +ifeq "$(ENGINE)" "original" + HL2SDK = $(HL2SDK_ORIG) + CFLAGS += -DSOURCE_ENGINE=1 +endif +ifeq "$(ENGINE)" "orangebox" + HL2SDK = $(HL2SDK_OB) + CFLAGS += -DSOURCE_ENGINE=3 +endif +ifeq "$(ENGINE)" "css" + HL2SDK = $(HL2SDK_CSS) + CFLAGS += -DSOURCE_ENGINE=6 +endif +ifeq "$(ENGINE)" "orangeboxvalve" + HL2SDK = $(HL2SDK_OB_VALVE) + CFLAGS += -DSOURCE_ENGINE=7 +endif +ifeq "$(ENGINE)" "left4dead" + HL2SDK = $(HL2SDK_L4D) + CFLAGS += -DSOURCE_ENGINE=8 +endif +ifeq "$(ENGINE)" "left4dead2" + HL2SDK = $(HL2SDK_L4D2) + CFLAGS += -DSOURCE_ENGINE=9 +endif +ifeq "$(ENGINE)" "csgo" + HL2SDK = $(HL2SDK_CSGO) + CFLAGS += -DSOURCE_ENGINE=12 +endif + +HL2PUB = $(HL2SDK)/public + +ifeq "$(ENGINE)" "original" + INCLUDE += -I$(HL2SDK)/public/dlls + METAMOD = $(MMSOURCE19)/core-legacy +else + INCLUDE += -I$(HL2SDK)/public/game/server + METAMOD = $(MMSOURCE19)/core +endif + +OS := $(shell uname -s) + +ifeq "$(OS)" "Darwin" + LIB_EXT = dylib + HL2LIB = $(HL2SDK)/lib/mac +else + LIB_EXT = so + ifeq "$(ENGINE)" "original" + HL2LIB = $(HL2SDK)/linux_sdk + else + HL2LIB = $(HL2SDK)/lib/linux + endif +endif + +# if ENGINE is original or OB +ifneq (,$(filter original orangebox,$(ENGINE))) + LIB_SUFFIX = _i486.$(LIB_EXT) +else + LIB_PREFIX = lib + ifneq (,$(filter orangeboxvalve css left4dead2,$(ENGINE))) + ifneq "$(OS)" "Darwin" + LIB_SUFFIX = _srv.$(LIB_EXT) + else + LIB_SUFFIX = .$(LIB_EXT) + endif + else + LIB_SUFFIX = .$(LIB_EXT) + endif +endif + +CFLAGS += -DSE_EPISODEONE=1 -DSE_DARKMESSIAH=2 -DSE_ORANGEBOX=3 -DSE_BLOODYGOODTIME=4 -DSE_EYE=5 \ + -DSE_CSS=6 -DSE_ORANGEBOXVALVE=7 -DSE_LEFT4DEAD=8 -DSE_LEFT4DEAD2=9 -DSE_ALIENSWARM=10 \ + -DSE_PORTAL2=11 -DSE_CSGO=12 + +LINK += $(HL2LIB)/tier1_i486.a $(LIB_PREFIX)vstdlib$(LIB_SUFFIX) $(LIB_PREFIX)tier0$(LIB_SUFFIX) + +ifeq "$(ENGINE)" "csgo" + LINK += $(HL2LIB)/interfaces_i486.a +endif + +INCLUDE += -I. -I.. -I$(HL2PUB) -I$(HL2PUB)/engine -I$(HL2PUB)/mathlib -I$(HL2PUB)/vstdlib \ + -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 -I. -I$(METAMOD) -I$(METAMOD)/sourcehook + +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +BINARY = $(PROJECT).$(LIB_EXT) + +ifeq "$(DEBUG)" "true" + BIN_DIR = Debug.$(ENGINE) + CFLAGS += $(DEBUG_FLAGS) +else + BIN_DIR = Release.$(ENGINE) + CFLAGS += $(OPT_FLAGS) +endif + + +ifeq "$(OS)" "Darwin" + CPP = $(CPP_OSX) + LIB_EXT = dylib + CFLAGS += -DOSX -D_OSX + LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 +else + LIB_EXT = so + CFLAGS += -D_LINUX + LINK += -shared +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 + +CFLAGS += -DPOSIX -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp \ + -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca \ + -Dstrcmpi=strcasecmp -DCOMPILER_GCC -Wno-non-virtual-dtor -Wno-overloaded-virtual \ + -Werror -fPIC -fno-exceptions -fno-rtti -msse -m32 -fno-strict-aliasing + +# Clang || GCC >= 4 +ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" + CFLAGS += $(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) + + +all: $(BIN_DIR) $(BIN_DIR)/$(BINARY) + +$(BIN_DIR): + mkdir -p $(BIN_DIR) + +$(BIN_DIR)/$(BINARY): $(OBJ_BIN) + ln -sf $(HL2LIB)/$(LIB_PREFIX)vstdlib$(LIB_SUFFIX) + ln -sf $(HL2LIB)/$(LIB_PREFIX)tier0$(LIB_SUFFIX) + $(CPP) $(INCLUDE) -m32 $(OBJ_BIN) $(LINK) -ldl -lm -o $(BIN_DIR)/$(BINARY) + rm -rf $(LIB_PREFIX)vstdlib$(LIB_SUFFIX) $(LIB_PREFIX)tier0$(LIB_SUFFIX) + +$(BIN_DIR)/%.o: %.cpp + $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + +clean: + rm -rf $(BIN_DIR)/*.o + rm -rf $(BIN_DIR)/$(BINARY) + +release: all + mkdir -p addons/metamod + cp unlocked_tickrate.vdf addons/metamod + cp $(BIN_DIR)/$(BINARY) addons + zip -r unlocked_tickrate-$(TICK_RATE).zip addons + rm -rf addons + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/hl2sdk-ob-valve b/hl2sdk-ob-valve new file mode 160000 index 0000000..1fca804 --- /dev/null +++ b/hl2sdk-ob-valve @@ -0,0 +1 @@ +Subproject commit 1fca804cbd292589afd327a659af436feb8b17c9 diff --git a/metamod-source b/metamod-source new file mode 160000 index 0000000..f255fa5 --- /dev/null +++ b/metamod-source @@ -0,0 +1 @@ +Subproject commit f255fa54ffbb7b8a2c45df0466ff444e0bca2b57 diff --git a/plugin.cpp b/plugin.cpp new file mode 100644 index 0000000..2bb404a --- /dev/null +++ b/plugin.cpp @@ -0,0 +1,65 @@ +#include + +PLUGIN_GLOBALVARS(); +SH_DECL_HOOK0(IServerGameDLL, GetTickInterval, const, 0, float); + +#ifndef TICK_INTERVAL +# ifdef TICK_RATE +# define TICK_INTERVAL (1.0f/TICK_RATE) +# else +# define TICK_INTERVAL 0.008 +# endif +#endif + +float Hook_GetTickInterval() +{ + RETURN_META_VALUE(MRES_SUPERCEDE, TICK_INTERVAL); +} + +class TickRatePlugin : public ISmmPlugin +{ + public: + bool Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late); + bool Unload(char *error, size_t maxlen); + public: + const char *GetAuthor(); + const char *GetName(); + const char *GetDescription(); + const char *GetURL(); + const char *GetLicense(); + const char *GetVersion(); + const char *GetDate(); + const char *GetLogTag(); +}; + +TickRatePlugin g_TickRatePlugin; +PLUGIN_EXPOSE(TickRatePlugin, g_TickRatePlugin); + +IServerGameDLL *server = NULL; + +bool TickRatePlugin::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late) +{ + PLUGIN_SAVEVARS(); +#if defined METAMOD_PLAPI_VERSION + GET_V_IFACE_ANY(GetServerFactory, server, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL); +#else + GET_V_IFACE_ANY(serverFactory, server, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL); +#endif + SH_ADD_HOOK_STATICFUNC(IServerGameDLL, GetTickInterval, server, Hook_GetTickInterval, false); + return true; +} + +bool TickRatePlugin::Unload(char *error, size_t maxlen) +{ + SH_REMOVE_HOOK_STATICFUNC(IServerGameDLL, GetTickInterval, server, Hook_GetTickInterval, false); + return true; +} + +const char *TickRatePlugin::GetLicense() { return "MIT"; } +const char *TickRatePlugin::GetVersion() { return "0.1.0"; } +const char *TickRatePlugin::GetDate() { return __DATE__; } +const char *TickRatePlugin::GetLogTag() { return "mms-unlocked-tickrate"; } +const char *TickRatePlugin::GetAuthor() { return "ldesgoui"; } +const char *TickRatePlugin::GetDescription() { return "Force a server's tickrate"; } +const char *TickRatePlugin::GetName() { return "Unlocked Tickrate"; } +const char *TickRatePlugin::GetURL() { return "https://github.com/ldesgoui/mms-unlocked-tickrate"; } diff --git a/unlocked_tickrate.vdf b/unlocked_tickrate.vdf new file mode 100644 index 0000000..78b7563 --- /dev/null +++ b/unlocked_tickrate.vdf @@ -0,0 +1,5 @@ +"Metamod Plugin" +{ + "alias" "Unlocked Tickrate" + "file" "addons/unlocked_tickrate" +}