Skip to content

Commit

Permalink
Merge branch '1.9-dev' of https://github.com/alliedmodders/sourcemod
Browse files Browse the repository at this point in the history
…into 1.9-dev
  • Loading branch information
psychonic committed Oct 5, 2018
2 parents ff727d5 + 8803219 commit 92e9ca7
Show file tree
Hide file tree
Showing 21 changed files with 191 additions and 49 deletions.
5 changes: 5 additions & 0 deletions core/ConVarManager.h
Expand Up @@ -43,6 +43,7 @@
#include <compat_wrappers.h> #include <compat_wrappers.h>
#include "concmd_cleaner.h" #include "concmd_cleaner.h"
#include "PlayerManager.h" #include "PlayerManager.h"
#include <sm_stringhashmap.h>


using namespace SourceHook; using namespace SourceHook;


Expand All @@ -67,6 +68,10 @@ struct ConVarInfo
{ {
return strcmp(name, info->pVar->GetName()) == 0; return strcmp(name, info->pVar->GetName()) == 0;
} }
static inline uint32_t hash(const detail::CharsAndLength &key)
{
return key.hash();
}
}; };


/** /**
Expand Down
4 changes: 4 additions & 0 deletions core/EventManager.h
Expand Up @@ -77,6 +77,10 @@ struct EventHook
{ {
return strcmp(name, hook->name.chars()) == 0; return strcmp(name, hook->name.chars()) == 0;
} }
static inline uint32_t hash(const detail::CharsAndLength &key)
{
return key.hash();
}
}; };


enum EventHookMode enum EventHookMode
Expand Down
14 changes: 13 additions & 1 deletion core/HalfLife2.h
Expand Up @@ -92,13 +92,21 @@ struct DataTableInfo
{ {
return strcmp(name, info.prop->GetName()) == 0; return strcmp(name, info.prop->GetName()) == 0;
} }
static inline uint32_t hash(const detail::CharsAndLength &key)
{
return key.hash();
}
}; };


static inline bool matches(const char *name, const DataTableInfo *info) static inline bool matches(const char *name, const DataTableInfo *info)
{ {
return strcmp(name, info->sc->GetName()) == 0; return strcmp(name, info->sc->GetName()) == 0;
} }

static inline uint32_t hash(const detail::CharsAndLength &key)
{
return key.hash();
}

DataTableInfo(ServerClass *sc) DataTableInfo(ServerClass *sc)
: sc(sc) : sc(sc)
{ {
Expand All @@ -114,6 +122,10 @@ struct DataMapCachePolicy
{ {
return strcmp(name, info.prop->fieldName) == 0; return strcmp(name, info.prop->fieldName) == 0;
} }
static inline uint32_t hash(const detail::CharsAndLength &key)
{
return key.hash();
}
}; };


typedef NameHashSet<sm_datatable_info_t, DataMapCachePolicy> DataMapCache; typedef NameHashSet<sm_datatable_info_t, DataMapCachePolicy> DataMapCache;
Expand Down
4 changes: 4 additions & 0 deletions core/logic/AdminCache.h
Expand Up @@ -82,6 +82,10 @@ struct AuthMethod
{ {
return strcmp(name, method->name.c_str()) == 0; return strcmp(name, method->name.c_str()) == 0;
} }
static inline uint32_t hash(const detail::CharsAndLength &key)
{
return key.hash();
}
}; };


struct UserAuth struct UserAuth
Expand Down
4 changes: 4 additions & 0 deletions core/logic/GameConfigs.h
Expand Up @@ -72,6 +72,10 @@ class CGameConfig :
{ {
return strcmp(key, value->m_File) == 0; return strcmp(key, value->m_File) == 0;
} }
static inline uint32_t hash(const detail::CharsAndLength &key)
{
return key.hash();
}
private: private:
char m_File[PLATFORM_MAX_PATH]; char m_File[PLATFORM_MAX_PATH];
char m_CurFile[PLATFORM_MAX_PATH]; char m_CurFile[PLATFORM_MAX_PATH];
Expand Down
4 changes: 4 additions & 0 deletions core/logic/HandleSys.h
Expand Up @@ -110,6 +110,10 @@ struct QHandleType
{ {
return type->name && type->name->compare(key) == 0; return type->name && type->name->compare(key) == 0;
} }
static inline uint32_t hash(const detail::CharsAndLength &key)
{
return key.hash();
}
}; };


typedef ke::Lambda<void(const char *)> HandleReporter; typedef ke::Lambda<void(const char *)> HandleReporter;
Expand Down
5 changes: 5 additions & 0 deletions core/logic/Native.h
Expand Up @@ -36,6 +36,7 @@
#include <am-string.h> #include <am-string.h>
#include <am-utility.h> #include <am-utility.h>
#include <am-refcounting.h> #include <am-refcounting.h>
#include <sm_stringhashmap.h>
#include "common_logic.h" #include "common_logic.h"


class CNativeOwner; class CNativeOwner;
Expand Down Expand Up @@ -93,6 +94,10 @@ struct Native : public ke::Refcounted<Native>
{ {
return strcmp(name, entry->name()) == 0; return strcmp(name, entry->name()) == 0;
} }
static inline uint32_t hash(const detail::CharsAndLength &key)
{
return key.hash();
}
}; };




Expand Down
31 changes: 3 additions & 28 deletions core/logic/PluginSys.cpp
Expand Up @@ -31,7 +31,6 @@


#include <stdio.h> #include <stdio.h>
#include <stdarg.h> #include <stdarg.h>
#include <ctype.h>
#include "PluginSys.h" #include "PluginSys.h"
#include "ShareSys.h" #include "ShareSys.h"
#include <ILibrarySys.h> #include <ILibrarySys.h>
Expand All @@ -47,7 +46,6 @@
#include "frame_tasks.h" #include "frame_tasks.h"
#include <amtl/am-string.h> #include <amtl/am-string.h>
#include <amtl/am-linkedlist.h> #include <amtl/am-linkedlist.h>
#include <amtl/am-uniqueptr.h>
#include <bridge/include/IVEngineServerBridge.h> #include <bridge/include/IVEngineServerBridge.h>
#include <bridge/include/CoreProvider.h> #include <bridge/include/CoreProvider.h>


Expand Down Expand Up @@ -934,38 +932,16 @@ void CPluginManager::LoadPluginsFromDir(const char *basedir, const char *localpa
libsys->CloseDirectory(dir); libsys->CloseDirectory(dir);
} }


#if defined PLATFORM_WINDOWS || defined PLATFORM_APPLE
char *strdup_tolower(const char *input)
{
char *str = strdup(input);

for (char *c = str; *c; c++)
{
*c = tolower((unsigned char)*c);
}

return str;
}
#endif

LoadRes CPluginManager::LoadPlugin(CPlugin **aResult, const char *path, bool debug, PluginType type) LoadRes CPluginManager::LoadPlugin(CPlugin **aResult, const char *path, bool debug, PluginType type)
{ {
if (m_LoadingLocked) if (m_LoadingLocked)
return LoadRes_NeverLoad; return LoadRes_NeverLoad;


/* For windows & mac, we convert the path to lower-case in order to avoid duplicate plugin loading */
#if defined PLATFORM_WINDOWS || defined PLATFORM_APPLE
ke::UniquePtr<char> finalPath = ke::UniquePtr<char>(strdup_tolower(path));
#else
ke::UniquePtr<char> finalPath = ke::UniquePtr<char>(strdup(path));
#endif


