Compare commits

...

20 Commits

Author SHA1 Message Date
arthurdead
7b493af742 css 2023-09-16 17:30:33 -03:00
arthurdead
09aa70e774 memset 2023-03-05 04:03:48 -03:00
arthurdead
a4cb9f5fec i merged the pr wrong 2023-03-05 02:42:08 -03:00
arthurdead
eefac413f7 Merge branch 'master' of https://github.com/arthurdead/proxysend.git 2023-03-05 02:26:31 -03:00
arthurdead
5e73c21103 store refs as unsigned long instead of int, ignore hltv, replay servers and clients, fix opaque_ptr 2023-03-05 02:25:40 -03:00
Arthurdead
1240e21fff
Merge pull request #3 from sapphonie/master
fix hooked edicts not getting set to FL_EDICT_CHANGED, other tweaks
2023-03-05 02:22:34 -03:00
sappho
db5b53b09e
maintainer revert requests 2023-03-05 00:21:11 -05:00
sappho
596e19892d comment so ppl know who to blame when something explodes somehow 2023-03-04 06:33:32 -05:00
sappho
1a0bae1814 fix hooked edicts not getting set to FL_EDICT_CHANGED (fixes inconsistent proxy behavior), fix mismatched delete[], null init all vars 2023-03-04 06:30:50 -05:00
arthurdead
5c1f39064b comment sv_parallel_sendsnapshot, detect string_t, mark edict as changed after hooking/unhooking 2023-02-15 22:50:16 -03:00
arthurdead
ea36957b1e only call IndexToReference inside SendTable_CalcDelta once 2022-11-21 11:17:30 -03:00
arthurdead
849fc94958 support c++14 2022-11-19 05:57:59 -03:00
arthurdead
ef14a08559 remove WriteDeltaEntities gamedata, add pre/post write_deltas and guess_prop_type to interface, fix SendTable_CalcDelta loop 2022-11-18 08:34:57 -03:00
arthurdead
cc99f7246c add remove_serverclass_from_cache to interface, fix ehandle callback 2022-11-15 17:44:40 -03:00
arthurdead
df012b0585 up version 2022-11-09 23:16:56 -03:00
arthurdead
4195cf9e84 check gamedata values 2022-11-09 23:16:26 -03:00
arthurdead
cba45e117e add pre_pack_entity in parallel_pack_listener 2022-11-08 18:44:05 -03:00
arthurdead
6d7d7b3223 fix crash on unload 2022-10-11 13:57:08 -03:00
arthurdead
0df516b022 add callback for TFClassType 2022-10-06 14:51:03 -03:00
arthurdead
7ae9b63e18 fix callback prop name missing last character 2022-10-04 03:01:58 -03:00
9 changed files with 2587 additions and 2200 deletions

View File

@ -173,13 +173,11 @@ class ExtensionConfig(object):
'-Wno-unused',
'-Wno-switch',
'-Wno-array-bounds',
'-Wno-register',
'-msse',
'-m32',
'-fvisibility=hidden',
]
cxx.cxxflags += [
'-std=gnu++2a',
'-fno-exceptions',
'-fno-threadsafe-statics',
'-Wno-non-virtual-dtor',
@ -188,6 +186,11 @@ class ExtensionConfig(object):
]
cxx.linkflags += ['-m32']
if cxx.version >= 'clang-5':
cxx.cxxflags += ['-Wno-register','-std=c++17']
else:
cxx.cxxflags += ['-std=c++14']
have_gcc = cxx.vendor == 'gcc'
have_clang = cxx.vendor == 'clang'
if cxx.version >= 'clang-3.6':

View File

@ -30,7 +30,7 @@ def CopyFiles(src, dest, files):
# Include files
CopyFiles('sourcemod/scripting/include', 'addons/sourcemod/scripting/include',
[ 'proxysend.inc', ]
[ 'proxysend.inc', 'proxysend_tf2.inc' ]
)
# GameData files

File diff suppressed because it is too large Load Diff

View File

