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;