/** /**
* Does this plugin already exist? * Does this plugin already exist?
*/ */
CPlugin *pPlugin; CPlugin *pPlugin;
if (m_LoadLookup.retrieve(finalPath.get(), &pPlugin)) if (m_LoadLookup.retrieve(path, &pPlugin))
{ {
/* Check to see if we should try reloading it */ /* Check to see if we should try reloading it */
if (pPlugin->GetStatus() == Plugin_BadLoad if (pPlugin->GetStatus() == Plugin_BadLoad
Expand All @@ -978,12 +954,11 @@ LoadRes CPluginManager::LoadPlugin(CPlugin **aResult, const char *path, bool deb
{ {
if (aResult) if (aResult)
*aResult = pPlugin; *aResult = pPlugin;

return LoadRes_AlreadyLoaded; return LoadRes_AlreadyLoaded;
} }
} }


CPlugin *plugin = CompileAndPrep(finalPath.get()); CPlugin *plugin = CompileAndPrep(path);


// Assign our outparam so we can return early. It must be set. // Assign our outparam so we can return early. It must be set.
*aResult = plugin; *aResult = plugin;
Expand Down Expand Up @@ -2416,4 +2391,4 @@ static OldPluginAPI sOldPluginAPI;
IPluginManager *CPluginManager::GetOldAPI() IPluginManager *CPluginManager::GetOldAPI()
{ {
return &sOldPluginAPI; return &sOldPluginAPI;
} }
54 changes: 48 additions & 6 deletions core/logic/PluginSys.h
Expand Up @@ -143,11 +143,6 @@ class CPlugin :
*/ */
static CPlugin *Create(const char *file); static CPlugin *Create(const char *file);


static inline bool matches(const char *file, const CPlugin *plugin)
{
return strcmp(plugin->m_filename, file) == 0;
}

public: public:
// Evicts the plugin from memory and sets an error state. // Evicts the plugin from memory and sets an error state.
void EvictWithError(PluginStatus status, const char *error_fmt, ...); void EvictWithError(PluginStatus status, const char *error_fmt, ...);
Expand Down Expand Up @@ -483,7 +478,54 @@ class CPluginManager :
typedef decltype(m_listeners)::iterator ListenerIter; typedef decltype(m_listeners)::iterator ListenerIter;
typedef decltype(m_plugins)::iterator PluginIter; typedef decltype(m_plugins)::iterator PluginIter;


NameHashSet<CPlugin *> m_LoadLookup; struct CPluginPolicy
{
static inline uint32_t hash(const detail::CharsAndLength &key)
{
/* For windows & mac, we convert the path to lower-case in order to avoid duplicate plugin loading */
#if defined PLATFORM_WINDOWS || defined PLATFORM_APPLE
const char *original = key.chars();
char *copy = strdup(original);

for (size_t i = 0; copy[i]; ++i)
{
copy[i] = tolower(copy[i]);
}

uint32_t hash = detail::CharsAndLength(copy).hash();
free(copy);
return hash;
#else
return key.hash();
#endif
}

static inline bool matches(const char *file, const CPlugin *plugin)
{
const char *pluginFile = const_cast<CPlugin*>(plugin)->GetFilename();
#if defined PLATFORM_WINDOWS || defined PLATFORM_APPLE
size_t fileLen = strlen(file);
if (fileLen != strlen(pluginFile))
{
return false;
}

for (size_t i = 0; i < fileLen; ++i)
{
if (tolower(file[i]) != tolower(pluginFile[i]))
{
return false;
}
}

return true;
#else
return strcmp(pluginFile, file) == 0;
#endif
}
};
NameHashSet<CPlugin *, CPluginPolicy> m_LoadLookup;

bool m_AllPluginsLoaded; bool m_AllPluginsLoaded;
IdentityToken_t *m_MyIdent; IdentityToken_t *m_MyIdent;


Expand Down
4 changes: 4 additions & 0 deletions core/logic/RootConsoleMenu.h
Expand Up @@ -46,6 +46,10 @@ struct ConsoleEntry
{ {
return strcmp(name, entry->command.c_str()) == 0; return strcmp(name, entry->command.c_str()) == 0;
} }
static inline uint32_t hash(const detail::CharsAndLength &key)
{
return key.hash();
}
}; };


class RootConsoleMenu : class RootConsoleMenu :
Expand Down
4 changes: 4 additions & 0 deletions core/logic/smn_maplists.cpp
Expand Up @@ -58,6 +58,10 @@ struct maplist_info_t
{ {
return strcmp(value->name, key) == 0; return strcmp(value->name, key) == 0;
} }
static inline uint32_t hash(const detail::CharsAndLength &key)
{
return key.hash();
}
}; };