@ -48,10 +48,13 @@
class Sample final : public SDKExtension, public IPluginsListener, public ISMEntityListener, public IConCommandBaseAccessor, public proxysend
{
public:
std::vector<const parallel_pack_listener *> pack_ent_listeners;
using pack_ent_listeners_t = std::vector<const parallel_pack_listener *>;
pack_ent_listeners_t pack_ent_listeners{};
bool add_listener(const parallel_pack_listener *ptr) noexcept override final;
bool remove_listener(const parallel_pack_listener *ptr) noexcept override final;
bool remove_serverclass_from_cache(ServerClass *ptr) noexcept override final;
prop_types guess_prop_type(const SendProp *prop, const SendTable *table) const noexcept override final;
bool is_parallel_pack_allowed() const noexcept;
@ -60,6 +63,9 @@ public:
virtual void OnPluginUnloaded(IPlugin *plugin) noexcept override final;
virtual void OnEntityDestroyed(CBaseEntity *pEntity) noexcept override final;
virtual void NotifyInterfaceDrop(SMInterface *pInterface);
virtual bool QueryInterfaceDrop(SMInterface *pInterface);
/**
* @brief This is called after the initial loading sequence has been processed.
*
@ -93,7 +99,7 @@ public:
* @param maxlen Size of error message buffer.
* @return True if working, false otherwise.
*/
//virtual bool QueryRunning(char *error, size_t maxlen);
virtual bool QueryRunning(char *error, size_t maxlen);
public:
#if defined SMEXT_CONF_METAMOD
/**

View File

@ -3,7 +3,7 @@
#include <IShareSys.h>
#define SMINTERFACE_PROXYSEND_NAME "proxysend"
#define SMINTERFACE_PROXYSEND_VERSION 1
#define SMINTERFACE_PROXYSEND_VERSION 3
class proxysend : public SourceMod::SMInterface
{
@ -16,9 +16,34 @@ public:
class parallel_pack_listener
{
public:
virtual bool is_allowed() const noexcept = 0;
virtual bool is_allowed() const noexcept { return true; }
virtual void pre_pack_entity(CBaseEntity *pEntity) const noexcept {}
virtual void pre_write_deltas() const noexcept {}
virtual void post_write_deltas() const noexcept {}
};
virtual bool add_listener(const parallel_pack_listener *ptr) noexcept = 0;
virtual bool remove_listener(const parallel_pack_listener *ptr) noexcept = 0;
virtual bool remove_serverclass_from_cache(ServerClass *ptr) noexcept = 0;
enum class prop_types : unsigned char
{
int_,
short_,
char_,
unsigned_int,
unsigned_short,
unsigned_char,
float_,
vector,
qangle,
cstring,
ehandle,
bool_,
color32_,
tstring,
unknown
};
virtual prop_types guess_prop_type(const SendProp *prop, const SendTable *table) const noexcept = 0;
};

View File

@ -40,7 +40,7 @@
/* Basic information exposed publicly */
#define SMEXT_CONF_NAME "proxysend"
#define SMEXT_CONF_DESCRIPTION "proxysend"
#define SMEXT_CONF_VERSION "0.1.0.0"
#define SMEXT_CONF_VERSION "0.1.0.8"
#define SMEXT_CONF_AUTHOR "Arthurdead"
#define SMEXT_CONF_URL ""
#define SMEXT_CONF_LOGTAG "PROXYSEND"

View File

@ -1,6 +1,6 @@
"Games"
{
"tf"
"#default"
{
"Offsets"
{
@ -40,11 +40,6 @@
"library" "engine"
"linux" "@_ZN21CFrameSnapshotManager15GetPackedEntityEP14CFrameSnapshoti"
}
"CBaseServer::WriteDeltaEntities"
{
"library" "engine"
"linux" "@_ZN11CBaseServer18WriteDeltaEntitiesEP11CBaseClientP12CClientFrameS3_R8bf_write"
}
"CGameClient::GetSendFrame"
{
"library" "engine"
@ -65,6 +60,21 @@
"library" "engine"
"linux" "@_ZN10PackWork_t7ProcessERS_"
}
"SendProxy_StringT_To_String"
{
"library" "server"
"linux" "@_Z27SendProxy_StringT_To_StringPK8SendPropPKvS3_P8DVariantii"
}
"SendProxy_Color32ToInt"
{
"library" "server"
"linux" "@_Z22SendProxy_Color32ToIntPK8SendPropPKvS3_P8DVariantii"
}
"SendProxy_EHandleToInt"
{
"library" "server"
"linux" "@_Z22SendProxy_EHandleToIntPK8SendPropPKvS3_P8DVariantii"
}
}
}
}

View File

