diff --git a/CMakeLists.txt b/CMakeLists.txt
index 07bd8afb5..d5e84fbf4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -91,16 +91,21 @@ set(SOURCE_FILES
src/core/managers/server_manager.h
src/scripting/natives/natives_server.cpp
src/scripting/natives/natives_usermessages.cpp
+ src/scripting/natives/natives_clientmessages.cpp
libraries/nlohmann/json.hpp
src/core/managers/voice_manager.cpp
src/core/managers/voice_manager.h
src/core/managers/usermessage_manager.cpp
src/core/managers/usermessage_manager.h
+ src/core/managers/clientmessage_manager.cpp
+ src/core/managers/clientmessage_manager.h
src/scripting/natives/natives_dynamichooks.cpp
src/core/game_system.h
src/core/game_system.cpp
src/core/UserMessage.h
src/core/UserMessage.cpp
+ src/core/ClientMessage.h
+ src/core/ClientMessage.cpp
src/core/recipientfilters.h
)
diff --git a/configs/addons/counterstrikesharp/gamedata/gamedata.json b/configs/addons/counterstrikesharp/gamedata/gamedata.json
index 8247c6f87..b6f835c01 100644
--- a/configs/addons/counterstrikesharp/gamedata/gamedata.json
+++ b/configs/addons/counterstrikesharp/gamedata/gamedata.json
@@ -265,5 +265,11 @@
"windows": 584,
"linux": 584
}
+ },
+ "CServerSideClient": {
+ "offsets": {
+ "windows": 8,
+ "linux": -64
+ }
}
}
diff --git a/docfx/examples/WithClientMessages.md b/docfx/examples/WithClientMessages.md
new file mode 100644
index 000000000..6bba4e869
--- /dev/null
+++ b/docfx/examples/WithClientMessages.md
@@ -0,0 +1,5 @@
+[!INCLUDE [WithClientMessages](../../examples/WithClientMessages/README.md)]
+
+View project on Github
+
+[!code-csharp[](../../examples/WithClientMessages/WithClientMessagesPlugin.cs)]
\ No newline at end of file
diff --git a/docfx/examples/toc.yml b/docfx/examples/toc.yml
index 41cf87e10..ae91fef3c 100644
--- a/docfx/examples/toc.yml
+++ b/docfx/examples/toc.yml
@@ -21,6 +21,8 @@ items:
href: WithTranslations.md
- name: User Messages
href: WithUserMessages.md
+ - name: Client Messages
+ href: WithClientMessages.md
- name: Voice Overrides
href: WithVoiceOverrides.md
- name: Warcraft Plugin
diff --git a/examples/WithClientMessages/README.md b/examples/WithClientMessages/README.md
new file mode 100644
index 000000000..139e53bd8
--- /dev/null
+++ b/examples/WithClientMessages/README.md
@@ -0,0 +1,2 @@
+# With Client Messages
+This is example shows how you can hook, interrupt and send Client Messages.
diff --git a/examples/WithClientMessages/WithClientMessages.csproj b/examples/WithClientMessages/WithClientMessages.csproj
new file mode 100644
index 000000000..1a3c1a887
--- /dev/null
+++ b/examples/WithClientMessages/WithClientMessages.csproj
@@ -0,0 +1,12 @@
+
+
+ net8.0
+ enable
+ enable
+ false
+ false
+
+
+
+
+
diff --git a/examples/WithClientMessages/WithClientMessagesPlugin.cs b/examples/WithClientMessages/WithClientMessagesPlugin.cs
new file mode 100644
index 000000000..aecbb07dc
--- /dev/null
+++ b/examples/WithClientMessages/WithClientMessagesPlugin.cs
@@ -0,0 +1,40 @@
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Core.Attributes;
+using CounterStrikeSharp.API.Modules.ClientMessages;
+using Microsoft.Extensions.Logging;
+using Serilog.Core;
+using System.Runtime.InteropServices;
+using System.Security.Cryptography;
+using System.Text;
+namespace WithClientMessages;
+
+[MinimumApiVersion(80)]
+public class WithClientMessagesPlugin : BasePlugin
+{
+ public override string ModuleName => "Example: With Client Messages";
+ public override string ModuleVersion => "1.0.0";
+ public override string ModuleAuthor => "CounterStrikeSharp & Contributors";
+ public override string ModuleDescription => "A simple plugin that hooks and sends Client Messages";
+
+ public override void Load(bool hotReload)
+ {
+ // Hooks can be added using the client message ID. In this case it's the ID for `CClientMsg_CustomGameEvent`.
+ HookClientMessage(280, cm =>
+ {
+ string event_name = cm.ReadString("event_name");
+ byte[] data = cm.ReadBytes("data");
+
+ // send back
+ var message = ClientMessage.FromPartialName("CClientMsg_CustomGameEvent");
+ message.SetString("event_name", event_name);
+ message.SetBytes("data", data);
+
+ var player = Utilities.GetPlayerFromSlot(cm.Sender)!;
+
+ message.Send(player);
+
+ return HookResult.Continue;
+ }, HookMode.Pre);
+ }
+}
diff --git a/managed/CounterStrikeSharp.API/CompatibilitySuppressions.xml b/managed/CounterStrikeSharp.API/CompatibilitySuppressions.xml
index 6cf66c127..25635d888 100644
--- a/managed/CounterStrikeSharp.API/CompatibilitySuppressions.xml
+++ b/managed/CounterStrikeSharp.API/CompatibilitySuppressions.xml
@@ -1,64 +1,2842 @@
-
+
+
+ CP0001
+ T:CounterStrikeSharp.API.Core.CCoopBonusCoin
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0001
+ T:CounterStrikeSharp.API.Core.CCSWeaponBaseVDataAPI
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0001
+ T:CounterStrikeSharp.API.Core.CInfoEnemyTerroristSpawn
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0001
+ T:CounterStrikeSharp.API.Core.CPointScriptEntity
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0001
+ T:CounterStrikeSharp.API.Core.CTriggerHurtGhost
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0001
+ T:CounterStrikeSharp.API.Core.EventItemsGifted
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0001
+ T:CounterStrikeSharp.API.Core.EventTrExitHintTrigger
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0001
+ T:CounterStrikeSharp.API.Core.EventTrMarkBestTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0001
+ T:CounterStrikeSharp.API.Core.EventTrMarkComplete
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0001
+ T:CounterStrikeSharp.API.Core.EventTrPlayerFlashbanged
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0001
+ T:CounterStrikeSharp.API.Core.EventTrShowExitMsgbox
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0001
+ T:CounterStrikeSharp.API.Core.EventTrShowFinishMsgbox
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0001
+ T:CounterStrikeSharp.API.Core.EventWeaponOutofammo
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0001
+ T:CounterStrikeSharp.API.Core.NPCLookType_t
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0001
+ T:CounterStrikeSharp.API.Core.ShatterPanelMode
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0001
+ T:CounterStrikeSharp.API.Core.SpawnPointCoopEnemy
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.AnimValueSource.ManualFacingHeading
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.AnimVectorSource.FacingDirection
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.BasePlugin.CommandHandlers
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
CP0002
F:CounterStrikeSharp.API.Core.BasePlugin.ConvarChangeHandlers
.\ApiCompat\v202.dll
- obj\Debug\net8.0\CounterStrikeSharp.API.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
CP0002
- M:CounterStrikeSharp.API.Core.CC4.get_DroppedFromDeath
+ F:CounterStrikeSharp.API.Core.ChickenActivity.HOP
.\ApiCompat\v202.dll
- obj\Debug\net8.0\CounterStrikeSharp.API.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
CP0002
- M:CounterStrikeSharp.API.Core.CCSGameRules.get_RoundStartTicks
+ F:CounterStrikeSharp.API.Core.ChickenActivity.JUMP
.\ApiCompat\v202.dll
- obj\Debug\net8.0\CounterStrikeSharp.API.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
CP0002
- M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_InvalidSteamLogonDelayed
+ F:CounterStrikeSharp.API.Core.loadout_slot_t.LOADOUT_SLOT_PET
.\ApiCompat\v202.dll
- obj\Debug\net8.0\CounterStrikeSharp.API.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
CP0002
- M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastAction
+ F:CounterStrikeSharp.API.Core.MovementGait_t.eJog
.\ApiCompat\v202.dll
- obj\Debug\net8.0\CounterStrikeSharp.API.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
CP0002
- M:CounterStrikeSharp.API.Core.CPlantedC4.get_PlantedAfterPickup
+ F:CounterStrikeSharp.API.Core.MovementGait_t.eRun
.\ApiCompat\v202.dll
- obj\Debug\net8.0\CounterStrikeSharp.API.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
- CP0005
- M:CounterStrikeSharp.API.Modules.Menu.BaseMenu.Open(CounterStrikeSharp.API.Core.CCSPlayerController)
+ CP0002
+ F:CounterStrikeSharp.API.Core.MovementGait_t.eSprint
.\ApiCompat\v202.dll
- obj\Debug\net8.0\CounterStrikeSharp.API.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
- CP0006
- M:CounterStrikeSharp.API.Modules.Menu.IMenu.Open(CounterStrikeSharp.API.Core.CCSPlayerController)
+ CP0002
+ F:CounterStrikeSharp.API.Core.MovementGait_t.eWalk
.\ApiCompat\v202.dll
- obj\Debug\net8.0\CounterStrikeSharp.API.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
- CP0006
- M:CounterStrikeSharp.API.Modules.Menu.IMenu.OpenToAll
+ CP0002
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.SET_REGISTER_DOMAIN_VALUE
.\ApiCompat\v202.dll
- obj\Debug\net8.0\CounterStrikeSharp.API.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
- CP0011
- F:CounterStrikeSharp.API.Core.PulseValueType_t.PVAL_COUNT
+ CP0002
+ F:CounterStrikeSharp.API.Core.PulseValueType_t.PVAL_SCHEMA_PTR
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.ScriptedMoveTo_t.CINE_MOVETO_CUSTOM
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.ScriptedMoveTo_t.CINE_MOVETO_RUN
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.ScriptedMoveTo_t.CINE_MOVETO_TELEPORT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.ScriptedMoveTo_t.CINE_MOVETO_WAIT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.ScriptedMoveTo_t.CINE_MOVETO_WAIT_FACING
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.ScriptedMoveTo_t.CINE_MOVETO_WALK
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.ShatterGlassStressType.SHATTERDRYWALL_CHUNKS
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.ALL_CONTEXTS
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.ALL_SCENTS
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.ALL_SOUNDS
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_BULLET_IMPACT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_COMBAT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_CONTEXT_ALLIES_ONLY
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_CONTEXT_COMBINE_ONLY
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_CONTEXT_DANGER_APPROACH
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_CONTEXT_EXCLUDE_COMBINE
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_CONTEXT_EXPLOSION
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_CONTEXT_GUNFIRE
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_CONTEXT_PANIC_NPCS
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_CONTEXT_REACT_TO_SOURCE
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_DANGER
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_GLASS_BREAK
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_MOVE_AWAY
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_NONE
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_PHYSICS_DANGER
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_PHYSICS_OBJECT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_PLAYER
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_PLAYER_VEHICLE
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_THUMPER
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.SoundFlags_t.SOUND_WORLD
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_STEAMAUDIO_REVERB
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Modules.Memory.VirtualFunctions.AcceptInput
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Modules.Memory.VirtualFunctions.AcceptInputFunc
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Modules.Memory.VirtualFunctions.StateChanged
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ F:CounterStrikeSharp.API.Modules.Memory.VirtualFunctions.StateChangedFunc
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CAISound.get_SoundContext
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CAISound.get_SoundType
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBaseAnimGraph.get_ClientRagdoll
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBaseCombatCharacter.get_BloodColor
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBaseCombatCharacter.get_FieldOfView
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBaseEntity.get_DisableContextThinkStartTick
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBaseEntity.get_IsPlatform
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBaseFlex.get_NextSceneEventId
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBasePlayerController.get_LastLateCommandExecuted
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBasePlayerController.get_LastRealCommandNumberExecuted
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBasePlayerWeaponVData.get_MuzzleAttachment
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBasePlayerWeaponVData.set_MuzzleAttachment(System.String)
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBlood.get_Color
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakable.get_BasePropData
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakable.get_DmgModBullet
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakable.get_DmgModClub
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakable.get_DmgModExplosive
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakable.get_DmgModFire
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakable.get_Interactions
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakable.get_PhysicsDamageTableName
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakable.set_BasePropData(System.String)
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakable.set_PhysicsDamageTableName(System.String)
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakableProp.get_BasePropData
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakableProp.get_DmgModBullet
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakableProp.get_DmgModClub
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakableProp.get_DmgModExplosive
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakableProp.get_DmgModFire
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakableProp.get_Interactions
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakableProp.get_PhysicsDamageTableName
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakableProp.set_BasePropData(System.String)
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CBreakableProp.set_PhysicsDamageTableName(System.String)
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CC4.get_DroppedFromDeath
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CChicken.get_Activity
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CChicken.get_EggsPooped
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CChicken.get_InhibitDoorTimer
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CChicken.get_InhibitObstacleAvoidanceTimer
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CChicken.get_IsWaitingForLeader
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CChicken.get_LastEggPoopPosition
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CChicken.get_OriginalOwnerXuidHigh
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CChicken.get_OriginalOwnerXuidLow
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSBot.get_LastCoopSpawnPoint
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameModeRules_Deathmatch.get_DMBonusWeaponLoadoutSlot
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_CoopBonusCoinsFound
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_CoopBonusPistolsOnly
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_CoopMissionDeadPlayerRespawnEnabled
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_CoopMissionManager
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_CoopPlayersInDeploymentZone
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_CoopRespawnAndHealTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_DontIncrementCoopWave
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_FeaturedGiftersAccounts
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_FeaturedGiftersGifts
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_GuardianBotSkillLevelMax
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_GuardianBotSkillLevelMin
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_GuardianBuyUntilTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_GuardianGrenadesToGiveBots
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_GuardianModeSpecialKillsRemaining
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_GuardianModeSpecialWeaponNeeded
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_GuardianModeWaveNumber
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_HasTriggeredCoopSpawnReset
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_LoserBonus
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_NumGlobalGifters
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_NumGlobalGiftsGiven
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_NumGlobalGiftsPeriodSeconds
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_NumHeaviesToSpawn
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_RoundStartTicks
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGameRules.get_SkipNextServerPerfSample
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGOViewModel.get_OldWeaponParity
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSGOViewModel.get_WeaponParity
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayer_UseServices.get_TimeStartedHoldingUse
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerController_InGameMoneyServices.get_AccountMoneyEarnedForNextRound
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawn.get_Landseconds
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawn.get_PreviousModel
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_AccumulatedDistanceTraveled
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_AddonBits
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_AllowAutoFollowTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_ArmorValue
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_BlockingUseActionInProgress
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_BombSiteIndex
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_Bot
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_BotAllowActive
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_CanMoveDuringFreezePeriod
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_ChickenIdleSoundTimer
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_ChickenJumpSoundTimer
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_CurrentDeafnessFilter
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_CurrentEquipmentValue
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_DealtDamageToEnemyMostRecentTimestamp
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_DeathCamMusic
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_DeathFlags
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_DeathInfoOrigin
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_DeathInfoTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_DetectedByEnemySensorTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_DiedAirborne
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_Direction
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_DisplayHistoryBits
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_EmitSoundTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_EntitySpottedState
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_FlinchStack
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_FreezetimeEndEquipmentValue
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_GrenadeParametersStashed
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_GrenadeParameterStashTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_GuardianTooFarDistFrac
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_GunGameImmunityColor
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_HasDeathInfo
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_HasNightVision
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_HeadConstraintOffset
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_HeavyAssaultSuitCooldownRemaining
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_HideTargetID
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_HitBodyPart
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_HitHeading
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_HostagesKilled
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_Hud_MiniScoreHidden
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_Hud_RadarHidden
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_IgnoreLadderJumpTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_InBombZoneTrigger
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_InNoDefuseArea
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_IntroCamTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_InvalidSteamLogonDelayed
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_IsDefusing
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_IsGrabbingHostage
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_IsScoped
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_IsSpawning
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_IsWalking
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_KilledByHeadshot
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_KilledByTaser
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LadderSurpressionTimer
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastAction
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastAttackedTeammate
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastBookmarkedPosition
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastBumpMineBumpTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastCollisionCeiling
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastCollisionCeilingChangeTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastConcurrentKilled
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastDistanceTraveledNotice
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastEquippedArmorTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastEquippedHelmetTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastFriendlyFireDamageReductionRatio
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastGivenBombTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastGivenDefuserTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastHealth
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastHitBox
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastKillerIndex
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastLadderNormal
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastLadderPos
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastMoneyUpdateTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastPickupPriority
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastPickupPriorityTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastStandingPos
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LastWeaponFireUsercmd
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_LowerBodyYawTarget
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_MenuStringBuffer
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_MoveState
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_MyCollisionGroup
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_NameChangeHistory
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_NextGuardianTooFarHurtTime
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_NightVisionOn
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_NumDangerZoneDamageHits
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_NumEnemiesAtRoundStart
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_NumEnemiesKilledThisRound
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_NumEnemiesKilledThisSpawn
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_Pet
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_PlayerPatchEconIndices
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_PrimaryAddon
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_ResetArmorNextSpawn
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_ResumeZoom
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_RoundStartEquipmentValue
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_SecondaryAddon
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_ShootAngleHistory
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_ShotsFired
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_ShouldHaveCash
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_SlopeDropHeight
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_SlopeDropOffset
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_SpotRules
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_StashedGrenadeThrowPosition
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_StashedShootAngles
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_StashedVelocity
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_StoredSpawnAngle
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_StoredSpawnPosition
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_Strafing
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_SurvivalTeamNumber
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_ThirdPersonHeading
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_ThrowPositionHistory
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_TotalBulletForce
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_VCollisionInitted
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_VelocityHistory
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_VelocityModifier
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_WaitForNoAttack
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_WasInBombZoneTrigger
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.get_WhichBombZone
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.set_GunGameImmunityColor(System.Drawing.Color)
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CCSPlayerPawnBase.set_MenuStringBuffer(System.String)
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CDamageRecord.get_PlayerDamager
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CDamageRecord.get_PlayerRecipient
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_BoxMaxs
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_BoxMins
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_Brightness
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_Color
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_CubemapTexture
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_CustomCubemapTexture
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_EdgeFadeDist
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_EdgeFadeDists
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_Enabled
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_EnvCubeMapArrayIndex
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_Handshake
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_LightProbeAtlasX
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_LightProbeAtlasY
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_LightProbeAtlasZ
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_LightProbeDirectLightIndicesTexture
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_LightProbeDirectLightScalarsTexture
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_LightProbeDirectLightShadowsTexture
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_LightProbeSizeX
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_LightProbeSizeY
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_LightProbeSizeZ
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_LightProbeTexture
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_Moveable
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_Priority
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.get_StartDisabled
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCombinedLightProbeVolume.set_Color(System.Drawing.Color)
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_BoxProjectMaxs
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_BoxProjectMins
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_CopyDiffuseFromDefaultCubemap
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_CubemapTexture
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_CustomCubemapTexture
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_DefaultEnvMap
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_DefaultSpecEnvMap
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_DiffuseScale
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_EdgeFadeDist
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_EdgeFadeDists
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_Enabled
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_EnvCubeMapArrayIndex
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_Handshake
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_IndoorCubeMap
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_InfluenceRadius
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_Moveable
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_Priority
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvCubemap.get_StartDisabled
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvExplosion.get_CustomDamageType
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_BoxMaxs
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_BoxMins
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_Enabled
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_Handshake
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_LightProbeAtlasX
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_LightProbeAtlasY
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_LightProbeAtlasZ
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_LightProbeDirectLightIndicesTexture
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_LightProbeDirectLightScalarsTexture
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_LightProbeDirectLightShadowsTexture
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_LightProbeSizeX
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_LightProbeSizeY
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_LightProbeSizeZ
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_LightProbeTexture
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_Moveable
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_Priority
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvLightProbeVolume.get_StartDisabled
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvMicrophone.get_SoundMask
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CEnvWindShared.get_EntIndex
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CFuncShatterglass.get_ConcreteMaterialEdgeCaps
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CFuncShatterglass.get_ConcreteMaterialEdgeFace
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CFuncShatterglass.get_ConcreteMaterialEdgeFins
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CFuncShatterglass.get_GlassMaterialDamaged
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CFuncShatterglass.get_GlassMaterialUndamaged
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CFuncShatterglass.get_HasRateLimitedShards
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CFuncShatterglass.get_NumShardsEverCreated
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CFuncShatterglass.get_PanelNormalWs
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.ChangeAccessorFieldPathIndex_t.get_Value
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CMarkupVolume.get_Enabled
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CNavLinkAnimgraphVar.get_StrAnimgraphVar
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CNavLinkAnimgraphVar.set_StrAnimgraphVar(System.String)
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CPhysBox.get_MassScale
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CPhysicsProp.get_CollisionGroupOverride
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CPlantedC4.get_PlantedAfterPickup
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CPointHurt.get_BitsDamageType
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CRagdollProp.get_BloodColor
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CScriptedSequence.get_LastFoundEntity
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CSound.get_Type
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CSoundEventPathCornerEntity.get_BPlaying
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CTakeDamageInfo.get_BitsDamageType
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.CTriggerHurt.get_BitsDamageInflict
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.PhysicsRagdollPose_t.get___m_pChainEntity
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.shard_model_desc_t.get_Material
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0002
+ M:CounterStrikeSharp.API.Core.shard_model_desc_t.get_ShatterPanelMode
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0005
+ M:CounterStrikeSharp.API.Modules.Menu.BaseMenu.Open(CounterStrikeSharp.API.Core.CCSPlayerController)
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0006
+ M:CounterStrikeSharp.API.Modules.Menu.IMenu.Open(CounterStrikeSharp.API.Core.CCSPlayerController)
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0006
+ M:CounterStrikeSharp.API.Modules.Menu.IMenu.OpenToAll
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0010
+ T:CounterStrikeSharp.API.Core.FacingMode
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0010
+ T:CounterStrikeSharp.API.Core.SoundFlags_t
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0010
+ T:CounterStrikeSharp.API.Core.TakeDamageFlags_t
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.AccelerationFrontBack
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.AccelerationHeading
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.AccelerationLeftRight
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.AccelerationSpeed
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.BoundaryRadius
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.FingerCurl_Index
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.FingerCurl_Middle
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.FingerCurl_Pinky
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.FingerCurl_Ring
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.FingerCurl_Thumb
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.FingerSplay_Index_Middle
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.FingerSplay_Middle_Ring
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.FingerSplay_Ring_Pinky
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.FingerSplay_Thumb_Index
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.GoalDistance
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.LookDistance
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.LookHeading
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.LookPitch
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.MaxMoveSpeed
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.MoveHeadingRelativeToLookHeading
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.Parameter
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.RootMotionSpeed
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.RootMotionTurnSpeed
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.SlopeAngle
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.SlopeHeading
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.SlopePitch
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.SlopeYaw
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.TargetMoveHeading
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.TargetMoveSpeed
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.WayPointDistance
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.AnimValueSource.WayPointHeading
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.ChickenActivity.GLIDE
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.ChickenActivity.LAND
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.ChickenActivity.RUN
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.ChickenActivity.WALK
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_CL_BODYGROUP_SET_TO_CLIP
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_CL_BODYGROUP_SET_TO_NEXTCLIP
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_CL_C4_SCREEN_TEXT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_CL_EJECT_MAG
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_CL_WEAPON_TRANSITION_INTO_HAND
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_GRENADE_THROW_COMPLETE
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_PULSE_GRAPH
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_PULSE_GRAPH_AIMAT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_PULSE_GRAPH_IKLOCKLEFTARM
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_PULSE_GRAPH_IKLOCKRIGHTARM
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_PULSE_GRAPH_LOOKAT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_SV_ATTACH_SILENCER_COMPLETE
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_SV_DETACH_SILENCER_COMPLETE
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_SV_HIDE_SILENCER
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_SV_SHOW_SILENCER
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_WPN_COMPLETE_RELOAD
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.GameAnimEventIndex_t.AE_WPN_HEALTHSHOT_INJECT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.ParticleFloatMapType_t.PF_MAP_TYPE_COUNT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.ADD_FLOAT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.ADD_INT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.ADD_STRING
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.DIV_FLOAT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.DIV_INT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.EQ_BOOL
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.EQ_ENTITY_NAME
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.EQ_FLOAT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.EQ_INT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.EQ_STRING
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.GET_CONST_INLINE_STORAGE
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.LAST_SERIALIZED_CODE
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.LT_FLOAT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.LT_INT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.LTE_FLOAT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.LTE_INT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.MOD_FLOAT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.MOD_INT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.MUL_FLOAT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.MUL_INT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.NE_BOOL
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.NE_ENTITY_NAME
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.NE_FLOAT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.NE_INT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.NE_STRING
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.NEGATE_FLOAT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.NEGATE_INT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.SUB_FLOAT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseInstructionCode_t.SUB_INT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseValueType_t.PVAL_ANY
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseValueType_t.PVAL_COUNT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseValueType_t.PVAL_CURSOR_FLOW
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseValueType_t.PVAL_ENTITY_NAME
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseValueType_t.PVAL_SCHEMA_ENUM
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.PulseValueType_t.PVAL_TYPESAFE_INT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.ShatterGlassStressType.SHATTERGLASS_EXPLOSIVE
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_AUTOFILTER
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_BOXVERB
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_CONVOLUTION
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_DELAY
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_DIFFUSOR
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_DYNAMICS
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_DYNAMICS_3BAND
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_DYNAMICS_COMPRESSOR
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_EFFECT_CHAIN
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_ENVELOPE
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_EQ8
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_FILTER
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_FREEVERB
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_FULLWAVE_INTEGRATOR
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_MOD_DELAY
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_OSC
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_PANNER
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_PLATEVERB
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_PRESETDSP
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_RT_PITCH
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_SHAPER
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_STEAMAUDIO_DIRECT
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_STEAMAUDIO_HRTF
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_STEAMAUDIO_PATHING
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_STEREODELAY
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_SUBGRAPH_SWITCH
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_UTILITY
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Core.VMixProcessorType_t.VPROCESSOR_VOCODER
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Modules.Commands.Targeting.TargetType.ExplicitName
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Modules.Commands.Targeting.TargetType.IdSteam64
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Modules.Commands.Targeting.TargetType.IdSteamEscaped
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Modules.Commands.Targeting.TargetType.IdUserid
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Modules.Commands.Targeting.TargetType.ImplicitName
+ .\ApiCompat\v202.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
+
+
+ CP0011
+ F:CounterStrikeSharp.API.Modules.Commands.Targeting.TargetType.Invalid
.\ApiCompat\v202.dll
- obj\Debug\net8.0\CounterStrikeSharp.API.dll
+ obj\Release\net8.0\CounterStrikeSharp.API.dll
\ No newline at end of file
diff --git a/managed/CounterStrikeSharp.API/Core/API.cs b/managed/CounterStrikeSharp.API/Core/API.cs
index 12fe56a27..a687245e8 100644
--- a/managed/CounterStrikeSharp.API/Core/API.cs
+++ b/managed/CounterStrikeSharp.API/Core/API.cs
@@ -2,6 +2,7 @@
using System;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.UserMessages;
+using CounterStrikeSharp.API.Modules.ClientMessages;
using CounterStrikeSharp.API.Modules.Commands;
using CounterStrikeSharp.API.Modules.Utils;
@@ -1295,7 +1296,7 @@ public static bool PbHasfield(UserMessage message, string name){
ScriptContext.GlobalScriptContext.Reset();
ScriptContext.GlobalScriptContext.Push(message);
ScriptContext.GlobalScriptContext.Push(name);
- ScriptContext.GlobalScriptContext.SetIdentifier(0xC971FB70);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x851C34D7);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
return (bool)ScriptContext.GlobalScriptContext.GetResult(typeof(bool));
@@ -1308,7 +1309,7 @@ public static int PbReadint(UserMessage message, string name, int index){
ScriptContext.GlobalScriptContext.Push(message);
ScriptContext.GlobalScriptContext.Push(name);
ScriptContext.GlobalScriptContext.Push(index);
- ScriptContext.GlobalScriptContext.SetIdentifier(0x5FA8BDC9);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xD917248E);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
return (int)ScriptContext.GlobalScriptContext.GetResult(typeof(int));
@@ -1321,7 +1322,7 @@ public static long PbReadint64(UserMessage message, string name, int index){
ScriptContext.GlobalScriptContext.Push(message);
ScriptContext.GlobalScriptContext.Push(name);
ScriptContext.GlobalScriptContext.Push(index);
- ScriptContext.GlobalScriptContext.SetIdentifier(0xECCF528B);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x7B72854C);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
return (long)ScriptContext.GlobalScriptContext.GetResult(typeof(long));
@@ -1334,7 +1335,7 @@ public static float PbReadfloat(UserMessage message, string name, int index){
ScriptContext.GlobalScriptContext.Push(message);
ScriptContext.GlobalScriptContext.Push(name);
ScriptContext.GlobalScriptContext.Push(index);
- ScriptContext.GlobalScriptContext.SetIdentifier(0xED208CEA);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x7C321FAD);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
return (float)ScriptContext.GlobalScriptContext.GetResult(typeof(float));
@@ -1347,7 +1348,7 @@ public static bool PbReadbool(UserMessage message, string name, int index){
ScriptContext.GlobalScriptContext.Push(message);
ScriptContext.GlobalScriptContext.Push(name);
ScriptContext.GlobalScriptContext.Push(index);
- ScriptContext.GlobalScriptContext.SetIdentifier(0x54C0D7F4);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xFC038953);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
return (bool)ScriptContext.GlobalScriptContext.GetResult(typeof(bool));
@@ -1360,7 +1361,7 @@ public static string PbReadstring(UserMessage message, string name, int index){
ScriptContext.GlobalScriptContext.Push(message);
ScriptContext.GlobalScriptContext.Push(name);
ScriptContext.GlobalScriptContext.Push(index);
- ScriptContext.GlobalScriptContext.SetIdentifier(0x66CACEEF);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xE57E2388);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
return (string)ScriptContext.GlobalScriptContext.GetResult(typeof(string));
@@ -1372,7 +1373,7 @@ public static int PbGetrepeatedfieldcount(UserMessage message, string name){
ScriptContext.GlobalScriptContext.Reset();
ScriptContext.GlobalScriptContext.Push(message);
ScriptContext.GlobalScriptContext.Push(name);
- ScriptContext.GlobalScriptContext.SetIdentifier(0xDE4E1549);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x66CB54CE);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
return (int)ScriptContext.GlobalScriptContext.GetResult(typeof(int));
@@ -1386,7 +1387,7 @@ public static void PbSetint(UserMessage message, string name, int value, int ind
ScriptContext.GlobalScriptContext.Push(name);
ScriptContext.GlobalScriptContext.Push(value);
ScriptContext.GlobalScriptContext.Push(index);
- ScriptContext.GlobalScriptContext.SetIdentifier(0x99BBC059);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x8EB452BE);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
}
@@ -1399,7 +1400,7 @@ public static void PbSetint64(UserMessage message, string name, long value, int
ScriptContext.GlobalScriptContext.Push(name);
ScriptContext.GlobalScriptContext.Push(value);
ScriptContext.GlobalScriptContext.Push(index);
- ScriptContext.GlobalScriptContext.SetIdentifier(0xF7AD351B);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xD13F37C);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
}
@@ -1412,7 +1413,7 @@ public static void PbSetfloat(UserMessage message, string name, float value, int
ScriptContext.GlobalScriptContext.Push(name);
ScriptContext.GlobalScriptContext.Push(value);
ScriptContext.GlobalScriptContext.Push(index);
- ScriptContext.GlobalScriptContext.SetIdentifier(0xF7FDEB7A);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xD8CE1DD);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
}
@@ -1425,7 +1426,7 @@ public static void PbSetbool(UserMessage message, string name, bool value, int i
ScriptContext.GlobalScriptContext.Push(name);
ScriptContext.GlobalScriptContext.Push(value);
ScriptContext.GlobalScriptContext.Push(index);
- ScriptContext.GlobalScriptContext.SetIdentifier(0xD1342864);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x65446963);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
}
@@ -1438,7 +1439,7 @@ public static void PbSetstring(UserMessage message, string name, string value, i
ScriptContext.GlobalScriptContext.Push(name);
ScriptContext.GlobalScriptContext.Push(value);
ScriptContext.GlobalScriptContext.Push(index);
- ScriptContext.GlobalScriptContext.SetIdentifier(0x15C78B7F);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xF3B0D738);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
}
@@ -1450,7 +1451,7 @@ public static void PbAddint(UserMessage message, string name, int value){
ScriptContext.GlobalScriptContext.Push(message);
ScriptContext.GlobalScriptContext.Push(name);
ScriptContext.GlobalScriptContext.Push(value);
- ScriptContext.GlobalScriptContext.SetIdentifier(0x66CD6A1A);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x775540FD);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
}
@@ -1462,7 +1463,7 @@ public static void PbAddint64(UserMessage message, string name, object value){
ScriptContext.GlobalScriptContext.Push(message);
ScriptContext.GlobalScriptContext.Push(name);
ScriptContext.GlobalScriptContext.Push(value);
- ScriptContext.GlobalScriptContext.SetIdentifier(0x4FD05AD8);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xA1A9763F);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
}
@@ -1474,7 +1475,7 @@ public static void PbAddfloat(UserMessage message, string name, float value){
ScriptContext.GlobalScriptContext.Push(message);
ScriptContext.GlobalScriptContext.Push(name);
ScriptContext.GlobalScriptContext.Push(value);
- ScriptContext.GlobalScriptContext.SetIdentifier(0x5117B239);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xA1B8029E);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
}
@@ -1486,7 +1487,7 @@ public static void PbAddbool(UserMessage message, string name, bool value){
ScriptContext.GlobalScriptContext.Push(message);
ScriptContext.GlobalScriptContext.Push(name);
ScriptContext.GlobalScriptContext.Push(value);
- ScriptContext.GlobalScriptContext.SetIdentifier(0x40827C47);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x61FFEE00);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
}
@@ -1498,7 +1499,7 @@ public static void PbAddstring(UserMessage message, string name, string value){
ScriptContext.GlobalScriptContext.Push(message);
ScriptContext.GlobalScriptContext.Push(name);
ScriptContext.GlobalScriptContext.Push(value);
- ScriptContext.GlobalScriptContext.SetIdentifier(0x8DFD739C);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x1161491B);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
}
@@ -1510,7 +1511,7 @@ public static void PbRemoverepeatedfieldvalue(UserMessage message, string name,
ScriptContext.GlobalScriptContext.Push(message);
ScriptContext.GlobalScriptContext.Push(name);
ScriptContext.GlobalScriptContext.Push(index);
- ScriptContext.GlobalScriptContext.SetIdentifier(0x1721FCB1);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xABF83C16);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
}
@@ -1520,7 +1521,7 @@ public static string PbGetdebugstring(UserMessage message){
lock (ScriptContext.GlobalScriptContext.Lock) {
ScriptContext.GlobalScriptContext.Reset();
ScriptContext.GlobalScriptContext.Push(message);
- ScriptContext.GlobalScriptContext.SetIdentifier(0x913FB7BA);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x5D4069DD);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
return (string)ScriptContext.GlobalScriptContext.GetResult(typeof(string));
@@ -1635,6 +1636,476 @@ public static string UsermessageGettype(UserMessage message){
}
}
+ public static void HookClientMessage(int messageid, InputArgument callback, HookMode mode)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(messageid);
+ ScriptContext.GlobalScriptContext.Push((InputArgument)callback);
+ ScriptContext.GlobalScriptContext.Push(mode);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x261A390B);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static void UnhookClientMessage(int messageid, InputArgument callback, HookMode mode)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(messageid);
+ ScriptContext.GlobalScriptContext.Push((InputArgument)callback);
+ ScriptContext.GlobalScriptContext.Push(mode);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x39B3A770);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static bool PbHasfield(ClientMessage message, string name)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x6CDA2A81);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (bool)ScriptContext.GlobalScriptContext.GetResult(typeof(bool));
+ }
+ }
+
+ public static int PbReadint(ClientMessage message, string name, int index)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(index);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x990C3698);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (int)ScriptContext.GlobalScriptContext.GetResult(typeof(int));
+ }
+ }
+
+ public static long PbReadint64(ClientMessage message, string name, int index)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(index);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xCF43F5A);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (long)ScriptContext.GlobalScriptContext.GetResult(typeof(long));
+ }
+ }
+
+ public static float PbReadfloat(ClientMessage message, string name, int index)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(index);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xD69053B);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (float)ScriptContext.GlobalScriptContext.GetResult(typeof(float));
+ }
+ }
+
+ public static bool PbReadbool(ClientMessage message, string name, int index)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(index);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xBA948705);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (bool)ScriptContext.GlobalScriptContext.GetResult(typeof(bool));
+ }
+ }
+
+ public static string PbReadstring(ClientMessage message, string name, int index)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(index);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xD47D67DE);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (string)ScriptContext.GlobalScriptContext.GetResult(typeof(string));
+ }
+ }
+
+ public static byte[] PbReadbytes(ClientMessage message, string name, int index)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(index);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xD2CC412);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (byte[])ScriptContext.GlobalScriptContext.GetResult(typeof(byte[]));
+ }
+ }
+
+ public static int PbGetrepeatedfieldcount(ClientMessage message, string name)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x44BC6C58);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (int)ScriptContext.GlobalScriptContext.GetResult(typeof(int));
+ }
+ }
+
+ public static void PbSetint(ClientMessage message, string name, int value, int index)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(value);
+ ScriptContext.GlobalScriptContext.Push(index);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x689BBAE8);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static void PbSetint64(ClientMessage message, string name, long value, int index)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(value);
+ ScriptContext.GlobalScriptContext.Push(index);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xFE7613AA);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static void PbSetfloat(ClientMessage message, string name, float value, int index)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(value);
+ ScriptContext.GlobalScriptContext.Push(index);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xFF31A68B);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static void PbSetbool(ClientMessage message, string name, bool value, int index)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(value);
+ ScriptContext.GlobalScriptContext.Push(index);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x7C16A9F5);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static void PbSetstring(ClientMessage message, string name, string value, int index)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(value);
+ ScriptContext.GlobalScriptContext.Push(index);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xBF62452E);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static void PbSetbytes(ClientMessage message, string name, byte[] value, int index)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(value);
+ ScriptContext.GlobalScriptContext.Push(index);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xFEE230E2);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static void PbAddint(ClientMessage message, string name, int value)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(value);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x80630DAB);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static void PbAddint64(ClientMessage message, string name, object value)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(value);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x255D2AE9);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static void PbAddfloat(ClientMessage message, string name, float value)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(value);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x263A9CC8);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static void PbAddbool(ClientMessage message, string name, bool value)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(value);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x8CC96496);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static void PbAddstring(ClientMessage message, string name, string value)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(value);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xCCC3BD0D);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static void PbRemoverepeatedfieldvalue(ClientMessage message, string name, int index)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.Push(index);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x603DEB40);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static string PbGetdebugstring(ClientMessage message)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x33728C0B);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (string)ScriptContext.GlobalScriptContext.GetResult(typeof(string));
+ }
+ }
+
+ public static ulong ClientMessageGetrecipients(ClientMessage message){
+ lock (ScriptContext.GlobalScriptContext.Lock) {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0xF2FBDAB6);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (ulong)ScriptContext.GlobalScriptContext.GetResult(typeof(ulong));
+ }
+ }
+
+ public static void ClientMessageSetrecipients(ClientMessage message, ulong recipients){
+ lock (ScriptContext.GlobalScriptContext.Lock) {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.Push(recipients);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x371B3FA2);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static int ClientMessageFindmessageidbyname(string name)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x816C8297);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (int)ScriptContext.GlobalScriptContext.GetResult(typeof(int));
+ }
+ }
+
+ public static IntPtr ClientMessageCreate(string name)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(name);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x3898B04C);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (IntPtr)ScriptContext.GlobalScriptContext.GetResult(typeof(IntPtr));
+ }
+ }
+
+ public static IntPtr ClientMessageCreatebyid(int id)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(id);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x3AAD053A);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (IntPtr)ScriptContext.GlobalScriptContext.GetResult(typeof(IntPtr));
+ }
+ }
+
+ public static void ClientMessageSend(ClientMessage message)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x86C90434);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static void ClientMessageDelete(ClientMessage message)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x30AC1CD1);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ }
+ }
+
+ public static int ClientMessageGetid(ClientMessage message)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x5F0CA113);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (int)ScriptContext.GlobalScriptContext.GetResult(typeof(int));
+ }
+ }
+
+ public static string ClientMessageGetname(ClientMessage message)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x54B569D9);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (string)ScriptContext.GlobalScriptContext.GetResult(typeof(string));
+ }
+ }
+
+ public static int ClientMessageGetsender(ClientMessage message)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x594E2A35);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (int)ScriptContext.GlobalScriptContext.GetResult(typeof(int));
+ }
+ }
+
+ public static string ClientMessageGettype(ClientMessage message)
+ {
+ lock (ScriptContext.GlobalScriptContext.Lock)
+ {
+ ScriptContext.GlobalScriptContext.Reset();
+ ScriptContext.GlobalScriptContext.Push(message);
+ ScriptContext.GlobalScriptContext.SetIdentifier(0x54B45E26);
+ ScriptContext.GlobalScriptContext.Invoke();
+ ScriptContext.GlobalScriptContext.CheckErrors();
+ return (string)ScriptContext.GlobalScriptContext.GetResult(typeof(string));
+ }
+ }
+
public static IntPtr VectorNew(){
lock (ScriptContext.GlobalScriptContext.Lock) {
ScriptContext.GlobalScriptContext.Reset();
diff --git a/managed/CounterStrikeSharp.API/Core/BasePlugin.cs b/managed/CounterStrikeSharp.API/Core/BasePlugin.cs
index 600a9ee59..c999f8caa 100644
--- a/managed/CounterStrikeSharp.API/Core/BasePlugin.cs
+++ b/managed/CounterStrikeSharp.API/Core/BasePlugin.cs
@@ -31,6 +31,7 @@
using CounterStrikeSharp.API.Modules.Cvars;
using CounterStrikeSharp.API.Modules.Entities;
using CounterStrikeSharp.API.Modules.UserMessages;
+using CounterStrikeSharp.API.Modules.ClientMessages;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
@@ -538,7 +539,7 @@ public void HookUserMessage(int messageId, UserMessage.UserMessageHandler handle
NativeAPI.HookUsermessage(messageId, subscriber.GetInputArgument(), mode);
Handlers[handler] = subscriber;
}
-
+
public void UnhookUserMessage(int messageId, UserMessage.UserMessageHandler handler, HookMode mode = HookMode.Pre)
{
if (!Handlers.TryGetValue(handler, out var subscriber)) return;
@@ -548,6 +549,24 @@ public void UnhookUserMessage(int messageId, UserMessage.UserMessageHandler hand
Handlers.Remove(handler);
}
+ public void HookClientMessage(int messageId, ClientMessage.ClientMessageHandler handler, HookMode mode = HookMode.Pre)
+ {
+ var subscriber = new CallbackSubscriber(handler, handler,
+ () => UnhookClientMessage(messageId, handler));
+
+ NativeAPI.HookClientMessage(messageId, subscriber.GetInputArgument(), mode);
+ Handlers[handler] = subscriber;
+ }
+
+ public void UnhookClientMessage(int messageId, ClientMessage.ClientMessageHandler handler, HookMode mode = HookMode.Pre)
+ {
+ if (!Handlers.TryGetValue(handler, out var subscriber)) return;
+
+ NativeAPI.UnhookClientMessage(messageId, subscriber.GetInputArgument(), mode);
+ FunctionReference.Remove(subscriber.GetReferenceIdentifier());
+ Handlers.Remove(handler);
+ }
+
///
/// Unhooks an entity output.
///
diff --git a/managed/CounterStrikeSharp.API/Core/ScriptContext.cs b/managed/CounterStrikeSharp.API/Core/ScriptContext.cs
index 11a3bdc6b..19f953b00 100644
--- a/managed/CounterStrikeSharp.API/Core/ScriptContext.cs
+++ b/managed/CounterStrikeSharp.API/Core/ScriptContext.cs
@@ -210,6 +210,12 @@ internal unsafe void Push(fxScriptContext* context, object arg)
return;
}
+ else if (arg is byte[])
+ {
+ PushBytes(context, (byte[])arg);
+
+ return;
+ }
else if (arg is InputArgument ia)
{
Push(context, ia.Value);
@@ -264,6 +270,12 @@ internal unsafe void SetResultInternal(fxScriptContext* context, object arg)
return;
}
+ if (arg is byte[])
+ {
+ SetResultBytes(context, (byte[])arg);
+
+ return;
+ }
else if (arg is InputArgument ia)
{
SetResultInternal(context, ia.Value);
@@ -325,6 +337,32 @@ internal unsafe void PushString(fxScriptContext* cxt, string str)
cxt->numArguments++;
}
+ [SecurityCritical]
+ internal unsafe void PushBytes(fxScriptContext* cxt, byte[] bytes)
+ {
+ var ptr = IntPtr.Zero;
+
+ if (bytes != null)
+ {
+ ptr = Marshal.AllocHGlobal(bytes.Length + 4);
+
+ byte[] lenBytes = BitConverter.GetBytes(bytes.Length);
+
+ Marshal.Copy(lenBytes, 0, ptr, 4);
+
+ Marshal.Copy(bytes, 0, ptr + 4, bytes.Length);
+
+ ms_finalizers.Enqueue(() => Free(ptr));
+ }
+
+ unsafe
+ {
+ *(IntPtr*)(&cxt->functionData[8 * cxt->numArguments]) = ptr;
+ }
+
+ cxt->numArguments++;
+ }
+
[SecurityCritical]
internal unsafe void SetResultString(fxScriptContext* cxt, string str)
{
@@ -348,7 +386,31 @@ internal unsafe void SetResultString(fxScriptContext* cxt, string str)
}
}
- [SecuritySafeCritical]
+ [SecurityCritical]
+ internal unsafe void SetResultBytes(fxScriptContext* cxt, byte[] bytes)
+ {
+ var ptr = IntPtr.Zero;
+
+ if (bytes != null)
+ {
+ ptr = Marshal.AllocHGlobal(bytes.Length + 4);
+
+ byte[] lenBytes = BitConverter.GetBytes(bytes.Length);
+
+ Marshal.Copy(lenBytes, 0, ptr, 4);
+
+ Marshal.Copy(bytes, 0, ptr + 4, bytes.Length);
+
+ ms_finalizers.Enqueue(() => Free(ptr));
+ }
+
+ unsafe
+ {
+ *(IntPtr*)(&cxt->result[8]) = ptr;
+ }
+ }
+
+ [SecuritySafeCritical]
private void Free(IntPtr ptr)
{
Marshal.FreeHGlobal(ptr);
@@ -443,7 +505,37 @@ internal unsafe object GetResult(Type type, byte* ptr)
return Encoding.UTF8.GetString(buffer);
}
- if (typeof(NativeObject).IsAssignableFrom(type))
+ if (type == typeof(byte[]))
+ {
+ var nativeLen = *(IntPtr*)&ptr[0];
+
+ if (nativeLen == IntPtr.Zero)
+ {
+ return null;
+ }
+
+ var dataLen = Marshal.ReadInt32(nativeLen);
+
+ if (dataLen == 0)
+ {
+ return null;
+ }
+
+ var nativeData = nativeLen + 4;
+
+ var len = 0;
+ while(len < dataLen)
+ {
+ Marshal.ReadByte(nativeData, len);
+ ++len;
+ }
+
+ var buffer = new byte[len];
+ Marshal.Copy(nativeData, buffer, 0, buffer.Length);
+ return buffer;
+ }
+
+ if (typeof(NativeObject).IsAssignableFrom(type))
{
var pointer = (IntPtr)GetResult(typeof(IntPtr), ptr);
return Activator.CreateInstance(type, pointer);
diff --git a/managed/CounterStrikeSharp.API/Modules/ClientMessages/ClientMessage.cs b/managed/CounterStrikeSharp.API/Modules/ClientMessages/ClientMessage.cs
new file mode 100644
index 000000000..791dda935
--- /dev/null
+++ b/managed/CounterStrikeSharp.API/Modules/ClientMessages/ClientMessage.cs
@@ -0,0 +1,147 @@
+using System.Collections.ObjectModel;
+using CounterStrikeSharp.API.Modules.Utils;
+
+namespace CounterStrikeSharp.API.Modules.ClientMessages;
+
+public class ClientMessage : NativeObject, IDisposable
+{
+ private RecipientFilter _recipients;
+
+ public delegate HookResult ClientMessageHandler(ClientMessage native);
+
+ public ClientMessage(IntPtr pointer) : base(pointer)
+ {
+ Recipients = new RecipientFilter(NativeAPI.ClientMessageGetrecipients(this));
+ Recipients.CollectionChanged = () => NativeAPI.ClientMessageSetrecipients(this, Recipients.GetRecipientMask());
+ }
+
+ ///
+ /// Creates a new client message with a given network message name partial match.
+ ///
+ ///
+ /// if the name is not a valid network message name
+ public static ClientMessage FromPartialName(string name) => new(NativeAPI.ClientMessageCreate(name));
+
+ ///
+ /// Creates a new client message with a given network message ID.
+ ///
+ ///
+ ///
+ public static ClientMessage FromId(int id) => new(NativeAPI.ClientMessageCreatebyid(id));
+
+ ///
+ /// Finds a network message ID by name.
+ ///
+ /// Network message system must be loaded before this function can be used.
+ /// Avoid calling this method from
+ ///
+ ///
+ public static int FindIdByName(string name) => NativeAPI.ClientMessageFindmessageidbyname(name);
+
+ public bool HasField(string fieldName) => NativeAPI.PbHasfield(this, fieldName);
+
+ public int ReadInt(string fieldName, int? index = null) => NativeAPI.PbReadint(this, fieldName, index ?? -1);
+ public uint ReadUInt(string fieldName, int? index = null) => (uint)NativeAPI.PbReadint(this, fieldName, index ?? -1);
+ public long ReadInt64(string fieldName, int? index = null) => NativeAPI.PbReadint64(this, fieldName, index ?? -1);
+ public ulong ReadUInt64(string fieldName, int? index = null) => (ulong)NativeAPI.PbReadint64(this, fieldName, index ?? -1);
+ public float ReadFloat(string fieldName, int? index = null) => NativeAPI.PbReadfloat(this, fieldName, index ?? -1);
+ public double ReadDouble(string fieldName, int? index = null) => NativeAPI.PbReadfloat(this, fieldName, index ?? -1);
+ public string ReadString(string fieldName, int? index = null) => NativeAPI.PbReadstring(this, fieldName, index ?? -1);
+ public byte[] ReadBytes(string fieldName, int? index = null) => NativeAPI.PbReadbytes(this, fieldName, index ?? -1);
+ public bool ReadBool(string fieldName, int? index = null) => NativeAPI.PbReadbool(this, fieldName, index ?? -1);
+ public void SetInt(string fieldName, int value, int? index = null) => NativeAPI.PbSetint(this, fieldName, value, index ?? -1);
+ public void SetUInt(string fieldName, uint value, int? index = null) => NativeAPI.PbSetint(this, fieldName, (int)value, index ?? -1);
+ public void SetInt64(string fieldName, long value, int? index = null) => NativeAPI.PbSetint64(this, fieldName, value, index ?? -1);
+
+ public void SetUInt64(string fieldName, ulong value, int? index = null) =>
+ NativeAPI.PbSetint64(this, fieldName, (long)value, index ?? -1);
+
+ public void SetFloat(string fieldName, float value, int? index = null) => NativeAPI.PbSetfloat(this, fieldName, value, index ?? -1);
+
+ public void SetDouble(string fieldName, double value, int? index = null) =>
+ NativeAPI.PbSetfloat(this, fieldName, (float)value, index ?? -1);
+
+ public void SetString(string fieldName, string value, int? index = null) => NativeAPI.PbSetstring(this, fieldName, value, index ?? -1);
+ public void SetBytes(string fieldName, byte[] value, int? index = null) => NativeAPI.PbSetbytes(this, fieldName, value, index ?? -1);
+ public void SetBool(string fieldName, bool value, int? index = null) => NativeAPI.PbSetbool(this, fieldName, value, index ?? -1);
+
+ public int GetRepeatedFieldCount(string fieldName) => NativeAPI.PbGetrepeatedfieldcount(this, fieldName);
+
+ public void RemoveRepeatedField(string fieldName, int index) => NativeAPI.PbRemoverepeatedfieldvalue(this, fieldName, index);
+
+ public void AddInt(string fieldName, int value) => NativeAPI.PbAddint(this, fieldName, value);
+ public void AddUInt(string fieldName, uint value) => NativeAPI.PbAddint(this, fieldName, (int)value);
+ public void AddInt64(string fieldName, long value) => NativeAPI.PbAddint64(this, fieldName, value);
+ public void AddUInt64(string fieldName, ulong value) => NativeAPI.PbAddint64(this, fieldName, (long)value);
+ public void AddFloat(string fieldName, float value) => NativeAPI.PbAddfloat(this, fieldName, value);
+ public void AddDouble(string fieldName, double value) => NativeAPI.PbAddfloat(this, fieldName, (float)value);
+ public void AddString(string fieldName, string value) => NativeAPI.PbAddstring(this, fieldName, value);
+ public void AddBool(string fieldName, bool value) => NativeAPI.PbAddbool(this, fieldName, value);
+
+ // public ClientMessage ReadMessage(string fieldName) => NativeAPI.PbReadmessage(this, fieldName);
+ // public ClientMessage ReadRepeatedMessage(string fieldName, int index ) => NativeAPI.PbReadrepeatedmessage(this, fieldName, index);
+ // public ClientMessage AddMessage(string fieldName) => NativeAPI.PbAddmessage(this, fieldName);
+
+ public void Send() => NativeAPI.ClientMessageSend(this);
+
+ public void Send(RecipientFilter recipientFilter)
+ {
+ Recipients = recipientFilter;
+ Send();
+ }
+
+ ///
+ /// Returns the network message name of this client message.
+ /// CMsgTEFireBullets [452]
+ ///
+ public string Name => NativeAPI.ClientMessageGetname(this);
+
+ ///
+ /// Returns the network message ID of this client message.
+ /// 452
+ ///
+ public int Id => NativeAPI.ClientMessageGetid(this);
+
+ ///
+ /// Returns the network message sender of this client message.
+ /// 0
+ ///
+ public int Sender => NativeAPI.ClientMessageGetsender(this);
+
+ ///
+ /// Returns the protobuf message type of this client message.
+ /// CMsgTEFireBullets
+ ///
+ public string Type => NativeAPI.ClientMessageGettype(this);
+
+ ///
+ /// Returns the debug string of this client message, as defined by protobuf.
+ ///
+ public string DebugString => NativeAPI.PbGetdebugstring(this);
+
+ public RecipientFilter Recipients
+ {
+ get => _recipients;
+ set
+ {
+ _recipients = value;
+ NativeAPI.ClientMessageSetrecipients(this, _recipients.GetRecipientMask());
+ }
+ }
+
+ private void ReleaseUnmanagedResources()
+ {
+ Server.NextFrame(() => { NativeAPI.ClientMessageDelete(this); });
+ }
+
+ public void Dispose()
+ {
+ ReleaseUnmanagedResources();
+ GC.SuppressFinalize(this);
+ }
+
+ ~ClientMessage()
+ {
+ ReleaseUnmanagedResources();
+ }
+}
diff --git a/managed/CounterStrikeSharp.sln b/managed/CounterStrikeSharp.sln
index 82ccb2078..f60cc9136 100644
--- a/managed/CounterStrikeSharp.sln
+++ b/managed/CounterStrikeSharp.sln
@@ -3,35 +3,35 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.12.35309.182
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestPlugin", "TestPlugin\TestPlugin.csproj", "{57E64289-5D69-4AA1-BEF0-D0D96A55EE8F}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestPlugin", "TestPlugin\TestPlugin.csproj", "{57E64289-5D69-4AA1-BEF0-D0D96A55EE8F}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CounterStrikeSharp.API", "CounterStrikeSharp.API\CounterStrikeSharp.API.csproj", "{55B47E41-61AA-4D75-9069-CB14328107B7}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CounterStrikeSharp.API", "CounterStrikeSharp.API\CounterStrikeSharp.API.csproj", "{55B47E41-61AA-4D75-9069-CB14328107B7}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeGen.Natives", "..\tooling\CodeGen.Natives\CodeGen.Natives.csproj", "{5C873ECF-A943-45AA-A3C0-E442EB4477BD}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CodeGen.Natives", "..\tooling\CodeGen.Natives\CodeGen.Natives.csproj", "{5C873ECF-A943-45AA-A3C0-E442EB4477BD}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CounterStrikeSharp.SchemaGen", "CounterStrikeSharp.SchemaGen\CounterStrikeSharp.SchemaGen.csproj", "{D470646C-9BBB-4030-B267-58537A4B0026}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CounterStrikeSharp.SchemaGen", "CounterStrikeSharp.SchemaGen\CounterStrikeSharp.SchemaGen.csproj", "{D470646C-9BBB-4030-B267-58537A4B0026}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WarcraftPlugin", "..\examples\WarcraftPlugin\WarcraftPlugin.csproj", "{DAE388A8-94A4-4C24-9450-E34677EEA2CF}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WarcraftPlugin", "..\examples\WarcraftPlugin\WarcraftPlugin.csproj", "{DAE388A8-94A4-4C24-9450-E34677EEA2CF}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{7DF99C35-881D-4FF2-B1C9-246BD3DECB9A}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WithConfig", "..\examples\WithConfig\WithConfig.csproj", "{2846604A-5B9F-4D80-9476-657C09CFDD5C}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WithConfig", "..\examples\WithConfig\WithConfig.csproj", "{2846604A-5B9F-4D80-9476-657C09CFDD5C}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelloWorld", "..\examples\HelloWorld\HelloWorld.csproj", "{DDA4F93A-7D4A-4698-8C2A-5DAE7FBCDC72}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HelloWorld", "..\examples\HelloWorld\HelloWorld.csproj", "{DDA4F93A-7D4A-4698-8C2A-5DAE7FBCDC72}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WithDependencyInjection", "..\examples\WithDependencyInjection\WithDependencyInjection.csproj", "{E497E40C-A7B4-41A7-A1C6-2EC6698FF3BF}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WithDependencyInjection", "..\examples\WithDependencyInjection\WithDependencyInjection.csproj", "{E497E40C-A7B4-41A7-A1C6-2EC6698FF3BF}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WithCommands", "..\examples\WithCommands\WithCommands.csproj", "{EA2F596E-2236-4999-B476-B1FDA287674A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WithCommands", "..\examples\WithCommands\WithCommands.csproj", "{EA2F596E-2236-4999-B476-B1FDA287674A}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WithGameEventHandlers", "..\examples\WithGameEventHandlers\WithGameEventHandlers.csproj", "{3032F3FA-E20A-4581-9A08-2FB5FF1524F4}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WithGameEventHandlers", "..\examples\WithGameEventHandlers\WithGameEventHandlers.csproj", "{3032F3FA-E20A-4581-9A08-2FB5FF1524F4}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WithDatabaseDapper", "..\examples\WithDatabaseDapper\WithDatabaseDapper.csproj", "{A641D8D7-35F1-48AB-AABA-EDFB6B7FC49B}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WithDatabaseDapper", "..\examples\WithDatabaseDapper\WithDatabaseDapper.csproj", "{A641D8D7-35F1-48AB-AABA-EDFB6B7FC49B}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WithEntityOutputHooks", "..\examples\WithEntityOutputHooks\WithEntityOutputHooks.csproj", "{31EABE0B-871F-497B-BF36-37FFC6FAD15F}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WithEntityOutputHooks", "..\examples\WithEntityOutputHooks\WithEntityOutputHooks.csproj", "{31EABE0B-871F-497B-BF36-37FFC6FAD15F}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CounterStrikeSharp.API.Tests", "CounterStrikeSharp.API.Tests\CounterStrikeSharp.API.Tests.csproj", "{BBA80E1B-109D-4ABD-9ADF-46EB0FEDFCD3}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CounterStrikeSharp.API.Tests", "CounterStrikeSharp.API.Tests\CounterStrikeSharp.API.Tests.csproj", "{BBA80E1B-109D-4ABD-9ADF-46EB0FEDFCD3}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WithTranslations", "..\examples\WithTranslations\WithTranslations.csproj", "{BB44E08E-CCA8-4E22-A132-11B2F69D1890}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WithTranslations", "..\examples\WithTranslations\WithTranslations.csproj", "{BB44E08E-CCA8-4E22-A132-11B2F69D1890}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WithVoiceOverrides", "..\examples\WithVoiceOverrides\WithVoiceOverrides.csproj", "{6FA3107D-42AF-42A0-BF51-2230D13268B5}"
EndProject
@@ -47,6 +47,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WithUserMessages", "..\exam
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WithCheckTransmit", "..\examples\WithCheckTransmit\WithCheckTransmit.csproj", "{854B06B5-0E7B-438A-BA51-3F299557F884}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WithClientMessages", "..\examples\WithClientMessages\WithClientMessages.csproj", "{F9D6767C-F5F0-420C-A019-DE4B4DCA9C17}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -137,6 +139,10 @@ Global
{854B06B5-0E7B-438A-BA51-3F299557F884}.Debug|Any CPU.Build.0 = Debug|Any CPU
{854B06B5-0E7B-438A-BA51-3F299557F884}.Release|Any CPU.ActiveCfg = Release|Any CPU
{854B06B5-0E7B-438A-BA51-3F299557F884}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F9D6767C-F5F0-420C-A019-DE4B4DCA9C17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F9D6767C-F5F0-420C-A019-DE4B4DCA9C17}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F9D6767C-F5F0-420C-A019-DE4B4DCA9C17}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F9D6767C-F5F0-420C-A019-DE4B4DCA9C17}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -159,6 +165,7 @@ Global
{76AD7BB0-A096-4336-83E2-B32CAE4E9933} = {7DF99C35-881D-4FF2-B1C9-246BD3DECB9A}
{A14029BA-CADE-4F25-ADC5-48CF14332F61} = {7DF99C35-881D-4FF2-B1C9-246BD3DECB9A}
{854B06B5-0E7B-438A-BA51-3F299557F884} = {7DF99C35-881D-4FF2-B1C9-246BD3DECB9A}
+ {F9D6767C-F5F0-420C-A019-DE4B4DCA9C17} = {7DF99C35-881D-4FF2-B1C9-246BD3DECB9A}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {069C4CD4-BACA-446A-A6B8-0194E4F75355}
diff --git a/src/core/ClientMessage.cpp b/src/core/ClientMessage.cpp
new file mode 100644
index 000000000..b4b7f1335
--- /dev/null
+++ b/src/core/ClientMessage.cpp
@@ -0,0 +1,43 @@
+/*
+ * This file is part of CounterStrikeSharp.
+ * CounterStrikeSharp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CounterStrikeSharp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with CounterStrikeSharp. If not, see . *
+ */
+#include "ClientMessage.h"
+
+#include "networksystem/inetworkserializer.h"
+
+using namespace google;
+
+namespace counterstrikesharp {
+int ClientMessage::GetMessageID() { return msgSerializable->GetNetMessageInfo()->m_MessageId; }
+
+std::string ClientMessage::GetMessageName() { return msgSerializable->GetUnscopedName(); }
+
+int ClientMessage::GetSender() { return sender; }
+
+bool ClientMessage::HasField(std::string fieldName)
+{
+ const google::protobuf::Descriptor* descriptor = msg->GetDescriptor();
+ const google::protobuf::FieldDescriptor* field = descriptor->FindFieldByName(fieldName);
+
+ if (field == nullptr || (field->label() == google::protobuf::FieldDescriptor::LABEL_REPEATED))
+ {
+ return false;
+ }
+
+ return this->msg->GetReflection()->HasField(*this->msg, field);
+}
+
+const CNetMessagePB* ClientMessage::GetProtobufMessage() { return msg; }
+} // namespace counterstrikesharp
diff --git a/src/core/ClientMessage.h b/src/core/ClientMessage.h
new file mode 100644
index 000000000..c72d925e1
--- /dev/null
+++ b/src/core/ClientMessage.h
@@ -0,0 +1,1168 @@
+/*
+ * This file is part of CounterStrikeSharp.
+ * CounterStrikeSharp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CounterStrikeSharp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with CounterStrikeSharp. If not, see . *
+ */
+
+#pragma once
+
+#include
+
+#include "core/globals.h"
+#include "log.h"
+#include "networkbasetypes.pb.h"
+
+using namespace google;
+
+#define GETCHECK_FIELD() \
+ const protobuf::FieldDescriptor* field = msg->GetDescriptor()->FindFieldByName(pszFieldName); \
+ if (!field) \
+ { \
+ return false; \
+ }
+
+#define CHECK_FIELD_TYPE(type) \
+ if (field->cpp_type() != protobuf::FieldDescriptor::CPPTYPE_##type) \
+ { \
+ return false; \
+ }
+
+#define CHECK_FIELD_TYPE2(type1, type2) \
+ protobuf::FieldDescriptor::CppType fieldType = field->cpp_type(); \
+ if (fieldType != protobuf::FieldDescriptor::CPPTYPE_##type1 && fieldType != protobuf::FieldDescriptor::CPPTYPE_##type2) \
+ { \
+ return false; \
+ }
+
+#define CHECK_FIELD_TYPE3(type1, type2, type3) \
+ protobuf::FieldDescriptor::CppType fieldType = field->cpp_type(); \
+ if (fieldType != protobuf::FieldDescriptor::CPPTYPE_##type1 && fieldType != protobuf::FieldDescriptor::CPPTYPE_##type2 && \
+ fieldType != protobuf::FieldDescriptor::CPPTYPE_##type3) \
+ { \
+ return false; \
+ }
+
+#define CHECK_FIELD_REPEATED() \
+ if (field->label() != protobuf::FieldDescriptor::LABEL_REPEATED) \
+ { \
+ return false; \
+ }
+
+#define CHECK_FIELD_NOT_REPEATED() \
+ if (field->label() == protobuf::FieldDescriptor::LABEL_REPEATED) \
+ { \
+ return false; \
+ }
+
+#define CHECK_REPEATED_ELEMENT(idx) \
+ int elemCount = msg->GetReflection()->FieldSize(*msg, field); \
+ if (elemCount == 0 || idx >= elemCount || idx < 0) \
+ { \
+ return false; \
+ };
+
+class INetworkMessageInternal;
+namespace google::protobuf {
+class Message;
+}
+
+namespace counterstrikesharp {
+class ScriptCallback;
+
+static inline size_t SafeStrcpy(char* dest, size_t maxlength, const char* src)
+{
+ if (!dest || !maxlength) return 0;
+
+ char* iter = dest;
+ size_t count = maxlength;
+ while (*src && --count)
+ *iter++ = *src++;
+ *iter = '\0';
+
+ return iter - dest;
+}
+
+class ClientMessage
+{
+ public:
+ ClientMessage(INetworkMessageInternal* msgSerializable, int sender, const CNetMessage* message)
+ : msgSerializable(msgSerializable), sender(sender),
+ msg(const_cast(message)->ToPB())
+ {
+ this->recipientMask = new uint64(0);
+ }
+
+ ClientMessage(std::string msgName)
+ {
+ this->msgSerializable = globals::networkMessages->FindNetworkMessagePartial(msgName.c_str());
+ if (!this->msgSerializable) return;
+
+ this->msg = this->msgSerializable->AllocateMessage()->ToPB();
+ this->recipientMask = new uint64(0);
+ }
+
+ ClientMessage(int msgId)
+ {
+ this->msgSerializable = globals::networkMessages->FindNetworkMessageById(msgId);
+ if (!this->msgSerializable) return;
+
+ this->msg = this->msgSerializable->AllocateMessage()->ToPB();
+ this->recipientMask = new uint64(0);
+ }
+
+ ~ClientMessage()
+ {
+ delete this->recipientMask;
+ }
+
+ std::string GetMessageName();
+ int GetMessageID();
+ int GetSender();
+ bool HasField(std::string fieldName);
+ const CNetMessagePB* GetProtobufMessage();
+ INetworkMessageInternal* GetSerializableMessage() { return msgSerializable; }
+ uint64* GetRecipientMask() { return recipientMask; }
+
+ private:
+ CNetMessagePB* msg = nullptr;
+ INetworkMessageInternal* msgSerializable = nullptr;
+ int sender = -1;
+ int nRecipientCount = 0;
+ uint64* recipientMask = nullptr;
+
+ public:
+ inline bool HasField(const char* pszFieldName)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_NOT_REPEATED();
+ return msg->GetReflection()->HasField(*msg, field);
+ }
+
+ inline bool GetInt32(const char* pszFieldName, int32* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(INT32);
+ CHECK_FIELD_NOT_REPEATED();
+
+ *out = msg->GetReflection()->GetInt32(*msg, field);
+ return true;
+ }
+
+ inline bool SetInt32(const char* pszFieldName, int32 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(INT32);
+ CHECK_FIELD_NOT_REPEATED();
+
+ msg->GetReflection()->SetInt32(msg, field, value);
+ return true;
+ }
+
+ inline bool GetRepeatedInt32(const char* pszFieldName, int index, int32* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(INT32);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ *out = msg->GetReflection()->GetRepeatedInt32(*msg, field, index);
+ return true;
+ }
+
+ inline bool SetRepeatedInt32(const char* pszFieldName, int index, int32 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(INT32);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ msg->GetReflection()->SetRepeatedInt32(msg, field, index, value);
+ return true;
+ }
+
+ inline bool AddInt32(const char* pszFieldName, int32 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(INT32);
+ CHECK_FIELD_REPEATED();
+
+ msg->GetReflection()->AddInt32(msg, field, value);
+ return true;
+ }
+
+ inline bool GetInt64(const char* pszFieldName, int64* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(INT64);
+ CHECK_FIELD_NOT_REPEATED();
+
+ *out = msg->GetReflection()->GetInt64(*msg, field);
+ return true;
+ }
+
+ inline bool SetInt64(const char* pszFieldName, int64 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(INT64);
+ CHECK_FIELD_NOT_REPEATED();
+
+ msg->GetReflection()->SetInt64(msg, field, value);
+ return true;
+ }
+
+ inline bool GetRepeatedInt64(const char* pszFieldName, int index, int64* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(INT64);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ *out = msg->GetReflection()->GetRepeatedInt64(*msg, field, index);
+ return true;
+ }
+
+ inline bool SetRepeatedInt64(const char* pszFieldName, int index, int64 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(INT64);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ msg->GetReflection()->SetRepeatedInt64(msg, field, index, value);
+ return true;
+ }
+
+ inline bool AddInt64(const char* pszFieldName, int64 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(INT64);
+ CHECK_FIELD_REPEATED();
+
+ msg->GetReflection()->AddInt64(msg, field, value);
+ return true;
+ }
+
+ inline bool GetUInt32(const char* pszFieldName, uint32* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(UINT32);
+ CHECK_FIELD_NOT_REPEATED();
+
+ *out = msg->GetReflection()->GetUInt32(*msg, field);
+ return true;
+ }
+
+ inline bool SetUInt32(const char* pszFieldName, uint32 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(UINT32);
+ CHECK_FIELD_NOT_REPEATED();
+
+ msg->GetReflection()->SetUInt32(msg, field, value);
+ return true;
+ }
+
+ inline bool GetRepeatedUInt32(const char* pszFieldName, int index, uint32* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(UINT32);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ *out = msg->GetReflection()->GetRepeatedUInt32(*msg, field, index);
+ return true;
+ }
+
+ inline bool SetRepeatedUInt32(const char* pszFieldName, int index, uint32 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(UINT32);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ msg->GetReflection()->SetRepeatedUInt32(msg, field, index, value);
+ return true;
+ }
+
+ inline bool AddUInt32(const char* pszFieldName, uint32 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(UINT32);
+ CHECK_FIELD_REPEATED();
+
+ msg->GetReflection()->AddUInt32(msg, field, value);
+ return true;
+ }
+
+ inline bool GetUInt64(const char* pszFieldName, uint64* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(UINT64);
+ CHECK_FIELD_NOT_REPEATED();
+
+ *out = msg->GetReflection()->GetUInt64(*msg, field);
+ return true;
+ }
+
+ inline bool SetUInt64(const char* pszFieldName, uint64 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(UINT64);
+ CHECK_FIELD_NOT_REPEATED();
+
+ msg->GetReflection()->SetUInt64(msg, field, value);
+ return true;
+ }
+
+ inline bool GetRepeatedUInt64(const char* pszFieldName, int index, uint64* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(UINT64);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ *out = msg->GetReflection()->GetRepeatedUInt64(*msg, field, index);
+ return true;
+ }
+
+ inline bool SetRepeatedUInt64(const char* pszFieldName, int index, uint64 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(UINT64);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ msg->GetReflection()->SetRepeatedUInt64(msg, field, index, value);
+ return true;
+ }
+
+ inline bool AddUInt64(const char* pszFieldName, uint64 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(UINT64);
+ CHECK_FIELD_REPEATED();
+
+ msg->GetReflection()->AddUInt32(msg, field, value);
+ return true;
+ }
+
+ inline bool GetInt32OrUnsignedOrEnum(const char* pszFieldName, int32* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE3(INT32, UINT32, ENUM);
+ CHECK_FIELD_NOT_REPEATED();
+
+ if (fieldType == protobuf::FieldDescriptor::CPPTYPE_UINT32) *out = (int32)msg->GetReflection()->GetUInt32(*msg, field);
+ else if (fieldType == protobuf::FieldDescriptor::CPPTYPE_INT32)
+ *out = msg->GetReflection()->GetInt32(*msg, field);
+ else // CPPTYPE_ENUM
+ *out = msg->GetReflection()->GetEnum(*msg, field)->number();
+
+ return true;
+ }
+
+ inline bool GetInt64OrUnsigned(const char* pszFieldName, int64* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE2(INT64, UINT64);
+ CHECK_FIELD_NOT_REPEATED();
+
+ if (fieldType == protobuf::FieldDescriptor::CPPTYPE_UINT64) *out = (int64)msg->GetReflection()->GetUInt64(*msg, field);
+ else
+ *out = msg->GetReflection()->GetInt64(*msg, field);
+
+ return true;
+ }
+
+ inline bool SetInt32OrUnsignedOrEnum(const char* pszFieldName, int32 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE3(INT32, UINT32, ENUM);
+ CHECK_FIELD_NOT_REPEATED();
+
+ if (fieldType == protobuf::FieldDescriptor::CPPTYPE_UINT32)
+ {
+ msg->GetReflection()->SetUInt32(msg, field, (uint32)value);
+ }
+ else if (fieldType == protobuf::FieldDescriptor::CPPTYPE_INT32)
+ {
+ msg->GetReflection()->SetInt32(msg, field, value);
+ }
+ else // CPPTYPE_ENUM
+ {
+ const protobuf::EnumValueDescriptor* pEnumValue = field->enum_type()->FindValueByNumber(value);
+ if (!pEnumValue) return false;
+
+ msg->GetReflection()->SetEnum(msg, field, pEnumValue);
+ }
+
+ return true;
+ }
+
+ inline bool SetInt64OrUnsigned(const char* pszFieldName, int64 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE2(INT64, UINT64);
+ CHECK_FIELD_NOT_REPEATED();
+
+ if (fieldType == protobuf::FieldDescriptor::CPPTYPE_UINT64)
+ {
+ msg->GetReflection()->SetUInt64(msg, field, (uint64)value);
+ }
+ else
+ {
+ msg->GetReflection()->SetInt64(msg, field, value);
+ }
+
+ return true;
+ }
+
+ inline bool GetRepeatedInt32OrUnsignedOrEnum(const char* pszFieldName, int index, int32* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE3(INT32, UINT32, ENUM);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ if (fieldType == protobuf::FieldDescriptor::CPPTYPE_UINT32)
+ *out = (int32)msg->GetReflection()->GetRepeatedUInt32(*msg, field, index);
+ else if (fieldType == protobuf::FieldDescriptor::CPPTYPE_INT32)
+ *out = msg->GetReflection()->GetRepeatedInt32(*msg, field, index);
+ else // CPPTYPE_ENUM
+ *out = msg->GetReflection()->GetRepeatedEnum(*msg, field, index)->number();
+
+ return true;
+ }
+
+ inline bool GetRepeatedInt64OrUnsigned(const char* pszFieldName, int index, int64* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE2(INT64, UINT64);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ if (fieldType == protobuf::FieldDescriptor::CPPTYPE_UINT64)
+ *out = (int64)msg->GetReflection()->GetRepeatedUInt64(*msg, field, index);
+ else
+ *out = msg->GetReflection()->GetRepeatedInt64(*msg, field, index);
+
+ return true;
+ }
+
+ inline bool SetRepeatedInt32OrUnsignedOrEnum(const char* pszFieldName, int index, int32 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE3(INT32, UINT32, ENUM);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ if (fieldType == protobuf::FieldDescriptor::CPPTYPE_UINT32)
+ {
+ msg->GetReflection()->SetRepeatedUInt32(msg, field, index, (uint32)value);
+ }
+ else if (fieldType == protobuf::FieldDescriptor::CPPTYPE_INT32)
+ {
+ msg->GetReflection()->SetRepeatedInt32(msg, field, index, value);
+ }
+ else // CPPTYPE_ENUM
+ {
+ const protobuf::EnumValueDescriptor* pEnumValue = field->enum_type()->FindValueByNumber(value);
+ if (!pEnumValue) return false;
+
+ msg->GetReflection()->SetRepeatedEnum(msg, field, index, pEnumValue);
+ }
+
+ return true;
+ }
+
+ inline bool SetRepeatedInt64OrUnsigned(const char* pszFieldName, int index, int64 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE2(INT64, UINT64);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ if (fieldType == protobuf::FieldDescriptor::CPPTYPE_UINT64)
+ {
+ msg->GetReflection()->SetRepeatedUInt64(msg, field, index, (uint64)value);
+ }
+ else
+ {
+ msg->GetReflection()->SetRepeatedInt64(msg, field, index, value);
+ }
+
+ return true;
+ }
+
+ inline bool AddInt32OrUnsignedOrEnum(const char* pszFieldName, int32 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE3(INT32, UINT32, ENUM);
+ CHECK_FIELD_REPEATED();
+
+ if (fieldType == protobuf::FieldDescriptor::CPPTYPE_UINT32)
+ {
+ msg->GetReflection()->AddUInt32(msg, field, (uint32)value);
+ }
+ else if (fieldType == protobuf::FieldDescriptor::CPPTYPE_INT32)
+ {
+ msg->GetReflection()->AddInt32(msg, field, value);
+ }
+ else // CPPTYPE_ENUM
+ {
+ const protobuf::EnumValueDescriptor* pEnumValue = field->enum_type()->FindValueByNumber(value);
+ if (!pEnumValue) return false;
+
+ msg->GetReflection()->AddEnum(msg, field, pEnumValue);
+ }
+
+ return true;
+ }
+
+ inline bool AddInt64OrUnsigned(const char* pszFieldName, int64 value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE2(INT64, UINT64);
+ CHECK_FIELD_REPEATED();
+
+ if (fieldType == protobuf::FieldDescriptor::CPPTYPE_UINT64)
+ {
+ msg->GetReflection()->AddUInt64(msg, field, (uint64)value);
+ }
+ else
+ {
+ msg->GetReflection()->AddInt64(msg, field, value);
+ }
+
+ return true;
+ }
+
+ inline bool GetBool(const char* pszFieldName, bool* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(BOOL);
+ CHECK_FIELD_NOT_REPEATED();
+
+ *out = msg->GetReflection()->GetBool(*msg, field);
+ return true;
+ }
+
+ inline bool SetBool(const char* pszFieldName, bool value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(BOOL);
+ CHECK_FIELD_NOT_REPEATED();
+
+ msg->GetReflection()->SetBool(msg, field, value);
+ return true;
+ }
+
+ inline bool GetRepeatedBool(const char* pszFieldName, int index, bool* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(BOOL);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ *out = msg->GetReflection()->GetRepeatedBool(*msg, field, index);
+ return true;
+ }
+
+ inline bool SetRepeatedBool(const char* pszFieldName, int index, bool value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(BOOL);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ msg->GetReflection()->SetRepeatedBool(msg, field, index, value);
+ return true;
+ }
+
+ inline bool AddBool(const char* pszFieldName, bool value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(BOOL);
+ CHECK_FIELD_REPEATED();
+
+ msg->GetReflection()->AddBool(msg, field, value);
+ return true;
+ }
+
+ inline bool GetFloat(const char* pszFieldName, float* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(FLOAT);
+ CHECK_FIELD_NOT_REPEATED();
+
+ *out = msg->GetReflection()->GetFloat(*msg, field);
+ return true;
+ }
+
+ inline bool SetFloat(const char* pszFieldName, float value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(FLOAT);
+ CHECK_FIELD_NOT_REPEATED();
+
+ msg->GetReflection()->SetFloat(msg, field, value);
+ return true;
+ }
+
+ inline bool GetRepeatedFloat(const char* pszFieldName, int index, float* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(FLOAT);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ *out = msg->GetReflection()->GetRepeatedFloat(*msg, field, index);
+ return true;
+ }
+
+ inline bool SetRepeatedFloat(const char* pszFieldName, int index, float value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(FLOAT);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ msg->GetReflection()->SetRepeatedFloat(msg, field, index, value);
+ return true;
+ }
+
+ inline bool AddFloat(const char* pszFieldName, float value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(FLOAT);
+ CHECK_FIELD_REPEATED();
+
+ msg->GetReflection()->AddFloat(msg, field, value);
+ return true;
+ }
+
+ inline bool GetDouble(const char* pszFieldName, double* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(DOUBLE);
+ CHECK_FIELD_NOT_REPEATED();
+
+ *out = msg->GetReflection()->GetDouble(*msg, field);
+ return true;
+ }
+
+ inline bool SetDouble(const char* pszFieldName, double value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(DOUBLE);
+ CHECK_FIELD_NOT_REPEATED();
+
+ msg->GetReflection()->SetDouble(msg, field, value);
+ return true;
+ }
+
+ inline bool GetRepeatedDouble(const char* pszFieldName, int index, double* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(DOUBLE);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ *out = msg->GetReflection()->GetRepeatedDouble(*msg, field, index);
+ return true;
+ }
+
+ inline bool SetRepeatedDouble(const char* pszFieldName, int index, double value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(DOUBLE);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ msg->GetReflection()->SetRepeatedDouble(msg, field, index, value);
+ return true;
+ }
+
+ inline bool AddDouble(const char* pszFieldName, double value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(DOUBLE);
+ CHECK_FIELD_REPEATED();
+
+ msg->GetReflection()->AddDouble(msg, field, value);
+ return true;
+ }
+
+ inline bool GetFloatOrDouble(const char* pszFieldName, float* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE2(FLOAT, DOUBLE);
+ CHECK_FIELD_NOT_REPEATED();
+
+ if (fieldType == protobuf::FieldDescriptor::CPPTYPE_DOUBLE) *out = (float)msg->GetReflection()->GetDouble(*msg, field);
+ else
+ *out = msg->GetReflection()->GetFloat(*msg, field);
+
+ return true;
+ }
+
+ inline bool SetFloatOrDouble(const char* pszFieldName, float value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE2(FLOAT, DOUBLE);
+ CHECK_FIELD_NOT_REPEATED();
+
+ if (fieldType == protobuf::FieldDescriptor::CPPTYPE_DOUBLE) msg->GetReflection()->SetDouble(msg, field, (double)value);
+ else
+ msg->GetReflection()->SetFloat(msg, field, value);
+
+ return true;
+ }
+
+ inline bool GetRepeatedFloatOrDouble(const char* pszFieldName, int index, float* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE2(FLOAT, DOUBLE);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ if (fieldType == protobuf::FieldDescriptor::CPPTYPE_DOUBLE)
+ *out = (float)msg->GetReflection()->GetRepeatedDouble(*msg, field, index);
+ else
+ *out = msg->GetReflection()->GetRepeatedFloat(*msg, field, index);
+
+ return true;
+ }
+
+ inline bool SetRepeatedFloatOrDouble(const char* pszFieldName, int index, float value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE2(FLOAT, DOUBLE);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ if (fieldType == protobuf::FieldDescriptor::CPPTYPE_DOUBLE)
+ msg->GetReflection()->SetRepeatedDouble(msg, field, index, (double)value);
+ else
+ msg->GetReflection()->SetRepeatedFloat(msg, field, index, value);
+
+ return true;
+ }
+
+ inline bool AddFloatOrDouble(const char* pszFieldName, float value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE2(FLOAT, DOUBLE);
+ CHECK_FIELD_REPEATED();
+
+ if (fieldType == protobuf::FieldDescriptor::CPPTYPE_DOUBLE) msg->GetReflection()->AddDouble(msg, field, (double)value);
+ else
+ msg->GetReflection()->AddFloat(msg, field, value);
+
+ return true;
+ }
+
+ inline bool GetString(const char* pszFieldName, std::string& out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(STRING);
+ CHECK_FIELD_NOT_REPEATED();
+
+ out = msg->GetReflection()->GetString(*msg, field);
+
+ return true;
+ }
+
+ inline bool SetString(const char* pszFieldName, std::string value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(STRING);
+ CHECK_FIELD_NOT_REPEATED();
+
+ msg->GetReflection()->SetString(msg, field, value);
+ return true;
+ }
+
+ inline bool GetRepeatedString(const char* pszFieldName, int index, std::string& out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(STRING);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ out = msg->GetReflection()->GetRepeatedString(*msg, field, index);
+
+ return true;
+ }
+
+ inline bool SetRepeatedString(const char* pszFieldName, int index, std::string value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(STRING);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ msg->GetReflection()->SetRepeatedString(msg, field, index, value);
+
+ return true;
+ }
+
+ inline bool AddString(const char* pszFieldName, const char* value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(STRING);
+ CHECK_FIELD_REPEATED();
+
+ msg->GetReflection()->AddString(msg, field, value);
+ return true;
+ }
+
+ inline bool GetColor(const char* pszFieldName, Color* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_NOT_REPEATED();
+
+ auto msgRGBA = *(CMsgRGBA*)msg->GetReflection()->MutableMessage(msg, field);
+ out->SetColor(msgRGBA.r(), msgRGBA.g(), msgRGBA.b(), msgRGBA.a());
+
+ return true;
+ }
+
+ inline bool SetColor(const char* pszFieldName, const Color& value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_NOT_REPEATED();
+
+ CMsgRGBA* msgRGBA = (CMsgRGBA*)msg->GetReflection()->MutableMessage(msg, field);
+ msgRGBA->set_r(value.r());
+ msgRGBA->set_g(value.g());
+ msgRGBA->set_b(value.b());
+ msgRGBA->set_a(value.a());
+
+ return true;
+ }
+
+ inline bool GetRepeatedColor(const char* pszFieldName, int index, Color* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ const CMsgRGBA& msgRGBA = (const CMsgRGBA&)msg->GetReflection()->GetRepeatedMessage(*msg, field, index);
+ out->SetColor(msgRGBA.r(), msgRGBA.g(), msgRGBA.b(), msgRGBA.a());
+
+ return true;
+ }
+
+ inline bool SetRepeatedColor(const char* pszFieldName, int index, const Color& value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ CMsgRGBA* msgRGBA = (CMsgRGBA*)msg->GetReflection()->MutableRepeatedMessage(msg, field, index);
+ msgRGBA->set_r(value.r());
+ msgRGBA->set_g(value.g());
+ msgRGBA->set_b(value.b());
+ msgRGBA->set_a(value.a());
+
+ return true;
+ }
+
+ inline bool AddColor(const char* pszFieldName, const Color& value)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_REPEATED();
+
+ CMsgRGBA* msgRGBA = (CMsgRGBA*)msg->GetReflection()->AddMessage(msg, field);
+ msgRGBA->set_r(value.r());
+ msgRGBA->set_g(value.g());
+ msgRGBA->set_b(value.b());
+ msgRGBA->set_a(value.a());
+
+ return true;
+ }
+
+ inline bool GetVector2D(const char* pszFieldName, Vector2D* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_NOT_REPEATED();
+
+ auto msgVec2d = *(CMsgVector2D*)msg->GetReflection()->MutableMessage(msg, field);
+ out->Init(msgVec2d.x(), msgVec2d.y());
+
+ return true;
+ }
+
+ inline bool SetVector2D(const char* pszFieldName, Vector2D& vec)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_NOT_REPEATED();
+
+ CMsgVector2D* msgVec2d = (CMsgVector2D*)msg->GetReflection()->MutableMessage(msg, field);
+ msgVec2d->set_x(vec.x);
+ msgVec2d->set_y(vec.y);
+
+ return true;
+ }
+
+ inline bool GetRepeatedVector2D(const char* pszFieldName, int index, Vector2D* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ const CMsgVector2D& msgVec2d = (const CMsgVector2D&)msg->GetReflection()->GetRepeatedMessage(*msg, field, index);
+ out->Init(msgVec2d.x(), msgVec2d.y());
+
+ return true;
+ }
+
+ inline bool SetRepeatedVector2D(const char* pszFieldName, int index, Vector2D& vec)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ CMsgVector2D* msgVec2d = (CMsgVector2D*)msg->GetReflection()->MutableRepeatedMessage(msg, field, index);
+ msgVec2d->set_x(vec.x);
+ msgVec2d->set_y(vec.y);
+
+ return true;
+ }
+
+ inline bool AddVector2D(const char* pszFieldName, Vector2D& vec)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_REPEATED();
+
+ CMsgVector2D* msgVec2d = (CMsgVector2D*)msg->GetReflection()->AddMessage(msg, field);
+ msgVec2d->set_x(vec.x);
+ msgVec2d->set_y(vec.y);
+
+ return true;
+ }
+
+ inline bool GetVector(const char* pszFieldName, Vector* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_NOT_REPEATED();
+
+ auto msgVec = *(CMsgVector*)msg->GetReflection()->MutableMessage(msg, field);
+ out->Init(msgVec.x(), msgVec.y(), msgVec.z());
+
+ return true;
+ }
+
+ inline bool SetVector(const char* pszFieldName, Vector& vec)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_NOT_REPEATED();
+
+ CMsgVector* msgVec = (CMsgVector*)msg->GetReflection()->MutableMessage(msg, field);
+ msgVec->set_x(vec.x);
+ msgVec->set_y(vec.y);
+ msgVec->set_z(vec.z);
+
+ return true;
+ }
+
+ inline bool GetRepeatedVector(const char* pszFieldName, int index, Vector* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ const CMsgVector& msgVec = (const CMsgVector&)msg->GetReflection()->GetRepeatedMessage(*msg, field, index);
+ out->Init(msgVec.x(), msgVec.y(), msgVec.z());
+
+ return true;
+ }
+
+ inline bool SetRepeatedVector(const char* pszFieldName, int index, Vector& vec)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ CMsgVector* msgVec = (CMsgVector*)msg->GetReflection()->MutableRepeatedMessage(msg, field, index);
+ msgVec->set_x(vec.x);
+ msgVec->set_y(vec.y);
+ msgVec->set_z(vec.z);
+
+ return true;
+ }
+
+ inline bool AddVector(const char* pszFieldName, Vector& vec)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_REPEATED();
+
+ CMsgVector* msgVec = (CMsgVector*)msg->GetReflection()->AddMessage(msg, field);
+ msgVec->set_x(vec.x);
+ msgVec->set_y(vec.y);
+ msgVec->set_z(vec.z);
+
+ return true;
+ }
+
+ inline bool GetQAngle(const char* pszFieldName, QAngle* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_NOT_REPEATED();
+
+ auto msgAng = *(CMsgQAngle*)msg->GetReflection()->MutableMessage(msg, field);
+ out->Init(msgAng.x(), msgAng.y(), msgAng.z());
+
+ return true;
+ }
+
+ inline bool SetQAngle(const char* pszFieldName, QAngle& vec)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_NOT_REPEATED();
+
+ CMsgQAngle* msgAng = (CMsgQAngle*)msg->GetReflection()->MutableMessage(msg, field);
+ msgAng->set_x(vec.x);
+ msgAng->set_y(vec.y);
+ msgAng->set_z(vec.z);
+
+ return true;
+ }
+
+ inline bool GetRepeatedQAngle(const char* pszFieldName, int index, QAngle* out)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ const CMsgQAngle& msgAng = (const CMsgQAngle&)msg->GetReflection()->GetRepeatedMessage(*msg, field, index);
+ out->Init(msgAng.x(), msgAng.y(), msgAng.z());
+
+ return true;
+ }
+
+ inline bool SetRepeatedQAngle(const char* pszFieldName, int index, QAngle& vec)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ CMsgQAngle* msgAng = (CMsgQAngle*)msg->GetReflection()->MutableRepeatedMessage(msg, field, index);
+ msgAng->set_x(vec.x);
+ msgAng->set_y(vec.y);
+ msgAng->set_z(vec.z);
+
+ return true;
+ }
+
+ inline bool AddQAngle(const char* pszFieldName, QAngle& vec)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_REPEATED();
+
+ CMsgQAngle* msgAng = (CMsgQAngle*)msg->GetReflection()->AddMessage(msg, field);
+ msgAng->set_x(vec.x);
+ msgAng->set_y(vec.y);
+ msgAng->set_z(vec.z);
+
+ return true;
+ }
+
+ inline bool GetMessage(const char* pszFieldName, protobuf::Message** message)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_NOT_REPEATED();
+
+ *message = msg->GetReflection()->MutableMessage(msg, field);
+
+ return true;
+ }
+
+ inline bool GetRepeatedMessage(const char* pszFieldName, int index, const protobuf::Message** message)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ const protobuf::Message* m = &msg->GetReflection()->GetRepeatedMessage(*msg, field, index);
+ *message = m;
+
+ return true;
+ }
+
+ inline bool AddMessage(const char* pszFieldName, protobuf::Message** message)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_TYPE(MESSAGE);
+ CHECK_FIELD_REPEATED();
+
+ *message = msg->GetReflection()->AddMessage(msg, field);
+
+ return true;
+ }
+
+ inline int GetRepeatedFieldCount(const char* pszFieldName)
+ {
+ const protobuf::FieldDescriptor* field = msg->GetDescriptor()->FindFieldByName(pszFieldName);
+ if (!field) return -1;
+
+ if (field->label() != protobuf::FieldDescriptor::LABEL_REPEATED) return -1;
+
+ return msg->GetReflection()->FieldSize(*msg, field);
+ }
+
+ inline bool RemoveRepeatedFieldValue(const char* pszFieldName, int index)
+ {
+ GETCHECK_FIELD();
+ CHECK_FIELD_REPEATED();
+ CHECK_REPEATED_ELEMENT(index);
+
+ // Protobuf guarantees that repeated field values will stay in order and so must we.
+ const protobuf::Reflection* pReflection = msg->GetReflection();
+ for (int i = index; i < elemCount - 1; ++i)
+ {
+ pReflection->SwapElements(msg, field, i, i + 1);
+ }
+
+ pReflection->RemoveLast(msg, field);
+
+ return true;
+ }
+
+ inline std::string GetDebugString() { return msg->DebugString(); }
+};
+
+} // namespace counterstrikesharp
diff --git a/src/core/globals.cpp b/src/core/globals.cpp
index 941752c06..8a62507aa 100644
--- a/src/core/globals.cpp
+++ b/src/core/globals.cpp
@@ -24,6 +24,7 @@
#include "core/managers/server_manager.h"
#include "core/managers/voice_manager.h"
#include "core/managers/usermessage_manager.h"
+#include "core/managers/clientmessage_manager.h"
#include
#include
@@ -92,6 +93,7 @@ ServerManager serverManager;
VoiceManager voiceManager;
TickScheduler tickScheduler;
UserMessageManager userMessageManager;
+ClientMessageManager clientMessageManager;
bool gameLoopInitialized = false;
GetLegacyGameEventListener_t* GetLegacyGameEventListener = nullptr;
diff --git a/src/core/globals.h b/src/core/globals.h
index b834d9770..3be6b856d 100644
--- a/src/core/globals.h
+++ b/src/core/globals.h
@@ -46,6 +46,7 @@ namespace counterstrikesharp {
class EntityListener;
class EventManager;
class UserMessageManager;
+class ClientMessageManager;
class ConCommandManager;
class CallbackManager;
class ConVarManager;
@@ -98,6 +99,7 @@ extern ISource2GameEntities* gameEntities;
extern EventManager eventManager;
extern UserMessageManager userMessageManager;
+extern ClientMessageManager clientMessageManager;
extern ConCommandManager conCommandManager;
extern CallbackManager callbackManager;
extern ConVarManager convarManager;
diff --git a/src/core/managers/clientmessage_manager.cpp b/src/core/managers/clientmessage_manager.cpp
new file mode 100644
index 000000000..85c2decaf
--- /dev/null
+++ b/src/core/managers/clientmessage_manager.cpp
@@ -0,0 +1,211 @@
+#include "core/managers/clientmessage_manager.h"
+
+#include
+#include
+
+#include "core/gameconfig.h"
+#include "core/ClientMessage.h"
+#include "core/log.h"
+#include "core/managers/player_manager.h"
+#include "igameeventsystem.h"
+#include "scripting/callback_manager.h"
+
+using namespace google;
+
+SH_DECL_MANUALHOOK2(FilterMessage, 0, 0, 0, bool, const CNetMessage*, INetChannel*);
+
+ namespace counterstrikesharp
+{
+ ClientMessageManager::ClientMessageManager() {}
+
+ ClientMessageManager::~ClientMessageManager() {}
+
+ void ClientMessageManager::OnAllInitialized()
+ {
+ const char* name = "CServerSideClient";
+ void* serverSideClientVTable = reinterpret_cast(modules::engine->FindVirtualTable(name, globals::gameConfig->GetOffset(name)));
+ if (serverSideClientVTable == nullptr)
+ {
+ CSSHARP_CORE_ERROR("Failed to find vtable for \'%s\'", name);
+ return;
+ }
+
+ m_hookid =
+ SH_ADD_MANUALDVPHOOK(FilterMessage, serverSideClientVTable, SH_MEMBER(this, &ClientMessageManager::Hook_FilterMessage), false);
+ }
+
+ void ClientMessageManager::OnShutdown() { SH_REMOVE_HOOK_ID(m_hookid); }
+
+ void ClientMessageManager::HookClientMessage(int messageId, CallbackT fnCallback, HookMode mode)
+ {
+ ClientMessageHook* pHook;
+
+ CSSHARP_CORE_TRACE("Hooking client message: {0} with callback pointer: {1}", messageId, (void*)fnCallback);
+
+ auto search = m_hooksMap.find(messageId);
+ // If hook struct is not found
+ if (search == m_hooksMap.end())
+ {
+ pHook = new ClientMessageHook();
+
+ if (mode == HookMode::Post)
+ {
+ pHook->m_pPostHook = globals::callbackManager.CreateCallback("");
+ pHook->m_pPostHook->AddListener(fnCallback);
+ }
+ else
+ {
+ pHook->m_pPreHook = globals::callbackManager.CreateCallback("");
+ pHook->m_pPreHook->AddListener(fnCallback);
+ }
+
+ pHook->m_messageId = messageId;
+
+ m_hooksMap[messageId] = pHook;
+
+ return;
+ }
+ else
+ {
+ pHook = search->second;
+ }
+
+ if (mode == HookMode::Post)
+ {
+ if (!pHook->m_pPostHook)
+ {
+ pHook->m_pPostHook = globals::callbackManager.CreateCallback("");
+ }
+
+ pHook->m_pPostHook->AddListener(fnCallback);
+ }
+ else
+ {
+ if (!pHook->m_pPreHook)
+ {
+ pHook->m_pPreHook = globals::callbackManager.CreateCallback("");
+ }
+
+ pHook->m_pPreHook->AddListener(fnCallback);
+ }
+ }
+
+ void ClientMessageManager::UnhookClientMessage(int messageId, CallbackT fnCallback, HookMode mode)
+ {
+ ClientMessageHook* pHook;
+ ScriptCallback* pCallback;
+
+ auto search = m_hooksMap.find(messageId);
+ if (search == m_hooksMap.end())
+ {
+ return;
+ }
+
+ pHook = search->second;
+
+ if (mode == HookMode::Post)
+ {
+ pCallback = pHook->m_pPostHook;
+ }
+ else
+ {
+ pCallback = pHook->m_pPreHook;
+ }
+
+ pCallback->RemoveListener(fnCallback);
+
+ if (pCallback->GetFunctionCount() == 0)
+ {
+ globals::callbackManager.ReleaseCallback(pCallback);
+
+ if (mode == HookMode::Post)
+ {
+ pHook->m_pPostHook = nullptr;
+ }
+ else
+ {
+ pHook->m_pPreHook = nullptr;
+ }
+ }
+
+ CSSHARP_CORE_TRACE("Unhooking client message: {0} with callback pointer: {1}", messageId, (void*)fnCallback);
+
+ return;
+ }
+
+ bool ClientMessageManager::FindPlayerByNetChan(INetChannel *pChannel, CPlayerSlot *pSlot)
+ {
+ for (int i = 0; i < 64; ++i)
+ {
+ CPlayerSlot slot(i);
+ auto pNetChan = (INetChannel*)globals::engine->GetPlayerNetInfo(slot);
+ if (pNetChan == pChannel)
+ {
+ *pSlot = slot;
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ bool ClientMessageManager::Hook_FilterMessage(const CNetMessage* pData, INetChannel* pChannel)
+ {
+ INetworkMessageInternal* pEvent = pData->GetNetMessage();
+
+ CPlayerSlot player(0);
+ if (!FindPlayerByNetChan(pChannel, &player))
+ {
+ return false;
+ }
+
+ int sender = player.Get();
+
+ auto message = ClientMessage(pEvent, sender, pData);
+
+ auto iMessageID = message.GetMessageID();
+
+ auto I = m_hooksMap.find(iMessageID);
+
+ HookResult result = HookResult::Continue;
+
+ if (I != m_hooksMap.end())
+ {
+ auto pEventHook = I->second;
+ auto* pCallback = pEventHook->m_pPreHook;
+
+ if (pCallback)
+ {
+ CSSHARP_CORE_TRACE("Pushing client message `{}` sender: {}, post: {}", iMessageID, sender, false);
+ pCallback->Reset();
+ pCallback->ScriptContext().Push(&message);
+
+ for (auto fnMethodToCall : pCallback->GetFunctions())
+ {
+ if (!fnMethodToCall) continue;
+ fnMethodToCall(&pCallback->ScriptContextStruct());
+
+ auto hookResult = pCallback->ScriptContext().GetResult();
+
+ if (hookResult >= HookResult::Stop)
+ {
+ RETURN_META_VALUE(MRES_SUPERCEDE, true);
+ }
+
+ if (hookResult >= HookResult::Handled)
+ {
+ result = hookResult;
+ }
+ }
+ }
+ }
+
+ if (result >= HookResult::Handled)
+ {
+ RETURN_META_VALUE(MRES_SUPERCEDE, true);
+ }
+
+ RETURN_META_VALUE(MRES_IGNORED, true);
+ }
+
+} // namespace counterstrikesharp
diff --git a/src/core/managers/clientmessage_manager.h b/src/core/managers/clientmessage_manager.h
new file mode 100644
index 000000000..0e8e0fa77
--- /dev/null
+++ b/src/core/managers/clientmessage_manager.h
@@ -0,0 +1,59 @@
+/*
+ * This file is part of CounterStrikeSharp.
+ * CounterStrikeSharp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CounterStrikeSharp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with CounterStrikeSharp. If not, see . *
+ */
+
+#pragma once
+
+#include "core/global_listener.h"
+#include "core/globals.h"
+#include "inetchannel.h"
+#include "networksystem/inetworkserializer.h"
+#include "scripting/script_engine.h"
+
+namespace counterstrikesharp {
+class ScriptCallback;
+
+struct ClientMessageHook
+{
+ ClientMessageHook()
+ {
+ m_pPreHook = nullptr;
+ m_pPostHook = nullptr;
+ }
+ counterstrikesharp::ScriptCallback* m_pPreHook;
+ counterstrikesharp::ScriptCallback* m_pPostHook;
+ int m_messageId;
+};
+
+class ClientMessageManager : public GlobalClass
+{
+ public:
+ ClientMessageManager();
+ ~ClientMessageManager();
+ void OnAllInitialized() override;
+ void OnShutdown() override;
+ bool FindPlayerByNetChan(INetChannel *pChannel, CPlayerSlot *pFoundSlot);
+ bool Hook_FilterMessage(const CNetMessage *pData, INetChannel *pChannel);
+
+ void UnhookClientMessage(int messageId, CallbackT fnCallback, HookMode mode);
+ void HookClientMessage(int messageId, CallbackT fnCallback, HookMode mode);
+
+ private:
+ ScriptCallback* m_on_client_message_callback;
+ std::map m_hooksMap;
+ int m_hookid;
+};
+
+} // namespace counterstrikesharp
diff --git a/src/core/memory_module.cpp b/src/core/memory_module.cpp
index 089010648..ad2718f8f 100644
--- a/src/core/memory_module.cpp
+++ b/src/core/memory_module.cpp
@@ -16,6 +16,9 @@
#else
#include
#include
+#include
+#include "sys/mman.h"
+#include
#endif
#include "core/gameconfig.h"
@@ -63,8 +66,7 @@ void Initialize()
moduleList.emplace_back(std::move(mod));
}
#else
- dl_iterate_phdr(
- [](struct dl_phdr_info* info, size_t, void*) {
+ dl_iterate_phdr([](struct dl_phdr_info* info, size_t, void*) {
std::string name = info->dlpi_name;
if (name.rfind(MODULE_EXT) != name.length() - strlen(MODULE_EXT)) return 0;
@@ -80,8 +82,7 @@ void Initialize()
moduleList.emplace_back(std::move(mod));
return 0;
- },
- nullptr);
+ }, nullptr);
#endif
}
@@ -188,6 +189,12 @@ CModule::CModule(std::string_view path, std::uint64_t base)
if (m_fnCreateInterface == nullptr) return;
+ m_hModule = dlmount(m_pszPath.c_str());
+
+ if (!m_hModule) CSSHARP_CORE_ERROR("Could not find {}", m_pszPath);
+
+ InitializeSections();
+
m_bInitialized = true;
}
#else
@@ -259,10 +266,23 @@ CModule::CModule(std::string_view path, dl_phdr_info* info)
if (m_fnCreateInterface == nullptr) return;
+ m_hModule = dlmount(m_pszPath.c_str());
+
+ if (!m_hModule)
+ CSSHARP_CORE_ERROR("Could not find {}", m_pszPath);
+
+ if (int e = GetModuleInformation(m_hModule, &m_base, &m_size, m_vecSections))
+ CSSHARP_CORE_ERROR("Failed to get module info for {}, error {}", m_pszPath, e);
+
m_bInitialized = true;
}
#endif
+CModule::~CModule()
+{
+ if (m_hModule) dlclose(m_hModule);
+}
+
#ifdef _WIN32
void CModule::DumpSymbols()
{
@@ -562,4 +582,204 @@ void* CModule::FindSymbol(const std::string& name)
CSSHARP_CORE_ERROR("Cannot find symbol {}", name);
return nullptr;
}
+
+Sections* CModule::GetSection(const std::string_view name)
+{
+ for (auto& section : m_vecSections)
+ {
+ if (section.name == name) return §ion;
+ }
+
+ return nullptr;
+}
+
+#ifdef _WIN32
+void CModule::InitializeSections()
+{
+ IMAGE_DOS_HEADER* pDosHeader = reinterpret_cast(m_hModule);
+ IMAGE_NT_HEADERS* pNtHeader = reinterpret_cast(reinterpret_cast(m_hModule) + pDosHeader->e_lfanew);
+
+ IMAGE_SECTION_HEADER* pSectionHeader = IMAGE_FIRST_SECTION(pNtHeader);
+
+ for (int i = 0; i < pNtHeader->FileHeader.NumberOfSections; i++)
+ {
+ Sections section;
+ section.name = (char*)pSectionHeader[i].Name;
+ section.pBase = (void*)((uint8_t*)m_base + pSectionHeader[i].VirtualAddress);
+ section.size = pSectionHeader[i].SizeOfRawData;
+
+ m_vecSections.push_back(std::move(section));
+ }
+}
+#endif
+
+#ifdef _WIN32
+void* CModule::FindVirtualTable(const std::string& name, int32_t offset)
+{
+ auto runTimeData = GetSection(".data");
+ auto readOnlyData = GetSection(".rdata");
+
+ if (!runTimeData || !readOnlyData)
+ {
+ CSSHARP_CORE_ERROR("Failed to find .data or .rdata section");
+ return nullptr;
+ }
+
+ std::string decoratedTableName = ".?AV" + name + "@@";
+
+ SignatureIterator sigIt(runTimeData->pBase, runTimeData->size, (const byte*)decoratedTableName.c_str(),
+ decoratedTableName.size() + 1);
+ void* typeDescriptor = sigIt.FindNext(false);
+
+ if (!typeDescriptor)
+ {
+ CSSHARP_CORE_ERROR("Failed to find type descriptor for {}", name);
+ return nullptr;
+ }
+
+ typeDescriptor = (void*)((uintptr_t)typeDescriptor - 0x10);
+
+ const uint32_t rttiTDRva = (uintptr_t)typeDescriptor - (uintptr_t)m_base;
+
+ CSSHARP_CORE_TRACE("RTTI Type Descriptor RVA: 0x{}", rttiTDRva);
+
+ SignatureIterator sigIt2(readOnlyData->pBase, readOnlyData->size, (const byte*)&rttiTDRva, sizeof(uint32_t));
+
+ while (void* completeObjectLocator = sigIt2.FindNext(false))
+ {
+ auto completeObjectLocatorHeader = (uintptr_t)completeObjectLocator - 0xC;
+ // check RTTI Complete Object Locator header, always 0x1
+ if (*(int32_t*)(completeObjectLocatorHeader) != 1) continue;
+
+ // check RTTI Complete Object Locator vtable offset
+ if (*(int32_t*)((uintptr_t)completeObjectLocator - 0x8) != offset) continue;
+
+ SignatureIterator sigIt3(readOnlyData->pBase, readOnlyData->size, (const byte*)&completeObjectLocatorHeader, sizeof(void*));
+ void* vtable = sigIt3.FindNext(false);
+
+ if (!vtable)
+ {
+ CSSHARP_CORE_ERROR("Failed to find vtable for {}", name);
+ return nullptr;
+ }
+
+ return (void*)((uintptr_t)vtable + 0x8);
+ }
+
+ CSSHARP_CORE_ERROR("Failed to find RTTI Complete Object Locator for {}", name);
+ return nullptr;
+}
+#else
+void* CModule::FindVirtualTable(const std::string& name, int32_t offset)
+{
+ auto readOnlyData = GetSection(".rodata");
+ auto readOnlyRelocations = GetSection(".data.rel.ro");
+
+ if (!readOnlyData || !readOnlyRelocations)
+ {
+ CSSHARP_CORE_ERROR("Failed to find .rodata or .data.rel.ro section");
+ return nullptr;
+ }
+
+ std::string decoratedTableName = std::to_string(name.length()) + name;
+
+ SignatureIterator sigIt(readOnlyData->pBase, readOnlyData->size, (const byte*)decoratedTableName.c_str(),
+ decoratedTableName.size() + 1);
+ void* classNameString = sigIt.FindNext(false);
+
+ if (!classNameString)
+ {
+ CSSHARP_CORE_ERROR("Failed to find type descriptor for {}", name);
+ return nullptr;
+ }
+
+ SignatureIterator sigIt2(readOnlyRelocations->pBase, readOnlyRelocations->size, (const byte*)&classNameString, sizeof(void*));
+ void* typeName = sigIt2.FindNext(false);
+
+ if (!typeName)
+ {
+ CSSHARP_CORE_ERROR("Failed to find type name for {}", name);
+ return nullptr;
+ }
+
+ void* typeInfo = (void*)((uintptr_t)typeName - 0x8);
+
+ for (const auto& sectionName : { std::string_view(".data.rel.ro"), std::string_view(".data.rel.ro.local") })
+ {
+ auto section = GetSection(sectionName);
+ if (!section) continue;
+
+ SignatureIterator sigIt3(section->pBase, section->size, (const byte*)&typeInfo, sizeof(void*));
+
+ while (void* vtable = sigIt3.FindNext(false))
+ {
+ if (*(int64_t*)((uintptr_t)vtable - 0x8) == (int64_t)offset) return (void*)((uintptr_t)vtable + 0x8);
+ }
+ }
+
+ CSSHARP_CORE_ERROR("Failed to find vtable for {}", name);
+ return nullptr;
+}
+#endif
+
+#ifndef _WIN32
+int CModule::GetModuleInformation(HINSTANCE hModule, void** base, size_t* length, std::vector& sections)
+{
+ link_map* lmap;
+ if (dlinfo(hModule, RTLD_DI_LINKMAP, &lmap) != 0)
+ {
+ dlclose(hModule);
+ return 1;
+ }
+
+ int fd = open(lmap->l_name, O_RDONLY);
+ if (fd == -1)
+ {
+ dlclose(hModule);
+ return 2;
+ }
+
+ struct stat st;
+ if (fstat(fd, &st) == 0)
+ {
+ void* map = mmap(nullptr, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
+ if (map != MAP_FAILED)
+ {
+ ElfW(Ehdr)* ehdr = static_cast(map);
+ ElfW(Shdr)* shdrs = reinterpret_cast(reinterpret_cast(ehdr) + ehdr->e_shoff);
+ const char* strTab = reinterpret_cast(reinterpret_cast(ehdr) + shdrs[ehdr->e_shstrndx].sh_offset);
+
+ for (auto i = 0; i < ehdr->e_phnum; ++i)
+ {
+ ElfW(Phdr)* phdr = reinterpret_cast(reinterpret_cast(ehdr) + ehdr->e_phoff + i * ehdr->e_phentsize);
+ if (phdr->p_type == PT_LOAD && phdr->p_flags & PF_X)
+ {
+ *base = reinterpret_cast(lmap->l_addr + phdr->p_vaddr);
+ *length = phdr->p_filesz;
+ break;
+ }
+ }
+
+ for (auto i = 0; i < ehdr->e_shnum; ++i)
+ {
+ ElfW(Shdr)* shdr = reinterpret_cast(reinterpret_cast(shdrs) + i * ehdr->e_shentsize);
+ if (*(strTab + shdr->sh_name) == '\0')
+ continue;
+
+ Sections section;
+ section.name = strTab + shdr->sh_name;
+ section.pBase = reinterpret_cast(lmap->l_addr + shdr->sh_addr);
+ section.size = shdr->sh_size;
+ sections.push_back(section);
+ }
+
+ munmap(map, st.st_size);
+ }
+ }
+
+ close(fd);
+
+ return 0;
+}
+#endif
} // namespace counterstrikesharp::modules
diff --git a/src/core/memory_module.h b/src/core/memory_module.h
index d350d870a..d0ab3142a 100644
--- a/src/core/memory_module.h
+++ b/src/core/memory_module.h
@@ -50,6 +50,48 @@ struct Segments
std::vector bytes{};
};
+struct Sections
+{
+ std::string name;
+ void* pBase;
+ size_t size;
+};
+
+class SignatureIterator
+{
+public:
+ SignatureIterator(void* pBase, size_t iSize, const byte* pSignature, size_t iSigLength) :
+ m_pBase((byte*)pBase), m_iSize(iSize), m_pSignature(pSignature), m_iSigLength(iSigLength)
+ {
+ m_pCurrent = m_pBase;
+ }
+
+ void* FindNext(bool allowWildcard)
+ {
+ for (size_t i = 0; i < m_iSize; i++)
+ {
+ size_t Matches = 0;
+ while (*(m_pCurrent + i + Matches) == m_pSignature[Matches] || (allowWildcard && m_pSignature[Matches] == '\x2A'))
+ {
+ Matches++;
+ if (Matches == m_iSigLength)
+ {
+ m_pCurrent += i + 1;
+ return m_pCurrent - 1;
+ }
+ }
+ }
+
+ return nullptr;
+ }
+private:
+ byte* m_pBase;
+ size_t m_iSize;
+ const byte* m_pSignature;
+ size_t m_iSigLength;
+ byte* m_pCurrent;
+};
+
class CModule
{
public:
@@ -58,6 +100,7 @@ class CModule
#else
CModule(std::string_view path, struct dl_phdr_info* info);
#endif
+ ~CModule();
void* FindSignature(const char* signature);
@@ -65,12 +108,16 @@ class CModule
void* FindSymbol(const std::string& name);
+ void* FindVirtualTable(const std::string& name, int32_t offset = 0);
+
[[nodiscard]] bool IsInitialized() const { return m_bInitialized; }
std::string m_pszModule{};
std::string m_pszPath{};
+ HINSTANCE m_hModule;
void* m_base{};
size_t m_size{};
+ std::vector m_vecSections{};
private:
bool m_bInitialized{};
@@ -90,6 +137,16 @@ class CModule
std::optional> GetOriginalBytes(const std::vector& disk_data, std::uintptr_t rva, std::size_t size);
void* FindSignature(const std::vector& sigBytes);
+
+#ifdef _WIN32
+ void InitializeSections();
+ #endif
+
+#ifndef _WIN32
+int GetModuleInformation(HINSTANCE module, void** base, size_t* length, std::vector& sections);
+#endif
+
+ Sections* GetSection(const std::string_view name);
};
} // namespace counterstrikesharp::modules
diff --git a/src/scripting/natives/natives_clientmessages.cpp b/src/scripting/natives/natives_clientmessages.cpp
new file mode 100644
index 000000000..dcbe8db59
--- /dev/null
+++ b/src/scripting/natives/natives_clientmessages.cpp
@@ -0,0 +1,792 @@
+/*
+ * This file is part of CounterStrikeSharp.
+ * CounterStrikeSharp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CounterStrikeSharp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with CounterStrikeSharp. If not, see . *
+ */
+// clang-format off
+
+#include "core/ClientMessage.h"
+#include "core/globals.h"
+#include "core/log.h"
+#include "core/managers/clientmessage_manager.h"
+#include "igameeventsystem.h"
+#include "scripting/autonative.h"
+
+#include "core/recipientfilters.h"
+
+// clang-format on
+
+namespace counterstrikesharp {
+
+#define GET_MESSAGE_OR_ERR() \
+ auto message = scriptContext.GetArgument(0); \
+ if (message == nullptr || message->GetMessageID() < 0) \
+ { \
+ scriptContext.ThrowNativeError("Invalid message"); \
+ return; \
+ }
+
+#define GET_FIELD_NAME_OR_ERR() const char* fieldName = scriptContext.GetArgument(1);
+
+std::vector managed_clientmessages;
+
+static void HookClientMessage(ScriptContext& script_context)
+{
+ auto messageId = script_context.GetArgument(0);
+ auto callback = script_context.GetArgument(1);
+ auto mode = script_context.GetArgument(2);
+
+ globals::clientMessageManager.HookClientMessage(messageId, callback, mode);
+}
+
+static void UnhookClientMessage(ScriptContext& script_context)
+{
+ auto messageId = script_context.GetArgument(0);
+ auto callback = script_context.GetArgument(1);
+ auto mode = script_context.GetArgument(2);
+
+ globals::clientMessageManager.UnhookClientMessage(messageId, callback, mode);
+}
+
+static void GetInt32OrUnsignedOrEnum(ScriptContext& script_context)
+{
+ auto message = script_context.GetArgument(0);
+ auto fieldName = script_context.GetArgument(1);
+
+ int returnValue;
+ if (!message->GetInt32OrUnsignedOrEnum(fieldName, &returnValue))
+ {
+ script_context.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ return;
+ }
+
+ script_context.SetResult(returnValue);
+}
+
+static void SetInt32OrUnsignedOrEnum(ScriptContext& script_context)
+{
+ auto message = script_context.GetArgument(0);
+ auto fieldName = script_context.GetArgument(1);
+ auto value = script_context.GetArgument(2);
+
+ if (!message->SetInt32OrUnsignedOrEnum(fieldName, value))
+ {
+ script_context.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+}
+
+static void PbReadInt(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ int returnValue;
+
+ auto index = scriptContext.GetArgument(2);
+
+ if (index < 0)
+ {
+ if (!message->GetInt32OrUnsignedOrEnum(fieldName, &returnValue))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ return;
+ }
+ }
+ else
+ {
+ if (!message->GetRepeatedInt32OrUnsignedOrEnum(fieldName, index, &returnValue))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", fieldName, index,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ return;
+ }
+ }
+
+ scriptContext.SetResult(returnValue);
+}
+
+static void PbReadInt64(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ int64 returnValue;
+
+ auto index = scriptContext.GetArgument(2);
+
+ if (index < 0)
+ {
+ if (!message->GetInt64OrUnsigned(fieldName, &returnValue))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ return;
+ }
+ }
+ else
+ {
+ if (!message->GetRepeatedInt64OrUnsigned(fieldName, index, &returnValue))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", fieldName, index,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ return;
+ }
+ }
+
+ scriptContext.SetResult(returnValue);
+}
+
+static void PbReadFloat(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ float returnValue;
+
+ auto index = scriptContext.GetArgument(2);
+
+ if (index < 0)
+ {
+ if (!message->GetFloatOrDouble(fieldName, &returnValue))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ return;
+ }
+ }
+ else
+ {
+ if (!message->GetRepeatedFloatOrDouble(fieldName, index, &returnValue))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", fieldName, index,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ return;
+ }
+ }
+
+ scriptContext.SetResult(returnValue);
+}
+
+static void PbReadBool(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ bool returnValue;
+
+ auto index = scriptContext.GetArgument(2);
+
+ if (index < 0)
+ {
+ if (!message->GetBool(fieldName, &returnValue))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ return;
+ }
+ }
+ else
+ {
+ if (!message->GetRepeatedBool(fieldName, index, &returnValue))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", fieldName, index,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ return;
+ }
+ }
+
+ scriptContext.SetResult(returnValue);
+}
+
+static void PbReadString(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ std::string returnValue;
+
+ auto index = scriptContext.GetArgument(2);
+
+ if (index < 0)
+ {
+ if (!message->GetString(fieldName, returnValue))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ return;
+ }
+ }
+ else
+ {
+ if (!message->GetRepeatedString(fieldName, index, returnValue))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", fieldName, index,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ return;
+ }
+ }
+
+ scriptContext.SetResult(returnValue.c_str());
+}
+
+static void PbReadBytes(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ std::string returnValue;
+
+ auto index = scriptContext.GetArgument(2);
+
+ if (index < 0)
+ {
+ if (!message->GetString(fieldName, returnValue))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ return;
+ }
+ }
+ else
+ {
+ if (!message->GetRepeatedString(fieldName, index, returnValue))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", fieldName, index,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ return;
+ }
+ }
+
+ int len = returnValue.length();
+ char* lenBuf = reinterpret_cast(&len);
+ std::string lenStr = std::string(lenBuf, 4);
+ returnValue = lenStr + returnValue;
+
+ scriptContext.SetResult(returnValue.c_str());
+}
+
+static void PbGetRepeatedFieldCount(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ auto count = message->GetRepeatedFieldCount(fieldName);
+
+ if (count == -1)
+ {
+ return scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+
+ scriptContext.SetResult(count);
+}
+
+static void PbHasField(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ scriptContext.SetResult(message->HasField(fieldName));
+}
+
+static void PbSetInt(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ auto value = scriptContext.GetArgument(2);
+ auto index = scriptContext.GetArgument(3);
+
+ if (index < 0)
+ {
+ if (!message->SetInt32OrUnsignedOrEnum(fieldName, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+ }
+ else
+ {
+ if (!message->SetRepeatedInt32OrUnsignedOrEnum(fieldName, index, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", fieldName, index,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+ }
+}
+
+static void PbSetInt64(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ auto value = scriptContext.GetArgument(2);
+ auto index = scriptContext.GetArgument(3);
+
+ if (index < 0)
+ {
+ if (!message->SetInt64OrUnsigned(fieldName, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+ }
+ else
+ {
+ if (!message->SetRepeatedInt64OrUnsigned(fieldName, index, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", fieldName, index,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+ }
+}
+
+static void PbSetFloat(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ auto value = scriptContext.GetArgument(2);
+ auto index = scriptContext.GetArgument(3);
+
+ if (index < 0)
+ {
+ if (!message->SetFloatOrDouble(fieldName, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+ }
+ else
+ {
+ if (!message->SetRepeatedFloatOrDouble(fieldName, index, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", fieldName, index,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+ }
+}
+
+static void PbSetBool(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ auto value = scriptContext.GetArgument(2);
+ auto index = scriptContext.GetArgument(3);
+
+ if (index < 0)
+ {
+ if (!message->SetBool(fieldName, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+ }
+ else
+ {
+ if (!message->SetRepeatedBool(fieldName, index, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", fieldName, index,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+ }
+}
+
+static void PbSetString(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ auto value = strdup(std::string(scriptContext.GetArgument(2)).c_str());
+ auto index = scriptContext.GetArgument(3);
+
+ if (index < 0)
+ {
+ if (!message->SetString(fieldName, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+ }
+ else
+ {
+ if (!message->SetRepeatedString(fieldName, index, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", fieldName, index,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+ }
+}
+
+static void PbSetBytes(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ auto len = *(int*)scriptContext.GetArgument(2);
+ auto value = std::string(scriptContext.GetArgument(2) + 4, len);
+ auto index = scriptContext.GetArgument(3);
+
+ if (index < 0)
+ {
+ if (!message->SetString(fieldName, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+ }
+ else
+ {
+ if (!message->SetRepeatedString(fieldName, index, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", fieldName, index,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+ }
+}
+
+static void PbAddInt(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ auto value = scriptContext.GetArgument(2);
+
+ if (!message->AddInt32OrUnsignedOrEnum(fieldName, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+}
+
+static void PbAddInt64(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ auto value = scriptContext.GetArgument(2);
+
+ if (!message->AddInt64OrUnsigned(fieldName, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+}
+
+static void PbAddFloat(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ auto value = scriptContext.GetArgument(2);
+
+ if (!message->AddFloatOrDouble(fieldName, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+}
+
+static void PbAddBool(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ auto value = scriptContext.GetArgument(2);
+
+ if (!message->AddBool(fieldName, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+}
+
+static void PbAddString(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ auto value = scriptContext.GetArgument(2);
+
+ if (!message->AddString(fieldName, value))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+}
+
+static void PbRemoveRepeatedFieldValue(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+ GET_FIELD_NAME_OR_ERR();
+
+ auto index = scriptContext.GetArgument(2);
+
+ if (!message->RemoveRepeatedFieldValue(fieldName, index))
+ {
+ scriptContext.ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", fieldName, index,
+ message->GetProtobufMessage()->GetTypeName().c_str());
+ }
+}
+
+// static void PbReadMessage(ScriptContext& scriptContext)
+//{
+// GET_MESSAGE_OR_ERR();
+// GET_FIELD_NAME_OR_ERR();
+//
+// google::protobuf::Message* subMessage = nullptr;
+//
+// if (!message->GetMessage(fieldName, &subMessage))
+// {
+// scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+// message->GetProtobufMessage()->GetTypeName().c_str());
+// return;
+// }
+//
+// auto subClientMessage = new ClientMessage(subMessage);
+// managed_clientmessages.push_back(subClientMessage);
+// scriptContext.SetResult(subClientMessage);
+// }
+//
+// static void PbReadRepeatedMessage(ScriptContext& scriptContext)
+//{
+// GET_MESSAGE_OR_ERR();
+// GET_FIELD_NAME_OR_ERR();
+//
+// const google::protobuf::Message* subMessage = nullptr;
+//
+// auto index = scriptContext.GetArgument(2);
+//
+// if (!message->GetRepeatedMessage(fieldName, index, &subMessage))
+// {
+// scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+// message->GetProtobufMessage()->GetTypeName().c_str());
+// return;
+// }
+//
+// auto subClientMessage = new ClientMessage(const_cast(subMessage));
+// managed_clientmessages.push_back(subClientMessage);
+// scriptContext.SetResult(subClientMessage);
+// }
+//
+// static void PbAddMessage(ScriptContext& scriptContext)
+//{
+// GET_MESSAGE_OR_ERR();
+// GET_FIELD_NAME_OR_ERR();
+//
+// google::protobuf::Message* subMessage;
+//
+// if (!message->AddMessage(fieldName, &subMessage))
+// {
+// scriptContext.ThrowNativeError("Invalid field \"%s\" for message \"%s\"", fieldName,
+// message->GetProtobufMessage()->GetTypeName().c_str());
+// return;
+// }
+//
+// auto subClientMessage = new ClientMessage(subMessage);
+// managed_clientmessages.push_back(subClientMessage);
+// scriptContext.SetResult(subClientMessage);
+// }
+
+static void PbGetDebugString(ScriptContext& scriptContext)
+{
+ GET_MESSAGE_OR_ERR();
+
+ scriptContext.SetResult(message->GetDebugString().c_str());
+}
+
+static void ClientMessageFindMessageIdByName(ScriptContext& scriptContext)
+{
+ auto messageName = scriptContext.GetArgument(0);
+ auto message = globals::networkMessages->FindNetworkMessagePartial(messageName);
+
+ if (message == nullptr)
+ {
+ scriptContext.ThrowNativeError("Could not find client message: %s", messageName);
+ return;
+ }
+
+ scriptContext.SetResult(message->GetNetMessageInfo()->m_MessageId);
+}
+
+static void ClientMessageCreate(ScriptContext& scriptContext)
+{
+ auto messageName = scriptContext.GetArgument(0);
+ auto message = new ClientMessage(messageName);
+
+ if (message->GetSerializableMessage() == nullptr)
+ {
+ scriptContext.ThrowNativeError("Failed to create client message: %s", messageName);
+ return;
+ }
+
+ managed_clientmessages.push_back(message);
+
+ scriptContext.SetResult(message);
+}
+
+static void ClientMessageCreateById(ScriptContext& scriptContext)
+{
+ auto messageId = scriptContext.GetArgument(0);
+ auto message = new ClientMessage(messageId);
+
+ if (message->GetSerializableMessage() == nullptr)
+ {
+ scriptContext.ThrowNativeError("Failed to create client message: %d", messageId);
+ return;
+ }
+
+ managed_clientmessages.push_back(message);
+
+ scriptContext.SetResult(message);
+}
+
+static void ClientMessageGetRecipients(ScriptContext& scriptContext)
+{
+ auto message = scriptContext.GetArgument(0);
+
+ if (message == nullptr)
+ {
+ scriptContext.ThrowNativeError("Invalid message");
+ return;
+ }
+
+ scriptContext.SetResult(message->GetRecipientMask() ? *message->GetRecipientMask() : 0);
+}
+
+static void ClientMessageSetRecipients(ScriptContext& scriptContext)
+{
+ auto message = scriptContext.GetArgument(0);
+ auto recipientMask = scriptContext.GetArgument(1);
+
+ *message->GetRecipientMask() = recipientMask;
+}
+
+static void ClientMessageSend(ScriptContext& scriptContext)
+{
+ auto message = scriptContext.GetArgument(0);
+
+ CRecipientFilter filter{};
+ filter.AddRecipientsFromMask(message->GetRecipientMask() ? *message->GetRecipientMask() : 0);
+
+ globals::gameEventSystem->PostEventAbstract(0, false, &filter, message->GetSerializableMessage(), message->GetProtobufMessage(), 0);
+}
+
+static void ClientMessageDelete(ScriptContext& scriptContext)
+{
+ auto message = scriptContext.GetArgument(0);
+
+ auto it = std::find(managed_clientmessages.begin(), managed_clientmessages.end(), message);
+ if (it != managed_clientmessages.end())
+ {
+ managed_clientmessages.erase(it);
+ delete message;
+ }
+}
+
+static void ClientMessageGetMessageId(ScriptContext& scriptContext)
+{
+ auto message = scriptContext.GetArgument(0);
+
+ if (message == nullptr || message->GetSerializableMessage() == nullptr)
+ {
+ scriptContext.ThrowNativeError("Invalid message");
+ return;
+ }
+
+ scriptContext.SetResult(message->GetMessageID());
+}
+
+static void ClientMessageGetMessageName(ScriptContext& scriptContext)
+{
+ auto message = scriptContext.GetArgument(0);
+
+ if (message == nullptr || message->GetSerializableMessage() == nullptr)
+ {
+ scriptContext.ThrowNativeError("Invalid message");
+ return;
+ }
+
+ scriptContext.SetResult(message->GetSerializableMessage()->GetUnscopedName());
+}
+
+static void ClientMessageGetMessageSender(ScriptContext& scriptContext)
+{
+ auto message = scriptContext.GetArgument(0);
+
+ if (message == nullptr || message->GetSerializableMessage() == nullptr)
+ {
+ scriptContext.ThrowNativeError("Invalid message");
+ return;
+ }
+
+ scriptContext.SetResult(message->GetSender());
+}
+
+static void ClientMessageGetMessageTypeName(ScriptContext& scriptContext)
+{
+ auto message = scriptContext.GetArgument(0);
+
+ if (message == nullptr || message->GetProtobufMessage() == nullptr)
+ {
+ scriptContext.ThrowNativeError("Invalid message");
+ return;
+ }
+
+ scriptContext.SetResult(message->GetProtobufMessage()->GetTypeName().c_str());
+}
+
+REGISTER_NATIVES(clientmessages, {
+ ScriptEngine::RegisterNativeHandler("HOOK_CLIENTMESSAGE", HookClientMessage);
+ ScriptEngine::RegisterNativeHandler("UNHOOK_CLIENTMESSAGE", UnhookClientMessage);
+ ScriptEngine::RegisterNativeHandler("CM_PB_HASFIELD", PbHasField);
+ ScriptEngine::RegisterNativeHandler("CM_PB_READINT", PbReadInt);
+ ScriptEngine::RegisterNativeHandler("CM_PB_READINT64", PbReadInt64);
+ ScriptEngine::RegisterNativeHandler("CM_PB_READFLOAT", PbReadFloat);
+ ScriptEngine::RegisterNativeHandler("CM_PB_READBOOL", PbReadBool);
+ ScriptEngine::RegisterNativeHandler("CM_PB_READSTRING", PbReadString);
+ ScriptEngine::RegisterNativeHandler("CM_PB_READBYTES", PbReadBytes);
+ ScriptEngine::RegisterNativeHandler("CM_PB_GETREPEATEDFIELDCOUNT", PbGetRepeatedFieldCount);
+ ScriptEngine::RegisterNativeHandler("CM_PB_SETINT", PbSetInt);
+ ScriptEngine::RegisterNativeHandler("CM_PB_SETINT64", PbSetInt64);
+ ScriptEngine::RegisterNativeHandler("CM_PB_SETFLOAT", PbSetFloat);
+ ScriptEngine::RegisterNativeHandler("CM_PB_SETBOOL", PbSetBool);
+ ScriptEngine::RegisterNativeHandler("CM_PB_SETSTRING", PbSetString);
+ ScriptEngine::RegisterNativeHandler("CM_PB_SETBYTES", PbSetBytes);
+ ScriptEngine::RegisterNativeHandler("CM_PB_ADDINT", PbAddInt);
+ ScriptEngine::RegisterNativeHandler("CM_PB_ADDINT64", PbAddInt64);
+ ScriptEngine::RegisterNativeHandler("CM_PB_ADDFLOAT", PbAddFloat);
+ ScriptEngine::RegisterNativeHandler("CM_PB_ADDBOOL", PbAddBool);
+ ScriptEngine::RegisterNativeHandler("CM_PB_ADDSTRING", PbAddString);
+ ScriptEngine::RegisterNativeHandler("CM_PB_REMOVEREPEATEDFIELDVALUE", PbRemoveRepeatedFieldValue);
+ // ScriptEngine::RegisterNativeHandler("CM_PB_READMESSAGE", PbReadMessage);
+ // ScriptEngine::RegisterNativeHandler("CM_PB_READREPEATEDMESSAGE", PbReadRepeatedMessage);
+ // ScriptEngine::RegisterNativeHandler("CM_PB_ADDMESSAGE", PbAddMessage);
+ ScriptEngine::RegisterNativeHandler("CM_PB_GETDEBUGSTRING", PbGetDebugString);
+ ScriptEngine::RegisterNativeHandler("CLIENTMESSAGE_FINDMESSAGEIDBYNAME", ClientMessageFindMessageIdByName);
+ ScriptEngine::RegisterNativeHandler("CLIENTMESSAGE_CREATE", ClientMessageCreate);
+ ScriptEngine::RegisterNativeHandler("CLIENTMESSAGE_CREATEBYID", ClientMessageCreateById);
+ ScriptEngine::RegisterNativeHandler("CLIENTMESSAGE_GETRECIPIENTS", ClientMessageGetRecipients);
+ ScriptEngine::RegisterNativeHandler("CLIENTMESSAGE_SETRECIPIENTS", ClientMessageSetRecipients);
+ ScriptEngine::RegisterNativeHandler("CLIENTMESSAGE_SEND", ClientMessageSend);
+ ScriptEngine::RegisterNativeHandler("CLIENTMESSAGE_DELETE", ClientMessageDelete);
+ ScriptEngine::RegisterNativeHandler("CLIENTMESSAGE_GETID", ClientMessageGetMessageId);
+ ScriptEngine::RegisterNativeHandler("CLIENTMESSAGE_GETNAME", ClientMessageGetMessageName);
+ ScriptEngine::RegisterNativeHandler("CLIENTMESSAGE_GETSENDER", ClientMessageGetMessageSender);
+ ScriptEngine::RegisterNativeHandler("CLIENTMESSAGE_GETTYPE", ClientMessageGetMessageTypeName);
+})
+} // namespace counterstrikesharp
diff --git a/src/scripting/natives/natives_clientmessages.yaml b/src/scripting/natives/natives_clientmessages.yaml
new file mode 100644
index 000000000..02b302d90
--- /dev/null
+++ b/src/scripting/natives/natives_clientmessages.yaml
@@ -0,0 +1,37 @@
+HOOK_CLIENTMESSAGE: messageId:int, callback:func, mode:HookMode -> void
+UNHOOK_CLIENTMESSAGE: messageId:int, callback:func, mode:HookMode -> void
+CM_PB_HASFIELD: message:ClientMessage, name:string -> bool
+CM_PB_READINT: message:ClientMessage, name:string, index:int -> int
+CM_PB_READINT64: message:ClientMessage, name:string, index:int -> long
+CM_PB_READFLOAT: message:ClientMessage, name:string, index:int -> float
+CM_PB_READBOOL: message:ClientMessage, name:string, index:int -> bool
+CM_PB_READSTRING: message:ClientMessage, name:string, index:int -> string
+CM_PB_READBYTES: message:ClientMessage, name:string, index:int -> byte[]
+CM_PB_GETREPEATEDFIELDCOUNT: message:ClientMessage, name:string -> int
+CM_PB_SETINT: message:ClientMessage, name:string, value:int, index:int -> void
+CM_PB_SETINT64: message:ClientMessage, name:string, value:long, index:int -> void
+CM_PB_SETFLOAT: message:ClientMessage, name:string, value:float, index:int -> void
+CM_PB_SETBOOL: message:ClientMessage, name:string, value:bool, index:int -> void
+CM_PB_SETSTRING: message:ClientMessage, name:string, value:string, index:int -> void
+CM_PB_SETBYTES: message:ClientMessage, name:string, value:byte[], index:int -> void
+CM_PB_ADDINT: message:ClientMessage, name:string, value:int -> void
+CM_PB_ADDINT64: message:ClientMessage, name:string, value:int64 -> void
+CM_PB_ADDFLOAT: message:ClientMessage, name:string, value:float -> void
+CM_PB_ADDBOOL: message:ClientMessage, name:string, value:bool -> void
+CM_PB_ADDSTRING: message:ClientMessage, name:string, value:string -> void
+CM_PB_REMOVEREPEATEDFIELDVALUE: message:ClientMessage, name:string, index:int -> void
+#CM_PB_READMESSAGE: message:ClientMessage, name:string -> ClientMessage
+#CM_PB_READREPEATEDMESSAGE: message:ClientMessage, name:string, index:int -> ClientMessage
+#CM_PB_ADDMESSAGE: message:ClientMessage, name:string -> ClientMessage
+CM_PB_GETDEBUGSTRING: message:ClientMessage -> string
+CLIENTMESSAGE_GETRECIPIENTS: message:ClientMessage -> uint64
+CLIENTMESSAGE_SETRECIPIENTS: message:ClientMessage, recipients:uint64 -> void
+CLIENTMESSAGE_FINDMESSAGEIDBYNAME: name:string -> int
+CLIENTMESSAGE_CREATE: name:string -> pointer
+CLIENTMESSAGE_CREATEBYID: id:int -> pointer
+CLIENTMESSAGE_SEND: message:ClientMessage -> void
+CLIENTMESSAGE_DELETE: message:ClientMessage -> void
+CLIENTMESSAGE_GETID: message:ClientMessage -> int
+CLIENTMESSAGE_GETNAME: message:ClientMessage -> string
+CLIENTMESSAGE_GETSENDER: message:ClientMessage -> int
+CLIENTMESSAGE_GETTYPE: message:ClientMessage -> string
diff --git a/src/scripting/natives/natives_usermessages.cpp b/src/scripting/natives/natives_usermessages.cpp
index 5757080dd..1686f618b 100644
--- a/src/scripting/natives/natives_usermessages.cpp
+++ b/src/scripting/natives/natives_usermessages.cpp
@@ -683,28 +683,28 @@ static void UserMessageGetMessageTypeName(ScriptContext& scriptContext)
REGISTER_NATIVES(usermessages, {
ScriptEngine::RegisterNativeHandler("HOOK_USERMESSAGE", HookUserMessage);
ScriptEngine::RegisterNativeHandler("UNHOOK_USERMESSAGE", UnhookUserMessage);
- ScriptEngine::RegisterNativeHandler("PB_HASFIELD", PbHasField);
- ScriptEngine::RegisterNativeHandler("PB_READINT", PbReadInt);
- ScriptEngine::RegisterNativeHandler("PB_READINT64", PbReadInt64);
- ScriptEngine::RegisterNativeHandler("PB_READFLOAT", PbReadFloat);
- ScriptEngine::RegisterNativeHandler("PB_READBOOL", PbReadBool);
- ScriptEngine::RegisterNativeHandler("PB_READSTRING", PbReadString);
- ScriptEngine::RegisterNativeHandler("PB_GETREPEATEDFIELDCOUNT", PbGetRepeatedFieldCount);
- ScriptEngine::RegisterNativeHandler("PB_SETINT", PbSetInt);
- ScriptEngine::RegisterNativeHandler("PB_SETINT64", PbSetInt64);
- ScriptEngine::RegisterNativeHandler("PB_SETFLOAT", PbSetFloat);
- ScriptEngine::RegisterNativeHandler("PB_SETBOOL", PbSetBool);
- ScriptEngine::RegisterNativeHandler("PB_SETSTRING", PbSetString);
- ScriptEngine::RegisterNativeHandler("PB_ADDINT", PbAddInt);
- ScriptEngine::RegisterNativeHandler("PB_ADDINT64", PbAddInt64);
- ScriptEngine::RegisterNativeHandler("PB_ADDFLOAT", PbAddFloat);
- ScriptEngine::RegisterNativeHandler("PB_ADDBOOL", PbAddBool);
- ScriptEngine::RegisterNativeHandler("PB_ADDSTRING", PbAddString);
- ScriptEngine::RegisterNativeHandler("PB_REMOVEREPEATEDFIELDVALUE", PbRemoveRepeatedFieldValue);
- // ScriptEngine::RegisterNativeHandler("PB_READMESSAGE", PbReadMessage);
- // ScriptEngine::RegisterNativeHandler("PB_READREPEATEDMESSAGE", PbReadRepeatedMessage);
- // ScriptEngine::RegisterNativeHandler("PB_ADDMESSAGE", PbAddMessage);
- ScriptEngine::RegisterNativeHandler("PB_GETDEBUGSTRING", PbGetDebugString);
+ ScriptEngine::RegisterNativeHandler("UM_PB_HASFIELD", PbHasField);
+ ScriptEngine::RegisterNativeHandler("UM_PB_READINT", PbReadInt);
+ ScriptEngine::RegisterNativeHandler("UM_PB_READINT64", PbReadInt64);
+ ScriptEngine::RegisterNativeHandler("UM_PB_READFLOAT", PbReadFloat);
+ ScriptEngine::RegisterNativeHandler("UM_PB_READBOOL", PbReadBool);
+ ScriptEngine::RegisterNativeHandler("UM_PB_READSTRING", PbReadString);
+ ScriptEngine::RegisterNativeHandler("UM_PB_GETREPEATEDFIELDCOUNT", PbGetRepeatedFieldCount);
+ ScriptEngine::RegisterNativeHandler("UM_PB_SETINT", PbSetInt);
+ ScriptEngine::RegisterNativeHandler("UM_PB_SETINT64", PbSetInt64);
+ ScriptEngine::RegisterNativeHandler("UM_PB_SETFLOAT", PbSetFloat);
+ ScriptEngine::RegisterNativeHandler("UM_PB_SETBOOL", PbSetBool);
+ ScriptEngine::RegisterNativeHandler("UM_PB_SETSTRING", PbSetString);
+ ScriptEngine::RegisterNativeHandler("UM_PB_ADDINT", PbAddInt);
+ ScriptEngine::RegisterNativeHandler("UM_PB_ADDINT64", PbAddInt64);
+ ScriptEngine::RegisterNativeHandler("UM_PB_ADDFLOAT", PbAddFloat);
+ ScriptEngine::RegisterNativeHandler("UM_PB_ADDBOOL", PbAddBool);
+ ScriptEngine::RegisterNativeHandler("UM_PB_ADDSTRING", PbAddString);
+ ScriptEngine::RegisterNativeHandler("UM_PB_REMOVEREPEATEDFIELDVALUE", PbRemoveRepeatedFieldValue);
+ // ScriptEngine::RegisterNativeHandler("UM_PB_READMESSAGE", PbReadMessage);
+ // ScriptEngine::RegisterNativeHandler("UM_PB_READREPEATEDMESSAGE", PbReadRepeatedMessage);
+ // ScriptEngine::RegisterNativeHandler("UM_PB_ADDMESSAGE", PbAddMessage);
+ ScriptEngine::RegisterNativeHandler("UM_PB_GETDEBUGSTRING", PbGetDebugString);
ScriptEngine::RegisterNativeHandler("USERMESSAGE_FINDMESSAGEIDBYNAME", UserMessageFindMessageIdByName);
ScriptEngine::RegisterNativeHandler("USERMESSAGE_CREATE", UserMessageCreate);
ScriptEngine::RegisterNativeHandler("USERMESSAGE_CREATEBYID", UserMessageCreateById);
diff --git a/src/scripting/natives/natives_usermessages.yaml b/src/scripting/natives/natives_usermessages.yaml
index da541b8a5..8c51e4e2d 100644
--- a/src/scripting/natives/natives_usermessages.yaml
+++ b/src/scripting/natives/natives_usermessages.yaml
@@ -1,27 +1,27 @@
HOOK_USERMESSAGE: messageId:int, callback:func, mode:HookMode -> void
UNHOOK_USERMESSAGE: messageId:int, callback:func, mode:HookMode -> void
-PB_HASFIELD: message:UserMessage, name:string -> bool
-PB_READINT: message:UserMessage, name:string, index:int -> int
-PB_READINT64: message:UserMessage, name:string, index:int -> long
-PB_READFLOAT: message:UserMessage, name:string, index:int -> float
-PB_READBOOL: message:UserMessage, name:string, index:int -> bool
-PB_READSTRING: message:UserMessage, name:string, index:int -> string
-PB_GETREPEATEDFIELDCOUNT: message:UserMessage, name:string -> int
-PB_SETINT: message:UserMessage, name:string, value:int, index:int -> void
-PB_SETINT64: message:UserMessage, name:string, value:long, index:int -> void
-PB_SETFLOAT: message:UserMessage, name:string, value:float, index:int -> void
-PB_SETBOOL: message:UserMessage, name:string, value:bool, index:int -> void
-PB_SETSTRING: message:UserMessage, name:string, value:string, index:int -> void
-PB_ADDINT: message:UserMessage, name:string, value:int -> void
-PB_ADDINT64: message:UserMessage, name:string, value:int64 -> void
-PB_ADDFLOAT: message:UserMessage, name:string, value:float -> void
-PB_ADDBOOL: message:UserMessage, name:string, value:bool -> void
-PB_ADDSTRING: message:UserMessage, name:string, value:string -> void
-PB_REMOVEREPEATEDFIELDVALUE: message:UserMessage, name:string, index:int -> void
-#PB_READMESSAGE: message:UserMessage, name:string -> UserMessage
-#PB_READREPEATEDMESSAGE: message:UserMessage, name:string, index:int -> UserMessage
-#PB_ADDMESSAGE: message:UserMessage, name:string -> UserMessage
-PB_GETDEBUGSTRING: message:UserMessage -> string
+UM_PB_HASFIELD: message:UserMessage, name:string -> bool
+UM_PB_READINT: message:UserMessage, name:string, index:int -> int
+UM_PB_READINT64: message:UserMessage, name:string, index:int -> long
+UM_PB_READFLOAT: message:UserMessage, name:string, index:int -> float
+UM_PB_READBOOL: message:UserMessage, name:string, index:int -> bool
+UM_PB_READSTRING: message:UserMessage, name:string, index:int -> string
+UM_PB_GETREPEATEDFIELDCOUNT: message:UserMessage, name:string -> int
+UM_PB_SETINT: message:UserMessage, name:string, value:int, index:int -> void
+UM_PB_SETINT64: message:UserMessage, name:string, value:long, index:int -> void
+UM_PB_SETFLOAT: message:UserMessage, name:string, value:float, index:int -> void
+UM_PB_SETBOOL: message:UserMessage, name:string, value:bool, index:int -> void
+UM_PB_SETSTRING: message:UserMessage, name:string, value:string, index:int -> void
+UM_PB_ADDINT: message:UserMessage, name:string, value:int -> void
+UM_PB_ADDINT64: message:UserMessage, name:string, value:int64 -> void
+UM_PB_ADDFLOAT: message:UserMessage, name:string, value:float -> void
+UM_PB_ADDBOOL: message:UserMessage, name:string, value:bool -> void
+UM_PB_ADDSTRING: message:UserMessage, name:string, value:string -> void
+UM_PB_REMOVEREPEATEDFIELDVALUE: message:UserMessage, name:string, index:int -> void
+#UM_PB_READMESSAGE: message:UserMessage, name:string -> UserMessage
+#UM_PB_READREPEATEDMESSAGE: message:UserMessage, name:string, index:int -> UserMessage
+#UM_PB_ADDMESSAGE: message:UserMessage, name:string -> UserMessage
+UM_PB_GETDEBUGSTRING: message:UserMessage -> string
USERMESSAGE_GETRECIPIENTS: message:UserMessage -> uint64
USERMESSAGE_SETRECIPIENTS: message:UserMessage, recipients:uint64 -> void
USERMESSAGE_FINDMESSAGEIDBYNAME: name:string -> int
diff --git a/tooling/CodeGen.Natives/Mapping.cs b/tooling/CodeGen.Natives/Mapping.cs
index e12e2b26c..c76a8bbc9 100644
--- a/tooling/CodeGen.Natives/Mapping.cs
+++ b/tooling/CodeGen.Natives/Mapping.cs
@@ -73,6 +73,8 @@ public static string GetCSharpType(string type)
return "CommandCallingContext";
case "UserMessage":
return "UserMessage";
+ case "ClientMessage":
+ return "ClientMessage";
case "RecipientFilter":
return "RecipientFilter";
case "any":
diff --git a/tooling/CodeGen.Natives/Scripts/GenerateNatives.cs b/tooling/CodeGen.Natives/Scripts/GenerateNatives.cs
index b4d547179..58a4608fe 100644
--- a/tooling/CodeGen.Natives/Scripts/GenerateNatives.cs
+++ b/tooling/CodeGen.Natives/Scripts/GenerateNatives.cs
@@ -92,6 +92,7 @@ public static void GenerateNatives()
using System;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.UserMessages;
+using CounterStrikeSharp.API.Modules.ClientMessages;
using CounterStrikeSharp.API.Modules.Commands;
using CounterStrikeSharp.API.Modules.Utils;