#define MAPLIST_FLAG_MAPSFOLDER (1<<0) /**< On failure, use all maps in the maps folder. */ #define MAPLIST_FLAG_MAPSFOLDER (1<<0) /**< On failure, use all maps in the maps folder. */
Expand Down
4 changes: 4 additions & 0 deletions core/smn_console.cpp
Expand Up @@ -184,6 +184,10 @@ class CommandFlagsHelper : public IConCommandTracker
{ {
return strcmp(name, base->GetName()) == 0; return strcmp(name, base->GetName()) == 0;
} }
static inline uint32_t hash(const detail::CharsAndLength &key)
{
return key.hash();
}
}; };
NameHashSet<ConCommandBase *, ConCommandPolicy> m_CmdFlags; NameHashSet<ConCommandBase *, ConCommandPolicy> m_CmdFlags;
} s_CommandFlagsHelper; } s_CommandFlagsHelper;
Expand Down
4 changes: 4 additions & 0 deletions extensions/clientprefs/cookie.h
Expand Up @@ -96,6 +96,10 @@ struct Cookie
{ {
return strcmp(name, cookie->name) == 0; return strcmp(name, cookie->name) == 0;
} }
static inline uint32_t hash(const detail::CharsAndLength &key)
{
return key.hash();
}
}; };