@ -3,7 +3,6 @@
#endif
#define __PROXYSEND_INC
#include <tf2>
#include <sdktools>
typeset proxysend_callbacks
@ -27,58 +26,9 @@ typeset proxysend_callbacks
native void proxysend_hook(int entity, const char[] prop, proxysend_callbacks callback, bool per_client);
native void proxysend_unhook(int entity, const char[] prop, proxysend_callbacks callback);
stock int get_bit_for_cond(TFCond cond)
{
int icond = view_as<int>(cond);
switch(icond / 32) {
case 0: return (1 << icond);
case 1: return (1 << (icond - 32));
case 2: return (1 << (icond - 64));
case 3: return (1 << (icond - 96));
case 4: return (1 << (icond - 128));
default: ThrowError("Invalid TFCond value %d", icond);
}
return 0;
}
stock void get_prop_name_for_cond(TFCond cond, char[] name, int len)
{
int icond = view_as<int>(cond);
switch(icond / 32) {
case 0: strcopy(name, len, "m_nPlayerCond");
case 1: strcopy(name, len, "m_nPlayerCondEx");
case 2: strcopy(name, len, "m_nPlayerCondEx2");
case 3: strcopy(name, len, "m_nPlayerCondEx3");
case 4: strcopy(name, len, "m_nPlayerCondEx4");
default: ThrowError("Invalid TFCond value %d", icond);
}
}
stock void proxysend_hook_cond(int entity, TFCond cond, proxysend_callbacks callback, bool per_client)
{
int icond = view_as<int>(cond);
switch(icond / 32) {
case 0: proxysend_hook(entity, "m_nPlayerCond", callback, per_client);
case 1: proxysend_hook(entity, "m_nPlayerCondEx", callback, per_client);
case 2: proxysend_hook(entity, "m_nPlayerCondEx2", callback, per_client);
case 3: proxysend_hook(entity, "m_nPlayerCondEx3", callback, per_client);
case 4: proxysend_hook(entity, "m_nPlayerCondEx4", callback, per_client);
default: ThrowError("Invalid TFCond value %d", icond);
}
}
stock void proxysend_unhook_cond(int entity, TFCond cond, proxysend_callbacks callback)
{
int icond = view_as<int>(cond);
switch(icond / 32) {
case 0: proxysend_unhook(entity, "m_nPlayerCond", callback);
case 1: proxysend_unhook(entity, "m_nPlayerCondEx", callback);
case 2: proxysend_unhook(entity, "m_nPlayerCondEx2", callback);
case 3: proxysend_unhook(entity, "m_nPlayerCondEx3", callback);
case 4: proxysend_unhook(entity, "m_nPlayerCondEx4", callback);
default: ThrowError("Invalid TFCond value %d", icond);
}
}
#if defined _tf2_included || defined _tf2_stocks_included
#include <proxysend_tf2>
#endif
#if !defined REQUIRE_EXTENSIONS
public __ext_proxysend_SetNTVOptional()

View File

@ -0,0 +1,63 @@
#if defined __PROXYSEND_TF2_INC
#endinput
#endif
#define __PROXYSEND_TF2_INC
#include <tf2>
#if !defined __PROXYSEND_INC
#include <proxysend>
#endif
stock int get_bit_for_cond(TFCond cond)
{
int icond = view_as<int>(cond);
switch(icond / 32) {
case 0: return (1 << icond);
case 1: return (1 << (icond - 32));
case 2: return (1 << (icond - 64));
case 3: return (1 << (icond - 96));
case 4: return (1 << (icond - 128));
default: ThrowError("Invalid TFCond value %d", icond);
}
return 0;
}
stock void get_prop_name_for_cond(TFCond cond, char[] name, int len)
{
int icond = view_as<int>(cond);
switch(icond / 32) {
case 0: strcopy(name, len, "m_nPlayerCond");
case 1: strcopy(name, len, "m_nPlayerCondEx");
case 2: strcopy(name, len, "m_nPlayerCondEx2");
case 3: strcopy(name, len, "m_nPlayerCondEx3");
case 4: strcopy(name, len, "m_nPlayerCondEx4");
default: ThrowError("Invalid TFCond value %d", icond);
}
}
stock void proxysend_hook_cond(int entity, TFCond cond, proxysend_callbacks callback, bool per_client)
{
int icond = view_as<int>(cond);
switch(icond / 32) {
case 0: proxysend_hook(entity, "m_nPlayerCond", callback, per_client);
case 1: proxysend_hook(entity, "m_nPlayerCondEx", callback, per_client);
case 2: proxysend_hook(entity, "m_nPlayerCondEx2", callback, per_client);
case 3: proxysend_hook(entity, "m_nPlayerCondEx3", callback, per_client);
case 4: proxysend_hook(entity, "m_nPlayerCondEx4", callback, per_client);
default: ThrowError("Invalid TFCond value %d", icond);
}
}
stock void proxysend_unhook_cond(int entity, TFCond cond, proxysend_callbacks callback)
{
int icond = view_as<int>(cond);
switch(icond / 32) {
case 0: proxysend_unhook(entity, "m_nPlayerCond", callback);
case 1: proxysend_unhook(entity, "m_nPlayerCondEx", callback);
case 2: proxysend_unhook(entity, "m_nPlayerCondEx2", callback);
case 3: proxysend_unhook(entity, "m_nPlayerCondEx3", callback);
case 4: proxysend_unhook(entity, "m_nPlayerCondEx4", callback);
default: ThrowError("Invalid TFCond value %d", icond);
}
}