class CookieManager : public IClientListener, public IPluginsListener class CookieManager : public IClientListener, public IPluginsListener
Expand Down
28 changes: 22 additions & 6 deletions extensions/cstrike/forwards.cpp
Expand Up @@ -126,7 +126,7 @@ DETOUR_DECL_MEMBER0(DetourWeaponPrice, int)
} }
#endif #endif


#if SOURCE_ENGINE != SE_CSGO || !defined(WIN32) #if SOURCE_ENGINE != SE_CSGO
DETOUR_DECL_MEMBER2(DetourTerminateRound, void, float, delay, int, reason) DETOUR_DECL_MEMBER2(DetourTerminateRound, void, float, delay, int, reason)
{ {
if (g_pIgnoreTerminateDetour) if (g_pIgnoreTerminateDetour)
Expand All @@ -135,20 +135,31 @@ DETOUR_DECL_MEMBER2(DetourTerminateRound, void, float, delay, int, reason)
DETOUR_MEMBER_CALL(DetourTerminateRound)(delay, reason); DETOUR_MEMBER_CALL(DetourTerminateRound)(delay, reason);
return; return;
} }
#elif !defined(WIN32)
DETOUR_DECL_MEMBER4(DetourTerminateRound, void, float, delay, int, reason, int, unknown, int, unknown2)
{
if (g_pIgnoreTerminateDetour)
{
g_pIgnoreTerminateDetour = false;
DETOUR_MEMBER_CALL(DetourTerminateRound)(delay, reason, unknown, unknown2);
return;
}
#else #else
//Windows CSGO //Windows CSGO
//char __userpurge TerminateRound(int a1@<ecx>, float a2@<xmm1>, int *a3) //char __userpurge TerminateRound(int a1@<ecx>, float a2@<xmm1>, int *a3)
// a1 - this // a1 - this
// a2 - delay // a2 - delay
// a3 - reason // a3 - reason
DETOUR_DECL_MEMBER1(DetourTerminateRound, void, int, reason) // a4 - unknown
// a5 - unknown
DETOUR_DECL_MEMBER3(DetourTerminateRound, void, int, reason, int, unknown, int, unknown2)
{ {
float delay; float delay;


if (g_pIgnoreTerminateDetour) if (g_pIgnoreTerminateDetour)
{ {
g_pIgnoreTerminateDetour = false; g_pIgnoreTerminateDetour = false;
return DETOUR_MEMBER_CALL(DetourTerminateRound)(reason); return DETOUR_MEMBER_CALL(DetourTerminateRound)(reason, unknown, unknown2);
} }


//Save the delay //Save the delay
Expand Down Expand Up @@ -178,25 +189,30 @@ DETOUR_DECL_MEMBER1(DetourTerminateRound, void, int, reason)
reason++; reason++;
#endif #endif


#if SOURCE_ENGINE != SE_CSGO || !defined(WIN32) #if SOURCE_ENGINE != SE_CSGO
if (result == Pl_Changed) if (result == Pl_Changed)
return DETOUR_MEMBER_CALL(DetourTerminateRound)(delay, reason); return DETOUR_MEMBER_CALL(DetourTerminateRound)(delay, reason);


return DETOUR_MEMBER_CALL(DetourTerminateRound)(orgdelay, orgreason); return DETOUR_MEMBER_CALL(DetourTerminateRound)(orgdelay, orgreason);
#elif !defined(WIN32)
if (result == Pl_Changed)
return DETOUR_MEMBER_CALL(DetourTerminateRound)(delay, reason, unknown, unknown2);

return DETOUR_MEMBER_CALL(DetourTerminateRound)(orgdelay, orgreason, unknown, unknown2);
#else #else
if (result == Pl_Changed) if (result == Pl_Changed)
{ {
__asm __asm
{ {
movss xmm1, delay movss xmm1, delay
} }
return DETOUR_MEMBER_CALL(DetourTerminateRound)(reason); return DETOUR_MEMBER_CALL(DetourTerminateRound)(reason, unknown, unknown2);
} }
__asm __asm
{ {
movss xmm1, orgdelay movss xmm1, orgdelay
} }
return DETOUR_MEMBER_CALL(DetourTerminateRound)(orgreason); return DETOUR_MEMBER_CALL(DetourTerminateRound)(orgreason, unknown, unknown2);
#endif #endif
} }


Expand Down

0 comments on commit 92e9ca7

Please sign in to comment.