From 72ff220f3efe944211511964c09d3dbe68798fcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Wed, 21 Oct 2026 18:03:41 +0300 Subject: [PATCH 01/12] Fix weapon local data tables sending the field instead of the weapon --- Game.Shared/BaseCombatWeaponShared.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Game.Shared/BaseCombatWeaponShared.cs b/Game.Shared/BaseCombatWeaponShared.cs index 8c1457e8..e1fc9d8a 100644 --- a/Game.Shared/BaseCombatWeaponShared.cs +++ b/Game.Shared/BaseCombatWeaponShared.cs @@ -229,8 +229,8 @@ private static void RecvProxy_WeaponState(ref readonly RecvProxyData data, objec if (weapon != null) { BasePlayer? player = ToBasePlayer(weapon.GetOwner()); if (player != null) { - // recipients.SetOnly(player.GetClientIndex()); - return data; + recipients.SetOnly(player.EntIndex() - 1); + return instance; } } @@ -241,8 +241,8 @@ private static void RecvProxy_WeaponState(ref readonly RecvProxyData data, objec if (weapon != null) { BasePlayer? player = ToBasePlayer(weapon.GetOwner()); if (player != null) { - // recipients.SetOnly(player.GetClientIndex()); - return data; + recipients.SetOnly(player.EntIndex() - 1); + return instance; } } From 9e1e4db383446f4d61bd666d298ab7a1222e9cca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Wed, 21 Oct 2026 18:11:27 +0300 Subject: [PATCH 02/12] Fix server never updating carried weapon state --- Game.Server/Player.cs | 5 +++++ Game.Shared/BaseCombatWeaponShared.cs | 11 +---------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/Game.Server/Player.cs b/Game.Server/Player.cs index 82343051..44fb2a78 100644 --- a/Game.Server/Player.cs +++ b/Game.Server/Player.cs @@ -2248,6 +2248,11 @@ public virtual void UpdateClientData() { // todo + for (int i = 0; i < WeaponCount(); i++) { + if (GetWeapon(i) != null) + GetWeapon(i)!.UpdateClientData(this); + } + // g_pGameRules.UpdateClientData(this); } diff --git a/Game.Shared/BaseCombatWeaponShared.cs b/Game.Shared/BaseCombatWeaponShared.cs index e1fc9d8a..87227d8b 100644 --- a/Game.Shared/BaseCombatWeaponShared.cs +++ b/Game.Shared/BaseCombatWeaponShared.cs @@ -381,16 +381,7 @@ public struct PoseParamTable public virtual int DrawOverriddenViewmodel(BaseViewModel viewmodel, StudioFlags flags) => 0; public virtual void ViewModelDrawn(BaseViewModel viewmodelflags) { } public virtual int UpdateClientData(BasePlayer player) { - WeaponState iNewState = WeaponState.IsCarriedByPlayer; - - if (player.GetActiveWeapon() == this) { - if (player.OnTarget) - iNewState = WeaponState.IsOnTarget; - else - iNewState = WeaponState.IsActive; - } - else - iNewState = WeaponState.IsCarriedByPlayer; + WeaponState iNewState = player.GetActiveWeapon() == this ? WeaponState.IsActive : WeaponState.IsCarriedByPlayer; if (State != (int)iNewState) { int iOldState = State; From 3121c5044521726ff13cc832f6393635da46f066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Wed, 21 Oct 2026 18:17:58 +0300 Subject: [PATCH 03/12] Fix client using the observed player's weapon outside in-eye mode --- Game.Client/C_BasePlayer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Game.Client/C_BasePlayer.cs b/Game.Client/C_BasePlayer.cs index 4fa44cba..a36d5757 100644 --- a/Game.Client/C_BasePlayer.cs +++ b/Game.Client/C_BasePlayer.cs @@ -815,7 +815,7 @@ protected override bool ShouldInterpolate() { public override BaseCombatWeapon? GetActiveWeapon() { BasePlayer fromPlayer = this; - if (fromPlayer == GetLocalPlayer()) {// observer mode todo + if (fromPlayer == GetLocalPlayer() && GetObserverMode() == Shared.ObserverMode.InEye) { C_BaseEntity? target = ObserverTarget.Get(); if (target != null && target.IsPlayer()) From 16f05087a69f513c25d794e14d0aae1e7d3571a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Wed, 21 Oct 2026 18:28:14 +0300 Subject: [PATCH 04/12] Fix weapon network fields not marking the entity changed --- Game.Server/BaseCombatWeapon.cs | 1 + Game.Shared/BaseCombatWeaponShared.cs | 54 ++++++++++++++++++++++++++- Source.Common/BaseHandle.cs | 1 + 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/Game.Server/BaseCombatWeapon.cs b/Game.Server/BaseCombatWeapon.cs index 0a983ae4..4166abc9 100644 --- a/Game.Server/BaseCombatWeapon.cs +++ b/Game.Server/BaseCombatWeapon.cs @@ -34,6 +34,7 @@ public partial class BaseCombatWeapon : BaseAnimating public override DataMap? GetDataDescMap() => DataDesc; public BaseCombatWeapon() { + Owner = new(); OnBaseCombatWeaponCreated(this); } diff --git a/Game.Shared/BaseCombatWeaponShared.cs b/Game.Shared/BaseCombatWeaponShared.cs index 87227d8b..2a339111 100644 --- a/Game.Shared/BaseCombatWeaponShared.cs +++ b/Game.Shared/BaseCombatWeaponShared.cs @@ -328,39 +328,91 @@ public struct PoseParamTable } [NetworkName("m_iClip1")] +#if CLIENT_DLL public int iClip1; +#else + [NetworkVar] public partial int iClip1 { get; set; } +#endif [NetworkName("m_iClip2")] +#if CLIENT_DLL public int iClip2; +#else + [NetworkVar] public partial int iClip2 { get; set; } +#endif [NetworkName("m_iPrimaryAmmoType")] +#if CLIENT_DLL public int PrimaryAmmoType; +#else + [NetworkVar] public partial int PrimaryAmmoType { get; set; } +#endif [NetworkName("m_iSecondaryAmmoType")] +#if CLIENT_DLL public int SecondaryAmmoType; +#else + [NetworkVar] public partial int SecondaryAmmoType { get; set; } +#endif /// /// View model index (entity offset) /// [NetworkName("m_nViewModelIndex")] +#if CLIENT_DLL public int nViewModelIndex; +#else + [NetworkVar] public partial int nViewModelIndex { get; set; } +#endif /// /// View model index (art) /// [NetworkName("m_iViewModelIndex")] +#if CLIENT_DLL public int iViewModelIndex; +#else + [NetworkVar] public partial int iViewModelIndex { get; set; } +#endif [NetworkName("m_iWorldModelIndex")] +#if CLIENT_DLL public int WorldModelIndex; +#else + [NetworkVar] public partial int WorldModelIndex { get; set; } +#endif [NetworkName("m_bFlipViewModel")] +#if CLIENT_DLL public bool FlipViewModel; +#else + [NetworkVar] public partial bool FlipViewModel { get; set; } +#endif [NetworkName("m_flNextPrimaryAttack")] +#if CLIENT_DLL public TimeUnit_t NextPrimaryAttack; +#else + [NetworkVar] public partial TimeUnit_t NextPrimaryAttack { get; set; } +#endif [NetworkName("m_flNextSecondaryAttack")] +#if CLIENT_DLL public TimeUnit_t NextSecondaryAttack; +#else + [NetworkVar] public partial TimeUnit_t NextSecondaryAttack { get; set; } +#endif [NetworkName("m_flTimeWeaponIdle")] +#if CLIENT_DLL public TimeUnit_t TimeWeaponIdle; +#else + [NetworkVar] public partial TimeUnit_t TimeWeaponIdle { get; set; } +#endif [NetworkName("m_iState")] +#if CLIENT_DLL public int State; +#else + [NetworkVar] public partial int State { get; set; } +#endif [NetworkName("m_hOwner")] +#if CLIENT_DLL public EHANDLE Owner = new(); +#else + [NetworkVar] public partial EHANDLE Owner { get; set; } +#endif Activity Activity; int IdealSequence; @@ -1273,7 +1325,7 @@ public void SetOwner(BaseCombatCharacter? owner) { SetContextThink(null, 0, HIDEWEAPON_THINK_CONTEXT); } - Owner.Set(owner); + Owner = EHANDLE.FromEntity(owner); #if !CLIENT_DLL // DispatchUpdateTransmitState(); todo #else diff --git a/Source.Common/BaseHandle.cs b/Source.Common/BaseHandle.cs index d6370733..0d871606 100644 --- a/Source.Common/BaseHandle.cs +++ b/Source.Common/BaseHandle.cs @@ -50,6 +50,7 @@ public struct Handle : IEquatable>, IEquatable, IBaseHa public Handle(uint value) => Index = value; public Handle(in BaseHandle handle) => Index = handle.Index; public Handle(int entry, int serial) => Index = (uint)(entry | (serial << Constants.NUM_ENT_ENTRY_BITS)); + public static Handle FromEntity(IHandleEntity? entity) => new(entity != null ? entity.GetRefEHandle().Index : Constants.INVALID_EHANDLE_INDEX); public readonly int GetEntryIndex() => (int)(Index & Constants.ENT_ENTRY_MASK); public readonly int GetSerialNumber() => (int)(Index >> Constants.NUM_ENT_ENTRY_BITS); From cfbef1372e87576261da18b1201634ae9e73abd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Wed, 21 Oct 2026 18:37:09 +0300 Subject: [PATCH 05/12] Fix carried weapons not being transmitted to their owner --- Game.Server/BaseCombatCharacter.cs | 22 ++++++++++++++++++++++ Game.Server/BaseCombatWeapon.cs | 8 ++++++++ Game.Shared/BaseCombatWeaponShared.cs | 2 +- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Game.Server/BaseCombatCharacter.cs b/Game.Server/BaseCombatCharacter.cs index 9d78bd25..ebf5a7b1 100644 --- a/Game.Server/BaseCombatCharacter.cs +++ b/Game.Server/BaseCombatCharacter.cs @@ -266,6 +266,28 @@ public virtual bool FInViewCone(in Vector3 spot) { return instance; } + public override void SetTransmit(CheckTransmitInfo info, bool always) { + if (info.TransmitEdict.Get(EntIndex()) != 0) + return; + + base.SetTransmit(info, always); + + if (info.ClientEnt == Edict()) { + for (int i = 0; i < MAX_WEAPONS; i++) { + BaseCombatWeapon? weapon = MyWeapons[i].Get(); + if (weapon == null) + continue; + + weapon.SetTransmit(info, always); + } + } + else { + BaseCombatWeapon? activeWeapon = ActiveWeapon.Get(); + if (activeWeapon != null && !activeWeapon.IsEffectActive(EntityEffects.NoDraw)) + activeWeapon.SetTransmit(info, always); + } + } + public void ClearLastKnownArea() { // TODO } diff --git a/Game.Server/BaseCombatWeapon.cs b/Game.Server/BaseCombatWeapon.cs index 4166abc9..38a95028 100644 --- a/Game.Server/BaseCombatWeapon.cs +++ b/Game.Server/BaseCombatWeapon.cs @@ -3,6 +3,7 @@ using Source; using Source.Common; using Source.Common.Commands; +using Source.Common.Engine; using Source.Common.Formats.BSP; using Source.Common.Physics; @@ -38,6 +39,13 @@ public BaseCombatWeapon() { OnBaseCombatWeaponCreated(this); } + public override EdictFlags UpdateTransmitState() { + if (GetOwner() != null) + return SetTransmitState(EdictFlags.PVSCheck); + + return base.UpdateTransmitState(); + } + public override void UpdateOnRemove() { OnBaseCombatWeaponDestroyed(this); base.UpdateOnRemove(); diff --git a/Game.Shared/BaseCombatWeaponShared.cs b/Game.Shared/BaseCombatWeaponShared.cs index 2a339111..a446694a 100644 --- a/Game.Shared/BaseCombatWeaponShared.cs +++ b/Game.Shared/BaseCombatWeaponShared.cs @@ -1327,7 +1327,7 @@ public void SetOwner(BaseCombatCharacter? owner) { Owner = EHANDLE.FromEntity(owner); #if !CLIENT_DLL - // DispatchUpdateTransmitState(); todo + DispatchUpdateTransmitState(); #else UpdateVisibility(); #endif From 51d394f92f160776165a61d417564d9ba5234f2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Wed, 21 Oct 2026 18:47:36 +0300 Subject: [PATCH 06/12] Fix client physics simulation never running think functions --- Game.Client/C_BaseEntity.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Game.Client/C_BaseEntity.cs b/Game.Client/C_BaseEntity.cs index 7ef1c539..e5bc269b 100644 --- a/Game.Client/C_BaseEntity.cs +++ b/Game.Client/C_BaseEntity.cs @@ -2863,11 +2863,14 @@ protected InterpolateResult BaseInterpolatePart1(ref TimeUnit_t currentTime, ref return InterpolateResult.Continue; } - void PhysicsStep() { } - void PhysicsPusher() { } - void PhysicsNone() { } - void PhysicsRigidChild() { } - void PhysicsNoclip() { } + void PhysicsStep() { + PhysicsRunThink(ThinkMethods.FireAllButBase); + PhysicsRunThink(ThinkMethods.FireBaseOnly); + } + void PhysicsPusher() => PhysicsRunThink(); + void PhysicsNone() => PhysicsRunThink(); + void PhysicsRigidChild() => PhysicsRunThink(); + void PhysicsNoclip() => PhysicsRunThink(); void PhysicsStepRunTimestep(TimeUnit_t timestep) { } void PhysicsToss() { } void PhysicsCustom() { } From 038e25722276ff9d0250586825a46aff53097eef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Wed, 21 Oct 2026 19:34:04 +0300 Subject: [PATCH 07/12] Fix user command random seed not being set --- Game.Client/InMain.cs | 3 +++ Game.Shared/UserCmd.cs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Game.Client/InMain.cs b/Game.Client/InMain.cs index 305f01b9..d1697698 100644 --- a/Game.Client/InMain.cs +++ b/Game.Client/InMain.cs @@ -7,6 +7,7 @@ using Source.Common.Client; using Source.Common.Commands; using Source.Common.GUI; +using Source.Common.Hashing; using Source.Common.Input; using Source.Common.Mathematics; @@ -273,6 +274,8 @@ public void CreateMove(int sequenceNumber, double inputSampleFrametime, bool act cmd.Buttons |= InButtons.Forward; else if (cmd.ForwardMove < 0) cmd.Buttons |= InButtons.Back; + + cmd.RandomSeed = (int)(MD5Value.PseudoRandom((uint)sequenceNumber) & 0x7fffffff); } private void ApplyExtras(ref UserCmd cmd) { diff --git a/Game.Shared/UserCmd.cs b/Game.Shared/UserCmd.cs index 0a9e5a60..61c75073 100644 --- a/Game.Shared/UserCmd.cs +++ b/Game.Shared/UserCmd.cs @@ -1,5 +1,6 @@ using Source; using Source.Common.Bitbuffers; +using Source.Common.Hashing; using Source.Common.Mathematics; using System.Numerics; @@ -208,6 +209,8 @@ public static void ReadUsercmd(bf_read buf, ref UserCmd move, ref UserCmd from) move.WeaponSubtype = (int)buf.ReadUBitLong(WEAPON_SUBTYPE_BITS); } + move.RandomSeed = (int)(MD5Value.PseudoRandom((uint)move.CommandNumber) & 0x7fffffff); + if (buf.ReadOneBit() != 0) move.MouseDeltaX = buf.ReadShort(); From de29fa61fd2631ca8308b494dc9d12ac44b6f911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Thu, 22 Oct 2026 02:41:53 +0300 Subject: [PATCH 08/12] Generate network tables and prediction maps from in-class lists --- Game.Client/C_AI_BaseNPC.cs | 38 +- Game.Client/C_BaseAnimating.cs | 144 +-- Game.Client/C_BaseAnimatingOverlay.cs | 26 +- Game.Client/C_BaseBeam.cs | 71 +- Game.Client/C_BaseCombatCharacter.cs | 54 +- Game.Client/C_BaseCombatWeapon.cs | 4 + Game.Client/C_BaseEntity.cs | 486 +++++---- Game.Client/C_BaseFlex.cs | 34 +- Game.Client/C_BasePlayer.cs | 208 ++-- Game.Client/C_BaseTempEntity.cs | 10 +- Game.Client/C_BaseViewModel.cs | 34 +- Game.Client/C_BeamSpotlight.cs | 43 +- Game.Client/C_BoneFollower.cs | 17 +- Game.Client/C_BoneManipulate.cs | 25 +- Game.Client/C_BreakableProp.cs | 8 +- Game.Client/C_BreakableSurface.cs | 45 +- Game.Client/C_CitadelEnergyCore.cs | 29 +- Game.Client/C_ColorCorrection.cs | 51 +- Game.Client/C_ColorCorrectionVolume.cs | 31 +- Game.Client/C_DustTrail.cs | 63 +- Game.Client/C_DynamicLight.cs | 39 +- Game.Client/C_Embers.cs | 25 +- Game.Client/C_EntityDissolve.cs | 57 +- Game.Client/C_EntityFlame.cs | 13 +- Game.Client/C_EntityParticleTrail.cs | 45 +- Game.Client/C_EnvAmbientLight.cs | 13 +- Game.Client/C_EnvDetailController.cs | 19 +- Game.Client/C_EnvHeadcrabCanister.cs | 93 +- Game.Client/C_EnvParticleScript.cs | 13 +- Game.Client/C_EnvProjectedTexture.cs | 65 +- Game.Client/C_EnvQuadraticBeam.cs | 27 +- Game.Client/C_EnvScreenEffect.cs | 17 +- Game.Client/C_EnvScreenOverlay.cs | 34 +- Game.Client/C_EnvStarfield.cs | 17 +- Game.Client/C_EnvTonemapController.cs | 38 +- Game.Client/C_EnvWind.cs | 30 +- Game.Client/C_FireSmoke.cs | 37 +- Game.Client/C_FireTrail.cs | 17 +- Game.Client/C_Fish.cs | 41 +- Game.Client/C_Flare.cs | 29 +- Game.Client/C_FleshEffectTarget.cs | 17 +- Game.Client/C_FlexManipulate.cs | 21 +- Game.Client/C_FogController.cs | 74 +- Game.Client/C_FuncAreaPortalWindow.cs | 29 +- Game.Client/C_FuncConveyor.cs | 14 +- Game.Client/C_FuncMonitor.cs | 8 +- Game.Client/C_FuncOccluder.cs | 17 +- Game.Client/C_FuncReflectiveGlass.cs | 8 +- Game.Client/C_FuncRotating.cs | 17 +- Game.Client/C_FuncSmokeVolume.cs | 49 +- Game.Client/C_FuncTrackTrain.cs | 8 +- Game.Client/C_Func_Dust.cs | 63 +- Game.Client/C_Func_LOD.cs | 17 +- Game.Client/C_InfoOverlayAccessor.cs | 15 +- Game.Client/C_LightGlow.cs | 50 +- Game.Client/C_MaterialModifyControl.cs | 57 +- Game.Client/C_MortarShell.cs | 21 +- Game.Client/C_MovieExplosion.cs | 7 +- Game.Client/C_NPC_AntlionGuard.cs | 21 +- Game.Client/C_NPC_Barnacle.cs | 27 +- Game.Client/C_NPC_Barney.cs | 9 +- Game.Client/C_NPC_CombineGunship.cs | 15 +- Game.Client/C_NPC_Manhack.cs | 21 +- Game.Client/C_NPC_Portal_FloorTurret.cs | 21 +- Game.Client/C_NPC_Puppet.cs | 17 +- Game.Client/C_NPC_RocketTurret.cs | 21 +- Game.Client/C_NPC_RollerMine.cs | 27 +- Game.Client/C_NPC_Vortigaunt.cs | 21 +- Game.Client/C_ParticlePerformanceMonitor.cs | 19 +- Game.Client/C_ParticleSmokeGrenade.cs | 27 +- Game.Client/C_ParticleSystem.cs | 50 +- Game.Client/C_PhysBox.cs | 8 +- Game.Client/C_PhysMagnet.cs | 8 +- Game.Client/C_PhysicsProp.cs | 14 +- Game.Client/C_Plasma.cs | 33 +- Game.Client/C_PlayerResource.cs | 44 +- Game.Client/C_PointCamera.cs | 57 +- Game.Client/C_PointWorldText.cs | 41 +- Game.Client/C_PoseController.cs | 53 +- Game.Client/C_Precipitation.cs | 29 +- Game.Client/C_PrecipitationBlocker.cs | 9 +- Game.Client/C_PropCrane.cs | 29 +- Game.Client/C_PropEnergyBall.cs | 17 +- Game.Client/C_PropJeep.cs | 42 +- Game.Client/C_PropScalable.cs | 51 +- Game.Client/C_PropVehicleChoreoGeneric.cs | 70 +- Game.Client/C_PropVehicleDriveable.cs | 59 +- Game.Client/C_Props.cs | 82 +- Game.Client/C_RagdollManager.cs | 18 +- Game.Client/C_RagdollProp.cs | 35 +- Game.Client/C_RagdollPropAttached.cs | 30 +- Game.Client/C_RocketTrail.cs | 71 +- Game.Client/C_Rope.cs | 97 +- Game.Client/C_RotorWashEmitter.cs | 13 +- Game.Client/C_RpgRocket.cs | 9 +- Game.Client/C_SceneEntity.cs | 57 +- Game.Client/C_ScriptIntro.cs | 81 +- Game.Client/C_ShadowControl.cs | 29 +- Game.Client/C_SlideshowDisplay.cs | 41 +- Game.Client/C_SmokeStack.cs | 73 +- Game.Client/C_SmokeTrail.cs | 71 +- Game.Client/C_SpatialEntity.cs | 28 +- Game.Client/C_SporeExplosion.cs | 39 +- Game.Client/C_SporeTrail.cs | 39 +- Game.Client/C_SpotlightEnd.cs | 17 +- Game.Client/C_SteamJet.cs | 53 +- Game.Client/C_Strider.cs | 22 +- Game.Client/C_Sun.cs | 48 +- Game.Client/C_TEAntlionDust.cs | 19 +- Game.Client/C_TEArmorRicochet.cs | 9 +- Game.Client/C_TEBSPDecal.cs | 21 +- Game.Client/C_TEBeamEntPoint.cs | 25 +- Game.Client/C_TEBeamEnts.cs | 17 +- Game.Client/C_TEBeamFollow.cs | 13 +- Game.Client/C_TEBeamLaser.cs | 17 +- Game.Client/C_TEBeamPoints.cs | 17 +- Game.Client/C_TEBeamRing.cs | 17 +- Game.Client/C_TEBeamRingPoint.cs | 21 +- Game.Client/C_TEBeamSpline.cs | 21 +- Game.Client/C_TEBloodSprite.cs | 39 +- Game.Client/C_TEBloodStream.cs | 33 +- Game.Client/C_TEBreakModel.cs | 47 +- Game.Client/C_TEBubbleTrail.cs | 33 +- Game.Client/C_TEBubbles.cs | 33 +- Game.Client/C_TEClientProjectile.cs | 29 +- Game.Client/C_TEConcussiveExplosion.cs | 25 +- Game.Client/C_TEDecal.cs | 29 +- Game.Client/C_TEDust.cs | 21 +- Game.Client/C_TEDynamicLight.cs | 41 +- Game.Client/C_TEEffectDispatch.cs | 13 +- Game.Client/C_TEEnergySplash.cs | 23 +- Game.Client/C_TEExplosion.cs | 25 +- Game.Client/C_TEFizz.cs | 25 +- Game.Client/C_TEFootprintDecal.cs | 25 +- Game.Client/C_TEGaussExplosion.cs | 17 +- Game.Client/C_TEGlowSprite.cs | 29 +- Game.Client/C_TEHL2MPFireBullets.cs | 55 +- Game.Client/C_TEKillPlayerAttachments.cs | 13 +- Game.Client/C_TELargeFunnel.cs | 13 +- Game.Client/C_TEMetalSparks.cs | 19 +- Game.Client/C_TEMuzzleFlash.cs | 25 +- Game.Client/C_TEParticleSystem.cs | 15 +- Game.Client/C_TEPhysicsProp.cs | 47 +- Game.Client/C_TEPlayerAnimEvent.cs | 23 +- Game.Client/C_TEPlayerDecal.cs | 23 +- Game.Client/C_TEProjectedDecal.cs | 25 +- Game.Client/C_TEShatterSurface.cs | 53 +- Game.Client/C_TEShowLine.cs | 13 +- Game.Client/C_TESmoke.cs | 25 +- Game.Client/C_TESparks.cs | 21 +- Game.Client/C_TESprite.cs | 25 +- Game.Client/C_TESpriteSpray.cs | 35 +- Game.Client/C_TEWorldDecal.cs | 17 +- Game.Client/C_Team.cs | 57 +- Game.Client/C_Tesla.cs | 17 +- Game.Client/C_TriggerPlayerMovement.cs | 9 +- Game.Client/C_Triggers.cs | 16 +- Game.Client/C_VGuiScreen.cs | 41 +- Game.Client/C_VortigauntChargeToken.cs | 13 +- Game.Client/C_VortigauntEffectDispel.cs | 13 +- Game.Client/C_WaterBullet.cs | 9 +- Game.Client/C_WaterLODControl.cs | 18 +- Game.Client/C_World.cs | 45 +- Game.Client/Game.Client.csproj | 1 - Game.Client/GarrysMod/C_GMOD_Player.cs | 87 +- Game.Client/GarrysMod/C_LuaNextBot.cs | 15 +- Game.Client/GarrysMod/WeaponCrossbow.cs | 8 +- Game.Client/HL1/C_BaseHL1CombatWeapon.cs | 8 +- Game.Client/HL1/C_BaseHL1MPCombatWeapon.cs | 8 +- Game.Client/HL1/C_BaseHelicopter_HL1.cs | 8 +- Game.Client/HL2/C_AR2Explosion.cs | 13 +- Game.Client/HL2/C_AlyxEmpEffect.cs | 19 +- Game.Client/HL2/C_BaseHLCombatWeapon.cs | 24 +- Game.Client/HL2/C_BaseHLPlayer.cs | 26 +- Game.Client/HL2/C_BaseHelicopter.cs | 13 +- Game.Client/HL2/C_HL2PlayerLocalData.cs | 55 +- Game.Client/HL2/C_InfoTeleporterCountdown.cs | 23 +- Game.Client/HL2/C_PropAirboat.cs | 27 +- Game.Client/HL2/C_PropCombineBall.cs | 25 +- Game.Client/HL2/C_PropVehiclePrisonerPod.cs | 33 +- Game.Client/HL2/C_Weapon_Stubs_HL2.cs | 56 +- Game.Client/HL2MP/C_HL2MP_Player.cs | 92 +- .../NextBot/C_NextBotCombatCharacter.cs | 6 +- Game.Client/ParticleMgr.cs | 6 +- Game.Client/PlayerLocalData.cs | 230 ++--- Game.Server/AI_BaseNPC.cs | 47 +- Game.Server/BaseAnimating.cs | 195 ++-- Game.Server/BaseAnimatingOverlay.cs | 20 +- Game.Server/BaseBeam.cs | 71 +- Game.Server/BaseCombatCharacter.cs | 95 +- Game.Server/BaseEntity.cs | 441 ++++---- Game.Server/BaseFlex.cs | 51 +- Game.Server/BaseHLBludgeonWeapon.cs | 8 +- Game.Server/BaseHLCombatWeapon.cs | 16 +- Game.Server/BaseTempEntity.cs | 10 +- Game.Server/BeamSpotlight.cs | 57 +- Game.Server/BoneFollower.cs | 21 +- Game.Server/BoneManipulate.cs | 33 +- Game.Server/BreakableSurface.cs | 63 +- Game.Server/CitadelEnergyCore.cs | 39 +- Game.Server/ColorCorrection.cs | 74 +- Game.Server/ColorCorrectionVolume.cs | 43 +- Game.Server/DustTrail.cs | 89 +- Game.Server/DynamicLight.cs | 51 +- Game.Server/Embers.cs | 33 +- Game.Server/EntityDissolve.cs | 69 +- Game.Server/EntityFlame.cs | 20 +- Game.Server/EntityParticleTrail.cs | 61 +- Game.Server/EnvAmbientLight.cs | 15 +- Game.Server/EnvDetailController.cs | 23 +- Game.Server/EnvHeadcrabCanister.cs | 133 +-- Game.Server/EnvParticleScript.cs | 15 +- Game.Server/EnvProjectedTexture.cs | 98 +- Game.Server/EnvQuadraticBeam.cs | 35 +- Game.Server/EnvScreenEffect.cs | 21 +- Game.Server/EnvScreenOverlay.cs | 42 +- Game.Server/EnvStarfield.cs | 21 +- Game.Server/EnvTonemapController.cs | 49 +- Game.Server/EnvWind.cs | 36 +- Game.Server/FireSmoke.cs | 45 +- Game.Server/FireTrail.cs | 21 +- Game.Server/Fish.cs | 51 +- Game.Server/Flare.cs | 39 +- Game.Server/FleshEffectTarget.cs | 21 +- Game.Server/FlexManipulate.cs | 29 +- Game.Server/FogController.cs | 53 +- Game.Server/FuncAreaPortalWindow.cs | 34 +- Game.Server/FuncConveyor.cs | 15 +- Game.Server/FuncMonitor.cs | 8 +- Game.Server/FuncOccluder.cs | 24 +- Game.Server/FuncReflectiveGlass.cs | 8 +- Game.Server/FuncRotating.cs | 47 +- Game.Server/FuncSmokeVolume.cs | 66 +- Game.Server/FuncTrackTrain.cs | 8 +- Game.Server/Func_Dust.cs | 81 +- Game.Server/Func_LOD.cs | 21 +- Game.Server/Game.Server.csproj | 2 - Game.Server/GameInterface.cs | 2 +- Game.Server/GarrysMod/GMOD_Player.cs | 139 +-- Game.Server/GarrysMod/LuaNextBot.cs | 14 +- Game.Server/HL1/BaseHL1CombatWeapon.cs | 8 +- Game.Server/HL1/BaseHL1MPCombatWeapon.cs | 8 +- Game.Server/HL1/BaseHelicopter_HL1.cs | 8 +- Game.Server/HL2/AR2Explosion.cs | 15 +- Game.Server/HL2/AlyxEmpEffect.cs | 25 +- Game.Server/HL2/BaseHelicopter.cs | 15 +- Game.Server/HL2/HL2PlayerLocalData.cs | 72 +- Game.Server/HL2/HL2_Player.cs | 31 +- Game.Server/HL2/InfoTeleporterCountdown.cs | 31 +- Game.Server/HL2/PropAirboat.cs | 35 +- Game.Server/HL2/PropCombineBall.cs | 33 +- Game.Server/HL2/PropVehiclePrisonerPod.cs | 54 +- Game.Server/HL2/WeaponAlyxGun.cs | 8 +- Game.Server/HL2/WeaponAnnabelle.cs | 8 +- Game.Server/HL2/Weapon_Stubs_HL2.cs | 37 +- Game.Server/HL2MP/HL2MP_Player.cs | 139 +-- Game.Server/Hierarchy.cs | 2 +- Game.Server/InfoOverlayAccessor.cs | 17 +- Game.Server/LightGlow.cs | 67 +- Game.Server/MaterialModifyControl.cs | 81 +- Game.Server/MortarShell.cs | 27 +- Game.Server/MovieExplosion.cs | 7 +- Game.Server/NPC_AntlionGuard.cs | 27 +- Game.Server/NPC_Barnacle.cs | 35 +- Game.Server/NPC_Barney.cs | 9 +- Game.Server/NPC_CombineGunship.cs | 17 +- Game.Server/NPC_Manhack.cs | 27 +- Game.Server/NPC_Portal_FloorTurret.cs | 27 +- Game.Server/NPC_Puppet.cs | 26 +- Game.Server/NPC_RocketTurret.cs | 27 +- Game.Server/NPC_RollerMine.cs | 35 +- Game.Server/NPC_Strider.cs | 26 +- Game.Server/NPC_Vortigaunt.cs | 27 +- Game.Server/NavMesh/NavEntities.cs | 10 +- Game.Server/NextBot/NextBotCombatCharacter.cs | 6 +- Game.Server/ParticlePerformanceMonitor.cs | 21 +- Game.Server/ParticleSmokeGrenade.cs | 35 +- Game.Server/ParticleSystem.cs | 64 +- Game.Server/PhysMagnet.cs | 8 +- Game.Server/PhysObj.cs | 8 +- Game.Server/Plasma.cs | 45 +- Game.Server/Player.cs | 239 +++-- Game.Server/PlayerLocalData.cs | 250 +++-- Game.Server/PlayerResource.cs | 85 +- Game.Server/PointCamera.cs | 81 +- Game.Server/PointWorldText.cs | 57 +- Game.Server/PoseController.cs | 75 +- Game.Server/Precipitation.cs | 39 +- Game.Server/PrecipitationBlocker.cs | 9 +- Game.Server/PropCrane.cs | 44 +- Game.Server/PropEnergyBall.cs | 21 +- Game.Server/PropJeep.cs | 50 +- Game.Server/PropScalable.cs | 63 +- Game.Server/PropVehicleChoreoGeneric.cs | 100 +- Game.Server/PropVehicleDriveable.cs | 94 +- Game.Server/Props.cs | 123 +-- Game.Server/RagdollManager.cs | 19 +- Game.Server/RagdollProp.cs | 49 +- Game.Server/RagdollPropAttached.cs | 36 +- Game.Server/RocketTrail.cs | 101 +- Game.Server/Rope.cs | 144 +-- Game.Server/RotorWashEmitter.cs | 15 +- Game.Server/RpgRocket.cs | 9 +- Game.Server/SceneEntity.cs | 41 +- Game.Server/ScriptIntro.cs | 127 +-- Game.Server/ServerNetworkProperty.cs | 2 +- Game.Server/ShadowControl.cs | 41 +- Game.Server/SlideshowDisplay.cs | 57 +- Game.Server/SmokeStack.cs | 107 +- Game.Server/SmokeTrail.cs | 101 +- Game.Server/Soundscape.cs | 10 +- Game.Server/SoundscapeSystem.cs | 2 +- Game.Server/SpatialEntity.cs | 37 +- Game.Server/SporeExplosion.cs | 53 +- Game.Server/SporeTrail.cs | 53 +- Game.Server/SpotlightEnd.cs | 21 +- Game.Server/SteamJet.cs | 75 +- Game.Server/Sun.cs | 64 +- Game.Server/TEAntlionDust.cs | 19 +- Game.Server/TEArmorRicochet.cs | 10 +- Game.Server/TEBSPDecal.cs | 21 +- Game.Server/TEBeamEntPoint.cs | 25 +- Game.Server/TEBeamEnts.cs | 17 +- Game.Server/TEBeamFollow.cs | 13 +- Game.Server/TEBeamLaser.cs | 17 +- Game.Server/TEBeamPoints.cs | 17 +- Game.Server/TEBeamRing.cs | 17 +- Game.Server/TEBeamRingPoint.cs | 21 +- Game.Server/TEBeamSpline.cs | 20 +- Game.Server/TEBloodSprite.cs | 39 +- Game.Server/TEBloodStream.cs | 33 +- Game.Server/TEBreakModel.cs | 47 +- Game.Server/TEBubbleTrail.cs | 33 +- Game.Server/TEBubbles.cs | 33 +- Game.Server/TEClientProjectile.cs | 29 +- Game.Server/TEConcussiveExplosion.cs | 25 +- Game.Server/TEDecal.cs | 29 +- Game.Server/TEDust.cs | 21 +- Game.Server/TEDynamicLight.cs | 41 +- Game.Server/TEEffectDispatch.cs | 13 +- Game.Server/TEEnergySplash.cs | 23 +- Game.Server/TEExplosion.cs | 25 +- Game.Server/TEFizz.cs | 25 +- Game.Server/TEFootprintDecal.cs | 25 +- Game.Server/TEGaussExplosion.cs | 17 +- Game.Server/TEGlowSprite.cs | 29 +- Game.Server/TEHL2MPFireBullets.cs | 55 +- Game.Server/TEKillPlayerAttachments.cs | 13 +- Game.Server/TELargeFunnel.cs | 13 +- Game.Server/TEMetalSparks.cs | 19 +- Game.Server/TEMuzzleFlash.cs | 25 +- Game.Server/TEParticleSystem.cs | 15 +- Game.Server/TEPhysicsProp.cs | 47 +- Game.Server/TEPlayerAnimEvent.cs | 23 +- Game.Server/TEPlayerDecal.cs | 21 +- Game.Server/TEProjectedDecal.cs | 25 +- Game.Server/TEShatterSurface.cs | 53 +- Game.Server/TEShowLine.cs | 13 +- Game.Server/TESmoke.cs | 25 +- Game.Server/TESparks.cs | 21 +- Game.Server/TESprite.cs | 25 +- Game.Server/TESpriteSpray.cs | 33 +- Game.Server/TEWorldDecal.cs | 17 +- Game.Server/Team.cs | 60 +- Game.Server/Tesla.cs | 21 +- Game.Server/TriggerPlayerMovement.cs | 8 +- Game.Server/Triggers.cs | 19 +- Game.Server/VGuiScreen.cs | 56 +- Game.Server/VortigauntChargeToken.cs | 15 +- Game.Server/VortigauntEffectDispel.cs | 15 +- Game.Server/WaterBullet.cs | 9 +- Game.Server/WaterLODControl.cs | 24 +- Game.Server/World.cs | 63 +- Game.Shared/AnimationLayer.cs | 45 +- Game.Shared/BaseCombatCharacterShared.cs | 6 +- Game.Shared/BaseCombatWeaponShared.cs | 336 +++--- Game.Shared/BaseDoor.cs | 21 +- Game.Shared/BaseEntityShared.cs | 4 +- Game.Shared/BaseGrenade.cs | 63 +- Game.Shared/BaseParticleEntity.cs | 22 +- Game.Shared/BasePlayerShared.cs | 10 +- Game.Shared/BaseToggle.cs | 44 +- Game.Shared/BaseViewModel.cs | 102 +- Game.Shared/Beam.cs | 231 ++--- Game.Shared/CollisionProperty.cs | 200 ++-- Game.Shared/Color32Proxy.cs | 16 + Game.Shared/EffectData.cs | 172 ++-- Game.Shared/EnvWindShared.cs | 80 +- Game.Shared/FuncLadder.cs | 50 +- Game.Shared/GameMovement.cs | 14 +- Game.Shared/GameRules.cs | 24 +- .../GarrysMod/BaseHL2MPBludgeonWeapon.cs | 24 +- Game.Shared/GarrysMod/GMODGameRules.cs | 55 +- Game.Shared/GarrysMod/HL2MPMachineGun.cs | 35 +- Game.Shared/GarrysMod/LuaEntity.cs | 20 +- Game.Shared/GarrysMod/LuaPlayer.cs | 2 +- Game.Shared/GarrysMod/PhysBeam.cs | 62 +- Game.Shared/GarrysMod/SENT_AI.cs | 36 +- Game.Shared/GarrysMod/SENT_Anim.cs | 36 +- Game.Shared/GarrysMod/SENT_Point.cs | 36 +- Game.Shared/GarrysMod/ScriptedEntity.cs | 20 +- Game.Shared/GarrysMod/Weapon357.cs | 26 +- Game.Shared/GarrysMod/WeaponAR2.cs | 24 +- Game.Shared/GarrysMod/WeaponBugBait.cs | 43 +- Game.Shared/GarrysMod/WeaponCrossbow.cs | 52 +- Game.Shared/GarrysMod/WeaponCrowbar.cs | 26 +- Game.Shared/GarrysMod/WeaponFrag.cs | 51 +- Game.Shared/GarrysMod/WeaponGModBase.cs | 44 +- Game.Shared/GarrysMod/WeaponPhysCannon.cs | 86 +- Game.Shared/GarrysMod/WeaponPhysGun.cs | 69 +- Game.Shared/GarrysMod/WeaponPistol.cs | 78 +- Game.Shared/GarrysMod/WeaponRPG.cs | 89 +- Game.Shared/GarrysMod/WeaponSLAM.cs | 100 +- Game.Shared/GarrysMod/WeaponSMG1.cs | 24 +- Game.Shared/GarrysMod/WeaponSWEP.cs | 50 +- Game.Shared/GarrysMod/WeaponShotgun.cs | 61 +- Game.Shared/GarrysMod/WeaponStunStick.cs | 37 +- Game.Shared/HL1/Weapon357_HL1.cs | 35 +- Game.Shared/HL1/WeaponCrossbow_HL1.cs | 35 +- Game.Shared/HL1/WeaponCrowbar_HL1.cs | 23 +- Game.Shared/HL1/WeaponEgon.cs | 23 +- Game.Shared/HL1/WeaponGauss.cs | 75 +- Game.Shared/HL1/WeaponGlock.cs | 23 +- Game.Shared/HL1/WeaponHandGrenade.cs | 43 +- Game.Shared/HL1/WeaponHgun.cs | 43 +- Game.Shared/HL1/WeaponMP5.cs | 23 +- Game.Shared/HL1/WeaponRPG_HL1.cs | 81 +- Game.Shared/HL1/WeaponSatchel.cs | 67 +- Game.Shared/HL1/WeaponShotgun_HL1.cs | 43 +- Game.Shared/HL1/WeaponSnark.cs | 35 +- Game.Shared/HL1/WeaponTripMine.cs | 43 +- Game.Shared/HL2/BaseHLCombatWeapon.cs | 18 +- Game.Shared/HL2/HL_GameMovement.cs | 4 +- Game.Shared/HL2MP/HL2MPGameRules.cs | 55 +- Game.Shared/InfoLadderDismount.cs | 22 +- Game.Shared/ParticleParse.cs | 8 +- Game.Shared/PhysicsMainShared.cs | 2 +- Game.Shared/PlayerNetVars.cs | 58 +- Game.Shared/PlayerState.cs | 26 + Game.Shared/PredictedViewModel.cs | 20 +- Game.Shared/Sprite.cs | 143 ++- Game.Shared/SpriteTrail.cs | 78 +- .../NetworkClassRegistrationGenerator.cs | 239 ----- .../Source.CodeAnalysis.NetworkClasses.csproj | 19 - .../NetworkVarGenerator.FieldAccessors.cs | 25 +- .../NetworkVarGenerator.Tables.cs | 962 ++++++++++++++++++ .../NetworkVarGenerator.cs | 118 ++- Source.Common/BoneSetup.cs | 6 +- Source.Common/ClientClass.cs | 59 +- Source.Common/DataMap.cs | 17 +- Source.Common/DtRecv.cs | 6 - Source.Common/DtSend.cs | 6 - Source.Common/FieldAccessors.cs | 6 +- .../{PlayerState.cs => PlayerEngineState.cs} | 4 +- Source.Common/Server/IServerGameDLL.cs | 2 +- Source.Common/ServerClass.cs | 110 +- Source.Engine/Server/GameClient.cs | 2 +- Source.NET.slnx | 3 - 458 files changed, 9804 insertions(+), 9921 deletions(-) create mode 100644 Game.Shared/Color32Proxy.cs create mode 100644 Game.Shared/PlayerState.cs delete mode 100644 Source.CodeAnalysis.NetworkClasses/NetworkClassRegistrationGenerator.cs delete mode 100644 Source.CodeAnalysis.NetworkClasses/Source.CodeAnalysis.NetworkClasses.csproj create mode 100644 Source.CodeAnalysis.NetworkVars/NetworkVarGenerator.Tables.cs rename Source.Common/{PlayerState.cs => PlayerEngineState.cs} (80%) diff --git a/Game.Client/C_AI_BaseNPC.cs b/Game.Client/C_AI_BaseNPC.cs index aee1645a..7ceec49d 100644 --- a/Game.Client/C_AI_BaseNPC.cs +++ b/Game.Client/C_AI_BaseNPC.cs @@ -6,36 +6,34 @@ namespace Game.Client; -using FIELD = FIELD; - [NetworkName("CAI_BaseNPC")] -public class C_AI_BaseNPC : C_BaseCombatCharacter +public partial class C_AI_BaseNPC : C_BaseCombatCharacter { - public static readonly RecvTable DT_AI_BaseNPC = new(DT_BaseCombatCharacter, [ - RecvPropInt(FIELD.OF(nameof(LifeState))), - RecvPropBool(FIELD.OF(nameof(PerformAvoidance))), - RecvPropBool(FIELD.OF(nameof(IsMoving))), - RecvPropBool(FIELD.OF(nameof(FadeCorpse))), - RecvPropInt(FIELD.OF(nameof(DeathPose))), - RecvPropInt(FIELD.OF(nameof(DeathFrame))), - RecvPropBool(FIELD.OF(nameof(ImportantRagdoll))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_AI_BaseNPC); - - [NetworkName("m_bPerformAvoidance")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(LifeState), + nameof(PerformAvoidance), + nameof(IsMoving), + nameof(FadeCorpse), + nameof(DeathPose), + nameof(DeathFrame), + nameof(ImportantRagdoll), + ]; + + [NetworkVar("m_bPerformAvoidance")] public bool PerformAvoidance; - [NetworkName("m_bIsMoving")] + [NetworkVar("m_bIsMoving")] public bool IsMoving; - [NetworkName("m_bFadeCorpse")] + [NetworkVar("m_bFadeCorpse")] public bool FadeCorpse; - [NetworkName("m_iDeathPose")] + [NetworkVar("m_iDeathPose")] public int DeathPose; - [NetworkName("m_iDeathFrame")] + [NetworkVar("m_iDeathFrame")] public int DeathFrame; public bool SpeedModActive; public int SpeedModRadius; public int SpeedModSpeed; - [NetworkName("m_bImportanRagdoll")] + [NetworkVar("m_bImportanRagdoll")] public bool ImportantRagdoll; public float TimePingEffect; diff --git a/Game.Client/C_BaseAnimating.cs b/Game.Client/C_BaseAnimating.cs index e7563b73..54896daf 100644 --- a/Game.Client/C_BaseAnimating.cs +++ b/Game.Client/C_BaseAnimating.cs @@ -22,20 +22,18 @@ using ClientModelRenderInfo = Source.Common.Engine.ModelRenderInfo; using Color = Source.Color; -using DEFINE = Source.DEFINE; using FIELD = Source.FIELD; -using FIELD_ILR = Source.FIELD; namespace Game.Client; [NetworkName("CInfoLightingRelative")] public partial class C_InfoLightingRelative : C_BaseEntity { - public static readonly RecvTable DT_InfoLightingRelative = new(DT_BaseEntity, [ - RecvPropEHandle(FIELD_ILR.OF(nameof(LightingLandmark))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_InfoLightingRelative); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(LightingLandmark), + ]; - [NetworkName("m_hLightingLandmark")] + [NetworkVar("m_hLightingLandmark")] public EHANDLE LightingLandmark = new(); } @@ -904,55 +902,60 @@ public bool IsSequenceLooping(StudioHdr? studioHdr, int sequence) { return (Animation.GetSequenceFlags(studioHdr, sequence) & StudioAnimSeqFlags.Looping) != 0; } - public static readonly RecvTable DT_ServerAnimationData = new(nameof(DT_ServerAnimationData), [ - RecvPropFloat(FIELD.OF(nameof(Cycle))), - ]); - public static readonly new DataMap PredMap = new(typeof(C_BaseAnimating), C_BaseEntity.PredMap, [ - DEFINE.PRED_FIELD( nameof(Skin), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(Body), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.FIELD( nameof(PrevSequence), FieldType.Integer ), - DEFINE.PRED_FIELD( nameof(ResetEventsParity), FieldType.Integer, FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.NoErrorCheck ), - DEFINE.PRED_FIELD( nameof(MuzzleFlashParity), FieldType.Character, FieldTypeDescFlags.InSendTable ), - ]); public override DataMap? GetPredDescMap() => PredMap; - public static readonly RecvTable DT_BaseAnimating = new(DT_BaseEntity, [ - RecvPropInt( FIELD.OF(nameof(ForceBone))), - RecvPropVector( FIELD.OF(nameof(Force))), + [NetworkTable("DT_ServerAnimationData")] + public static readonly NetworkProp[] ServerAnimationDataProps = [ + new(nameof(Cycle)) { Encoding = NetEncoding.Float }, + ]; - RecvPropInt( FIELD.OF(nameof(Skin))), - RecvPropInt( FIELD.OF(nameof(Body))), + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(Skin), + nameof(Body), + nameof(PrevSequence), + new(nameof(ResetEventsParity)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.NoErrorCheck }, + nameof(MuzzleFlashParity), + ]; - RecvPropInt( FIELD.OF(nameof(HitboxSet))), + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Sequence)) { Proxy = typeof(SequenceProxy) }, + nameof(ForceBone), + nameof(Force), - RecvPropFloat( FIELD.OF(nameof(ModelScale))), + nameof(Skin), + nameof(Body), - RecvPropArray3( FIELD.OF_ARRAY(nameof(PoseParameter)), RecvPropFloat(null!)), + nameof(HitboxSet), - RecvPropInt( FIELD.OF(nameof(Sequence)), 0, RecvProxy_Sequence), - RecvPropFloat( FIELD.OF(nameof(PlaybackRate))), + nameof(ModelScale), - RecvPropArray3(FIELD.OF_ARRAY(nameof(EncodedController)), RecvPropFloat(null!) ), + nameof(PoseParameter), - RecvPropInt( FIELD.OF(nameof( ClientSideAnimation ))), - RecvPropInt( FIELD.OF(nameof( ClientSideFrameReset ))), + nameof(PlaybackRate), - RecvPropInt( FIELD.OF(nameof( NewSequenceParity) )), - RecvPropInt( FIELD.OF(nameof( ResetEventsParity ))), - RecvPropInt( FIELD.OF(nameof( MuzzleFlashParity ))), + nameof(EncodedController), - RecvPropEHandle( FIELD.OF(nameof( LightingOrigin )) ), - RecvPropEHandle( FIELD.OF(nameof( LightingOriginRelative )) ), + new(nameof(ClientSideAnimation)) { Encoding = NetEncoding.Int }, + new(nameof(ClientSideFrameReset)) { Encoding = NetEncoding.Int }, - RecvPropDataTable( "serveranimdata", DT_ServerAnimationData ), + nameof(NewSequenceParity), + nameof(ResetEventsParity), + nameof(MuzzleFlashParity), - RecvPropFloat( FIELD.OF(nameof(FadeMinDist) )), - RecvPropFloat( FIELD.OF(nameof(FadeMaxDist ))), - RecvPropFloat( FIELD.OF(nameof(FadeScale ))), + nameof(LightingOrigin), + nameof(LightingOriginRelative), + + new(nameof(ServerAnimationDataProps)) { Name = "serveranimdata" }, + + nameof(FadeMinDist), + nameof(FadeMaxDist), + nameof(FadeScale), // Gmod specific - RecvPropEHandle(FIELD.OF(nameof(BoneManipulator))), - RecvPropEHandle(FIELD.OF(nameof(FlexManipulator))), - RecvPropVector(FIELD.OF(nameof(OverrideViewTarget))), - ]); + nameof(BoneManipulator), + nameof(FlexManipulator), + nameof(OverrideViewTarget), + ]; private static void RecvProxy_Sequence(ref readonly RecvProxyData data, object instance, IFieldAccessor field) { RecvProxy_Int32ToInt32(in data, instance, field); @@ -962,10 +965,15 @@ private static void RecvProxy_Sequence(ref readonly RecvProxyData data, object i animating.SetReceivedSequence(); animating.UpdateVisibility(); } + + public static class SequenceProxy + { + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_Sequence(in data, instance, field); + } + public virtual void DoMuzzleFlash() => MuzzleFlashParity = unchecked((byte)((MuzzleFlashParity + 1) & ((1 << (int)EntityEffects.MuzzleflashBits) - 1))); - public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseAnimating); protected override StudioHdr? OnNewModel() { InvalidateMdlCache(); int i; @@ -1888,43 +1896,43 @@ public override void GetAimEntOrigin(C_BaseEntity attachedTo, out Vector3 origin } } - [NetworkName("m_nSequence")] + [NetworkVar("m_nSequence")] public int Sequence; - [NetworkName("m_nForceBone")] + [NetworkVar("m_nForceBone")] public int ForceBone; - [NetworkName("m_vecForce")] + [NetworkVar("m_vecForce")] public Vector3 Force; - [NetworkName("m_nSkin")] + [NetworkVar("m_nSkin")] public int Skin; - [NetworkName("m_nBody")] + [NetworkVar("m_nBody")] public int Body; - [NetworkName("m_nHitboxSet")] + [NetworkVar("m_nHitboxSet")] public int HitboxSet; public int GetHitboxSet() => HitboxSet; - [NetworkName("m_flModelScale")] + [NetworkVar("m_flModelScale")] public float ModelScale = 1.0f; - [NetworkName("m_flPlaybackRate")] + [NetworkVar("m_flPlaybackRate")] public float PlaybackRate; - [NetworkName("m_bClientSideAnimation")] + [NetworkVar("m_bClientSideAnimation")] public bool ClientSideAnimation; public bool LastClientSideFrameReset; - [NetworkName("m_bClientSideFrameReset")] + [NetworkVar("m_bClientSideFrameReset")] public bool ClientSideFrameReset; - [NetworkName("m_nNewSequenceParity")] + [NetworkVar("m_nNewSequenceParity")] public int NewSequenceParity; - [NetworkName("m_nResetEventsParity")] + [NetworkVar("m_nResetEventsParity")] public int ResetEventsParity; public byte OldMuzzleFlashParity; - [NetworkName("m_nMuzzleFlashParity")] + [NetworkVar("m_nMuzzleFlashParity")] public byte MuzzleFlashParity; - [NetworkName("m_hLightingOrigin")] + [NetworkVar("m_hLightingOrigin")] public EHANDLE LightingOrigin = new(); - [NetworkName("m_hLightingOriginRelative")] + [NetworkVar("m_hLightingOriginRelative")] public EHANDLE LightingOriginRelative = new(); - [NetworkName("m_pBoneManipulator")] + [NetworkVar("m_pBoneManipulator")] public EHANDLE BoneManipulator = new(); - [NetworkName("m_pFlexManipulator")] + [NetworkVar("m_pFlexManipulator")] public EHANDLE FlexManipulator = new(); public EHANDLE ClientFlexManipulator = new(); @@ -1951,25 +1959,25 @@ public override void GetAimEntOrigin(C_BaseEntity attachedTo, out Vector3 origin return null; } - [NetworkName("m_OverrideViewTarget")] + [NetworkVar("m_OverrideViewTarget")] public Vector3 OverrideViewTarget; - [NetworkName("m_fadeMinDist")] + [NetworkVar("m_fadeMinDist")] public float FadeMinDist; - [NetworkName("m_fadeMaxDist")] + [NetworkVar("m_fadeMaxDist")] public float FadeMaxDist; - [NetworkName("m_flFadeScale")] + [NetworkVar("m_flFadeScale")] public float FadeScale; - [NetworkName("m_flCycle")] + [NetworkVar("m_flCycle")] public TimeUnit_t Cycle; public readonly InterpolatedVar iv_Cycle; public readonly InterpolatedVarArray iv_flPoseParameter; - [NetworkName("m_flPoseParameter")] + [NetworkVar("m_flPoseParameter")] public InlineArrayMaxStudioPoseParam PoseParameter; public InlineArrayMaxStudioPoseParam OldPoseParameters; public float PrevEventCycle; public int EventSequence; - [NetworkName("m_flEncodedController")] + [NetworkVar("m_flEncodedController")] public InlineArrayMaxStudioBoneCtrls EncodedController; public InlineArrayMaxStudioBoneCtrls OldEncodedController; } diff --git a/Game.Client/C_BaseAnimatingOverlay.cs b/Game.Client/C_BaseAnimatingOverlay.cs index 6bf17f87..742c13d7 100644 --- a/Game.Client/C_BaseAnimatingOverlay.cs +++ b/Game.Client/C_BaseAnimatingOverlay.cs @@ -5,16 +5,25 @@ using System.Numerics; using System.Runtime.CompilerServices; -using FIELD = Source.FIELD; - namespace Game.Client; [NetworkName("CBaseAnimatingOverlay")] public partial class C_BaseAnimatingOverlay : C_BaseAnimating { - public static readonly RecvTable DT_OverlayVars = new(nameof(DT_OverlayVars), [ - RecvPropList(FIELD.OF_LIST(nameof(AnimOverlay), MAX_OVERLAYS), ResizeAnimationLayerCallback, RecvPropDataTable(null!, AnimationLayerRef.DT_Animationlayer)) - ]); + [NetworkTable("DT_OverlayVars")] + public static readonly NetworkProp[] OverlayVarsProps = [ + new(nameof(AnimOverlay)) { Encoding = NetEncoding.List, Count = MAX_OVERLAYS, DataTable = "DT_Animationlayer", Proxy = typeof(AnimOverlayProxy) }, + ]; + + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(OverlayVarsProps)) { Name = "overlay_vars" }, + ]; + + public static class AnimOverlayProxy + { + public static void Resize(object instance, object list, int len) => ResizeAnimationLayerCallback(instance, list, len); + } public C_BaseAnimatingOverlay() : base() { for (int i = 0; i < MAX_OVERLAYS; i++) { @@ -71,12 +80,7 @@ private static void ResizeAnimationLayerCallback(object instance, object list, i } } - - public static readonly RecvTable DT_BaseAnimatingOverlay = new(DT_BaseAnimating, [ - RecvPropDataTable("overlay_vars", DT_OverlayVars) - ]); public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseAnimatingOverlay); - - [NetworkName("m_AnimOverlay")] + [NetworkVar("m_AnimOverlay")] readonly List AnimOverlay = []; readonly List> iv_AnimOverlay = []; public readonly float[] OverlayPrevEventCycle = new float[MAX_OVERLAYS]; diff --git a/Game.Client/C_BaseBeam.cs b/Game.Client/C_BaseBeam.cs index 08a2833f..48aabadf 100644 --- a/Game.Client/C_BaseBeam.cs +++ b/Game.Client/C_BaseBeam.cs @@ -3,57 +3,56 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("CTEBaseBeam")] -public class C_BaseBeam : C_BaseTempEntity +[NetworkName("CTEBaseBeam", Table = "DT_BaseBeam", NoBase = true)] +public partial class C_BaseBeam : C_BaseTempEntity { - public static readonly RecvTable DT_BaseBeam = new([ - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - RecvPropInt(FIELD.OF(nameof(HaloIndex))), - RecvPropInt(FIELD.OF(nameof(StartFrame))), - RecvPropInt(FIELD.OF(nameof(FrameRate))), - RecvPropFloat(FIELD.OF(nameof(Life))), - RecvPropFloat(FIELD.OF(nameof(Width))), - RecvPropFloat(FIELD.OF(nameof(EndWidth))), - RecvPropInt(FIELD.OF(nameof(FadeLength))), - RecvPropFloat(FIELD.OF(nameof(Amplitude))), - RecvPropInt(FIELD.OF(nameof(Speed))), - RecvPropInt(FIELD.OF(nameof(R))), - RecvPropInt(FIELD.OF(nameof(G))), - RecvPropInt(FIELD.OF(nameof(B))), - RecvPropInt(FIELD.OF(nameof(A))), - RecvPropInt(FIELD.OF(nameof(Flags))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseBeam); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(HaloIndex)) { Bits = 14 }, + new(nameof(StartFrame)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(FrameRate)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Life)) { Bits = 8, Low = 0.0f, High = 25.6f }, + new(nameof(Width)) { Bits = 10, Low = 0.0f, High = 128.0f }, + new(nameof(EndWidth)) { Bits = 10, Low = 0.0f, High = 128.0f }, + new(nameof(FadeLength)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Amplitude)) { Bits = 8, Low = 0.0f, High = 64.0f }, + new(nameof(Speed)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(R)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(G)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(B)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(A)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Flags)) { Bits = 20, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_nHaloIndex")] + [NetworkVar("m_nHaloIndex")] public int HaloIndex; - [NetworkName("m_nStartFrame")] + [NetworkVar("m_nStartFrame")] public int StartFrame; - [NetworkName("m_nFrameRate")] + [NetworkVar("m_nFrameRate")] public int FrameRate; - [NetworkName("m_fLife")] + [NetworkVar("m_fLife")] public float Life; - [NetworkName("m_fWidth")] + [NetworkVar("m_fWidth")] public float Width; - [NetworkName("m_fEndWidth")] + [NetworkVar("m_fEndWidth")] public float EndWidth; - [NetworkName("m_nFadeLength")] + [NetworkVar("m_nFadeLength")] public int FadeLength; - [NetworkName("m_fAmplitude")] + [NetworkVar("m_fAmplitude")] public float Amplitude; - [NetworkName("m_nSpeed")] + [NetworkVar("m_nSpeed")] public int Speed; - [NetworkName("r")] + [NetworkVar("r")] public int R; - [NetworkName("g")] + [NetworkVar("g")] public int G; - [NetworkName("b")] + [NetworkVar("b")] public int B; - [NetworkName("a")] + [NetworkVar("a")] public int A; - [NetworkName("m_nFlags")] + [NetworkVar("m_nFlags")] public int Flags; } diff --git a/Game.Client/C_BaseCombatCharacter.cs b/Game.Client/C_BaseCombatCharacter.cs index 1be1bcc3..52e5b7e6 100644 --- a/Game.Client/C_BaseCombatCharacter.cs +++ b/Game.Client/C_BaseCombatCharacter.cs @@ -5,52 +5,52 @@ using Source.Common.Physics; using Source.GUI.Controls; -using DEFINE = Source.DEFINE; -using FIELD = Source.FIELD; - namespace Game.Client; [NetworkName("CBaseCombatCharacter")] public partial class C_BaseCombatCharacter : C_BaseFlex { - public static readonly RecvTable DT_BCCLocalPlayerExclusive = new(nameof(DT_BCCLocalPlayerExclusive), [ - RecvPropTime64(FIELD.OF(nameof(NextAttack))), - ]); - public override bool IsBaseCombatCharacter() => true; + [NetworkTable("DT_BCCLocalPlayerExclusive")] + public static readonly NetworkProp[] BCCLocalPlayerExclusiveProps = [ + nameof(NextAttack), + ]; - public static readonly new DataMap PredMap = new(typeof(C_BaseCombatCharacter), C_BaseFlex.PredMap, [ - DEFINE.PRED_ARRAY( nameof(Ammo), FieldType.Integer, MAX_AMMO_TYPES, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(NextAttack), FieldType.Double, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(ActiveWeapon), FieldType.EHandle, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_ARRAY( nameof(MyWeapons), FieldType.EHandle, MAX_WEAPONS, FieldTypeDescFlags.InSendTable ), - ]); public override DataMap? GetPredDescMap() => PredMap; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(BCCLocalPlayerExclusiveProps)) { Name = "bcc_localdata" }, + nameof(ActiveWeapon), + nameof(MyWeapons), + nameof(BloodColor), + ]; + + public override bool IsBaseCombatCharacter() => true; - public static readonly RecvTable DT_BaseCombatCharacter = new(DT_BaseFlex, [ - RecvPropDataTable( "bcc_localdata", DT_BCCLocalPlayerExclusive ), - RecvPropEHandle(FIELD.OF(nameof(ActiveWeapon))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(MyWeapons)), RecvPropEHandle( FIELD.OF_ARRAY(nameof(MyWeapons)))), - RecvPropInt(FIELD.OF(nameof(BloodColor))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseCombatCharacter); + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + new(nameof(Ammo)) { Flags = FieldTypeDescFlags.InSendTable }, + nameof(NextAttack), + nameof(ActiveWeapon), + nameof(MyWeapons), + ]; public C_BaseCombatWeapon? GetWeapon(int i) => MyWeapons[i].Get(); public TimeUnit_t GetNextAttack() => NextAttack; public void SetNextAttack(TimeUnit_t wait) => NextAttack = wait; - [NetworkName("m_flNextAttack")] + [NetworkVar("m_flNextAttack")] public TimeUnit_t NextAttack; - [NetworkName("m_hLastWeapon")] + [NetworkVar("m_hLastWeapon")] public Handle LastWeapon = new(); - [NetworkName("m_hActiveWeapon")] + [NetworkVar("m_hActiveWeapon")] public Handle ActiveWeapon = new(); - [NetworkName("m_hMyWeapons")] + [NetworkVar("m_hMyWeapons")] public InlineArrayNewMaxWeapons> MyWeapons = new(); - [NetworkName("m_iAmmo")] - [NetworkArraySize(MAX_AMMO_TYPES)] public readonly NetworkArray Ammo = new(MAX_AMMO_TYPES); + [NetworkVar("m_iAmmo")] + public partial ref readonly InlineArray256 Ammo { get; } - [NetworkName("m_bloodColor")] + [NetworkVar("m_bloodColor")] public BloodColor BloodColor; public int WeaponCount() => MAX_WEAPONS; diff --git a/Game.Client/C_BaseCombatWeapon.cs b/Game.Client/C_BaseCombatWeapon.cs index 8b839991..d05286d1 100644 --- a/Game.Client/C_BaseCombatWeapon.cs +++ b/Game.Client/C_BaseCombatWeapon.cs @@ -10,6 +10,10 @@ namespace Game.Client; public partial class C_BaseCombatWeapon : C_BaseAnimating { + public C_BaseCombatWeapon() { + Owner = new(); + } + public override bool IsBaseCombatWeapon() => true; public override GarrysMod.LuaClass Lua_GetLuaClass() => GarrysMod.LuaEntity.LC_Weapon; public bool Dropped; diff --git a/Game.Client/C_BaseEntity.cs b/Game.Client/C_BaseEntity.cs index e5bc269b..4948787f 100644 --- a/Game.Client/C_BaseEntity.cs +++ b/Game.Client/C_BaseEntity.cs @@ -145,9 +145,106 @@ internal void RemoveFromPredictablesList(in ClientEntityHandle remove) { private readonly List Predictables = []; } -[NetworkName("CBaseEntity")] +[NetworkName("CBaseEntity", NoBase = true)] public partial class C_BaseEntity : IClientEntity { + [NetworkTable("DT_AnimTimeMustBeFirst")] + public static readonly NetworkProp[] AnimTimeMustBeFirstProps = [ + new(nameof(AnimTime)) { Encoding = NetEncoding.Int, Proxy = typeof(AnimTimeProxy) }, + ]; + + [NetworkTable("DT_PredictableId")] + public static readonly NetworkProp[] PredictableIdProps = [ + new(nameof(PredictableID)) { Encoding = NetEncoding.PredictableId }, + new(nameof(b_IsPlayerSimulated)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + ]; + + [NetworkTable] + public static readonly NetworkProp[] Props = [ + nameof(AnimTimeMustBeFirstProps), + new(nameof(SimulationTime)) { Encoding = NetEncoding.Int, Proxy = typeof(SimulationTimeProxy) }, + nameof(InterpolationFrame), + nameof(NetworkOrigin), + nameof(NetworkAngles), + new(nameof(ModelIndex)) { Encoding = NetEncoding.Int, Proxy = typeof(ModelIndexProxy) }, + new(nameof(Effects)) { Proxy = typeof(EffectFlagsProxy) }, + nameof(RenderMode), + nameof(RenderFX), + new(nameof(ColorRender)) { Encoding = NetEncoding.Int }, + nameof(TeamNum), + nameof(CollisionGroup), + nameof(Elasticity), + nameof(ShadowCastDistance), + new(nameof(OwnerEntity)) { Proxy = typeof(OwnerEntityProxy) }, + nameof(EffectEntity), + new(nameof(NetworkMoveParent)) { Encoding = NetEncoding.Int, Proxy = typeof(MoveParentProxy) }, + nameof(ParentAttachment), + new(nameof(MoveType)) { Proxy = typeof(MoveTypeProxy) }, + new(nameof(MoveCollide)) { Proxy = typeof(MoveCollideProxy) }, + new(nameof(Collision)) { Encoding = NetEncoding.DataTable, DataTable = "DT_CollisionProperty" }, + new(nameof(TextureFrameIndex)) { Encoding = NetEncoding.Int }, + new(nameof(PredictableIdProps)) { Name = "predictable_id" }, + new(nameof(SimulatedEveryTick)) { Encoding = NetEncoding.Int, Proxy = typeof(InterpolationAmountProxy) }, + new(nameof(AnimatedEveryTick)) { Encoding = NetEncoding.Int, Proxy = typeof(InterpolationAmountProxy) }, + nameof(AlternateSorting), + nameof(m_takedamage), + nameof(RealClassName), + nameof(OverrideMaterial), + new(nameof(OverrideSubMaterials)) { Encoding = NetEncoding.Array2 }, + nameof(Health), + nameof(MaxHealth), + nameof(SpawnFlags), + nameof(GModFlags), + nameof(OnFire), + nameof(CreationTime), + new(nameof(Velocity)) { Encoding = NetEncoding.VectorElements, Proxy = typeof(LocalVelocityProxy) }, + new(nameof(GMOD_DataTable)) { Encoding = NetEncoding.GModTable }, + nameof(GMOD_bool), + nameof(GMOD_float), + nameof(GMOD_int), + nameof(GMOD_Vector), + nameof(GMOD_QAngle), + nameof(GMOD_EHANDLE), + new(nameof(GMOD_String0)) { Encoding = NetEncoding.String }, + new(nameof(GMOD_String1)) { Encoding = NetEncoding.String }, + new(nameof(GMOD_String2)) { Encoding = NetEncoding.String }, + new(nameof(GMOD_String3)) { Encoding = NetEncoding.String }, + nameof(CreationID), + nameof(MapCreatedID), + ]; + + [PredictionTable] + public static readonly PredictionField[] Prediction = [ + nameof(Gravity), + new(nameof(NetworkOrigin)) { Tolerance = coordTolerance }, + new(nameof(NetworkAngles)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.NoErrorCheck }, + new(nameof(ModelIndex)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.ModelIndex }, + nameof(RenderMode), + nameof(RenderFX), + nameof(TeamNum), + nameof(OwnerEntity), + nameof(NetworkMoveParent), + nameof(MoveType), + nameof(MoveCollide), + new(nameof(Collision)) { Embedded = true }, + new(nameof(Velocity)) { Tolerance = 0.5f }, + new(nameof(Friction)) { Flags = FieldTypeDescFlags.InSendTable }, + nameof(BaseVelocity), + nameof(WaterLevel), + new(nameof(ViewOffset)) { Flags = FieldTypeDescFlags.InSendTable, Tolerance = 0.25f }, + nameof(Origin), + nameof(Rotation), + nameof(WaterType), + nameof(AbsOrigin), + nameof(AbsRotation), + nameof(ProxyRandomValue), + nameof(Dormant), + new(nameof(flags)) { Flags = FieldTypeDescFlags.InSendTable }, + new(nameof(eflags)) { Type = FieldType.Integer }, + nameof(AbsVelocity), + nameof(AngVelocity), + ]; + public delegate void BASEPTR(C_BaseEntity self); public delegate void ENTITYFUNCPTR(C_BaseEntity self, C_BaseEntity? other); @@ -510,6 +607,62 @@ private static void cc_cl_interp_all_changed(IConVar ivar, in ConVarChangeContex return null; } + public static class AnimTimeProxy + { + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_AnimTime(in data, instance, field); + } + + public static class SimulationTimeProxy + { + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_SimulationTime(in data, instance, field); + } + + public static class ModelIndexProxy + { + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_IntToModelIndex16_BackCompatible(in data, instance, field); + } + + public static class EffectFlagsProxy + { + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_EffectFlags(in data, instance, field); + } + + public static class OwnerEntityProxy + { + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_OwnerEntity(in data, instance, field); + } + + public static class MoveParentProxy + { + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_IntToMoveParent(in data, instance, field); + } + + public static class MoveTypeProxy + { + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_MoveType(in data, instance, field); + } + + public static class MoveCollideProxy + { + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_MoveCollide(in data, instance, field); + } + + public static class InterpolationAmountProxy + { + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_InterpolationAmountChanged(in data, instance, field); + } + + public static class LocalVelocityProxy + { + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) { + switch (((DynamicAccessor)field).Index) { + case 0: RecvProxy_LocalVelocityX(in data, instance, field); break; + case 1: RecvProxy_LocalVelocityY(in data, instance, field); break; + default: RecvProxy_LocalVelocityZ(in data, instance, field); break; + } + } + } + private static void RecvProxy_AnimTime(ref readonly RecvProxyData data, object instance, IFieldAccessor field) { C_BaseEntity pEntity = (C_BaseEntity)instance; @@ -528,15 +681,8 @@ private static void RecvProxy_EffectFlags(ref readonly RecvProxyData data, objec } - public static RecvTable DT_AnimTimeMustBeFirst = new(nameof(DT_AnimTimeMustBeFirst), [ - RecvPropInt(FIELD.OF(nameof(AnimTime)), 0, RecvProxy_AnimTime), - ]); - public static RecvTable DT_PredictableId = new(nameof(DT_PredictableId), [ - RecvPropPredictableId(FIELD.OF(nameof(PredictableID))), - RecvPropInt(FIELD.OF(nameof(b_IsPlayerSimulated))), - ]); protected static void RecvProxy_SimulationTime(ref readonly RecvProxyData data, object instance, IFieldAccessor field) { C_BaseEntity entity = (C_BaseEntity)instance; @@ -554,80 +700,6 @@ protected static void RecvProxy_SimulationTime(ref readonly RecvProxyData data, entity.SimulationTime = (t * TICK_INTERVAL); } - public static RecvTable DT_BaseEntity = new([ - RecvPropDataTable("AnimTimeMustBeFirst", DT_AnimTimeMustBeFirst), - - RecvPropInt(FIELD.OF(nameof(SimulationTime)), 0, RecvProxy_SimulationTime), - RecvPropInt(FIELD.OF(nameof(InterpolationFrame))), - - RecvPropVector(FIELD.OF_NAMED(nameof(NetworkOrigin), "m_vecOrigin")), - RecvPropQAngles(FIELD.OF_NAMED(nameof(NetworkAngles), "m_angRotation")), - - RecvPropInt(FIELD.OF(nameof(ModelIndex)), 0, RecvProxy_IntToModelIndex16_BackCompatible), - - RecvPropInt(FIELD.OF(nameof(Effects)), 0, RecvProxy_EffectFlags), - RecvPropInt(FIELD.OF(nameof(RenderMode))), - RecvPropInt(FIELD.OF(nameof(RenderFX))), - RecvPropInt(FIELD.OF(nameof(ColorRender))), - RecvPropInt(FIELD.OF(nameof(TeamNum))), - RecvPropInt(FIELD.OF(nameof(CollisionGroup))), - RecvPropFloat(FIELD.OF(nameof(Elasticity))), - RecvPropFloat(FIELD.OF(nameof(ShadowCastDistance))), - RecvPropEHandle(FIELD.OF(nameof(OwnerEntity)), RecvProxy_OwnerEntity), - RecvPropEHandle(FIELD.OF(nameof(EffectEntity))), - RecvPropInt(FIELD.OF(nameof(NetworkMoveParent)), 0, RecvProxy_IntToMoveParent), - RecvPropInt(FIELD.OF(nameof(ParentAttachment))), - - RecvPropInt(FIELD.OF(nameof(MoveType)), 0, RecvProxy_MoveType), - RecvPropInt(FIELD.OF(nameof(MoveCollide)), 0, RecvProxy_MoveCollide), - RecvPropQAngles (FIELD.OF(nameof(Rotation))), - RecvPropInt( FIELD.OF(nameof( TextureFrameIndex) )), - RecvPropDataTable( "predictable_id", DT_PredictableId ), - RecvPropInt(FIELD.OF(nameof(SimulatedEveryTick)), 0, RecvProxy_InterpolationAmountChanged), - RecvPropInt(FIELD.OF(nameof(AnimatedEveryTick)), 0, RecvProxy_InterpolationAmountChanged), - RecvPropBool( FIELD.OF(nameof( AlternateSorting ))), - - RecvPropDataTable("m_Collision", FIELD.OF(nameof(Collision)), CollisionProperty.DT_CollisionProperty, 0, RECV_GET_OBJECT_AT_FIELD(FIELD.OF(nameof(Collision)))), - - // gmod specific - RecvPropInt(FIELD.OF(nameof(m_takedamage))), - RecvPropInt(FIELD.OF(nameof(RealClassName))), - - RecvPropInt(FIELD.OF(nameof(OverrideMaterial))), - - RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(OverrideSubMaterials), 0), PropFlags.Unsigned), - RecvPropArray2(null, 32, "m_OverrideSubMaterials"), - - RecvPropInt(FIELD.OF(nameof(Health))), - RecvPropInt(FIELD.OF(nameof(MaxHealth))), - RecvPropInt(FIELD.OF(nameof(SpawnFlags))), - RecvPropInt(FIELD.OF(nameof(GModFlags))), - RecvPropBool(FIELD.OF(nameof(OnFire))), - RecvPropFloat(FIELD.OF(nameof(CreationTime))), - - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(Velocity), 0), 0, RecvProxy_LocalVelocityX), - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(Velocity), 1), 0, RecvProxy_LocalVelocityY), - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(Velocity), 2), 0, RecvProxy_LocalVelocityZ), - - // NW2 table - RecvPropGModTable(FIELD.OF(nameof(GMOD_DataTable))), - - // Addon exposed data tables - RecvPropArray3(FIELD.OF_ARRAY(nameof(GMOD_bool)), RecvPropBool(FIELD.OF_ARRAYINDEX(nameof(GMOD_bool), 0))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(GMOD_float)), RecvPropFloat(FIELD.OF_ARRAYINDEX(nameof(GMOD_float), 0))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(GMOD_int)), RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(GMOD_int), 0))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(GMOD_Vector)), RecvPropVector(FIELD.OF_ARRAYINDEX(nameof(GMOD_Vector), 0))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(GMOD_QAngle)), RecvPropQAngles(FIELD.OF_ARRAYINDEX(nameof(GMOD_QAngle), 0))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(GMOD_EHANDLE)), RecvPropEHandle(FIELD.OF_ARRAYINDEX(nameof(GMOD_EHANDLE), 0))), - RecvPropString(FIELD.OF(nameof(GMOD_String0))), - RecvPropString(FIELD.OF(nameof(GMOD_String1))), - RecvPropString(FIELD.OF(nameof(GMOD_String2))), - RecvPropString(FIELD.OF(nameof(GMOD_String3))), - - // Creation IDs - RecvPropInt(FIELD.OF(nameof(CreationID))), - RecvPropInt(FIELD.OF(nameof(MapCreatedID))), - ]); private static void RecvProxy_OwnerEntity(ref readonly RecvProxyData data, object instance, IFieldAccessor field) { RecvProxy_IntToEHandle(in data, instance, field); @@ -683,43 +755,12 @@ private static void RecvProxy_MoveType(ref readonly RecvProxyData data, object i public void SetCollisionBounds(in Vector3 mins, in Vector3 maxs) => CollisionProp().SetCollisionBounds(in mins, in maxs); - public static readonly ClientClass ClientClass = new ClientClass(DT_BaseEntity); const float coordTolerance = 2.0f / (float)(1 << (int)COORD_FRACTIONAL_BITS); public float GetGravity() => Gravity; public void SetGravity(float gravity) => Gravity = gravity; - public static readonly DataMap PredMap = new(typeof(C_BaseEntity), [ - DEFINE.PRED_TYPEDESCRIPTION( nameof(Collision), CollisionProperty.PredMap ), - DEFINE.PRED_FIELD(nameof(MoveType), FieldType.Character, FieldTypeDescFlags.InSendTable), - DEFINE.PRED_FIELD(nameof(MoveCollide), FieldType.Character, FieldTypeDescFlags.InSendTable), - DEFINE.FIELD(nameof(AbsVelocity), FieldType.Vector), - DEFINE.PRED_FIELD_TOL(nameof(Velocity), FieldType.Vector, FieldTypeDescFlags.InSendTable, 0.5f), - DEFINE.PRED_FIELD(nameof(RenderMode), FieldType.Character, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(RenderFX), FieldType.Character, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(flags), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD_TOL(nameof(ViewOffset), FieldType.Vector, FieldTypeDescFlags.InSendTable, 0.25f ), - DEFINE.PRED_FIELD(nameof(ModelIndex), FieldType.Short, FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.ModelIndex ), - DEFINE.PRED_FIELD(nameof(Friction), FieldType.Float, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(TeamNum), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(OwnerEntity), FieldType.EHandle, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(NetworkMoveParent), FieldType.EHandle, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD_TOL(nameof(NetworkOrigin), FieldType.Vector, FieldTypeDescFlags.InSendTable, coordTolerance ), - DEFINE.PRED_FIELD(nameof(NetworkAngles), FieldType.Vector, FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.NoErrorCheck ), - DEFINE.FIELD(nameof(AbsOrigin), FieldType.Vector ), - DEFINE.FIELD(nameof(AbsRotation), FieldType.Vector ), - DEFINE.FIELD(nameof(Origin), FieldType.Vector ), - DEFINE.FIELD(nameof(Rotation), FieldType.Vector ), - DEFINE.FIELD(nameof(WaterLevel), FieldType.Character ), - DEFINE.FIELD(nameof(WaterType), FieldType.Character ), - DEFINE.FIELD(nameof(AngVelocity), FieldType.Vector ), - DEFINE.FIELD(nameof(Dormant), FieldType.Boolean ), - DEFINE.FIELD(nameof(BaseVelocity), FieldType.Vector ), - DEFINE.FIELD(nameof(eflags), FieldType.Integer ), - DEFINE.FIELD(nameof(Gravity), FieldType.Float ), - DEFINE.FIELD(nameof(ProxyRandomValue), FieldType.Float ), - ]); public virtual DataMap? GetPredDescMap() => PredMap; public static readonly DataMap DataDesc = new(typeof(C_BaseEntity), [ DEFINE.FIELD(nameof(ModelName), FieldType.String), @@ -736,6 +777,7 @@ private static void RecvProxy_MoveType(ref readonly RecvProxyData data, object i public float Gravity; public C_BaseEntity() { + GMOD_EHANDLEForModify() = new(); AddVar(this, DA_Origin, IV_Origin, LatchFlags.LatchSimulationVar); AddVar(this, DA_Rotation, IV_Rotation, LatchFlags.LatchSimulationVar); @@ -764,119 +806,146 @@ public C_BaseEntity() { private Model? Model; ModelInstanceHandle_t ModelInstance; - [NetworkName("m_flAnimTime")] + [NetworkVar("m_flAnimTime")] public TimeUnit_t AnimTime; - public TimeUnit_t OldAnimTime; - - [NetworkName("m_flSimulationTime")] + [NetworkVar("m_flSimulationTime")] public TimeUnit_t SimulationTime; - public TimeUnit_t OldSimulationTime; - - public TimeUnit_t CreateTime; - - [NetworkName("m_ubInterpolationFrame")] + [NetworkVar("m_ubInterpolationFrame")] public byte InterpolationFrame; - public byte OldInterpolationFrame; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_vecOrigin")] + public Vector3 NetworkOrigin; + [NetworkVar("m_angRotation")] + public QAngle NetworkAngles; + [NetworkVar("m_nModelIndex")] public int ModelIndex; - public byte OldParentAttachment; - [NetworkName("m_iParentAttachment")] + [NetworkVar("m_fEffects")] + public int Effects; + [NetworkVar("m_nRenderMode")] + public byte RenderMode; + [NetworkVar("m_nRenderFX")] + public byte RenderFX; + [NetworkVar("m_clrRender")] + public Color ColorRender; + [NetworkVar("m_iTeamNum")] + public int TeamNum; + [NetworkVar("m_CollisionGroup")] + public int CollisionGroup; + [NetworkVar("m_flElasticity")] + public float Elasticity; + [NetworkVar("m_flShadowCastDistance")] + public float ShadowCastDistance; + [NetworkVar("m_hOwnerEntity")] + public EHANDLE OwnerEntity = new(); + [NetworkVar("m_hEffectEntity")] + public EHANDLE EffectEntity = new(); + [NetworkVar("moveparent")] + public EHANDLE NetworkMoveParent = new(); + [NetworkVar("m_iParentAttachment")] public byte ParentAttachment; - - [NetworkName("movetype")] + [NetworkVar("movetype")] public byte MoveType; - [NetworkName("movecollide")] + [NetworkVar("movecollide")] public byte MoveCollide; - [NetworkName("m_iTextureFrameIndex")] + [NetworkVar("m_Collision")] + public CollisionProperty Collision = new(); + [NetworkVar("m_iTextureFrameIndex")] public bool TextureFrameIndex; - [NetworkName("m_bSimulatedEveryTick")] + [NetworkVar("m_PredictableID")] + public PredictableId PredictableID = new(); + [NetworkVar("m_bSimulatedEveryTick")] public bool SimulatedEveryTick; - [NetworkName("m_bAnimatedEveryTick")] + [NetworkVar("m_bAnimatedEveryTick")] public bool AnimatedEveryTick; - [NetworkName("m_bAlternateSorting")] + [NetworkVar("m_bAlternateSorting")] public bool AlternateSorting; - - [NetworkName("m_PredictableID")] - public PredictableId PredictableID = new(); - + [NetworkVar("m_takedamage")] public byte m_takedamage; - [NetworkName("m_RealClassName")] + [NetworkVar("m_RealClassName")] public ushort RealClassName; - [NetworkName("m_OverrideMaterial")] + [NetworkVar("m_OverrideMaterial")] public ushort OverrideMaterial; - [NetworkName("m_OverrideSubMaterials")] + [NetworkVar("m_OverrideSubMaterials")] public InlineArray32 OverrideSubMaterials; - [NetworkName("m_iHealth")] + [NetworkVar("m_iHealth")] public int Health; - public int GetHealth() => Health; - public int SetHealth(int amt) => Health = amt; - [NetworkName("m_iMaxHealth")] + [NetworkVar("m_iMaxHealth")] public int MaxHealth; - [NetworkName("m_spawnflags")] + [NetworkVar("m_spawnflags")] public int SpawnFlags; - [NetworkName("m_iGModFlags")] + [NetworkVar("m_iGModFlags")] public int GModFlags; - [NetworkName("m_bOnFire")] + [NetworkVar("m_bOnFire")] public bool OnFire; - [NetworkName("m_CreationTime")] + [NetworkVar("m_CreationTime")] public float CreationTime; - [NetworkName("m_vecVelocity")] + [NetworkVar("m_vecVelocity")] public Vector3 Velocity; - [NetworkName("m_iCreationID")] + [NetworkVar("m_GMOD_DataTable")] + public readonly IGMODDataTable GMOD_DataTable; + [NetworkVar("m_GMOD_bool")] + public partial ref readonly InlineArray32 GMOD_bool { get; } + [NetworkVar("m_GMOD_float")] + public partial ref readonly InlineArray32 GMOD_float { get; } + [NetworkVar("m_GMOD_int")] + public partial ref readonly InlineArray32 GMOD_int { get; } + [NetworkVar("m_GMOD_Vector")] + public partial ref readonly InlineArray32 GMOD_Vector { get; } + [NetworkVar("m_GMOD_QAngle")] + public partial ref readonly InlineArray32 GMOD_QAngle { get; } + [NetworkVar("m_GMOD_EHANDLE")] + public partial ref readonly InlineArrayNew32 GMOD_EHANDLE { get; } + [NetworkVar("m_GMOD_String0")] + public partial ref readonly InlineArray512 GMOD_String0 { get; } + [NetworkVar("m_GMOD_String1")] + public partial ref readonly InlineArray512 GMOD_String1 { get; } + [NetworkVar("m_GMOD_String2")] + public partial ref readonly InlineArray512 GMOD_String2 { get; } + [NetworkVar("m_GMOD_String3")] + public partial ref readonly InlineArray512 GMOD_String3 { get; } + [NetworkVar("m_iCreationID")] public int CreationID; - [NetworkName("m_iMapCreatedID")] + [NetworkVar("m_iMapCreatedID")] public int MapCreatedID; - [NetworkName("m_flFriction")] + [NetworkVar("m_flFriction")] public float Friction; + [NetworkVar("m_nSpeed")] + public int Speed; + [NetworkVar("m_hGroundEntity")] + public EHANDLE GroundEntity = new(); + [NetworkVar("m_lifeState")] + public int LifeState; + [NetworkVar("m_vecBaseVelocity")] + public Vector3 BaseVelocity; + [NetworkVar("m_nNextThinkTick")] + public int NextThinkTick; + [NetworkVar("m_nWaterLevel")] + public byte WaterLevel; + [NetworkVar("m_vecViewOffset")] + public Vector3 ViewOffset; + [NetworkVar("m_vecOrigin")] + public Vector3 Origin; + [NetworkVar("m_angRotation")] + public QAngle Rotation; + public TimeUnit_t OldAnimTime; + + public TimeUnit_t OldSimulationTime; + + public TimeUnit_t CreateTime; + + public byte OldInterpolationFrame; + public byte OldParentAttachment; + + + + public int GetHealth() => Health; + public int SetHealth(int amt) => Health = amt; - [NetworkName("m_Collision")] - public CollisionProperty Collision = new(); - [NetworkName("m_fEffects")] - public int Effects; - [NetworkName("m_nRenderMode")] - public byte RenderMode; - [NetworkName("m_nRenderFX")] - public byte RenderFX; public byte RenderFXBlend; - [NetworkName("m_clrRender")] - public Color ColorRender; - [NetworkName("m_CollisionGroup")] - public int CollisionGroup; - [NetworkName("m_flElasticity")] - public float Elasticity; - [NetworkName("m_flShadowCastDistance")] - public float ShadowCastDistance; public byte OldRenderMode; - [NetworkName("m_GMOD_bool")] - public InlineArray32 GMOD_bool; - [NetworkName("m_GMOD_float")] - public InlineArray32 GMOD_float; - [NetworkName("m_GMOD_int")] - public InlineArray32 GMOD_int; - [NetworkName("m_GMOD_Vector")] - public InlineArray32 GMOD_Vector; - [NetworkName("m_GMOD_QAngle")] - public InlineArray32 GMOD_QAngle; - [NetworkName("m_GMOD_EHANDLE")] - public InlineArrayNew32 GMOD_EHANDLE = new(); - [NetworkName("m_GMOD_String0")] - public InlineArray512 GMOD_String0; - [NetworkName("m_GMOD_String1")] - public InlineArray512 GMOD_String1; - [NetworkName("m_GMOD_String2")] - public InlineArray512 GMOD_String2; - [NetworkName("m_GMOD_String3")] - public InlineArray512 GMOD_String3; - - [NetworkName("m_GMOD_DataTable")] - public readonly IGMODDataTable GMOD_DataTable; - [NetworkName("m_nSpeed")] - public int Speed; - [NetworkName("m_iTeamNum")] - public int TeamNum; + public int GetTeamNumber() => TeamNum; IPhysicsObject? PhysicsObject = null!; @@ -886,26 +955,10 @@ public void VPhysicsUpdate(IPhysicsObject physics) { } public bool IsFloating() => false; - [NetworkName("m_hOwnerEntity")] - public EHANDLE OwnerEntity = new(); public C_BaseEntity? GetOwnerEntity() => (C_BaseEntity?)OwnerEntity.Get(); - [NetworkName("m_hEffectEntity")] - public EHANDLE EffectEntity = new(); - [NetworkName("m_hGroundEntity")] - public EHANDLE GroundEntity = new(); - [NetworkName("moveparent")] - public EHANDLE NetworkMoveParent = new(); public EHANDLE OldMoveParent = new(); public string? ModelName; - [NetworkName("m_lifeState")] - public int LifeState; - [NetworkName("m_vecBaseVelocity")] - public Vector3 BaseVelocity; - [NetworkName("m_nNextThinkTick")] - public int NextThinkTick; public int LastThinkTick; - [NetworkName("m_nWaterLevel")] - public byte WaterLevel; public byte WaterType; public long CreationTick; @@ -914,23 +967,15 @@ public void VPhysicsUpdate(IPhysicsObject physics) { } public Vector3 AbsOrigin; public QAngle AbsRotation; - [NetworkName("m_vecViewOffset")] - public Vector3 ViewOffset; public Vector3 OldOrigin; public QAngle OldRotation; - public Vector3 NetworkOrigin; - public QAngle NetworkAngles; public EntClientFlags EntClientFlags; public Source.InlineArray4 RenderingClipPlane; public bool EnableRenderingClipPlane; - [NetworkName("m_vecOrigin")] - public Vector3 Origin; public readonly InterpolatedVar IV_Origin = new("Origin"); - [NetworkName("m_angRotation")] - public QAngle Rotation; public readonly InterpolatedVar IV_Rotation = new("Rotation"); @@ -1133,7 +1178,6 @@ public virtual bool GetSoundSpatialization(ref SpatializationInfo info) { return true; } - public virtual ClientClass GetClientClass() => ClientClassRetriever.GetOrError(GetType()); public IClientNetworkable GetClientNetworkable() => this; @@ -2302,7 +2346,7 @@ public void SetNetworkAngles(in QAngle angles) { - [NetworkName("m_fFlags")] + [NetworkVar("m_fFlags")] protected int flags; EFL eflags = EFL.DirtyAbsTransform; // << TODO: FIGURE OUT WHAT ACTUALLY INITIALIZES THIS. public Matrix3x4 CoordinateFrame; diff --git a/Game.Client/C_BaseFlex.cs b/Game.Client/C_BaseFlex.cs index d9478315..bf252d96 100644 --- a/Game.Client/C_BaseFlex.cs +++ b/Game.Client/C_BaseFlex.cs @@ -157,28 +157,26 @@ public partial class C_BaseFlex : C_BaseAnimatingOverlay, IHasLocalToGlobalFlexS readonly Source.Common.Audio.MouthInfo mouth = new(); public override Source.Common.Audio.MouthInfo? GetMouth() => mouth; - public static readonly RecvTable DT_BaseFlex = new(DT_BaseAnimatingOverlay, [ - RecvPropArray3 (FIELD.OF_ARRAY(nameof(FlexWeight)), RecvPropFloat(FIELD.OF_ARRAY(nameof(FlexWeight)))), - RecvPropInt (FIELD.OF(nameof(BlinkToggle))), - RecvPropVector (FIELD.OF(nameof(ViewTarget))), - - RecvPropFloat ( FIELD.OF_VECTORELEM(nameof(ViewOffset), 0)), - RecvPropFloat ( FIELD.OF_VECTORELEM(nameof(ViewOffset), 1)), - RecvPropFloat ( FIELD.OF_VECTORELEM(nameof(ViewOffset), 2)), - - RecvPropVector ( FIELD.OF(nameof(Lean))), - RecvPropVector ( FIELD.OF(nameof(Shift))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseFlex); - [NetworkName("m_flexWeight")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(FlexWeight), + nameof(BlinkToggle), + nameof(ViewTarget), + + new(nameof(ViewOffset)) { Encoding = NetEncoding.VectorElements }, + + nameof(Lean), + nameof(Shift), + ]; + [NetworkVar("m_flexWeight")] public InlineArray96 FlexWeight; - [NetworkName("m_blinktoggle")] + [NetworkVar("m_blinktoggle")] public int BlinkToggle; - [NetworkName("m_viewtarget")] + [NetworkVar("m_viewtarget")] public Vector3 ViewTarget; - [NetworkName("m_vecLean")] + [NetworkVar("m_vecLean")] public Vector3 Lean; - [NetworkName("m_vecShift")] + [NetworkVar("m_vecShift")] public Vector3 Shift; static readonly DynamicAccessor DA_ViewTarget = FIELD.OF(nameof(ViewTarget)); diff --git a/Game.Client/C_BasePlayer.cs b/Game.Client/C_BasePlayer.cs index a36d5757..9083d18f 100644 --- a/Game.Client/C_BasePlayer.cs +++ b/Game.Client/C_BasePlayer.cs @@ -17,7 +17,6 @@ using System.Runtime.CompilerServices; using System.Security.AccessControl; -using DEFINE = Source.DEFINE; using FIELD = Source.FIELD; namespace Game.Client; @@ -54,44 +53,38 @@ public C_BasePlayer() { AddVar(this, DA_ViewOffset, IV_ViewOffset, LatchFlags.LatchSimulationVar, true); } - public static readonly DataMap PM_PlayerState = new(typeof(PlayerState), [ - DEFINE.PRED_FIELD( nameof(PlayerState.DeadFlag), FieldType.Boolean, FieldTypeDescFlags.InSendTable ), - ]); - public static readonly RecvTable DT_PlayerState = new(nameof(DT_PlayerState), [ - RecvPropInt(FIELD.OF(nameof(PlayerState.DeadFlag))) - ]); - - public static readonly new DataMap PredMap = new(typeof(C_BasePlayer), C_BaseCombatCharacter.PredMap, [ - DEFINE.PRED_TYPEDESCRIPTION( nameof(Local), PlayerLocalData.PredMap ), - DEFINE.PRED_TYPEDESCRIPTION( nameof(pl), PM_PlayerState ), - DEFINE.PRED_FIELD( nameof(FOV), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(ZoomOwner), FieldType.EHandle, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(FOVTime), FieldType.Double, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(FOVStart), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(Vehicle), FieldType.EHandle, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD_TOL( nameof(Maxspeed), FieldType.Float, FieldTypeDescFlags.InSendTable, 0.5f ), - DEFINE.PRED_FIELD( nameof(Health), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(NextThinkTick), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(LifeState), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(WaterLevel), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD_TOL( nameof(BaseVelocity), FieldType.Vector, FieldTypeDescFlags.InSendTable, 0.05f ), - DEFINE.FIELD( nameof(Buttons), FieldType.Integer ), - DEFINE.FIELD( nameof(WaterJumpTime), FieldType.Float ), - DEFINE.FIELD( nameof(Impulse), FieldType.Integer ), - DEFINE.FIELD( nameof(StepSoundTime), FieldType.Float ), - DEFINE.FIELD( nameof(SwimSoundTime), FieldType.Float ), - DEFINE.FIELD( nameof(LadderNormal), FieldType.Vector ), - DEFINE.FIELD( nameof(AfButtonLast), FieldType.Integer ), - DEFINE.FIELD( nameof(AfButtonPressed), FieldType.Integer ), - DEFINE.FIELD( nameof(AfButtonReleased), FieldType.Integer ), - DEFINE.PRED_FIELD( nameof(LastWeapon), FieldType.EHandle, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(TickBase), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(GroundEntity), FieldType.EHandle, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_ARRAY( nameof(ViewModel), FieldType.EHandle, MAX_VIEWMODELS, FieldTypeDescFlags.InSendTable ), - DEFINE.FIELD( nameof(SurfaceFriction), FieldType.Float ), - DEFINE.FIELD( nameof(ButtonsArray), FieldType.Integer ), - DEFINE.PRED_FIELD( nameof(UseWeaponsInVehicle), FieldType.Boolean, FieldTypeDescFlags.InSendTable ), - ]); public override DataMap? GetPredDescMap() => PredMap; + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + new(nameof(Local)) { Embedded = true }, + new(nameof(pl)) { Embedded = true }, + new(nameof(FOV)) { Type = FieldType.Integer }, + nameof(ZoomOwner), + new(nameof(FOVTime)) { Type = FieldType.Double }, + new(nameof(FOVStart)) { Type = FieldType.Integer }, + nameof(Vehicle), + new(nameof(Maxspeed)) { Type = FieldType.Float, Tolerance = 0.5f }, + new(nameof(Health)) { Type = FieldType.Integer }, + new(nameof(NextThinkTick)) { Type = FieldType.Integer }, + new(nameof(LifeState)) { Type = FieldType.Integer }, + new(nameof(WaterLevel)) { Type = FieldType.Integer, Flags = FieldTypeDescFlags.InSendTable }, + new(nameof(BaseVelocity)) { Type = FieldType.Vector, Tolerance = 0.05f }, + new(nameof(Buttons)) { Type = FieldType.Integer }, + new(nameof(WaterJumpTime)) { Type = FieldType.Float }, + new(nameof(Impulse)) { Type = FieldType.Integer }, + new(nameof(StepSoundTime)) { Type = FieldType.Float }, + new(nameof(SwimSoundTime)) { Type = FieldType.Float }, + new(nameof(LadderNormal)) { Type = FieldType.Vector }, + new(nameof(AfButtonLast)) { Type = FieldType.Integer }, + new(nameof(AfButtonPressed)) { Type = FieldType.Integer }, + new(nameof(AfButtonReleased)) { Type = FieldType.Integer }, + nameof(LastWeapon), + new(nameof(TickBase)) { Type = FieldType.Integer }, + nameof(GroundEntity), + nameof(ViewModel), + new(nameof(SurfaceFriction)) { Type = FieldType.Float }, + new(nameof(ButtonsArray)) { Type = FieldType.Integer }, + nameof(UseWeaponsInVehicle), + ]; public int ButtonsArray; @@ -183,26 +176,28 @@ public bool AudioStateIsUnderwater(Vector3 mainViewOrigin) { return GetWaterLevel() >= Shared.WaterLevel.Eyes; } - public static readonly RecvTable DT_LocalPlayerExclusive = new(nameof(DT_LocalPlayerExclusive), [ - RecvPropDataTable("m_Local", FIELD.OF(nameof(Local)), PlayerLocalData.DT_Local, 0, DataTableRecvProxy_PointerDataTable), - RecvPropFloat(FIELD.OF(nameof(Friction))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(Ammo)), RecvPropInt( FIELD.OF_ARRAYINDEX(nameof(Ammo)))), - RecvPropInt(FIELD.OF(nameof(TickBase))), - RecvPropInt(FIELD.OF(nameof(NextThinkTick))), - RecvPropEHandle(FIELD.OF(nameof(LastWeapon))), - RecvPropEHandle(FIELD.OF(nameof(GroundEntity))), - RecvPropVector(FIELD.OF(nameof(BaseVelocity))), - RecvPropEHandle(FIELD.OF(nameof(ConstraintEntity))), - RecvPropVector(FIELD.OF(nameof(ConstraintCenter))), - RecvPropFloat(FIELD.OF(nameof(ConstraintRadius))), - RecvPropFloat(FIELD.OF(nameof(ConstraintWidth))), - RecvPropFloat(FIELD.OF(nameof(ConstraintSpeedFactor))), - RecvPropFloat(FIELD.OF(nameof(DeathTime))), - RecvPropFloat(FIELD.OF(nameof(LaggedMovementValue))), - RecvPropEHandle(FIELD.OF(nameof(TonemapController))), - RecvPropEHandle(FIELD.OF(nameof(ViewEntity))), - RecvPropBool(FIELD.OF(nameof(DisableWorldClicking))), - ]); + [NetworkTable("DT_LocalPlayerExclusive")] + public static readonly NetworkProp[] LocalPlayerExclusiveProps = [ + new(nameof(Local)) { Encoding = NetEncoding.DataTable, DataTable = "DT_Local" }, + new(nameof(ViewOffset)) { Encoding = NetEncoding.VectorElements }, + nameof(Friction), + nameof(Ammo), + nameof(TickBase), + nameof(NextThinkTick), + nameof(LastWeapon), + nameof(GroundEntity), + nameof(BaseVelocity), + nameof(ConstraintEntity), + nameof(ConstraintCenter), + nameof(ConstraintRadius), + nameof(ConstraintWidth), + nameof(ConstraintSpeedFactor), + new(nameof(DeathTime)) { Encoding = NetEncoding.Float }, + new(nameof(LaggedMovementValue)) { Encoding = NetEncoding.Float }, + nameof(TonemapController), + nameof(ViewEntity), + nameof(DisableWorldClicking), + ]; public virtual void ItemPreFrame() { } @@ -452,30 +447,26 @@ private void PlayPlayerJingle() { } - public static readonly RecvTable DT_BasePlayer = new(DT_BaseCombatCharacter, [ - RecvPropDataTable(nameof(pl), FIELD.OF(nameof(pl)), DT_PlayerState, proxyFn: DataTableRecvProxy_PointerDataTable), - RecvPropEHandle(FIELD.OF(nameof(Vehicle))), - RecvPropEHandle(FIELD.OF(nameof(UseEntity))), - RecvPropInt(FIELD.OF(nameof(LifeState))), - RecvPropEHandle(FIELD.OF(nameof(ColorCorrectionCtrl))), // << gmod specific - RecvPropFloat(FIELD.OF(nameof(Maxspeed))), - RecvPropInt(FIELD.OF("flags")), - // todo: RecvProxy_ObserverMode - RecvPropInt(FIELD.OF(nameof(ObserverMode))), - // todo: RecvProxy_ObserverTarget - RecvPropEHandle(FIELD.OF(nameof(ObserverTarget))), - RecvPropFloat(FIELD.OF(nameof(FOV))), - RecvPropFloat(FIELD.OF(nameof(FOVStart))), - RecvPropTime64(FIELD.OF(nameof(FOVTime))), - RecvPropFloat(FIELD.OF(nameof(DefaultFOV))), - RecvPropEHandle(FIELD.OF(nameof(ZoomOwner))), - - RecvPropEHandle(FIELD.OF_ARRAYINDEX(nameof(ViewModel), 0)), - RecvPropArray(FIELD.OF_ARRAY(nameof(ViewModel))), - - RecvPropBool(FIELD.OF(nameof(UseWeaponsInVehicle))), - RecvPropDataTable("localdata", DT_LocalPlayerExclusive), - ]); public static readonly new ClientClass ClientClass = new ClientClass(DT_BasePlayer); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(pl)) { Encoding = NetEncoding.DataTable, DataTable = "DT_PlayerState" }, + nameof(Vehicle), + nameof(UseEntity), + nameof(LifeState), + nameof(ColorCorrectionCtrl), // << gmod specific + nameof(Maxspeed), + nameof(flags), + nameof(ObserverMode), // todo: RecvProxy_ObserverMode + nameof(ObserverTarget), // todo: RecvProxy_ObserverTarget + new(nameof(FOV)) { Encoding = NetEncoding.Float }, + new(nameof(FOVStart)) { Encoding = NetEncoding.Float }, + nameof(FOVTime), + nameof(DefaultFOV), + nameof(ZoomOwner), + new(nameof(ViewModel)) { Encoding = NetEncoding.Array }, + nameof(UseWeaponsInVehicle), + new(nameof(LocalPlayerExclusiveProps)) { Name = "localdata" }, + ]; static C_BasePlayer? localPlayer; @@ -612,63 +603,64 @@ public void SetLocalViewAngles(in QAngle angles) { pl.ViewingAngle = angles; } + [NetworkVar("pl")] internal readonly PlayerState pl = new(); - [NetworkName("m_Local")] + [NetworkVar("m_Local")] public readonly PlayerLocalData Local = new(); - [NetworkName("m_hVehicle")] + [NetworkVar("m_hVehicle")] EHANDLE Vehicle = new(); - [NetworkName("m_hUseEntity")] + [NetworkVar("m_hUseEntity")] EHANDLE UseEntity = new(); - [NetworkName("m_hObserverTarget")] + [NetworkVar("m_hObserverTarget")] EHANDLE ObserverTarget = new(); - [NetworkName("m_hZoomOwner")] + [NetworkVar("m_hZoomOwner")] EHANDLE ZoomOwner = new(); - [NetworkName("m_hConstraintEntity")] + [NetworkVar("m_hConstraintEntity")] public EHANDLE ConstraintEntity = new(); - [NetworkName("m_hTonemapController")] + [NetworkVar("m_hTonemapController")] EHANDLE TonemapController = new(); - [NetworkName("m_hViewEntity")] + [NetworkVar("m_hViewEntity")] EHANDLE ViewEntity = new(); - [NetworkName("m_hViewModel")] + [NetworkVar("m_hViewModel")] InlineArrayNewMaxViewmodels> ViewModel = new(); - [NetworkName("m_bDisableWorldClicking")] + [NetworkVar("m_bDisableWorldClicking")] public bool DisableWorldClicking; public bool WorldClicking; public Vector3 WorldClickVector; - [NetworkName("m_flMaxspeed")] + [NetworkVar("m_flMaxspeed")] public float Maxspeed; int BonusProgress; int BonusChallenge; - [NetworkName("m_iObserverMode")] + [NetworkVar("m_iObserverMode")] public int ObserverMode; - [NetworkName("m_iFOV")] + [NetworkVar("m_iFOV")] public int FOV; - [NetworkName("m_iFOVStart")] + [NetworkVar("m_iFOVStart")] public int FOVStart; - [NetworkName("m_flFOVTime")] + [NetworkVar("m_flFOVTime")] public TimeUnit_t FOVTime; - [NetworkName("m_iDefaultFOV")] + [NetworkVar("m_iDefaultFOV")] public float DefaultFOV; - [NetworkName("m_vecConstraintCenter")] + [NetworkVar("m_vecConstraintCenter")] public Vector3 ConstraintCenter; - [NetworkName("m_flConstraintRadius")] + [NetworkVar("m_flConstraintRadius")] public float ConstraintRadius; - [NetworkName("m_flConstraintWidth")] + [NetworkVar("m_flConstraintWidth")] public float ConstraintWidth; - [NetworkName("m_flConstraintSpeedFactor")] + [NetworkVar("m_flConstraintSpeedFactor")] public float ConstraintSpeedFactor; InlineArray18 LastPlaceName; - [NetworkName("m_hColorCorrectionCtrl")] + [NetworkVar("m_hColorCorrectionCtrl")] EHANDLE ColorCorrectionCtrl = new(); - [NetworkName("m_bUseWeaponsInVehicle")] + [NetworkVar("m_bUseWeaponsInVehicle")] bool UseWeaponsInVehicle; public bool GetAllowWeaponsInVehicle() => UseWeaponsInVehicle; public bool OnTarget; - [NetworkName("m_flDeathTime")] + [NetworkVar("m_flDeathTime")] public double DeathTime; - [NetworkName("m_flLaggedMovementValue")] + [NetworkVar("m_flLaggedMovementValue")] public double LaggedMovementValue; - [NetworkName("m_nTickBase")] + [NetworkVar("m_nTickBase")] public int TickBase; public long FinalPredictedTick; InlineArray32 AnimExtension; diff --git a/Game.Client/C_BaseTempEntity.cs b/Game.Client/C_BaseTempEntity.cs index e7bcddfb..2cc23720 100644 --- a/Game.Client/C_BaseTempEntity.cs +++ b/Game.Client/C_BaseTempEntity.cs @@ -8,8 +8,8 @@ namespace Game.Client; -[NetworkName("CBaseTempEntity")] -public class C_BaseTempEntity : IClientUnknown, IClientNetworkable +[NetworkName("CBaseTempEntity", NoBase = true)] +public partial class C_BaseTempEntity : IClientUnknown, IClientNetworkable { public static C_BaseTempEntity? GetDynamicList() => s_DynamicEntities; public static C_BaseTempEntity? GetList() => s_TempEntities; @@ -41,13 +41,7 @@ public C_BaseTempEntity() { private static C_BaseTempEntity? s_TempEntities; private static C_BaseTempEntity? s_DynamicEntities; - public static readonly RecvTable DT_BaseTempEntity = new([]); - public static readonly ClientClass ClientClass = new ClientClass(DT_BaseTempEntity); - public int EntIndex() => 0; - public ClientClass GetClientClass() { - throw new NotImplementedException(); - } public IClientNetworkable GetClientNetworkable() => this; public IClientRenderable GetClientRenderable() => null!; diff --git a/Game.Client/C_BaseViewModel.cs b/Game.Client/C_BaseViewModel.cs index aa193a0b..5880a8c2 100644 --- a/Game.Client/C_BaseViewModel.cs +++ b/Game.Client/C_BaseViewModel.cs @@ -8,26 +8,26 @@ namespace Game.Client; #if GMOD_DLL using Game.Client.GarrysMod; #endif -using DEFINE = Source.DEFINE; public partial class C_BaseViewModel { - public static readonly new DataMap PredMap = new(typeof(C_BaseViewModel), C_BaseAnimating.PredMap, [ - DEFINE.PRED_FIELD( nameof(ModelIndex), FieldType.Short, FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.ModelIndex ), - DEFINE.PRED_FIELD( nameof(Skin), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(Body), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(Sequence), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(_ViewModelIndex), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD_TOL( nameof(PlaybackRate), FieldType.Float, FieldTypeDescFlags.InSendTable, 0.125f ), - DEFINE.PRED_FIELD( nameof(Effects), FieldType.Integer, FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.Override ), - DEFINE.PRED_FIELD( nameof(AnimationParity), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(Weapon), FieldType.EHandle, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(AnimTime), FieldType.Float, 0 ), - DEFINE.FIELD( nameof(Owner), FieldType.EHandle ), - DEFINE.FIELD( nameof(TimeWeaponIdle), FieldType.Float ), - DEFINE.FIELD( nameof(Activity), FieldType.Integer ), - DEFINE.PRED_FIELD( nameof(Cycle), FieldType.Float, FieldTypeDescFlags.Private | FieldTypeDescFlags.Override | FieldTypeDescFlags.NoErrorCheck ), - ]); public override DataMap? GetPredDescMap() => PredMap; + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + new(nameof(ModelIndex)) { Type = FieldType.Short, Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.ModelIndex }, + new(nameof(Skin)) { Type = FieldType.Integer }, + new(nameof(Body)) { Type = FieldType.Integer }, + new(nameof(Sequence)) { Type = FieldType.Integer }, + new(nameof(_ViewModelIndex)) { Type = FieldType.Integer }, + new(nameof(PlaybackRate)) { Type = FieldType.Float, Tolerance = 0.125f }, + new(nameof(Effects)) { Type = FieldType.Integer, Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.Override }, + new(nameof(AnimationParity)) { Type = FieldType.Integer }, + nameof(Weapon), + new(nameof(AnimTime)) { Type = FieldType.Float, Flags = 0 }, + new(nameof(Owner)) { Flags = FieldTypeDescFlags.Save }, + new(nameof(TimeWeaponIdle)) { Type = FieldType.Float }, + new(nameof(Activity)) { Type = FieldType.Integer }, + new(nameof(Cycle)) { Type = FieldType.Float, Flags = FieldTypeDescFlags.Private | FieldTypeDescFlags.Override | FieldTypeDescFlags.NoErrorCheck }, + ]; int OldAnimationParity; #if GMOD_DLL diff --git a/Game.Client/C_BeamSpotlight.cs b/Game.Client/C_BeamSpotlight.cs index 84a0b7e5..68abfcff 100644 --- a/Game.Client/C_BeamSpotlight.cs +++ b/Game.Client/C_BeamSpotlight.cs @@ -3,37 +3,36 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [LinkEntityToClass("beam_spotlight")] [NetworkName("CBeamSpotlight")] -public class C_BeamSpotlight : C_BaseEntity +public partial class C_BeamSpotlight : C_BaseEntity { - public static readonly RecvTable DT_BeamSpotlight = new(DT_BaseEntity, [ - RecvPropInt(FIELD.OF(nameof(HaloIndex))), - RecvPropInt(FIELD.OF(nameof(SpotlightOn))), - RecvPropInt(FIELD.OF(nameof(HasDynamicLight))), - RecvPropFloat(FIELD.OF(nameof(SpotlightMaxLength))), - RecvPropFloat(FIELD.OF(nameof(SpotlightGoalWidth))), - RecvPropFloat(FIELD.OF(nameof(HDRColorScale))), - RecvPropFloat(FIELD.OF(nameof(RotationSpeed))), - RecvPropInt(FIELD.OF(nameof(RotationAxis))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_BeamSpotlight); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(HaloIndex)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(SpotlightOn)) { Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(HasDynamicLight)) { Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(SpotlightMaxLength)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpotlightGoalWidth)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(HDRColorScale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(RotationAxis)) { Bits = 2, Flags = PropFlags.Unsigned }, + new(nameof(RotationSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_nHaloIndex")] + [NetworkVar("m_nHaloIndex")] public int HaloIndex; - [NetworkName("m_bSpotlightOn")] + [NetworkVar("m_bSpotlightOn")] public int SpotlightOn; - [NetworkName("m_bHasDynamicLight")] + [NetworkVar("m_bHasDynamicLight")] public int HasDynamicLight; - [NetworkName("m_flSpotlightMaxLength")] + [NetworkVar("m_flSpotlightMaxLength")] public float SpotlightMaxLength; - [NetworkName("m_flSpotlightGoalWidth")] + [NetworkVar("m_flSpotlightGoalWidth")] public float SpotlightGoalWidth; - [NetworkName("m_flHDRColorScale")] + [NetworkVar("m_flHDRColorScale")] public float HDRColorScale; - [NetworkName("m_flRotationSpeed")] - public float RotationSpeed; - [NetworkName("m_nRotationAxis")] + [NetworkVar("m_nRotationAxis")] public int RotationAxis; + [NetworkVar("m_flRotationSpeed")] + public float RotationSpeed; } diff --git a/Game.Client/C_BoneFollower.cs b/Game.Client/C_BoneFollower.cs index b12a2b4d..c382907e 100644 --- a/Game.Client/C_BoneFollower.cs +++ b/Game.Client/C_BoneFollower.cs @@ -3,18 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CBoneFollower")] -public class C_BoneFollower : C_BaseEntity +public partial class C_BoneFollower : C_BaseEntity { - public static readonly RecvTable DT_BoneFollower = new(DT_BaseEntity, [ - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - RecvPropInt(FIELD.OF(nameof(SolidIndex))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_BoneFollower); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(SolidIndex)) { Bits = 6, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_modelIndex")] + [NetworkVar("m_modelIndex")] public new int ModelIndex; - [NetworkName("m_solidIndex")] + [NetworkVar("m_solidIndex")] public int SolidIndex; } diff --git a/Game.Client/C_BoneManipulate.cs b/Game.Client/C_BoneManipulate.cs index 384eb4c3..7d74d431 100644 --- a/Game.Client/C_BoneManipulate.cs +++ b/Game.Client/C_BoneManipulate.cs @@ -4,25 +4,24 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [LinkEntityToClass("manipulate_bone")] [NetworkName("CBoneManipulate")] -public class C_BoneManipulate : C_BaseEntity +public partial class C_BoneManipulate : C_BaseEntity { - public static readonly RecvTable DT_BoneManipulate = new(DT_BaseEntity, [ - RecvPropArray3(FIELD.OF_ARRAY(nameof(BonePos)), RecvPropVector(null!)), - RecvPropArray3(FIELD.OF_ARRAY(nameof(BoneAng)), RecvPropVector(null!)), - RecvPropArray3(FIELD.OF_ARRAY(nameof(BoneScale)), RecvPropVector(null!)), - RecvPropArray3(FIELD.OF_ARRAY(nameof(BoneJiggle)), RecvPropInt(null!, null!, sizeOfVar: sizeof(int))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_BoneManipulate); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(BonePos)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(BoneAng)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(BoneScale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(BoneJiggle)) { Bits = 4, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_BonePos")] + [NetworkVar("m_BonePos")] public InlineArrayMaxStudioBones BonePos; - [NetworkName("m_BoneAng")] + [NetworkVar("m_BoneAng")] public InlineArrayMaxStudioBones BoneAng; - [NetworkName("m_BoneScale")] + [NetworkVar("m_BoneScale")] public InlineArrayMaxStudioBones BoneScale; - [NetworkName("m_BoneJiggle")] + [NetworkVar("m_BoneJiggle")] public InlineArrayMaxStudioBones BoneJiggle; } diff --git a/Game.Client/C_BreakableProp.cs b/Game.Client/C_BreakableProp.cs index 47e78935..ff3c5b03 100644 --- a/Game.Client/C_BreakableProp.cs +++ b/Game.Client/C_BreakableProp.cs @@ -6,8 +6,10 @@ namespace Game.Client; [NetworkName("CBreakableProp")] -public class C_BreakableProp : C_BaseAnimating +public partial class C_BreakableProp : C_BaseAnimating { - public static readonly RecvTable DT_BreakableProp = new(DT_BaseAnimating, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_BreakableProp); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/C_BreakableSurface.cs b/Game.Client/C_BreakableSurface.cs index c770b07b..980eadc0 100644 --- a/Game.Client/C_BreakableSurface.cs +++ b/Game.Client/C_BreakableSurface.cs @@ -6,39 +6,38 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CBreakableSurface")] -public class C_BreakableSurface : C_BaseEntity +public partial class C_BreakableSurface : C_BaseEntity { - public static readonly RecvTable DT_BreakableSurface = new(DT_BaseEntity, [ - RecvPropInt(FIELD.OF(nameof(NumWide))), - RecvPropInt(FIELD.OF(nameof(NumHigh))), - RecvPropFloat(FIELD.OF(nameof(PanelWidth))), - RecvPropFloat(FIELD.OF(nameof(PanelHeight))), - RecvPropVector(FIELD.OF(nameof(VNormal))), - RecvPropVector(FIELD.OF(nameof(VCorner))), - RecvPropInt(FIELD.OF(nameof(IsBroken))), - RecvPropInt(FIELD.OF(nameof(SurfaceType))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(RawPanelBitVec)), RecvPropInt(null!, null!, sizeOfVar: sizeof(int))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_BreakableSurface); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(NumWide)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(NumHigh)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(PanelWidth)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(PanelHeight)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VNormal)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(VCorner)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(IsBroken)) { Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(SurfaceType)) { Bits = 2, Flags = PropFlags.Unsigned }, + new(nameof(RawPanelBitVec)) { Bits = 1, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nNumWide")] + [NetworkVar("m_nNumWide")] public int NumWide; - [NetworkName("m_nNumHigh")] + [NetworkVar("m_nNumHigh")] public int NumHigh; - [NetworkName("m_flPanelWidth")] + [NetworkVar("m_flPanelWidth")] public float PanelWidth; - [NetworkName("m_flPanelHeight")] + [NetworkVar("m_flPanelHeight")] public float PanelHeight; - [NetworkName("m_vNormal")] + [NetworkVar("m_vNormal")] public Vector3 VNormal; - [NetworkName("m_vCorner")] + [NetworkVar("m_vCorner")] public Vector3 VCorner; - [NetworkName("m_bIsBroken")] + [NetworkVar("m_bIsBroken")] public int IsBroken; - [NetworkName("m_nSurfaceType")] + [NetworkVar("m_nSurfaceType")] public int SurfaceType; - [NetworkName("m_RawPanelBitVec")] + [NetworkVar("m_RawPanelBitVec")] public InlineArray256 RawPanelBitVec; } diff --git a/Game.Client/C_CitadelEnergyCore.cs b/Game.Client/C_CitadelEnergyCore.cs index f09899a1..7943f774 100644 --- a/Game.Client/C_CitadelEnergyCore.cs +++ b/Game.Client/C_CitadelEnergyCore.cs @@ -3,27 +3,26 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CCitadelEnergyCore")] -public class C_CitadelEnergyCore : C_BaseEntity +public partial class C_CitadelEnergyCore : C_BaseEntity { - public static readonly RecvTable DT_CitadelEnergyCore = new(DT_BaseEntity, [ - RecvPropFloat(FIELD.OF(nameof(Scale))), - RecvPropInt(FIELD.OF(nameof(State))), - RecvPropFloat(FIELD.OF(nameof(Duration))), - RecvPropFloat(FIELD.OF(nameof(StartTime))), - RecvPropInt(FIELD.OF(nameof(Spawnflags))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_CitadelEnergyCore); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Scale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(State)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Duration)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Spawnflags)) { Bits = 32, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_flScale")] + [NetworkVar("m_flScale")] public float Scale; - [NetworkName("m_nState")] + [NetworkVar("m_nState")] public int State; - [NetworkName("m_flDuration")] + [NetworkVar("m_flDuration")] public float Duration; - [NetworkName("m_flStartTime")] + [NetworkVar("m_flStartTime")] public float StartTime; - [NetworkName("m_spawnflags")] + [NetworkVar("m_spawnflags")] public int Spawnflags; } diff --git a/Game.Client/C_ColorCorrection.cs b/Game.Client/C_ColorCorrection.cs index d8278ed3..e9043bea 100644 --- a/Game.Client/C_ColorCorrection.cs +++ b/Game.Client/C_ColorCorrection.cs @@ -8,46 +8,45 @@ using Source.Common.MaterialSystem; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CColorCorrection")] -public class C_ColorCorrection : C_BaseEntity +public partial class C_ColorCorrection : C_BaseEntity { - public static readonly RecvTable DT_ColorCorrection = new([ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropFloat(FIELD.OF(nameof(MinFalloff))), - RecvPropFloat(FIELD.OF(nameof(MaxFalloff))), - RecvPropFloat(FIELD.OF(nameof(CurWeight))), - RecvPropFloat(FIELD.OF(nameof(MaxWeight))), - RecvPropFloat(FIELD.OF(nameof(FadeInDuration))), - RecvPropFloat(FIELD.OF(nameof(FadeOutDuration))), - RecvPropString(FIELD.OF(nameof(NetLookupFilename))), - RecvPropBool(FIELD.OF(nameof(Enabled))), - RecvPropBool(FIELD.OF(nameof(ClientSide))), - RecvPropBool(FIELD.OF(nameof(Exclusive))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_ColorCorrection); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Origin)) { Encoding = NetEncoding.Vector, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MinFalloff)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxFalloff)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(CurWeight)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxWeight)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeInDuration)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeOutDuration)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(NetLookupFilename)) { Encoding = NetEncoding.String }, + nameof(Enabled), + nameof(ClientSide), + nameof(Exclusive), + ]; - [NetworkName("m_MinFalloff")] + [NetworkVar("m_minFalloff")] public float MinFalloff; - [NetworkName("m_MaxFalloff")] + [NetworkVar("m_maxFalloff")] public float MaxFalloff; - [NetworkName("m_flCurWeight")] + [NetworkVar("m_flCurWeight")] public float CurWeight; - [NetworkName("m_flMaxWeight")] + [NetworkVar("m_flMaxWeight")] public float MaxWeight; - [NetworkName("m_flFadeInDuration")] + [NetworkVar("m_flFadeInDuration")] public float FadeInDuration; - [NetworkName("m_flFadeOutDuration")] + [NetworkVar("m_flFadeOutDuration")] public float FadeOutDuration; - [NetworkName("m_netlookupFilename")] + [NetworkVar("m_netLookupFilename")] public InlineArrayMaxPath NetLookupFilename; - [NetworkName("m_bEnabled")] + [NetworkVar("m_bEnabled")] public bool Enabled; - [NetworkName("m_bClientSide")] + [NetworkVar("m_bClientSide")] public bool ClientSide; - [NetworkName("m_bExclusive")] + [NetworkVar("m_bExclusive")] public bool Exclusive; } diff --git a/Game.Client/C_ColorCorrectionVolume.cs b/Game.Client/C_ColorCorrectionVolume.cs index 9713f13e..7525f7af 100644 --- a/Game.Client/C_ColorCorrectionVolume.cs +++ b/Game.Client/C_ColorCorrectionVolume.cs @@ -3,28 +3,27 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CColorCorrectionVolume")] -public class C_ColorCorrectionVolume : C_BaseEntity +public partial class C_ColorCorrectionVolume : C_BaseEntity { - public static readonly RecvTable DT_ColorCorrectionVolume = new([ - RecvPropBool(FIELD.OF(nameof(Enabled))), - RecvPropFloat(FIELD.OF(nameof(MaxWeight))), - RecvPropFloat(FIELD.OF(nameof(FadeDuration))), - RecvPropFloat(FIELD.OF(nameof(Weight))), - RecvPropString(FIELD.OF(nameof(LookupFilename))), - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_ColorCorrectionVolume); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Enabled), + new(nameof(MaxWeight)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeDuration)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Weight)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(LookupFilename)) { Encoding = NetEncoding.String }, + new(nameof(ModelIndex)) { Encoding = NetEncoding.Int, Bits = 14 }, + ]; - [NetworkName("m_bEnabled")] + [NetworkVar("m_bEnabled")] public bool Enabled; - [NetworkName("m_MaxWeight")] + [NetworkVar("m_MaxWeight")] public float MaxWeight; - [NetworkName("m_FadeDuration")] + [NetworkVar("m_FadeDuration")] public float FadeDuration; - [NetworkName("m_Weight")] + [NetworkVar("m_Weight")] public float Weight; - [NetworkName("m_lookupFilename")] + [NetworkVar("m_lookupFilename")] public InlineArrayMaxPath LookupFilename; } diff --git a/Game.Client/C_DustTrail.cs b/Game.Client/C_DustTrail.cs index 1160ece6..8b056abe 100644 --- a/Game.Client/C_DustTrail.cs +++ b/Game.Client/C_DustTrail.cs @@ -3,51 +3,50 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("DustTrail")] -public class C_DustTrail : C_BaseParticleEntity +[NetworkName("DustTrail", Table = "DT_DustTrail")] +public partial class C_DustTrail : C_BaseParticleEntity { - public static readonly RecvTable DT_DustTrail = new(DT_BaseParticleEntity, [ - RecvPropFloat(FIELD.OF(nameof(SpawnRate))), - RecvPropVector(FIELD.OF(nameof(Color))), - RecvPropFloat(FIELD.OF(nameof(ParticleLifetime))), - RecvPropFloat(FIELD.OF(nameof(StopEmitTime))), - RecvPropFloat(FIELD.OF(nameof(MinSpeed))), - RecvPropFloat(FIELD.OF(nameof(MaxSpeed))), - RecvPropFloat(FIELD.OF(nameof(MinDirectedSpeed))), - RecvPropFloat(FIELD.OF(nameof(MaxDirectedSpeed))), - RecvPropFloat(FIELD.OF(nameof(StartSize))), - RecvPropFloat(FIELD.OF(nameof(EndSize))), - RecvPropFloat(FIELD.OF(nameof(SpawnRadius))), - RecvPropBool(FIELD.OF(nameof(Emit))), - RecvPropFloat(FIELD.OF(nameof(Opacity))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_DustTrail); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SpawnRate)) { Bits = 8, Low = 1.0f, High = 1024.0f }, + new(nameof(Color)) { Bits = 8, Low = 0.0f, High = 1.0f }, + new(nameof(ParticleLifetime)) { Bits = 16, Flags = PropFlags.RoundUp, Low = 0.1f, High = 100.0f }, + new(nameof(StopEmitTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MinSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MinDirectedSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxDirectedSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EndSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpawnRadius)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Emit), + new(nameof(Opacity)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_SpawnRate")] + [NetworkVar("m_SpawnRate")] public float SpawnRate; - [NetworkName("m_Color")] + [NetworkVar("m_Color")] public Vector3 Color; - [NetworkName("m_ParticleLifetime")] + [NetworkVar("m_ParticleLifetime")] public float ParticleLifetime; - [NetworkName("m_StopEmitTime")] + [NetworkVar("m_StopEmitTime")] public float StopEmitTime; - [NetworkName("m_MinSpeed")] + [NetworkVar("m_MinSpeed")] public float MinSpeed; - [NetworkName("m_MaxSpeed")] + [NetworkVar("m_MaxSpeed")] public float MaxSpeed; - [NetworkName("m_MinDirectedSpeed")] + [NetworkVar("m_MinDirectedSpeed")] public float MinDirectedSpeed; - [NetworkName("m_MaxDirectedSpeed")] + [NetworkVar("m_MaxDirectedSpeed")] public float MaxDirectedSpeed; - [NetworkName("m_StartSize")] + [NetworkVar("m_StartSize")] public float StartSize; - [NetworkName("m_EndSize")] + [NetworkVar("m_EndSize")] public float EndSize; - [NetworkName("m_SpawnRadius")] + [NetworkVar("m_SpawnRadius")] public float SpawnRadius; - [NetworkName("m_bEmit")] + [NetworkVar("m_bEmit")] public bool Emit; - [NetworkName("m_Opacity")] + [NetworkVar("m_Opacity")] public float Opacity; } diff --git a/Game.Client/C_DynamicLight.cs b/Game.Client/C_DynamicLight.cs index 5263761c..f7ead005 100644 --- a/Game.Client/C_DynamicLight.cs +++ b/Game.Client/C_DynamicLight.cs @@ -9,35 +9,34 @@ namespace Game.Client; -using FIELD = FIELD; [NetworkName("CDynamicLight")] -public class C_DynamicLight : C_BaseEntity +public partial class C_DynamicLight : C_BaseEntity { - public static readonly RecvTable DT_DynamicLight = new(DT_BaseEntity, [ - RecvPropInt(FIELD.OF(nameof(Flags))), - RecvPropInt(FIELD.OF(nameof(LightStyle))), - RecvPropFloat(FIELD.OF(nameof(Radius))), - RecvPropInt(FIELD.OF(nameof(Exponent))), - RecvPropFloat(FIELD.OF(nameof(InnerAngle))), - RecvPropFloat(FIELD.OF(nameof(OuterAngle))), - RecvPropFloat(FIELD.OF(nameof(SpotRadius))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_DynamicLight); - - [NetworkName("m_Flags")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Flags)) { Bits = 4, Flags = PropFlags.Unsigned }, + new(nameof(LightStyle)) { Bits = 4, Flags = PropFlags.Unsigned }, + new(nameof(Radius)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Exponent)) { Bits = 8 }, + new(nameof(InnerAngle)) { Bits = 8, Low = 0.0f, High = 360.0f }, + new(nameof(OuterAngle)) { Bits = 8, Low = 0.0f, High = 360.0f }, + new(nameof(SpotRadius)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; + + [NetworkVar("m_Flags")] public int Flags; - [NetworkName("m_LightStyle")] + [NetworkVar("m_LightStyle")] public int LightStyle; - [NetworkName("m_Radius")] + [NetworkVar("m_Radius")] public float Radius; - [NetworkName("m_Exponent")] + [NetworkVar("m_Exponent")] public int Exponent; - [NetworkName("m_InnerAngle")] + [NetworkVar("m_InnerAngle")] public float InnerAngle; - [NetworkName("m_OuterAngle")] + [NetworkVar("m_OuterAngle")] public float OuterAngle; - [NetworkName("m_SpotRadius")] + [NetworkVar("m_SpotRadius")] public float SpotRadius; DLight? DynamicLight; diff --git a/Game.Client/C_Embers.cs b/Game.Client/C_Embers.cs index 3a544dd2..ea675118 100644 --- a/Game.Client/C_Embers.cs +++ b/Game.Client/C_Embers.cs @@ -3,24 +3,23 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CEmbers")] -public class C_Embers : C_BaseEntity +public partial class C_Embers : C_BaseEntity { - public static readonly RecvTable DT_Embers = new(DT_BaseEntity, [ - RecvPropInt(FIELD.OF(nameof(Density))), - RecvPropInt(FIELD.OF(nameof(Lifetime))), - RecvPropInt(FIELD.OF(nameof(Speed))), - RecvPropInt(FIELD.OF(nameof(Emit))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_Embers); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Density)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Lifetime)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Speed)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Emit)) { Bits = 2, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nDensity")] + [NetworkVar("m_nDensity")] public int Density; - [NetworkName("m_nLifetime")] + [NetworkVar("m_nLifetime")] public int Lifetime; - [NetworkName("m_nSpeed")] + [NetworkVar("m_nSpeed")] public new int Speed; - [NetworkName("m_bEmit")] + [NetworkVar("m_bEmit")] public int Emit; } diff --git a/Game.Client/C_EntityDissolve.cs b/Game.Client/C_EntityDissolve.cs index 9f7c856d..47625bcb 100644 --- a/Game.Client/C_EntityDissolve.cs +++ b/Game.Client/C_EntityDissolve.cs @@ -3,42 +3,41 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CEntityDissolve")] -public class C_EntityDissolve : C_BaseEntity +public partial class C_EntityDissolve : C_BaseEntity { - public static readonly RecvTable DT_EntityDissolve = new(DT_BaseEntity, [ - RecvPropFloat(FIELD.OF(nameof(StartTime))), - RecvPropFloat(FIELD.OF(nameof(FadeInStart))), - RecvPropFloat(FIELD.OF(nameof(FadeInLength))), - RecvPropFloat(FIELD.OF(nameof(FadeOutModelStart))), - RecvPropFloat(FIELD.OF(nameof(FadeOutModelLength))), - RecvPropFloat(FIELD.OF(nameof(FadeOutStart))), - RecvPropFloat(FIELD.OF(nameof(FadeOutLength))), - RecvPropInt(FIELD.OF(nameof(DissolveType))), - RecvPropVector(FIELD.OF(nameof(DissolverOrigin))), - RecvPropInt(FIELD.OF(nameof(Magnitude))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_EntityDissolve); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeOutStart)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeOutLength)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeOutModelStart)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeOutModelLength)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeInStart)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeInLength)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DissolveType)) { Bits = 3, Flags = PropFlags.Unsigned }, + new(nameof(DissolverOrigin)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Magnitude)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_flStartTime")] + [NetworkVar("m_flStartTime")] public float StartTime; - [NetworkName("m_flFadeInStart")] - public float FadeInStart; - [NetworkName("m_flFadeInLength")] - public float FadeInLength; - [NetworkName("m_flFadeOutModelStart")] - public float FadeOutModelStart; - [NetworkName("m_flFadeOutModelLength")] - public float FadeOutModelLength; - [NetworkName("m_flFadeOutStart")] + [NetworkVar("m_flFadeOutStart")] public float FadeOutStart; - [NetworkName("m_flFadeOutLength")] + [NetworkVar("m_flFadeOutLength")] public float FadeOutLength; - [NetworkName("m_nDissolveType")] + [NetworkVar("m_flFadeOutModelStart")] + public float FadeOutModelStart; + [NetworkVar("m_flFadeOutModelLength")] + public float FadeOutModelLength; + [NetworkVar("m_flFadeInStart")] + public float FadeInStart; + [NetworkVar("m_flFadeInLength")] + public float FadeInLength; + [NetworkVar("m_nDissolveType")] public int DissolveType; - [NetworkName("m_vDissolverOrigin")] + [NetworkVar("m_vDissolverOrigin")] public Vector3 DissolverOrigin; - [NetworkName("m_nMagnitude")] + [NetworkVar("m_nMagnitude")] public int Magnitude; } diff --git a/Game.Client/C_EntityFlame.cs b/Game.Client/C_EntityFlame.cs index 6592e049..1183b028 100644 --- a/Game.Client/C_EntityFlame.cs +++ b/Game.Client/C_EntityFlame.cs @@ -3,15 +3,14 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CEntityFlame")] -public class C_EntityFlame : C_BaseEntity +public partial class C_EntityFlame : C_BaseEntity { - public static readonly RecvTable DT_EntityFlame = new(DT_BaseEntity, [ - RecvPropEHandle(FIELD.OF(nameof(EntAttached))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_EntityFlame); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(EntAttached), + ]; - [NetworkName("m_hEntAttached")] + [NetworkVar("m_hEntAttached")] public EHANDLE EntAttached = new(); } diff --git a/Game.Client/C_EntityParticleTrail.cs b/Game.Client/C_EntityParticleTrail.cs index 6dc6b85a..544320ee 100644 --- a/Game.Client/C_EntityParticleTrail.cs +++ b/Game.Client/C_EntityParticleTrail.cs @@ -3,38 +3,37 @@ namespace Game.Client; -using FIELD = FIELD; - -public class C_EntityParticleTrailInfo +public partial class C_EntityParticleTrailInfo { - [NetworkName("m_flLifetime")] + [NetworkTable("DT_EntityParticleTrailInfo")] + public static readonly NetworkProp[] Props = [ + nameof(Lifetime), + nameof(StartSize), + nameof(EndSize), + ]; + + [NetworkVar("m_flLifetime")] public float Lifetime; - [NetworkName("m_flStartSize")] + [NetworkVar("m_flStartSize")] public float StartSize; - [NetworkName("m_flEndSize")] + [NetworkVar("m_flEndSize")] public float EndSize; - - public static readonly RecvTable DT_EntityParticleTrailInfo = new("DT_EntityParticleTrailInfo", [ - RecvPropFloat(Source.FIELD.OF(nameof(Lifetime))), - RecvPropFloat(Source.FIELD.OF(nameof(StartSize))), - RecvPropFloat(Source.FIELD.OF(nameof(EndSize))), - ]); } [NetworkName("CEntityParticleTrail")] -public class C_EntityParticleTrail : C_BaseParticleEntity +public partial class C_EntityParticleTrail : C_BaseParticleEntity { - [NetworkName("m_iMaterialName")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(MaterialName)) { Bits = 10, Flags = PropFlags.Unsigned }, + new(nameof(Info)) { Encoding = NetEncoding.DataTable, DataTable = "DT_EntityParticleTrailInfo" }, + nameof(ConstraintEntity), + ]; + + [NetworkVar("m_iMaterialName")] public int MaterialName; - [NetworkName("m_Info")] + [NetworkVar("m_Info")] public C_EntityParticleTrailInfo Info = new(); - [NetworkName("m_hConstraintEntity")] + [NetworkVar("m_hConstraintEntity")] public EHANDLE ConstraintEntity; - - public static readonly RecvTable DT_EntityParticleTrail = new(DT_BaseParticleEntity, [ - RecvPropInt(FIELD.OF(nameof(MaterialName))), - RecvPropDataTable("m_Info", FIELD.OF(nameof(Info)), C_EntityParticleTrailInfo.DT_EntityParticleTrailInfo), - RecvPropEHandle(FIELD.OF(nameof(ConstraintEntity))), - ]); - public static new readonly ClientClass ClientClass = new ClientClass(DT_EntityParticleTrail); } diff --git a/Game.Client/C_EnvAmbientLight.cs b/Game.Client/C_EnvAmbientLight.cs index 1fea2ca1..f03ffb9b 100644 --- a/Game.Client/C_EnvAmbientLight.cs +++ b/Game.Client/C_EnvAmbientLight.cs @@ -3,15 +3,14 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CEnvAmbientLight")] -public class C_EnvAmbientLight : C_SpatialEntity +public partial class C_EnvAmbientLight : C_SpatialEntity { - public static readonly RecvTable DT_EnvAmbientLight = new(DT_SpatialEntity, [ - RecvPropVector(FIELD.OF(nameof(Color))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_EnvAmbientLight); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Color)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_vecColor")] + [NetworkVar("m_vecColor")] public Vector3 Color; } diff --git a/Game.Client/C_EnvDetailController.cs b/Game.Client/C_EnvDetailController.cs index f1b99d48..3de58d49 100644 --- a/Game.Client/C_EnvDetailController.cs +++ b/Game.Client/C_EnvDetailController.cs @@ -3,20 +3,19 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [LinkEntityToClass("env_detail_controller")] -[NetworkName("CEnvDetailController")] -public class C_EnvDetailController : C_BaseEntity +[NetworkName("CEnvDetailController", Table = "DT_DetailController", NoBase = true)] +public partial class C_EnvDetailController : C_BaseEntity { - public static readonly RecvTable DT_DetailController = new([ - RecvPropFloat(FIELD.OF(nameof(FadeStartDist))), - RecvPropFloat(FIELD.OF(nameof(FadeEndDist))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_DetailController); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(FadeStartDist)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeEndDist)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flFadeStartDist")] + [NetworkVar("m_flFadeStartDist")] public float FadeStartDist; - [NetworkName("m_flFadeEndDist")] + [NetworkVar("m_flFadeEndDist")] public float FadeEndDist; static C_EnvDetailController? s_DetailController; diff --git a/Game.Client/C_EnvHeadcrabCanister.cs b/Game.Client/C_EnvHeadcrabCanister.cs index 97eb622f..8ca6f77d 100644 --- a/Game.Client/C_EnvHeadcrabCanister.cs +++ b/Game.Client/C_EnvHeadcrabCanister.cs @@ -4,74 +4,73 @@ namespace Game.Client; -using FIELD = FIELD; - -public class C_EnvHeadcrabCanisterShared +public partial class C_EnvHeadcrabCanisterShared { - [NetworkName("m_flFlightSpeed")] + [NetworkTable("DT_EnvHeadcrabCanisterShared")] + public static readonly NetworkProp[] Props = [ + nameof(FlightSpeed), + nameof(LaunchTime), + nameof(ParabolaDirection), + nameof(FlightTime), + nameof(WorldEnterTime), + nameof(InitialZSpeed), + nameof(ZAcceleration), + nameof(HorizSpeed), + nameof(LaunchedFromWithinWorld), + nameof(StartPosition), + nameof(EnterWorldPosition), + nameof(Direction), + nameof(StartAngles), + nameof(SkyboxOrigin), + nameof(SkyboxScale), + nameof(InSkybox), + ]; + + [NetworkVar("m_flFlightSpeed")] public float FlightSpeed; - [NetworkName("m_flLaunchTime")] + [NetworkVar("m_flLaunchTime")] public TimeUnit_t LaunchTime; - [NetworkName("m_vecParabolaDirection")] + [NetworkVar("m_vecParabolaDirection")] public Vector3 ParabolaDirection; - [NetworkName("m_flFlightTime")] + [NetworkVar("m_flFlightTime")] public float FlightTime; - [NetworkName("m_flWorldEnterTime")] + [NetworkVar("m_flWorldEnterTime")] public float WorldEnterTime; - [NetworkName("m_flInitialZSpeed")] + [NetworkVar("m_flInitialZSpeed")] public float InitialZSpeed; - [NetworkName("m_flZAcceleration")] + [NetworkVar("m_flZAcceleration")] public float ZAcceleration; - [NetworkName("m_flHorizSpeed")] + [NetworkVar("m_flHorizSpeed")] public float HorizSpeed; - [NetworkName("m_bLaunchedFromWithinWorld")] + [NetworkVar("m_bLaunchedFromWithinWorld")] public bool LaunchedFromWithinWorld; - [NetworkName("m_vecStartPosition")] + [NetworkVar("m_vecStartPosition")] public Vector3 StartPosition; - [NetworkName("m_vecEnterWorldPosition")] + [NetworkVar("m_vecEnterWorldPosition")] public Vector3 EnterWorldPosition; - [NetworkName("m_vecDirection")] + [NetworkVar("m_vecDirection")] public Vector3 Direction; - [NetworkName("m_vecStartAngles")] + [NetworkVar("m_vecStartAngles")] public Vector3 StartAngles; - [NetworkName("m_vecSkyboxOrigin")] + [NetworkVar("m_vecSkyboxOrigin")] public Vector3 SkyboxOrigin; - [NetworkName("m_flSkyboxScale")] + [NetworkVar("m_flSkyboxScale")] public float SkyboxScale; - [NetworkName("m_bInSkybox")] + [NetworkVar("m_bInSkybox")] public bool InSkybox; - - public static readonly RecvTable DT_EnvHeadcrabCanisterShared = new("DT_EnvHeadcrabCanisterShared", [ - RecvPropFloat(Source.FIELD.OF(nameof(FlightSpeed))), - RecvPropTime64(Source.FIELD.OF(nameof(LaunchTime))), - RecvPropVector(Source.FIELD.OF(nameof(ParabolaDirection))), - RecvPropFloat(Source.FIELD.OF(nameof(FlightTime))), - RecvPropFloat(Source.FIELD.OF(nameof(WorldEnterTime))), - RecvPropFloat(Source.FIELD.OF(nameof(InitialZSpeed))), - RecvPropFloat(Source.FIELD.OF(nameof(ZAcceleration))), - RecvPropFloat(Source.FIELD.OF(nameof(HorizSpeed))), - RecvPropBool(Source.FIELD.OF(nameof(LaunchedFromWithinWorld))), - RecvPropVector(Source.FIELD.OF(nameof(StartPosition))), - RecvPropVector(Source.FIELD.OF(nameof(EnterWorldPosition))), - RecvPropVector(Source.FIELD.OF(nameof(Direction))), - RecvPropVector(Source.FIELD.OF(nameof(StartAngles))), - RecvPropVector(Source.FIELD.OF(nameof(SkyboxOrigin))), - RecvPropFloat(Source.FIELD.OF(nameof(SkyboxScale))), - RecvPropBool(Source.FIELD.OF(nameof(InSkybox))), - ]); } [NetworkName("CEnvHeadcrabCanister")] -public class C_EnvHeadcrabCanister : C_BaseAnimating +public partial class C_EnvHeadcrabCanister : C_BaseAnimating { - [NetworkName("m_Shared")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Shared)) { Encoding = NetEncoding.DataTable, DataTable = "DT_EnvHeadcrabCanisterShared" }, + nameof(Landed), + ]; + + [NetworkVar("m_Shared")] public C_EnvHeadcrabCanisterShared Shared = new(); - [NetworkName("m_bLanded")] + [NetworkVar("m_bLanded")] public bool Landed; - - public static readonly RecvTable DT_EnvHeadcrabCanister = new(DT_BaseAnimating, [ - RecvPropDataTable("m_Shared", FIELD.OF(nameof(Shared)), C_EnvHeadcrabCanisterShared.DT_EnvHeadcrabCanisterShared), - RecvPropBool(FIELD.OF(nameof(Landed))), - ]); - public static new readonly ClientClass ClientClass = new ClientClass(DT_EnvHeadcrabCanister); } diff --git a/Game.Client/C_EnvParticleScript.cs b/Game.Client/C_EnvParticleScript.cs index c0e7697b..dd30c1bf 100644 --- a/Game.Client/C_EnvParticleScript.cs +++ b/Game.Client/C_EnvParticleScript.cs @@ -3,15 +3,14 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CEnvParticleScript")] -public class C_EnvParticleScript : C_BaseAnimating +public partial class C_EnvParticleScript : C_BaseAnimating { - public static readonly RecvTable DT_EnvParticleScript = new(DT_BaseAnimating, [ - RecvPropFloat(FIELD.OF(nameof(SequenceScale))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_EnvParticleScript); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SequenceScale)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flSequenceScale")] + [NetworkVar("m_flSequenceScale")] public float SequenceScale; } diff --git a/Game.Client/C_EnvProjectedTexture.cs b/Game.Client/C_EnvProjectedTexture.cs index 85c956f3..84fe5306 100644 --- a/Game.Client/C_EnvProjectedTexture.cs +++ b/Game.Client/C_EnvProjectedTexture.cs @@ -3,54 +3,53 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CEnvProjectedTexture")] -public class C_EnvProjectedTexture : C_BaseEntity +public partial class C_EnvProjectedTexture : C_BaseEntity { - public static readonly RecvTable DT_EnvProjectedTexture = new(DT_BaseEntity, [ - RecvPropEHandle(FIELD.OF(nameof(HTargetEntity))), - RecvPropBool(FIELD.OF(nameof(State))), - RecvPropFloat(FIELD.OF(nameof(LightFOV))), - RecvPropBool(FIELD.OF(nameof(EnableShadows))), - RecvPropBool(FIELD.OF(nameof(LightOnlyTarget))), - RecvPropBool(FIELD.OF(nameof(LightWorld))), - RecvPropBool(FIELD.OF(nameof(CameraSpace))), - RecvPropVector(FIELD.OF(nameof(LinearFloatLightColor))), - RecvPropString(FIELD.OF(nameof(SpotlightTextureName))), - RecvPropInt(FIELD.OF(nameof(SpotlightTextureFrame))), - RecvPropFloat(FIELD.OF(nameof(NearZ))), - RecvPropFloat(FIELD.OF(nameof(FarZ))), - RecvPropBool(FIELD.OF(nameof(ShadowQuality))), - RecvPropInt(FIELD.OF(nameof(Style))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_EnvProjectedTexture); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(HTargetEntity), + nameof(State), + new(nameof(LightFOV)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(EnableShadows), + nameof(LightOnlyTarget), + nameof(LightWorld), + nameof(CameraSpace), + new(nameof(LinearFloatLightColor)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpotlightTextureName)) { Encoding = NetEncoding.String }, + new(nameof(SpotlightTextureFrame)) { Bits = 14 }, + new(nameof(NearZ)) { Bits = 16, Flags = PropFlags.RoundDown, Low = 0.0f, High = 500.0f }, + new(nameof(FarZ)) { Bits = 18, Flags = PropFlags.RoundDown, Low = 0.0f, High = 56756.0f }, + nameof(ShadowQuality), + new(nameof(Style)) { Bits = 8 }, + ]; - [NetworkName("m_hTargetEntity")] + [NetworkVar("m_hTargetEntity")] public EHANDLE HTargetEntity = new(); - [NetworkName("m_bState")] + [NetworkVar("m_bState")] public bool State; - [NetworkName("m_flLightFOV")] + [NetworkVar("m_flLightFOV")] public float LightFOV; - [NetworkName("m_bEnableShadows")] + [NetworkVar("m_bEnableShadows")] public bool EnableShadows; - [NetworkName("m_bLightOnlyTarget")] + [NetworkVar("m_bLightOnlyTarget")] public bool LightOnlyTarget; - [NetworkName("m_bLightWorld")] + [NetworkVar("m_bLightWorld")] public bool LightWorld; - [NetworkName("m_bCameraSpace")] + [NetworkVar("m_bCameraSpace")] public bool CameraSpace; - [NetworkName("m_LinearFloatLightColor")] + [NetworkVar("m_LinearFloatLightColor")] public Vector3 LinearFloatLightColor; - [NetworkName("m_SpotlightTextureName")] + [NetworkVar("m_SpotlightTextureName")] public InlineArrayMaxPath SpotlightTextureName; - [NetworkName("m_nSpotlightTextureFrame")] + [NetworkVar("m_nSpotlightTextureFrame")] public int SpotlightTextureFrame; - [NetworkName("m_flNearZ")] + [NetworkVar("m_flNearZ")] public float NearZ; - [NetworkName("m_flFarZ")] + [NetworkVar("m_flFarZ")] public float FarZ; - [NetworkName("m_nShadowQuality")] + [NetworkVar("m_nShadowQuality")] public bool ShadowQuality; - [NetworkName("m_iStyle")] + [NetworkVar("m_iStyle")] public int Style; } diff --git a/Game.Client/C_EnvQuadraticBeam.cs b/Game.Client/C_EnvQuadraticBeam.cs index 3b7e0fdd..44ed36ec 100644 --- a/Game.Client/C_EnvQuadraticBeam.cs +++ b/Game.Client/C_EnvQuadraticBeam.cs @@ -3,24 +3,23 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("CEnvQuadraticBeam")] -public class C_EnvQuadraticBeam : C_BaseEntity +[NetworkName("CEnvQuadraticBeam", Table = "DT_QuadraticBeam")] +public partial class C_EnvQuadraticBeam : C_BaseEntity { - public static readonly RecvTable DT_QuadraticBeam = new(DT_BaseEntity, [ - RecvPropVector(FIELD.OF(nameof(TargetPosition))), - RecvPropVector(FIELD.OF(nameof(ControlPosition))), - RecvPropFloat(FIELD.OF(nameof(ScrollRate))), - RecvPropFloat(FIELD.OF(nameof(Width))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_QuadraticBeam); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(TargetPosition)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ControlPosition)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ScrollRate)) { Bits = 8, Low = -4, High = 4 }, + new(nameof(Width)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_targetPosition")] + [NetworkVar("m_targetPosition")] public Vector3 TargetPosition; - [NetworkName("m_controlPosition")] + [NetworkVar("m_controlPosition")] public Vector3 ControlPosition; - [NetworkName("m_scrollRate")] + [NetworkVar("m_scrollRate")] public float ScrollRate; - [NetworkName("m_flWidth")] + [NetworkVar("m_flWidth")] public float Width; } diff --git a/Game.Client/C_EnvScreenEffect.cs b/Game.Client/C_EnvScreenEffect.cs index b840fb2f..06e8650e 100644 --- a/Game.Client/C_EnvScreenEffect.cs +++ b/Game.Client/C_EnvScreenEffect.cs @@ -3,18 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CEnvScreenEffect")] -public class C_EnvScreenEffect : C_BaseEntity +public partial class C_EnvScreenEffect : C_BaseEntity { - public static readonly RecvTable DT_EnvScreenEffect = new(DT_BaseEntity, [ - RecvPropFloat(FIELD.OF(nameof(Duration))), - RecvPropInt(FIELD.OF(nameof(Type))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_EnvScreenEffect); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Duration)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Type)) { Bits = 12, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_flDuration")] + [NetworkVar("m_flDuration")] public float Duration; - [NetworkName("m_nType")] + [NetworkVar("m_nType")] public int Type; } diff --git a/Game.Client/C_EnvScreenOverlay.cs b/Game.Client/C_EnvScreenOverlay.cs index 43c3fe36..2072bc4b 100644 --- a/Game.Client/C_EnvScreenOverlay.cs +++ b/Game.Client/C_EnvScreenOverlay.cs @@ -3,32 +3,28 @@ namespace Game.Client; -using FIELD = FIELD; - [NetworkName("CEnvScreenOverlay")] -public class C_EnvScreenOverlay : C_BaseEntity +public partial class C_EnvScreenOverlay : C_BaseEntity { public const int MAX_SCREEN_OVERLAYS = 10; - [NetworkName("m_iszOverlayNames")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(OverlayNames)) { Encoding = NetEncoding.Array }, + new(nameof(OverlayTimes)) { Encoding = NetEncoding.Array, Bits = 11, Flags = PropFlags.RoundDown, Low = -1.0f, High = 63.0f }, + new(nameof(StartTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DesiredOverlay)) { Bits = 5 }, + nameof(IsActive), + ]; + + [NetworkVar("m_iszOverlayNames")] public InlineArray10> OverlayNames; - [NetworkName("m_flOverlayTimes")] + [NetworkVar("m_flOverlayTimes")] public InlineArray10 OverlayTimes; - [NetworkName("m_flStartTime")] + [NetworkVar("m_flStartTime")] public float StartTime; - [NetworkName("m_iDesiredOverlay")] + [NetworkVar("m_iDesiredOverlay")] public int DesiredOverlay; - [NetworkName("m_bIsActive")] + [NetworkVar("m_bIsActive")] public bool IsActive; - - public static readonly RecvTable DT_EnvScreenOverlay = new(DT_BaseEntity, [ - RecvPropString(FIELD.OF_ARRAYINDEX(nameof(OverlayNames), 0)), - RecvPropArray(FIELD.OF_ARRAY(nameof(OverlayNames))), - RecvPropFloat(FIELD.OF_ARRAYINDEX(nameof(OverlayTimes), 0)), - RecvPropArray(FIELD.OF_ARRAY(nameof(OverlayTimes))), - RecvPropFloat(FIELD.OF(nameof(StartTime))), - RecvPropInt(FIELD.OF(nameof(DesiredOverlay))), - RecvPropBool(FIELD.OF(nameof(IsActive))), - ]); - public static new readonly ClientClass ClientClass = new ClientClass(DT_EnvScreenOverlay); } diff --git a/Game.Client/C_EnvStarfield.cs b/Game.Client/C_EnvStarfield.cs index 1332e08d..87e18b1c 100644 --- a/Game.Client/C_EnvStarfield.cs +++ b/Game.Client/C_EnvStarfield.cs @@ -3,18 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CEnvStarfield")] -public class C_EnvStarfield : C_BaseEntity +public partial class C_EnvStarfield : C_BaseEntity { - public static readonly RecvTable DT_EnvStarfield = new(DT_BaseEntity, [ - RecvPropBool(FIELD.OF(nameof(On))), - RecvPropFloat(FIELD.OF(nameof(Density))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_EnvStarfield); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(On), + new(nameof(Density)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_bOn")] + [NetworkVar("m_bOn")] public bool On; - [NetworkName("m_flDensity")] + [NetworkVar("m_flDensity")] public float Density; } diff --git a/Game.Client/C_EnvTonemapController.cs b/Game.Client/C_EnvTonemapController.cs index 4b147920..1f6abe20 100644 --- a/Game.Client/C_EnvTonemapController.cs +++ b/Game.Client/C_EnvTonemapController.cs @@ -5,34 +5,34 @@ using Source.Common; -using FIELD = Source.FIELD; [NetworkName("CEnvTonemapController")] -public class C_EnvTonemapController : C_BaseEntity +public partial class C_EnvTonemapController : C_BaseEntity { - public static readonly RecvTable DT_EnvTonemapController = new(DT_BaseEntity, [ - RecvPropBool(FIELD.OF(nameof(UseCustomAutoExposureMin))), - RecvPropBool(FIELD.OF(nameof(UseCustomAutoExposureMax))), - RecvPropBool(FIELD.OF(nameof(UseCustomBloomScale))), - RecvPropFloat(FIELD.OF(nameof(CustomAutoExposureMin))), - RecvPropFloat(FIELD.OF(nameof(CustomAutoExposureMax))), - RecvPropFloat(FIELD.OF(nameof(CustomBloomScale))), - RecvPropFloat(FIELD.OF(nameof(CustomBloomScaleMinimum))), - ]); public static readonly new ClientClass ClientClass = new ClientClass(DT_EnvTonemapController); - - [NetworkName("m_bUseCustomAutoExposureMin")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(UseCustomAutoExposureMin), + nameof(UseCustomAutoExposureMax), + nameof(UseCustomBloomScale), + new(nameof(CustomAutoExposureMin)) { Bits = 0, Flags = PropFlags.NoScale, Low = 0, High = 0 }, + new(nameof(CustomAutoExposureMax)) { Bits = 0, Flags = PropFlags.NoScale, Low = 0, High = 0 }, + new(nameof(CustomBloomScale)) { Bits = 0, Flags = PropFlags.NoScale, Low = 0, High = 0 }, + new(nameof(CustomBloomScaleMinimum)) { Bits = 0, Flags = PropFlags.NoScale, Low = 0, High = 0 }, + ]; + + [NetworkVar("m_bUseCustomAutoExposureMin")] public bool UseCustomAutoExposureMin; - [NetworkName("m_bUseCustomAutoExposureMax")] + [NetworkVar("m_bUseCustomAutoExposureMax")] public bool UseCustomAutoExposureMax; - [NetworkName("m_bUseCustomBloomScale")] + [NetworkVar("m_bUseCustomBloomScale")] public bool UseCustomBloomScale; - [NetworkName("m_flCustomAutoExposureMin")] + [NetworkVar("m_flCustomAutoExposureMin")] public float CustomAutoExposureMin; - [NetworkName("m_flCustomAutoExposureMax")] + [NetworkVar("m_flCustomAutoExposureMax")] public float CustomAutoExposureMax; - [NetworkName("m_flCustomBloomScale")] + [NetworkVar("m_flCustomBloomScale")] public float CustomBloomScale; - [NetworkName("m_flCustomBloomScaleMinimum")] + [NetworkVar("m_flCustomBloomScaleMinimum")] public float CustomBloomScaleMinimum; static EHANDLE g_hTonemapControllerInUse = new(); diff --git a/Game.Client/C_EnvWind.cs b/Game.Client/C_EnvWind.cs index 1cccdca8..c2585ff8 100644 --- a/Game.Client/C_EnvWind.cs +++ b/Game.Client/C_EnvWind.cs @@ -4,32 +4,14 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -using FIELD_EWS = FIELD; [NetworkName("CEnvWind")] -public class C_EnvWind : C_BaseEntity +public partial class C_EnvWind : C_BaseEntity { - public static readonly RecvTable DT_EnvWindShared = new(nameof(DT_EnvWindShared), [ - RecvPropInt(FIELD_EWS.OF(nameof(EnvWindShared.MinWind))), - RecvPropInt(FIELD_EWS.OF(nameof(EnvWindShared.MaxWind))), - RecvPropInt(FIELD_EWS.OF(nameof(EnvWindShared.MinGust))), - RecvPropInt(FIELD_EWS.OF(nameof(EnvWindShared.MaxGust))), - RecvPropFloat(FIELD_EWS.OF(nameof(EnvWindShared.MinGustDelay))), - RecvPropFloat(FIELD_EWS.OF(nameof(EnvWindShared.MaxGustDelay))), - RecvPropInt(FIELD_EWS.OF(nameof(EnvWindShared.GustDirChange))), - RecvPropInt(FIELD_EWS.OF(nameof(EnvWindShared.WindSeed))), - RecvPropInt(FIELD_EWS.OF(nameof(EnvWindShared.InitialWindDir))), - RecvPropFloat(FIELD_EWS.OF(nameof(EnvWindShared.InitialWindSpeed))), - RecvPropFloat(FIELD_EWS.OF(nameof(EnvWindShared.StartTime))), - RecvPropFloat(FIELD_EWS.OF(nameof(EnvWindShared.GustDuration))), - RecvPropInt(FIELD_EWS.OF(nameof(EnvWindShared.WindRadius))), - ]); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(EnvWindShared)) { Encoding = NetEncoding.DataTable, DataTable = "DT_EnvWindShared" }, + ]; - public static readonly RecvTable DT_EnvWind = new([ - RecvPropDataTable("m_EnvWindShared", FIELD.OF(nameof(EnvWindShared)), DT_EnvWindShared, 0, RECV_GET_OBJECT_AT_FIELD(FIELD.OF(nameof(EnvWindShared)))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_EnvWind); - - [NetworkName("m_EnvWindShared")] + [NetworkVar("m_EnvWindShared")] public readonly EnvWindShared EnvWindShared = new(); } diff --git a/Game.Client/C_FireSmoke.cs b/Game.Client/C_FireSmoke.cs index 62d4a4e4..968279cf 100644 --- a/Game.Client/C_FireSmoke.cs +++ b/Game.Client/C_FireSmoke.cs @@ -3,32 +3,31 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CFireSmoke")] -public class C_FireSmoke : C_BaseEntity +public partial class C_FireSmoke : C_BaseEntity { - public static readonly RecvTable DT_FireSmoke = new(DT_BaseEntity, [ - RecvPropFloat(FIELD.OF(nameof(StartScale))), - // todo: RecvProxy_Scale - RecvPropFloat(FIELD.OF(nameof(Scale))), - // todo: RecvProxy_ScaleTime - RecvPropFloat(FIELD.OF(nameof(ScaleTime))), - RecvPropInt(FIELD.OF(nameof(Flags))), - RecvPropInt(FIELD.OF(nameof(FlameModelIndex))), - RecvPropInt(FIELD.OF(nameof(FlameFromAboveModelIndex))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_FireSmoke); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartScale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Scale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ScaleTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Flags)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(FlameModelIndex)) { Bits = 14 }, + new(nameof(FlameFromAboveModelIndex)) { Bits = 14 }, + ]; - [NetworkName("m_flStartScale")] + [NetworkVar("m_flStartScale")] public float StartScale; - [NetworkName("m_flScale")] + // todo: RecvProxy_Scale + [NetworkVar("m_flScale")] public float Scale; - [NetworkName("m_flScaleTime")] + // todo: RecvProxy_ScaleTime + [NetworkVar("m_flScaleTime")] public float ScaleTime; - [NetworkName("m_nFlags")] + [NetworkVar("m_nFlags")] public int Flags; - [NetworkName("m_nFlameModelIndex")] + [NetworkVar("m_nFlameModelIndex")] public int FlameModelIndex; - [NetworkName("m_nFlameFromAboveModelIndex")] + [NetworkVar("m_nFlameFromAboveModelIndex")] public int FlameFromAboveModelIndex; } diff --git a/Game.Client/C_FireTrail.cs b/Game.Client/C_FireTrail.cs index 8dd221d4..06f4c7cd 100644 --- a/Game.Client/C_FireTrail.cs +++ b/Game.Client/C_FireTrail.cs @@ -3,18 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CFireTrail")] -public class C_FireTrail : C_BaseParticleEntity +public partial class C_FireTrail : C_BaseParticleEntity { - public static readonly RecvTable DT_FireTrail = new(DT_BaseParticleEntity, [ - RecvPropInt(FIELD.OF(nameof(Attachment))), - RecvPropFloat(FIELD.OF(nameof(Lifetime))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_FireTrail); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Attachment)) { Bits = 32 }, + new(nameof(Lifetime)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_nAttachment")] + [NetworkVar("m_nAttachment")] public int Attachment; - [NetworkName("m_flLifetime")] + [NetworkVar("m_flLifetime")] public float Lifetime; } diff --git a/Game.Client/C_Fish.cs b/Game.Client/C_Fish.cs index 97ad6acd..3ef165ad 100644 --- a/Game.Client/C_Fish.cs +++ b/Game.Client/C_Fish.cs @@ -3,32 +3,31 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("CFish")] -public class C_Fish : C_BaseAnimating +[NetworkName("CFish", Table = "DT_CFish", NoBase = true)] +public partial class C_Fish : C_BaseAnimating { - public static readonly RecvTable DT_CFish = new([ - RecvPropVector(FIELD.OF(nameof(PoolOrigin))), - RecvPropFloat(FIELD.OF(nameof(Le))), - RecvPropFloat(FIELD.OF(nameof(X))), - RecvPropFloat(FIELD.OF(nameof(Y))), - RecvPropFloat(FIELD.OF(nameof(Z))), - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - RecvPropInt(FIELD.OF(nameof(LifeState))), - RecvPropFloat(FIELD.OF(nameof(WaterLevel))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_CFish); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(PoolOrigin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(X)) { Bits = 7, Low = -255.0f, High = 255.0f }, + new(nameof(Y)) { Bits = 7, Low = -255.0f, High = 255.0f }, + new(nameof(Z)) { Bits = 0, Flags = PropFlags.Coord | PropFlags.NoScale }, + new(nameof(Le)) { Bits = 7, Low = 0.0f, High = 360.0f }, + new(nameof(ModelIndex)) { Encoding = NetEncoding.Int, Bits = 14 }, + new(nameof(LifeState)) { Bits = 3, Flags = PropFlags.Unsigned }, + new(nameof(WaterLevel)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_poolOrigin")] + [NetworkVar("m_poolOrigin")] public Vector3 PoolOrigin; - [NetworkName("m_angle")] - public float Le; - [NetworkName("m_x")] + [NetworkVar("m_x")] public float X; - [NetworkName("m_y")] + [NetworkVar("m_y")] public float Y; - [NetworkName("m_z")] + [NetworkVar("m_z")] public float Z; - [NetworkName("m_waterLevel")] + [NetworkVar("m_angle")] + public float Le; + [NetworkVar("m_waterLevel")] public new float WaterLevel; } diff --git a/Game.Client/C_Flare.cs b/Game.Client/C_Flare.cs index 849688fb..35a85d8d 100644 --- a/Game.Client/C_Flare.cs +++ b/Game.Client/C_Flare.cs @@ -3,27 +3,26 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CFlare")] -public class C_Flare : C_BaseCombatCharacter +public partial class C_Flare : C_BaseCombatCharacter { - public static readonly RecvTable DT_Flare = new(DT_BaseCombatCharacter, [ - RecvPropFloat(FIELD.OF(nameof(TimeBurnOut))), - RecvPropFloat(FIELD.OF(nameof(Scale))), - RecvPropBool(FIELD.OF(nameof(Light))), - RecvPropBool(FIELD.OF(nameof(Smoke))), - RecvPropBool(FIELD.OF(nameof(PropFlare))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_Flare); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(TimeBurnOut)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Scale)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Light), + nameof(Smoke), + nameof(PropFlare), + ]; - [NetworkName("m_flTimeBurnOut")] + [NetworkVar("m_flTimeBurnOut")] public float TimeBurnOut; - [NetworkName("m_flScale")] + [NetworkVar("m_flScale")] public float Scale; - [NetworkName("m_bLight")] + [NetworkVar("m_bLight")] public bool Light; - [NetworkName("m_bSmoke")] + [NetworkVar("m_bSmoke")] public bool Smoke; - [NetworkName("m_bPropFlare")] + [NetworkVar("m_bPropFlare")] public bool PropFlare; } diff --git a/Game.Client/C_FleshEffectTarget.cs b/Game.Client/C_FleshEffectTarget.cs index a08277c9..5e912b78 100644 --- a/Game.Client/C_FleshEffectTarget.cs +++ b/Game.Client/C_FleshEffectTarget.cs @@ -3,18 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CFleshEffectTarget")] -public class C_FleshEffectTarget : C_BaseEntity +public partial class C_FleshEffectTarget : C_BaseEntity { - public static readonly RecvTable DT_FleshEffectTarget = new(DT_BaseEntity, [ - RecvPropFloat(FIELD.OF(nameof(Radius))), - RecvPropFloat(FIELD.OF(nameof(ScaleTime))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_FleshEffectTarget); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Radius)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ScaleTime)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flRadius")] + [NetworkVar("m_flRadius")] public float Radius; - [NetworkName("m_flScaleTime")] + [NetworkVar("m_flScaleTime")] public float ScaleTime; } diff --git a/Game.Client/C_FlexManipulate.cs b/Game.Client/C_FlexManipulate.cs index c294b73d..db1d6e1e 100644 --- a/Game.Client/C_FlexManipulate.cs +++ b/Game.Client/C_FlexManipulate.cs @@ -3,23 +3,22 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [LinkEntityToClass("manipulate_flex")] [NetworkName("CFlexManipulate")] -public class C_FlexManipulate : C_BaseEntity +public partial class C_FlexManipulate : C_BaseEntity { - public static readonly RecvTable DT_FlexManipulate = new(DT_BaseEntity, [ - RecvPropFloat(FIELD.OF(nameof(ExScale))), - RecvPropVector(FIELD.OF(nameof(EyesLocalTarget))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(FlexWeights)), RecvPropFloat(null!)), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_FlexManipulate); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ExScale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EyesLocalTarget)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FlexWeights)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flexScale")] + [NetworkVar("m_flexScale")] public float ExScale; - [NetworkName("m_EyesLocalTarget")] + [NetworkVar("m_EyesLocalTarget")] public Vector3 EyesLocalTarget; - [NetworkName("m_iFlexWeights")] + [NetworkVar("m_iFlexWeights")] public InlineArray96 FlexWeights; public void SetFlexWeight(byte index, float weight) { diff --git a/Game.Client/C_FogController.cs b/Game.Client/C_FogController.cs index ee70dd5b..effbf697 100644 --- a/Game.Client/C_FogController.cs +++ b/Game.Client/C_FogController.cs @@ -1,38 +1,36 @@ -using Game.Client; -using Game.Shared; - -using Source.Common; - -namespace Game.Server; -using FIELD = Source.FIELD; - -[NetworkName("CFogController")] -public class C_FogController : C_BaseEntity -{ - [NetworkName("m_fog")] - public FogParams Fog; - public static readonly RecvTable DT_FogController = new([ - RecvPropInt(FIELD.OF("Fog.Enable")), - RecvPropInt(FIELD.OF("Fog.Blend")), - RecvPropInt(FIELD.OF("Fog.Radial")), - RecvPropVector(FIELD.OF("Fog.DirPrimary")), - RecvPropInt(FIELD.OF("Fog.ColorPrimary")), - RecvPropInt(FIELD.OF("Fog.ColorSecondary")), - RecvPropInt(FIELD.OF("Fog.ColorPrimaryHDR")), - RecvPropInt(FIELD.OF("Fog.ColorSecondaryHDR")), - RecvPropFloat(FIELD.OF("Fog.Start")), - RecvPropFloat(FIELD.OF("Fog.End")), - RecvPropFloat(FIELD.OF("Fog.MaxDensity")), - RecvPropFloat(FIELD.OF("Fog.FarZ")), - - RecvPropInt(FIELD.OF("Fog.ColorPrimaryLerpTo")), - RecvPropInt(FIELD.OF("Fog.ColorSecondaryLerpTo")), - RecvPropFloat(FIELD.OF("Fog.StartLerpTo")), - RecvPropFloat(FIELD.OF("Fog.EndLerpTo")), - RecvPropFloat(FIELD.OF("Fog.MaxDensityLerpTo")), - RecvPropFloat(FIELD.OF("Fog.LerpTime")), - RecvPropFloat(FIELD.OF("Fog.Duration")), - RecvPropFloat(FIELD.OF("Fog.HDRColorScale")), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_FogController); -} \ No newline at end of file +using Game.Client; +using Game.Shared; + +using Source.Common; + +namespace Game.Server; +[NetworkName("CFogController")] +public partial class C_FogController : C_BaseEntity +{ + [NetworkVar("m_fog")] + public FogParams Fog; + [NetworkTable(NoBase = true)] + public static readonly new NetworkProp[] Props = [ + nameof(Fog.Enable), + nameof(Fog.Blend), + nameof(Fog.Radial), + nameof(Fog.DirPrimary), + new(nameof(Fog.ColorPrimary)) { Encoding = NetEncoding.Int }, + new(nameof(Fog.ColorSecondary)) { Encoding = NetEncoding.Int }, + new(nameof(Fog.ColorPrimaryHDR)) { Encoding = NetEncoding.Int }, + new(nameof(Fog.ColorSecondaryHDR)) { Encoding = NetEncoding.Int }, + nameof(Fog.Start), + nameof(Fog.End), + nameof(Fog.FarZ), + nameof(Fog.MaxDensity), + + new(nameof(Fog.ColorPrimaryLerpTo)) { Encoding = NetEncoding.Int }, + new(nameof(Fog.ColorSecondaryLerpTo)) { Encoding = NetEncoding.Int }, + nameof(Fog.StartLerpTo), + nameof(Fog.EndLerpTo), + nameof(Fog.MaxDensityLerpTo), + new(nameof(Fog.LerpTime)) { Encoding = NetEncoding.Float }, + new(nameof(Fog.Duration)) { Encoding = NetEncoding.Float }, + nameof(Fog.HDRColorScale), + ]; +} \ No newline at end of file diff --git a/Game.Client/C_FuncAreaPortalWindow.cs b/Game.Client/C_FuncAreaPortalWindow.cs index 0d2b0952..b5130e67 100644 --- a/Game.Client/C_FuncAreaPortalWindow.cs +++ b/Game.Client/C_FuncAreaPortalWindow.cs @@ -7,26 +7,25 @@ namespace Game.Client; -using FIELD = FIELD; [NetworkName("CFuncAreaPortalWindow")] -public class C_FuncAreaPortalWindow : C_BaseEntity +public partial class C_FuncAreaPortalWindow : C_BaseEntity { - public static readonly RecvTable DT_FuncAreaPortalWindow = new(DT_BaseEntity, [ - RecvPropFloat(FIELD.OF(nameof(FadeDist))), - RecvPropFloat(FIELD.OF(nameof(FadeStartDist))), - RecvPropFloat(FIELD.OF(nameof(TranslucencyLimit))), - RecvPropInt(FIELD.OF(nameof(BackgroundModelIndex))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_FuncAreaPortalWindow); - - [NetworkName("m_flFadeDist")] - public float FadeDist; - [NetworkName("m_flFadeStartDist")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(FadeStartDist)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeDist)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(TranslucencyLimit)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(BackgroundModelIndex)) { Encoding = NetEncoding.ModelIndex }, + ]; + + [NetworkVar("m_flFadeStartDist")] public float FadeStartDist; - [NetworkName("m_flTranslucencyLimit")] + [NetworkVar("m_flFadeDist")] + public float FadeDist; + [NetworkVar("m_flTranslucencyLimit")] public float TranslucencyLimit; - [NetworkName("m_iBackgroundModelIndex")] + [NetworkVar("m_iBackgroundModelIndex")] public int BackgroundModelIndex; public override void ComputeFxBlend() { diff --git a/Game.Client/C_FuncConveyor.cs b/Game.Client/C_FuncConveyor.cs index 35869c9e..e9f723c3 100644 --- a/Game.Client/C_FuncConveyor.cs +++ b/Game.Client/C_FuncConveyor.cs @@ -5,15 +5,15 @@ namespace Game.Client; -using FIELD = FIELD; [NetworkName("CFuncConveyor")] -public class C_FuncConveyor : C_BaseEntity +public partial class C_FuncConveyor : C_BaseEntity { - public static readonly RecvTable DT_FuncConveyor = new(DT_BaseEntity, [ - RecvPropFloat(FIELD.OF(nameof(ConveyorSpeed))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_FuncConveyor); - [NetworkName("m_flConveyorSpeed")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ConveyorSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; + + [NetworkVar("m_flConveyorSpeed")] public float ConveyorSpeed; } diff --git a/Game.Client/C_FuncMonitor.cs b/Game.Client/C_FuncMonitor.cs index f5d659b3..9e6f1342 100644 --- a/Game.Client/C_FuncMonitor.cs +++ b/Game.Client/C_FuncMonitor.cs @@ -5,8 +5,10 @@ namespace Game.Client; [NetworkName("CFuncMonitor")] -public class C_FuncMonitor : C_BaseEntity +public partial class C_FuncMonitor : C_BaseEntity { - public static readonly RecvTable DT_FuncMonitor = new(DT_BaseEntity, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_FuncMonitor); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/C_FuncOccluder.cs b/Game.Client/C_FuncOccluder.cs index b70f8b6b..460c8b1e 100644 --- a/Game.Client/C_FuncOccluder.cs +++ b/Game.Client/C_FuncOccluder.cs @@ -4,20 +4,19 @@ using Source.Common; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CFuncOccluder")] -public class C_FuncOccluder : C_BaseEntity +public partial class C_FuncOccluder : C_BaseEntity { - public static readonly RecvTable DT_FuncOccluder = new([ - RecvPropBool(FIELD.OF(nameof(Active))), - RecvPropInt(FIELD.OF(nameof(OccluderIndex))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_FuncOccluder); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Active), + new(nameof(OccluderIndex)) { Bits = 10, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_bActive")] + [NetworkVar("m_bActive")] public bool Active; - [NetworkName("m_nOccluderIndex")] + [NetworkVar("m_nOccluderIndex")] public int OccluderIndex; } diff --git a/Game.Client/C_FuncReflectiveGlass.cs b/Game.Client/C_FuncReflectiveGlass.cs index 348c7518..1ce8724e 100644 --- a/Game.Client/C_FuncReflectiveGlass.cs +++ b/Game.Client/C_FuncReflectiveGlass.cs @@ -5,8 +5,10 @@ namespace Game.Client; [NetworkName("CFuncReflectiveGlass")] -public class C_FuncReflectiveGlass : C_BaseEntity +public partial class C_FuncReflectiveGlass : C_BaseEntity { - public static readonly RecvTable DT_FuncReflectiveGlass = new(DT_BaseEntity, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_FuncReflectiveGlass); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/C_FuncRotating.cs b/Game.Client/C_FuncRotating.cs index 043d5a67..c3f8f539 100644 --- a/Game.Client/C_FuncRotating.cs +++ b/Game.Client/C_FuncRotating.cs @@ -3,18 +3,15 @@ using Source; using Source.Common; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CFuncRotating")] -public class C_FuncRotating : C_BaseEntity +public partial class C_FuncRotating : C_BaseEntity { - public static readonly RecvTable DT_FuncRotating = new(DT_BaseEntity, [ - RecvPropVector(FIELD.OF_NAMED(nameof(NetworkOrigin), "m_vecOrigin")), - RecvPropFloat(FIELD.OF_NAMED($"{nameof(NetworkAngles)}[0]", "m_angRotation[0]")), - RecvPropFloat(FIELD.OF_NAMED($"{nameof(NetworkAngles)}[1]", "m_angRotation[1]")), - RecvPropFloat(FIELD.OF_NAMED($"{nameof(NetworkAngles)}[2]", "m_angRotation[2]")), - RecvPropInt(FIELD.OF(nameof(SimulationTime)), 0, RecvProxy_SimulationTime) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_FuncRotating); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(NetworkOrigin), + new(nameof(NetworkAngles)) { Encoding = NetEncoding.VectorElements }, + new(nameof(SimulationTime)) { Encoding = NetEncoding.Int, Proxy = typeof(SimulationTimeProxy) }, + ]; } diff --git a/Game.Client/C_FuncSmokeVolume.cs b/Game.Client/C_FuncSmokeVolume.cs index a4b58abb..94c47427 100644 --- a/Game.Client/C_FuncSmokeVolume.cs +++ b/Game.Client/C_FuncSmokeVolume.cs @@ -1,45 +1,46 @@ using Game.Shared; +using Game.Shared; + using Source; using Source.Common; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CFuncSmokeVolume")] -public class C_FuncSmokeVolume : C_BaseParticleEntity +public partial class C_FuncSmokeVolume : C_BaseParticleEntity { - public static readonly RecvTable DT_FuncSmokeVolume = new(DT_BaseParticleEntity, [ - RecvPropInt(FIELD.OF(nameof(Color1)), 0, RecvProxy_IntToColor32), - RecvPropInt(FIELD.OF(nameof(Color2)), 0, RecvProxy_IntToColor32), - RecvPropString(FIELD.OF(nameof(MaterialName))), - RecvPropFloat(FIELD.OF(nameof(ParticleDrawWidth))), - RecvPropFloat(FIELD.OF(nameof(ParticleSpacingDistance))), - RecvPropFloat(FIELD.OF(nameof(DensityRampSpeed))), - RecvPropFloat(FIELD.OF(nameof(RotationSpeed))), - RecvPropFloat(FIELD.OF(nameof(MovementSpeed))), - RecvPropFloat(FIELD.OF(nameof(Density))), - RecvPropInt(FIELD.OF(nameof(SpawnFlags))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_FuncSmokeVolume); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Color1)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned, Proxy = typeof(Color32Proxy) }, + new(nameof(Color2)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned, Proxy = typeof(Color32Proxy) }, + new(nameof(MaterialName)) { Encoding = NetEncoding.String }, + new(nameof(ParticleDrawWidth)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ParticleSpacingDistance)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DensityRampSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(RotationSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MovementSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Density)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpawnFlags)) { Encoding = NetEncoding.Int, Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_Color1")] + [NetworkVar("m_Color1")] public Color Color1; - [NetworkName("m_Color2")] + [NetworkVar("m_Color2")] public Color Color2; - [NetworkName("m_MaterialName")] + [NetworkVar("m_MaterialName")] public InlineArray255 MaterialName; - [NetworkName("m_ParticleDrawWidth")] + [NetworkVar("m_ParticleDrawWidth")] public float ParticleDrawWidth; - [NetworkName("m_ParticleSpacingDistance")] + [NetworkVar("m_ParticleSpacingDistance")] public float ParticleSpacingDistance; - [NetworkName("m_DensityRampSpeed")] + [NetworkVar("m_DensityRampSpeed")] public float DensityRampSpeed; - [NetworkName("m_RotationSpeed")] + [NetworkVar("m_RotationSpeed")] public float RotationSpeed; - [NetworkName("m_MovementSpeed")] + [NetworkVar("m_MovementSpeed")] public float MovementSpeed; - [NetworkName("m_Density")] + [NetworkVar("m_Density")] public float Density; } diff --git a/Game.Client/C_FuncTrackTrain.cs b/Game.Client/C_FuncTrackTrain.cs index efc83dd0..f79d8250 100644 --- a/Game.Client/C_FuncTrackTrain.cs +++ b/Game.Client/C_FuncTrackTrain.cs @@ -5,8 +5,10 @@ namespace Game.Client; [NetworkName("CFuncTrackTrain")] -public class C_FuncTrackTrain : C_BaseEntity +public partial class C_FuncTrackTrain : C_BaseEntity { - public static readonly RecvTable DT_FuncTrackTrain = new(DT_BaseEntity, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_FuncTrackTrain); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/C_Func_Dust.cs b/Game.Client/C_Func_Dust.cs index d1d162a3..387ba783 100644 --- a/Game.Client/C_Func_Dust.cs +++ b/Game.Client/C_Func_Dust.cs @@ -5,49 +5,48 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("CFunc_Dust")] -public class C_Func_Dust : C_BaseEntity +[NetworkName("CFunc_Dust", NoBase = true)] +public partial class C_Func_Dust : C_BaseEntity { - public static readonly RecvTable DT_Func_Dust = new([ - RecvPropInt(FIELD.OF(nameof(Color))), - RecvPropInt(FIELD.OF(nameof(SpawnRate))), - RecvPropInt(FIELD.OF(nameof(SpeedMax))), - RecvPropFloat(FIELD.OF(nameof(SizeMin))), - RecvPropFloat(FIELD.OF(nameof(SizeMax))), - RecvPropInt(FIELD.OF(nameof(DistMax))), - RecvPropInt(FIELD.OF(nameof(LifetimeMin))), - RecvPropInt(FIELD.OF(nameof(LifetimeMax))), - RecvPropInt(FIELD.OF(nameof(DustFlags))), - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - RecvPropFloat(FIELD.OF(nameof(FallSpeed))), - RecvPropBool(FIELD.OF(nameof(AffectedByWind))), - RecvPropDataTable("m_Collision", CollisionProperty.DT_CollisionProperty, 0, RECV_GET_OBJECT_AT_FIELD(FIELD.OF(nameof(Collision)))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_Func_Dust); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Color)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(SpawnRate)) { Bits = 12, Flags = PropFlags.Unsigned }, + new(nameof(SizeMin)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SizeMax)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(LifetimeMin)) { Bits = 4, Flags = PropFlags.Unsigned }, + new(nameof(LifetimeMax)) { Bits = 4, Flags = PropFlags.Unsigned }, + new(nameof(DustFlags)) { Bits = 3, Flags = PropFlags.Unsigned }, + new(nameof(SpeedMax)) { Bits = 12, Flags = PropFlags.Unsigned }, + new(nameof(DistMax)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(ModelIndex)) { Encoding = NetEncoding.ModelIndex }, + new(nameof(FallSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(AffectedByWind), + new(nameof(Collision)) { Encoding = NetEncoding.DataTable, DataTable = "DT_CollisionProperty" }, + ]; - [NetworkName("m_Color")] + [NetworkVar("m_Color")] public Color Color; - [NetworkName("m_SpawnRate")] + [NetworkVar("m_SpawnRate")] public int SpawnRate; - [NetworkName("m_SpeedMax")] - public int SpeedMax; - [NetworkName("m_flSizeMin")] + [NetworkVar("m_flSizeMin")] public float SizeMin; - [NetworkName("m_flSizeMax")] + [NetworkVar("m_flSizeMax")] public float SizeMax; - [NetworkName("m_DistMax")] - public int DistMax; - [NetworkName("m_LifetimeMin")] + [NetworkVar("m_LifetimeMin")] public int LifetimeMin; - [NetworkName("m_LifetimeMax")] + [NetworkVar("m_LifetimeMax")] public int LifetimeMax; - [NetworkName("m_DustFlags")] + [NetworkVar("m_DustFlags")] public int DustFlags; - [NetworkName("m_FallSpeed")] + [NetworkVar("m_SpeedMax")] + public int SpeedMax; + [NetworkVar("m_DistMax")] + public int DistMax; + [NetworkVar("m_FallSpeed")] public float FallSpeed; - [NetworkName("m_bAffectedByWind")] + [NetworkVar("m_bAffectedByWind")] public bool AffectedByWind; } diff --git a/Game.Client/C_Func_LOD.cs b/Game.Client/C_Func_LOD.cs index 7690fe60..f4a1b915 100644 --- a/Game.Client/C_Func_LOD.cs +++ b/Game.Client/C_Func_LOD.cs @@ -5,19 +5,18 @@ namespace Game.Client; -using FIELD = FIELD; [NetworkName("CFunc_LOD")] -public class C_Func_LOD : C_BaseEntity +public partial class C_Func_LOD : C_BaseEntity { - public static readonly RecvTable DT_Func_LOD = new(DT_BaseEntity, [ - RecvPropFloat(FIELD.OF(nameof(DisappearMinDist))), - RecvPropFloat(FIELD.OF(nameof(DisappearMaxDist))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_Func_LOD); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(DisappearMinDist)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DisappearMaxDist)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_fDisappearMinDist")] + [NetworkVar("m_fDisappearMinDist")] public float DisappearMinDist = 5000.0f; - [NetworkName("m_fDisappearMaxDist")] + [NetworkVar("m_fDisappearMaxDist")] public float DisappearMaxDist = 5800.0f; } diff --git a/Game.Client/C_InfoOverlayAccessor.cs b/Game.Client/C_InfoOverlayAccessor.cs index eaa4540b..2ff2f02f 100644 --- a/Game.Client/C_InfoOverlayAccessor.cs +++ b/Game.Client/C_InfoOverlayAccessor.cs @@ -3,17 +3,16 @@ using Source.Common; namespace Game.Client; -using FIELD = Source.FIELD; -[NetworkName("CInfoOverlayAccessor")] +[NetworkName("CInfoOverlayAccessor", NoBase = true)] public partial class C_InfoOverlayAccessor : C_BaseEntity { - public static readonly RecvTable DT_InfoOverlayAccessor = new( [ - RecvPropInt(FIELD.OF(nameof(TextureFrameIndex))), - RecvPropInt(FIELD.OF(nameof(OverlayID))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_InfoOverlayAccessor); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(TextureFrameIndex)) { Encoding = NetEncoding.Int, Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(OverlayID)) { Bits = 32, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_iOverlayID")] + [NetworkVar("m_iOverlayID")] public int OverlayID; } diff --git a/Game.Client/C_LightGlow.cs b/Game.Client/C_LightGlow.cs index 039ae2a2..80817471 100644 --- a/Game.Client/C_LightGlow.cs +++ b/Game.Client/C_LightGlow.cs @@ -4,42 +4,42 @@ using Source.Common; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("CLightGlow")] -public class C_LightGlow : C_BaseEntity +[NetworkName("CLightGlow", NoBase = true)] +public partial class C_LightGlow : C_BaseEntity { - public static readonly RecvTable DT_LightGlow = new([ - RecvPropInt(FIELD.OF(nameof(RenderColor)), 0, RecvProxy_IntToColor32), - RecvPropInt(FIELD.OF(nameof(HorizontalSize))), - RecvPropInt(FIELD.OF(nameof(VerticalSize))), - RecvPropInt(FIELD.OF(nameof(MinDist))), - RecvPropInt(FIELD.OF(nameof(MaxDist))), - RecvPropInt(FIELD.OF(nameof(OuterMaxDist))), - RecvPropInt(FIELD.OF(nameof(SpawnFlags))), - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropVector(FIELD.OF(nameof(Rotation))), - RecvPropEHandle(FIELD.OF(nameof(MoveParent))), - RecvPropFloat(FIELD.OF(nameof(GlowProxySize))), + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(RenderColor)) { Encoding = NetEncoding.Int, Proxy = typeof(Color32Proxy) }, + nameof(HorizontalSize), + nameof(VerticalSize), + nameof(MinDist), + nameof(MaxDist), + nameof(OuterMaxDist), + nameof(SpawnFlags), + nameof(Origin), + nameof(Rotation), + new(nameof(NetworkMoveParent)) { Encoding = NetEncoding.Int, Proxy = typeof(MoveParentProxy) }, + nameof(GlowProxySize), // todo: RecvProxy_HDRColorScale - RecvPropFloat(FIELD.OF(nameof(HDRColorScale))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_LightGlow); + nameof(HDRColorScale), + ]; - [NetworkName("m_clrRender")] + [NetworkVar("m_clrRender")] public Color RenderColor; - [NetworkName("m_nHorizontalSize")] + [NetworkVar("m_nHorizontalSize")] public int HorizontalSize; - [NetworkName("m_nVerticalSize")] + [NetworkVar("m_nVerticalSize")] public int VerticalSize; - [NetworkName("m_nMinDist")] + [NetworkVar("m_nMinDist")] public int MinDist; - [NetworkName("m_nMaxDist")] + [NetworkVar("m_nMaxDist")] public int MaxDist; - [NetworkName("m_nOuterMaxDist")] + [NetworkVar("m_nOuterMaxDist")] public int OuterMaxDist; - [NetworkName("m_flGlowProxySize")] + [NetworkVar("m_flGlowProxySize")] public float GlowProxySize; + [NetworkVar("HDRColorScale")] public float HDRColorScale; } diff --git a/Game.Client/C_MaterialModifyControl.cs b/Game.Client/C_MaterialModifyControl.cs index 0288b655..a03362eb 100644 --- a/Game.Client/C_MaterialModifyControl.cs +++ b/Game.Client/C_MaterialModifyControl.cs @@ -3,48 +3,47 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CMaterialModifyControl")] -public class C_MaterialModifyControl : C_BaseEntity +public partial class C_MaterialModifyControl : C_BaseEntity { - public static readonly RecvTable DT_MaterialModifyControl = new(DT_BaseEntity, [ - RecvPropString(FIELD.OF(nameof(SzMaterialName))), - RecvPropString(FIELD.OF(nameof(SzMaterialVar))), - RecvPropString(FIELD.OF(nameof(SzMaterialVarValue))), - RecvPropInt(FIELD.OF(nameof(FrameStart))), - RecvPropInt(FIELD.OF(nameof(FrameEnd))), - RecvPropBool(FIELD.OF(nameof(Wrap))), - RecvPropFloat(FIELD.OF(nameof(Framerate))), - RecvPropBool(FIELD.OF(nameof(NewAnimCommandsSemaphore))), - RecvPropFloat(FIELD.OF(nameof(FloatLerpStartValue))), - RecvPropFloat(FIELD.OF(nameof(FloatLerpEndValue))), - RecvPropFloat(FIELD.OF(nameof(FloatLerpTransitionTime))), - RecvPropInt(FIELD.OF(nameof(ModifyMode))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_MaterialModifyControl); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SzMaterialName)) { Encoding = NetEncoding.String }, + new(nameof(SzMaterialVar)) { Encoding = NetEncoding.String }, + new(nameof(SzMaterialVarValue)) { Encoding = NetEncoding.String }, + new(nameof(FrameStart)) { Bits = 8 }, + new(nameof(FrameEnd)) { Bits = 8 }, + nameof(Wrap), + new(nameof(Framerate)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(NewAnimCommandsSemaphore), + new(nameof(FloatLerpStartValue)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FloatLerpEndValue)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FloatLerpTransitionTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ModifyMode)) { Bits = 2, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_szMaterialName")] + [NetworkVar("m_szMaterialName")] public InlineArray255 SzMaterialName; - [NetworkName("m_szMaterialVar")] + [NetworkVar("m_szMaterialVar")] public InlineArray255 SzMaterialVar; - [NetworkName("m_szMaterialVarValue")] + [NetworkVar("m_szMaterialVarValue")] public InlineArray255 SzMaterialVarValue; - [NetworkName("m_iFrameStart")] + [NetworkVar("m_iFrameStart")] public int FrameStart; - [NetworkName("m_iFrameEnd")] + [NetworkVar("m_iFrameEnd")] public int FrameEnd; - [NetworkName("m_bWrap")] + [NetworkVar("m_bWrap")] public bool Wrap; - [NetworkName("m_flFramerate")] + [NetworkVar("m_flFramerate")] public float Framerate; - [NetworkName("m_bNewAnimCommandsSemaphore")] + [NetworkVar("m_bNewAnimCommandsSemaphore")] public bool NewAnimCommandsSemaphore; - [NetworkName("m_flFloatLerpStartValue")] + [NetworkVar("m_flFloatLerpStartValue")] public float FloatLerpStartValue; - [NetworkName("m_flFloatLerpEndValue")] + [NetworkVar("m_flFloatLerpEndValue")] public float FloatLerpEndValue; - [NetworkName("m_flFloatLerpTransitionTime")] + [NetworkVar("m_flFloatLerpTransitionTime")] public float FloatLerpTransitionTime; - [NetworkName("m_nModifyMode")] + [NetworkVar("m_nModifyMode")] public int ModifyMode; } diff --git a/Game.Client/C_MortarShell.cs b/Game.Client/C_MortarShell.cs index 83b23366..84c47620 100644 --- a/Game.Client/C_MortarShell.cs +++ b/Game.Client/C_MortarShell.cs @@ -3,21 +3,20 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CMortarShell")] -public class C_MortarShell : C_BaseEntity +public partial class C_MortarShell : C_BaseEntity { - public static readonly RecvTable DT_MortarShell = new(DT_BaseEntity, [ - RecvPropFloat(FIELD.OF(nameof(Lifespan))), - RecvPropFloat(FIELD.OF(nameof(Radius))), - RecvPropVector(FIELD.OF(nameof(SurfaceNormal))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_MortarShell); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Lifespan)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Radius)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SurfaceNormal)) { Bits = 0, Flags = PropFlags.VarInt | PropFlags.VarInt }, + ]; - [NetworkName("m_flLifespan")] + [NetworkVar("m_flLifespan")] public float Lifespan; - [NetworkName("m_flRadius")] + [NetworkVar("m_flRadius")] public float Radius; - [NetworkName("m_vecSurfaceNormal")] + [NetworkVar("m_vecSurfaceNormal")] public Vector3 SurfaceNormal; } diff --git a/Game.Client/C_MovieExplosion.cs b/Game.Client/C_MovieExplosion.cs index e0a91df5..5b0ec2d0 100644 --- a/Game.Client/C_MovieExplosion.cs +++ b/Game.Client/C_MovieExplosion.cs @@ -4,10 +4,7 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("MovieExplosion")] -public class C_MovieExplosion : C_BaseParticleEntity +[NetworkName("MovieExplosion", Table = "DT_MovieExplosion")] +public partial class C_MovieExplosion : C_BaseParticleEntity { - public static readonly RecvTable DT_MovieExplosion = new(DT_BaseParticleEntity, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_MovieExplosion); } diff --git a/Game.Client/C_NPC_AntlionGuard.cs b/Game.Client/C_NPC_AntlionGuard.cs index cd8020ba..14310ca8 100644 --- a/Game.Client/C_NPC_AntlionGuard.cs +++ b/Game.Client/C_NPC_AntlionGuard.cs @@ -3,21 +3,20 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CNPC_AntlionGuard")] -public class C_NPC_AntlionGuard : C_AI_BaseNPC +public partial class C_NPC_AntlionGuard : C_AI_BaseNPC { - public static readonly RecvTable DT_NPC_AntlionGuard = new(DT_AI_BaseNPC, [ - RecvPropBool(FIELD.OF(nameof(CavernBreed))), - RecvPropBool(FIELD.OF(nameof(InCavern))), - RecvPropInt(FIELD.OF(nameof(BleedingLevel))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_NPC_AntlionGuard); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(CavernBreed), + nameof(InCavern), + new(nameof(BleedingLevel)) { Bits = 2, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_bCavernBreed")] + [NetworkVar("m_bCavernBreed")] public bool CavernBreed; - [NetworkName("m_bInCavern")] + [NetworkVar("m_bInCavern")] public bool InCavern; - [NetworkName("m_iBleedingLevel")] + [NetworkVar("m_iBleedingLevel")] public int BleedingLevel; } diff --git a/Game.Client/C_NPC_Barnacle.cs b/Game.Client/C_NPC_Barnacle.cs index 9e5f2fc0..2203fafa 100644 --- a/Game.Client/C_NPC_Barnacle.cs +++ b/Game.Client/C_NPC_Barnacle.cs @@ -3,24 +3,23 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("CNPC_Barnacle")] -public class C_NPC_Barnacle : C_AI_BaseNPC +[NetworkName("CNPC_Barnacle", Table = "DT_Barnacle")] +public partial class C_NPC_Barnacle : C_AI_BaseNPC { - public static readonly RecvTable DT_Barnacle = new(DT_AI_BaseNPC, [ - RecvPropFloat(FIELD.OF(nameof(Altitude))), - RecvPropVector(FIELD.OF(nameof(Root))), - RecvPropVector(FIELD.OF(nameof(Tip))), - RecvPropVector(FIELD.OF(nameof(TipDrawOffset))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_Barnacle); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Altitude)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Root)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Tip)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(TipDrawOffset)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flAltitude")] + [NetworkVar("m_flAltitude")] public float Altitude; - [NetworkName("m_vecRoot")] + [NetworkVar("m_vecRoot")] public Vector3 Root; - [NetworkName("m_vecTip")] + [NetworkVar("m_vecTip")] public Vector3 Tip; - [NetworkName("m_vecTipDrawOffset")] + [NetworkVar("m_vecTipDrawOffset")] public Vector3 TipDrawOffset; } diff --git a/Game.Client/C_NPC_Barney.cs b/Game.Client/C_NPC_Barney.cs index 1fc9fbbd..a4dc5e25 100644 --- a/Game.Client/C_NPC_Barney.cs +++ b/Game.Client/C_NPC_Barney.cs @@ -4,10 +4,11 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CNPC_Barney")] -public class C_NPC_Barney : C_AI_BaseNPC +public partial class C_NPC_Barney : C_AI_BaseNPC { - public static readonly RecvTable DT_NPC_Barney = new(DT_AI_BaseNPC, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_NPC_Barney); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/C_NPC_CombineGunship.cs b/Game.Client/C_NPC_CombineGunship.cs index f329b552..76c7f1ce 100644 --- a/Game.Client/C_NPC_CombineGunship.cs +++ b/Game.Client/C_NPC_CombineGunship.cs @@ -3,15 +3,14 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("CNPC_CombineGunship")] -public class C_NPC_CombineGunship : C_BaseHelicopter +[NetworkName("CNPC_CombineGunship", Table = "DT_CombineGunship")] +public partial class C_NPC_CombineGunship : C_BaseHelicopter { - public static readonly RecvTable DT_CombineGunship = new(DT_BaseHelicopter, [ - RecvPropVector(FIELD.OF(nameof(HitPos))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_CombineGunship); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(HitPos)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_vecHitPos")] + [NetworkVar("m_vecHitPos")] public Vector3 HitPos; } diff --git a/Game.Client/C_NPC_Manhack.cs b/Game.Client/C_NPC_Manhack.cs index 34a02ec8..538cfd55 100644 --- a/Game.Client/C_NPC_Manhack.cs +++ b/Game.Client/C_NPC_Manhack.cs @@ -3,21 +3,20 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CNPC_Manhack")] -public class C_NPC_Manhack : C_AI_BaseNPC +public partial class C_NPC_Manhack : C_AI_BaseNPC { - public static readonly RecvTable DT_NPC_Manhack = new(DT_AI_BaseNPC, [ - RecvPropInt(FIELD.OF(nameof(EnginePitch1))), - RecvPropFloat(FIELD.OF(nameof(EnginePitch1Time))), - RecvPropInt(FIELD.OF(nameof(EnginePitch2))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_NPC_Manhack); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(EnginePitch1)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(EnginePitch1Time)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EnginePitch2)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nEnginePitch1")] + [NetworkVar("m_nEnginePitch1")] public int EnginePitch1; - [NetworkName("m_flEnginePitch1Time")] + [NetworkVar("m_flEnginePitch1Time")] public float EnginePitch1Time; - [NetworkName("m_nEnginePitch2")] + [NetworkVar("m_nEnginePitch2")] public int EnginePitch2; } diff --git a/Game.Client/C_NPC_Portal_FloorTurret.cs b/Game.Client/C_NPC_Portal_FloorTurret.cs index c74bc53b..68deafa6 100644 --- a/Game.Client/C_NPC_Portal_FloorTurret.cs +++ b/Game.Client/C_NPC_Portal_FloorTurret.cs @@ -3,21 +3,20 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CNPC_Portal_FloorTurret")] -public class C_NPC_Portal_FloorTurret : C_AI_BaseNPC +public partial class C_NPC_Portal_FloorTurret : C_AI_BaseNPC { - public static readonly RecvTable DT_NPC_Portal_FloorTurret = new(DT_AI_BaseNPC, [ - RecvPropBool(FIELD.OF(nameof(OutOfAmmo))), - RecvPropBool(FIELD.OF(nameof(LaserOn))), - RecvPropInt(FIELD.OF(nameof(LaserHaloSprite))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_NPC_Portal_FloorTurret); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(OutOfAmmo), + nameof(LaserOn), + new(nameof(LaserHaloSprite)) { Bits = 16, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_bOutOfAmmo")] + [NetworkVar("m_bOutOfAmmo")] public bool OutOfAmmo; - [NetworkName("m_bLaserOn")] + [NetworkVar("m_bLaserOn")] public bool LaserOn; - [NetworkName("m_sLaserHaloSprite")] + [NetworkVar("m_sLaserHaloSprite")] public int LaserHaloSprite; } diff --git a/Game.Client/C_NPC_Puppet.cs b/Game.Client/C_NPC_Puppet.cs index 38537704..eae02424 100644 --- a/Game.Client/C_NPC_Puppet.cs +++ b/Game.Client/C_NPC_Puppet.cs @@ -3,18 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CNPC_Puppet")] -public class C_NPC_Puppet : C_AI_BaseNPC +public partial class C_NPC_Puppet : C_AI_BaseNPC { - public static readonly RecvTable DT_NPC_Puppet = new(DT_AI_BaseNPC, [ - RecvPropEHandle(FIELD.OF(nameof(AnimationTarget))), - RecvPropInt(FIELD.OF(nameof(TargetAttachment))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_NPC_Puppet); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(AnimationTarget), + new(nameof(TargetAttachment)) { Bits = 12 }, + ]; - [NetworkName("m_hAnimationTarget")] + [NetworkVar("m_hAnimationTarget")] public EHANDLE AnimationTarget = new(); - [NetworkName("m_nTargetAttachment")] + [NetworkVar("m_nTargetAttachment")] public int TargetAttachment; } diff --git a/Game.Client/C_NPC_RocketTurret.cs b/Game.Client/C_NPC_RocketTurret.cs index d4c6e5fd..eb181ded 100644 --- a/Game.Client/C_NPC_RocketTurret.cs +++ b/Game.Client/C_NPC_RocketTurret.cs @@ -3,21 +3,20 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CNPC_RocketTurret")] -public class C_NPC_RocketTurret : C_AI_BaseNPC +public partial class C_NPC_RocketTurret : C_AI_BaseNPC { - public static readonly RecvTable DT_NPC_RocketTurret = new(DT_AI_BaseNPC, [ - RecvPropInt(FIELD.OF(nameof(LaserState))), - RecvPropInt(FIELD.OF(nameof(SiteHalo))), - RecvPropVector(FIELD.OF(nameof(CurrentAngles))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_NPC_RocketTurret); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(LaserState)) { Bits = 2 }, + new(nameof(SiteHalo)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(CurrentAngles)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_iLaserState")] + [NetworkVar("m_iLaserState")] public int LaserState; - [NetworkName("m_nSiteHalo")] + [NetworkVar("m_nSiteHalo")] public int SiteHalo; - [NetworkName("m_vecCurrentAngles")] + [NetworkVar("m_vecCurrentAngles")] public Vector3 CurrentAngles; } diff --git a/Game.Client/C_NPC_RollerMine.cs b/Game.Client/C_NPC_RollerMine.cs index b234ba31..afc16932 100644 --- a/Game.Client/C_NPC_RollerMine.cs +++ b/Game.Client/C_NPC_RollerMine.cs @@ -3,24 +3,23 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("CNPC_RollerMine")] -public class C_NPC_RollerMine : C_AI_BaseNPC +[NetworkName("CNPC_RollerMine", Table = "DT_RollerMine")] +public partial class C_NPC_RollerMine : C_AI_BaseNPC { - public static readonly RecvTable DT_RollerMine = new(DT_AI_BaseNPC, [ - RecvPropBool(FIELD.OF(nameof(IsOpen))), - RecvPropFloat(FIELD.OF(nameof(ActiveTime))), - RecvPropBool(FIELD.OF(nameof(HackedByAlyx))), - RecvPropBool(FIELD.OF(nameof(PowerDown))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_RollerMine); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(IsOpen), + new(nameof(ActiveTime)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(HackedByAlyx), + nameof(PowerDown), + ]; - [NetworkName("m_bIsOpen")] + [NetworkVar("m_bIsOpen")] public bool IsOpen; - [NetworkName("m_flActiveTime")] + [NetworkVar("m_flActiveTime")] public float ActiveTime; - [NetworkName("m_bHackedByAlyx")] + [NetworkVar("m_bHackedByAlyx")] public bool HackedByAlyx; - [NetworkName("m_bPowerDown")] + [NetworkVar("m_bPowerDown")] public bool PowerDown; } diff --git a/Game.Client/C_NPC_Vortigaunt.cs b/Game.Client/C_NPC_Vortigaunt.cs index 5f7b170d..c4b3a1e6 100644 --- a/Game.Client/C_NPC_Vortigaunt.cs +++ b/Game.Client/C_NPC_Vortigaunt.cs @@ -3,21 +3,20 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CNPC_Vortigaunt")] -public class C_NPC_Vortigaunt : C_AI_BaseNPC +public partial class C_NPC_Vortigaunt : C_AI_BaseNPC { - public static readonly RecvTable DT_NPC_Vortigaunt = new(DT_AI_BaseNPC, [ - RecvPropFloat(FIELD.OF(nameof(BlueEndFadeTime))), - RecvPropBool(FIELD.OF(nameof(IsBlue))), - RecvPropBool(FIELD.OF(nameof(IsBlack))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_NPC_Vortigaunt); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(BlueEndFadeTime)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(IsBlue), + nameof(IsBlack), + ]; - [NetworkName("m_flBlueEndFadeTime")] + [NetworkVar("m_flBlueEndFadeTime")] public float BlueEndFadeTime; - [NetworkName("m_bIsBlue")] + [NetworkVar("m_bIsBlue")] public bool IsBlue; - [NetworkName("m_bIsBlack")] + [NetworkVar("m_bIsBlack")] public bool IsBlack; } diff --git a/Game.Client/C_ParticlePerformanceMonitor.cs b/Game.Client/C_ParticlePerformanceMonitor.cs index 7fdae6d7..34a2c5c4 100644 --- a/Game.Client/C_ParticlePerformanceMonitor.cs +++ b/Game.Client/C_ParticlePerformanceMonitor.cs @@ -3,18 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CParticlePerformanceMonitor")] -public class C_ParticlePerformanceMonitor : C_BaseEntity +public partial class C_ParticlePerformanceMonitor : C_BaseEntity { - public static readonly RecvTable DT_ParticlePerformanceMonitor = new(DT_BaseEntity, [ - RecvPropBool(FIELD.OF(nameof(DisplayPerf))), - RecvPropBool(FIELD.OF(nameof(MeasurePerf))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_ParticlePerformanceMonitor); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(MeasurePerf), + nameof(DisplayPerf), + ]; - [NetworkName("m_bDisplayPerf")] - public bool DisplayPerf; - [NetworkName("m_bMeasurePerf")] + [NetworkVar("m_bMeasurePerf")] public bool MeasurePerf; + [NetworkVar("m_bDisplayPerf")] + public bool DisplayPerf; } diff --git a/Game.Client/C_ParticleSmokeGrenade.cs b/Game.Client/C_ParticleSmokeGrenade.cs index d52e9619..85246d57 100644 --- a/Game.Client/C_ParticleSmokeGrenade.cs +++ b/Game.Client/C_ParticleSmokeGrenade.cs @@ -3,24 +3,23 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("ParticleSmokeGrenade")] -public class C_ParticleSmokeGrenade : C_BaseParticleEntity +[NetworkName("ParticleSmokeGrenade", Table = "DT_ParticleSmokeGrenade")] +public partial class C_ParticleSmokeGrenade : C_BaseParticleEntity { - public static readonly RecvTable DT_ParticleSmokeGrenade = new(DT_BaseParticleEntity, [ - RecvPropFloat(FIELD.OF(nameof(SpawnTime))), - RecvPropFloat(FIELD.OF(nameof(FadeStartTime))), - RecvPropFloat(FIELD.OF(nameof(FadeEndTime))), - RecvPropBool(FIELD.OF(nameof(CurrentStage))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_ParticleSmokeGrenade); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SpawnTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeStartTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeEndTime)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(CurrentStage), + ]; - [NetworkName("m_flSpawnTime")] + [NetworkVar("m_flSpawnTime")] public float SpawnTime; - [NetworkName("m_FadeStartTime")] + [NetworkVar("m_FadeStartTime")] public float FadeStartTime; - [NetworkName("m_FadeEndTime")] + [NetworkVar("m_FadeEndTime")] public float FadeEndTime; - [NetworkName("m_CurrentStage")] + [NetworkVar("m_CurrentStage")] public bool CurrentStage; } diff --git a/Game.Client/C_ParticleSystem.cs b/Game.Client/C_ParticleSystem.cs index 9c10a38b..cab86ef4 100644 --- a/Game.Client/C_ParticleSystem.cs +++ b/Game.Client/C_ParticleSystem.cs @@ -4,37 +4,37 @@ using Source.Common; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("CParticleSystem")] -public class C_ParticleSystem : C_BaseEntity +[NetworkName("CParticleSystem", NoBase = true)] +public partial class C_ParticleSystem : C_BaseEntity { - public static readonly RecvTable DT_ParticleSystem = new([ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropEHandle(FIELD.OF(nameof(OwnerEntity))), - RecvPropEHandle(FIELD.OF(nameof(MoveParent))), - RecvPropInt(FIELD.OF(nameof(ParentAttachment))), - RecvPropVector(FIELD.OF(nameof(Rotation))), - RecvPropInt(FIELD.OF(nameof(EffectIndex))), - RecvPropBool(FIELD.OF(nameof(Active))), - RecvPropFloat(FIELD.OF(nameof(StartTime))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(ControlPointEnts)), RecvPropEHandle(FIELD.OF_ARRAYINDEX(nameof(ControlPointEnts), 0))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(ControlPointParents)), RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(ControlPointParents), 0))), - RecvPropBool(FIELD.OF(nameof(WeatherEffect))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_ParticleSystem); - [NetworkName("m_iEffectIndex")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Origin)) { Encoding = NetEncoding.Vector, Bits = 0, Flags = PropFlags.Coord | PropFlags.ChangesOften }, + new(nameof(OwnerEntity)) { Encoding = NetEncoding.EHandle }, + new(nameof(NetworkMoveParent)) { Encoding = NetEncoding.Int, Proxy = typeof(MoveParentProxy) }, + new(nameof(ParentAttachment)) { Encoding = NetEncoding.Int, Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Rotation)) { Encoding = NetEncoding.Vector, Bits = 13, Flags = PropFlags.RoundDown | PropFlags.ChangesOften }, + new(nameof(EffectIndex)) { Bits = 12, Flags = PropFlags.Unsigned }, + nameof(Active), + new(nameof(StartTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + nameof(ControlPointEnts), + new(nameof(ControlPointParents)) { Bits = 3, Flags = PropFlags.Unsigned }, + nameof(WeatherEffect), + ]; + + [NetworkVar("m_iEffectIndex")] public int EffectIndex; - [NetworkName("m_bActive")] + [NetworkVar("m_bActive")] public bool Active; - [NetworkName("m_flStartTime")] + [NetworkVar("m_flStartTime")] public TimeUnit_t StartTime; - [NetworkName("m_bWeatherEffect")] - public bool WeatherEffect; - - [NetworkName("m_hControlPointEnts")] + [NetworkVar("m_hControlPointEnts")] public InlineArrayNewMaxControlPoints ControlPointEnts = new(); - [NetworkName("m_iControlPointParents")] + + [NetworkVar("m_iControlPointParents")] public InlineArrayNewMaxControlPoints ControlPointParents = new(); + [NetworkVar("m_bWeatherEffect")] + public bool WeatherEffect; } diff --git a/Game.Client/C_PhysBox.cs b/Game.Client/C_PhysBox.cs index c280861b..d72e4892 100644 --- a/Game.Client/C_PhysBox.cs +++ b/Game.Client/C_PhysBox.cs @@ -5,8 +5,10 @@ namespace Game.Client; [NetworkName("CPhysBox")] -public class C_PhysBox : C_BaseEntity +public partial class C_PhysBox : C_BaseEntity { - public static readonly RecvTable DT_PhysBox = new(DT_BaseEntity, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PhysBox); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/C_PhysMagnet.cs b/Game.Client/C_PhysMagnet.cs index 2b304551..10f4ab58 100644 --- a/Game.Client/C_PhysMagnet.cs +++ b/Game.Client/C_PhysMagnet.cs @@ -5,8 +5,10 @@ namespace Game.Client; [NetworkName("CPhysMagnet")] -public class C_PhysMagnet : C_BaseAnimating +public partial class C_PhysMagnet : C_BaseAnimating { - public static readonly RecvTable DT_PhysMagnet = new(DT_BaseAnimating, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PhysMagnet); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/C_PhysicsProp.cs b/Game.Client/C_PhysicsProp.cs index c5ed4053..6ef119d7 100644 --- a/Game.Client/C_PhysicsProp.cs +++ b/Game.Client/C_PhysicsProp.cs @@ -4,15 +4,15 @@ using Source.Common; namespace Game.Client; -using FIELD = Source.FIELD; [NetworkName("CPhysicsProp")] -public class C_PhysicsProp : C_BreakableProp +public partial class C_PhysicsProp : C_BreakableProp { - public static readonly RecvTable DT_PhysicsProp = new(DT_BreakableProp, [ - RecvPropBool(FIELD.OF(nameof(Awake))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PhysicsProp); - [NetworkName("m_bAwake")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Awake), + ]; + + [NetworkVar("m_bAwake")] public bool Awake; } diff --git a/Game.Client/C_Plasma.cs b/Game.Client/C_Plasma.cs index a3749a98..b53c488e 100644 --- a/Game.Client/C_Plasma.cs +++ b/Game.Client/C_Plasma.cs @@ -3,30 +3,29 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CPlasma")] -public class C_Plasma : C_BaseEntity +public partial class C_Plasma : C_BaseEntity { - public static readonly RecvTable DT_Plasma = new(DT_BaseEntity, [ - RecvPropFloat(FIELD.OF(nameof(Scale))), - RecvPropFloat(FIELD.OF(nameof(ScaleTime))), - RecvPropInt(FIELD.OF(nameof(Flags))), - RecvPropInt(FIELD.OF(nameof(PlasmaModelIndex))), - RecvPropInt(FIELD.OF(nameof(PlasmaModelIndex2))), - RecvPropInt(FIELD.OF(nameof(GlowModelIndex))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_Plasma); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Scale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ScaleTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Flags)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(PlasmaModelIndex)) { Bits = 14 }, + new(nameof(PlasmaModelIndex2)) { Bits = 14 }, + new(nameof(GlowModelIndex)) { Bits = 14 }, + ]; - [NetworkName("m_flScale")] + [NetworkVar("m_flScale")] public float Scale; - [NetworkName("m_flScaleTime")] + [NetworkVar("m_flScaleTime")] public float ScaleTime; - [NetworkName("m_nFlags")] + [NetworkVar("m_nFlags")] public int Flags; - [NetworkName("m_nPlasmaModelIndex")] + [NetworkVar("m_nPlasmaModelIndex")] public int PlasmaModelIndex; - [NetworkName("m_nPlasmaModelIndex2")] + [NetworkVar("m_nPlasmaModelIndex2")] public int PlasmaModelIndex2; - [NetworkName("m_nGlowModelIndex")] + [NetworkVar("m_nGlowModelIndex")] public int GlowModelIndex; } diff --git a/Game.Client/C_PlayerResource.cs b/Game.Client/C_PlayerResource.cs index 17e40276..90ed8fc0 100644 --- a/Game.Client/C_PlayerResource.cs +++ b/Game.Client/C_PlayerResource.cs @@ -10,42 +10,40 @@ namespace Game.Client; using Game.Client.GarrysMod; -using FIELD = Source.FIELD; - public static class PlayerResourceGlobals { public static C_PlayerResource? g_pPlayerResource; } -[NetworkName("CPlayerResource")] -public class C_PlayerResource : C_BaseEntity +[NetworkName("CPlayerResource", NoBase = true)] +public partial class C_PlayerResource : C_BaseEntity { - public static readonly RecvTable DT_PlayerResource = new([ - RecvPropArray3(FIELD.OF_ARRAY(nameof(Ping)), RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(Ping), 0))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(Score)), RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(Score), 0))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(Deaths)), RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(Deaths), 0))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(Connected)), RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(Connected), 0))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(Team)), RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(Team), 0))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(Alive)), RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(Alive), 0))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(Health)), RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(Health), 0))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(Armor)), RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(Armor)))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PlayerResource); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Ping)) { Bits = 12, Flags = PropFlags.Unsigned }, + new(nameof(Score)) { Bits = 32 }, + new(nameof(Deaths)) { Bits = 32 }, + new(nameof(Connected)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(Team)) { Bits = 16 }, + new(nameof(Alive)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(Health)) { Bits = 32, Flags = PropFlags.VarInt | PropFlags.Unsigned | PropFlags.Normal }, + new(nameof(Armor)) { Bits = 32, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_iPing")] + [NetworkVar("m_iPing")] InlineArrayMaxPlayersPlusOne Ping = new(); - [NetworkName("m_iScore")] + [NetworkVar("m_iScore")] InlineArrayMaxPlayersPlusOne Score = new(); - [NetworkName("m_iDeaths")] + [NetworkVar("m_iDeaths")] InlineArrayMaxPlayersPlusOne Deaths = new(); - [NetworkName("m_bConnected")] + [NetworkVar("m_bConnected")] InlineArrayMaxPlayersPlusOne Connected = new(); - [NetworkName("m_iTeam")] + [NetworkVar("m_iTeam")] InlineArrayMaxPlayersPlusOne Team = new(); - [NetworkName("m_bAlive")] + [NetworkVar("m_bAlive")] InlineArrayMaxPlayersPlusOne Alive = new(); - [NetworkName("m_iHealth")] + [NetworkVar("m_iHealth")] new InlineArrayMaxPlayersPlusOne Health = new(); - [NetworkName("m_iArmor")] + [NetworkVar("m_iArmor")] InlineArrayMaxPlayersPlusOne Armor = new(); const string PLAYER_UNCONNECTED_NAME = "unconnected"; diff --git a/Game.Client/C_PointCamera.cs b/Game.Client/C_PointCamera.cs index c2975af0..a5a9ba06 100644 --- a/Game.Client/C_PointCamera.cs +++ b/Game.Client/C_PointCamera.cs @@ -3,48 +3,47 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CPointCamera")] -public class C_PointCamera : C_BaseEntity +public partial class C_PointCamera : C_BaseEntity { - public static readonly RecvTable DT_PointCamera = new(DT_BaseEntity, [ - RecvPropFloat(FIELD.OF(nameof(FOV))), - RecvPropFloat(FIELD.OF(nameof(Resolution))), - RecvPropBool(FIELD.OF(nameof(FogEnable))), - RecvPropInt(FIELD.OF(nameof(FogColor))), - RecvPropInt(FIELD.OF(nameof(FogColorHDR))), - RecvPropFloat(FIELD.OF(nameof(FogStart))), - RecvPropFloat(FIELD.OF(nameof(FogEnd))), - RecvPropFloat(FIELD.OF(nameof(FogMaxDensity))), - RecvPropBool(FIELD.OF(nameof(FogRadial))), - RecvPropBool(FIELD.OF(nameof(Active))), - RecvPropBool(FIELD.OF(nameof(UseScreenAspectRatio))), - RecvPropBool(FIELD.OF(nameof(GlobalOverride))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PointCamera); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(FOV)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Resolution)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(FogEnable), + new(nameof(FogColor)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(FogColorHDR)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(FogStart)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FogEnd)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FogMaxDensity)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(FogRadial), + nameof(Active), + nameof(UseScreenAspectRatio), + nameof(GlobalOverride), + ]; - [NetworkName("m_FOV")] + [NetworkVar("m_FOV")] public float FOV; - [NetworkName("m_Resolution")] + [NetworkVar("m_Resolution")] public float Resolution; - [NetworkName("m_bFogEnable")] + [NetworkVar("m_bFogEnable")] public bool FogEnable; - [NetworkName("m_FogColor")] + [NetworkVar("m_FogColor")] public int FogColor; - [NetworkName("m_FogColorHDR")] + [NetworkVar("m_FogColorHDR")] public int FogColorHDR; - [NetworkName("m_flFogStart")] + [NetworkVar("m_flFogStart")] public float FogStart; - [NetworkName("m_flFogEnd")] + [NetworkVar("m_flFogEnd")] public float FogEnd; - [NetworkName("m_flFogMaxDensity")] + [NetworkVar("m_flFogMaxDensity")] public float FogMaxDensity; - [NetworkName("m_bFogRadial")] + [NetworkVar("m_bFogRadial")] public bool FogRadial; - [NetworkName("m_bActive")] + [NetworkVar("m_bActive")] public bool Active; - [NetworkName("m_bUseScreenAspectRatio")] + [NetworkVar("m_bUseScreenAspectRatio")] public bool UseScreenAspectRatio; - [NetworkName("m_bGlobalOverride")] + [NetworkVar("m_bGlobalOverride")] public bool GlobalOverride; } diff --git a/Game.Client/C_PointWorldText.cs b/Game.Client/C_PointWorldText.cs index d89be4ea..88358516 100644 --- a/Game.Client/C_PointWorldText.cs +++ b/Game.Client/C_PointWorldText.cs @@ -3,37 +3,36 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [LinkEntityToClass("point_worldtext")] [NetworkName("CPointWorldText")] -public class C_PointWorldText : C_BaseEntity +public partial class C_PointWorldText : C_BaseEntity { - public static readonly RecvTable DT_PointWorldText = new(DT_BaseEntity, [ - RecvPropString(FIELD.OF(nameof(SzText))), - RecvPropInt(FIELD.OF(nameof(ColTextColor))), - RecvPropFloat(FIELD.OF(nameof(TextSize))), - RecvPropFloat(FIELD.OF(nameof(TextSpacingX))), - RecvPropFloat(FIELD.OF(nameof(TextSpacingY))), - RecvPropInt(FIELD.OF(nameof(Orientation))), - RecvPropBool(FIELD.OF(nameof(Rainbow))), - RecvPropBool(FIELD.OF(nameof(TextEnabled))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PointWorldText); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SzText)) { Encoding = NetEncoding.String }, + new(nameof(ColTextColor)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(TextSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(TextSpacingX)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(TextSpacingY)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Orientation)) { Bits = 3, Flags = PropFlags.Unsigned }, + nameof(Rainbow), + nameof(TextEnabled), + ]; - [NetworkName("m_szText")] + [NetworkVar("m_szText")] public InlineArray512 SzText; - [NetworkName("m_colTextColor")] + [NetworkVar("m_colTextColor")] public int ColTextColor; - [NetworkName("m_flTextSize")] + [NetworkVar("m_flTextSize")] public float TextSize; - [NetworkName("m_flTextSpacingX")] + [NetworkVar("m_flTextSpacingX")] public float TextSpacingX; - [NetworkName("m_flTextSpacingY")] + [NetworkVar("m_flTextSpacingY")] public float TextSpacingY; - [NetworkName("m_nOrientation")] + [NetworkVar("m_nOrientation")] public int Orientation; - [NetworkName("m_bRainbow")] + [NetworkVar("m_bRainbow")] public bool Rainbow; - [NetworkName("m_bTextEnabled")] + [NetworkVar("m_bTextEnabled")] public bool TextEnabled; } diff --git a/Game.Client/C_PoseController.cs b/Game.Client/C_PoseController.cs index c54e6b0e..4e9f5e0e 100644 --- a/Game.Client/C_PoseController.cs +++ b/Game.Client/C_PoseController.cs @@ -3,46 +3,45 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CPoseController")] -public class C_PoseController : C_BaseEntity +public partial class C_PoseController : C_BaseEntity { - public static readonly RecvTable DT_PoseController = new(DT_BaseEntity, [ - RecvPropArray3(FIELD.OF_ARRAY(nameof(HProps)), RecvPropEHandle(FIELD.OF_ARRAYINDEX(nameof(HProps), 0))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(ChPoseIndex)), RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(ChPoseIndex), 0))), - RecvPropBool(FIELD.OF(nameof(PoseValueParity))), - RecvPropFloat(FIELD.OF(nameof(PoseValue))), - RecvPropFloat(FIELD.OF(nameof(InterpolationTime))), - RecvPropBool(FIELD.OF(nameof(InterpolationWrap))), - RecvPropFloat(FIELD.OF(nameof(CycleFrequency))), - RecvPropInt(FIELD.OF(nameof(FModType))), - RecvPropFloat(FIELD.OF(nameof(FModTimeOffset))), - RecvPropFloat(FIELD.OF(nameof(FModRate))), - RecvPropFloat(FIELD.OF(nameof(FModAmplitude))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PoseController); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(HProps), + new(nameof(ChPoseIndex)) { Bits = 5, Flags = PropFlags.Unsigned }, + nameof(PoseValueParity), + new(nameof(PoseValue)) { Bits = 11, Low = 0.0f, High = 1.0f }, + new(nameof(InterpolationTime)) { Bits = 11, Low = 0.0f, High = 10.0f }, + nameof(InterpolationWrap), + new(nameof(CycleFrequency)) { Bits = 11, Low = -10.0f, High = 10.0f }, + new(nameof(FModType)) { Bits = 3, Flags = PropFlags.Unsigned }, + new(nameof(FModTimeOffset)) { Bits = 11, Low = -1.0f, High = 1.0f }, + new(nameof(FModRate)) { Bits = 11, Low = -10.0f, High = 10.0f }, + new(nameof(FModAmplitude)) { Bits = 11, Low = 0.0f, High = 10.0f }, + ]; public const int MAX_POSE_CONTROLLED_PROPS = 4; - [NetworkName("m_hProps")] + [NetworkVar("m_hProps")] public InlineArray4 HProps; - [NetworkName("m_chPoseIndex")] + [NetworkVar("m_chPoseIndex")] public InlineArray4 ChPoseIndex; - [NetworkName("m_bPoseValueParity")] + [NetworkVar("m_bPoseValueParity")] public bool PoseValueParity; - [NetworkName("m_fPoseValue")] + [NetworkVar("m_fPoseValue")] public float PoseValue; - [NetworkName("m_fInterpolationTime")] + [NetworkVar("m_fInterpolationTime")] public float InterpolationTime; - [NetworkName("m_bInterpolationWrap")] + [NetworkVar("m_bInterpolationWrap")] public bool InterpolationWrap; - [NetworkName("m_fCycleFrequency")] + [NetworkVar("m_fCycleFrequency")] public float CycleFrequency; - [NetworkName("m_nFModType")] + [NetworkVar("m_nFModType")] public int FModType; - [NetworkName("m_fFModTimeOffset")] + [NetworkVar("m_fFModTimeOffset")] public float FModTimeOffset; - [NetworkName("m_fFModRate")] + [NetworkVar("m_fFModRate")] public float FModRate; - [NetworkName("m_fFModAmplitude")] + [NetworkVar("m_fFModAmplitude")] public float FModAmplitude; } diff --git a/Game.Client/C_Precipitation.cs b/Game.Client/C_Precipitation.cs index e77d382c..bad5ef7a 100644 --- a/Game.Client/C_Precipitation.cs +++ b/Game.Client/C_Precipitation.cs @@ -3,27 +3,26 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CPrecipitation")] -public class C_Precipitation : C_BaseEntity +public partial class C_Precipitation : C_BaseEntity { - public static readonly RecvTable DT_Precipitation = new(DT_BaseEntity, [ - RecvPropInt(FIELD.OF(nameof(PrecipType))), - RecvPropString(FIELD.OF(nameof(ParticleNameClose))), - RecvPropString(FIELD.OF(nameof(ParticleNameInner))), - RecvPropString(FIELD.OF(nameof(ParticleNameOuter))), - RecvPropFloat(FIELD.OF(nameof(ParticleDist))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_Precipitation); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(PrecipType)) { Bits = 4, Flags = PropFlags.Unsigned }, + new(nameof(ParticleNameClose)) { Encoding = NetEncoding.String }, + new(nameof(ParticleNameInner)) { Encoding = NetEncoding.String }, + new(nameof(ParticleNameOuter)) { Encoding = NetEncoding.String }, + new(nameof(ParticleDist)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_nPrecipType")] + [NetworkVar("m_nPrecipType")] public int PrecipType; - [NetworkName("m_sParticleNameClose")] + [NetworkVar("m_sParticleNameClose")] public InlineArray512 ParticleNameClose; - [NetworkName("m_sParticleNameInner")] + [NetworkVar("m_sParticleNameInner")] public InlineArray512 ParticleNameInner; - [NetworkName("m_sParticleNameOuter")] + [NetworkVar("m_sParticleNameOuter")] public InlineArray512 ParticleNameOuter; - [NetworkName("m_flParticleDist")] + [NetworkVar("m_flParticleDist")] public float ParticleDist; } diff --git a/Game.Client/C_PrecipitationBlocker.cs b/Game.Client/C_PrecipitationBlocker.cs index 7f6acd74..c0f706d9 100644 --- a/Game.Client/C_PrecipitationBlocker.cs +++ b/Game.Client/C_PrecipitationBlocker.cs @@ -3,10 +3,11 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CPrecipitationBlocker")] -public class C_PrecipitationBlocker : C_BaseEntity +public partial class C_PrecipitationBlocker : C_BaseEntity { - public static readonly RecvTable DT_PrecipitationBlocker = new(DT_BaseEntity, [ ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PrecipitationBlocker); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/C_PropCrane.cs b/Game.Client/C_PropCrane.cs index 734dd864..ea573b06 100644 --- a/Game.Client/C_PropCrane.cs +++ b/Game.Client/C_PropCrane.cs @@ -3,27 +3,26 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CPropCrane")] -public class C_PropCrane : C_BaseAnimating +public partial class C_PropCrane : C_BaseAnimating { - public static readonly RecvTable DT_PropCrane = new(DT_BaseAnimating, [ - RecvPropEHandle(FIELD.OF(nameof(Player))), - RecvPropBool(FIELD.OF(nameof(MagnetOn))), - RecvPropBool(FIELD.OF(nameof(EnterAnimOn))), - RecvPropBool(FIELD.OF(nameof(ExitAnimOn))), - RecvPropVector(FIELD.OF(nameof(EyeExitEndpoint))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PropCrane); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Player), + nameof(MagnetOn), + nameof(EnterAnimOn), + nameof(ExitAnimOn), + new(nameof(EyeExitEndpoint)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_hPlayer")] + [NetworkVar("m_hPlayer")] public EHANDLE Player = new(); - [NetworkName("m_bMagnetOn")] + [NetworkVar("m_bMagnetOn")] public bool MagnetOn; - [NetworkName("m_bEnterAnimOn")] + [NetworkVar("m_bEnterAnimOn")] public bool EnterAnimOn; - [NetworkName("m_bExitAnimOn")] + [NetworkVar("m_bExitAnimOn")] public bool ExitAnimOn; - [NetworkName("m_vecEyeExitEndpoint")] + [NetworkVar("m_vecEyeExitEndpoint")] public Vector3 EyeExitEndpoint; } diff --git a/Game.Client/C_PropEnergyBall.cs b/Game.Client/C_PropEnergyBall.cs index dafdbc9b..b32abdb6 100644 --- a/Game.Client/C_PropEnergyBall.cs +++ b/Game.Client/C_PropEnergyBall.cs @@ -4,19 +4,18 @@ using System.Numerics; using Game.Client.HL2; namespace Game.Client; -using FIELD = FIELD; [LinkEntityToClass("prop_energy_ball")] [NetworkName("CPropEnergyBall")] -public class C_PropEnergyBall : C_PropCombineBall +public partial class C_PropEnergyBall : C_PropCombineBall { - public static readonly RecvTable DT_PropEnergyBall = new(DT_PropCombineBall, [ - RecvPropBool(FIELD.OF(nameof(IsInfiniteLife))), - RecvPropFloat(FIELD.OF(nameof(TimeTillDeath))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PropEnergyBall); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(IsInfiniteLife), + new(nameof(TimeTillDeath)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_bIsInfiniteLife")] + [NetworkVar("m_bIsInfiniteLife")] public bool IsInfiniteLife; - [NetworkName("m_fTimeTillDeath")] + [NetworkVar("m_fTimeTillDeath")] public float TimeTillDeath; } diff --git a/Game.Client/C_PropJeep.cs b/Game.Client/C_PropJeep.cs index f70b0ad0..5889db21 100644 --- a/Game.Client/C_PropJeep.cs +++ b/Game.Client/C_PropJeep.cs @@ -6,40 +6,34 @@ using System.Numerics; namespace Game.Client; -using FIELD_PJ = Source.FIELD; -using FIELD_PJE = Source.FIELD; [NetworkName("CPropJeep")] -public class C_PropJeep : C_PropVehicleDriveable +public partial class C_PropJeep : C_PropVehicleDriveable { - public static readonly RecvTable DT_PropJeep = new(DT_PropVehicleDriveable, [ - RecvPropBool(FIELD_PJ.OF(nameof(HeadlightIsOn))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PropJeep); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(HeadlightIsOn), + ]; - [NetworkName("m_bHeadlightIsOn")] + [NetworkVar("m_bHeadlightIsOn")] public bool HeadlightIsOn; public override bool IsJeep() => true; } -[NetworkName("CPropJeepEpisodic")] -public class C_PropJeepEpisodic : C_PropJeep +[NetworkName("CPropJeepEpisodic", Table = "DT_CPropJeepEpisodic")] +public partial class C_PropJeepEpisodic : C_PropJeep { - public static readonly RecvTable DT_CPropJeepEpisodic = new(DT_PropJeep, [ - RecvPropInt(FIELD_PJE.OF(nameof(NumRadarContacts))), - - RecvPropVector(FIELD_PJE.OF_ARRAYINDEX(nameof(RadarContactPos), 0)), - RecvPropArray2(null!, 24, "m_vecRadarContactPos"), - - RecvPropInt(FIELD_PJE.OF_ARRAYINDEX(nameof(RadarContactType), 0)), - RecvPropArray2(null!, 24, "m_iRadarContactType"), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_CPropJeepEpisodic); - - [NetworkName("m_iNumRadarContacts")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(NumRadarContacts), + new(nameof(RadarContactPos)) { Encoding = NetEncoding.Array2 }, + new(nameof(RadarContactType)) { Encoding = NetEncoding.Array2 }, + ]; + + [NetworkVar("m_iNumRadarContacts")] public int NumRadarContacts; - [NetworkName("m_vecRadarContactPos")] + [NetworkVar("m_vecRadarContactPos")] public InlineArray24 RadarContactPos; - [NetworkName("m_iRadarContactType")] + [NetworkVar("m_iRadarContactType")] public InlineArray24 RadarContactType; } diff --git a/Game.Client/C_PropScalable.cs b/Game.Client/C_PropScalable.cs index c84239d4..8d9ce673 100644 --- a/Game.Client/C_PropScalable.cs +++ b/Game.Client/C_PropScalable.cs @@ -3,42 +3,41 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CPropScalable")] -public class C_PropScalable : C_BaseAnimating +public partial class C_PropScalable : C_BaseAnimating { - public static readonly RecvTable DT_PropScalable = new(DT_BaseAnimating, [ - // todo: RecvProxy_ScaleX - RecvPropFloat(FIELD.OF(nameof(ScaleX))), - // todo: RecvProxy_ScaleY - RecvPropFloat(FIELD.OF(nameof(ScaleY))), - // todo: RecvProxy_ScaleZ - RecvPropFloat(FIELD.OF(nameof(ScaleZ))), - RecvPropFloat(FIELD.OF(nameof(LerpTimeX))), - RecvPropFloat(FIELD.OF(nameof(LerpTimeY))), - RecvPropFloat(FIELD.OF(nameof(LerpTimeZ))), - RecvPropFloat(FIELD.OF(nameof(GoalTimeX))), - RecvPropFloat(FIELD.OF(nameof(GoalTimeY))), - RecvPropFloat(FIELD.OF(nameof(GoalTimeZ))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PropScalable); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ScaleX)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ScaleY)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ScaleZ)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(LerpTimeX)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(LerpTimeY)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(LerpTimeZ)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(GoalTimeX)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(GoalTimeY)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(GoalTimeZ)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flScaleX")] + // todo: RecvProxy_ScaleX + [NetworkVar("m_flScaleX")] public float ScaleX; - [NetworkName("m_flScaleY")] + // todo: RecvProxy_ScaleY + [NetworkVar("m_flScaleY")] public float ScaleY; - [NetworkName("m_flScaleZ")] + // todo: RecvProxy_ScaleZ + [NetworkVar("m_flScaleZ")] public float ScaleZ; - [NetworkName("m_flLerpTimeX")] + [NetworkVar("m_flLerpTimeX")] public float LerpTimeX; - [NetworkName("m_flLerpTimeY")] + [NetworkVar("m_flLerpTimeY")] public float LerpTimeY; - [NetworkName("m_flLerpTimeZ")] + [NetworkVar("m_flLerpTimeZ")] public float LerpTimeZ; - [NetworkName("m_flGoalTimeX")] + [NetworkVar("m_flGoalTimeX")] public float GoalTimeX; - [NetworkName("m_flGoalTimeY")] + [NetworkVar("m_flGoalTimeY")] public float GoalTimeY; - [NetworkName("m_flGoalTimeZ")] + [NetworkVar("m_flGoalTimeZ")] public float GoalTimeZ; } diff --git a/Game.Client/C_PropVehicleChoreoGeneric.cs b/Game.Client/C_PropVehicleChoreoGeneric.cs index f2c561c6..de1fd019 100644 --- a/Game.Client/C_PropVehicleChoreoGeneric.cs +++ b/Game.Client/C_PropVehicleChoreoGeneric.cs @@ -4,58 +4,58 @@ namespace Game.Client; -using FIELD = FIELD; [NetworkName("CPropVehicleChoreoGeneric")] -public class C_PropVehicleChoreoGeneric : C_DynamicProp +public partial class C_PropVehicleChoreoGeneric : C_DynamicProp { - [NetworkName("m_hPlayer")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Player), + nameof(EnterAnimOn), + nameof(ExitAnimOn), + nameof(ForceEyesToAttachment), + new(nameof(EyeExitEndpoint)) { Bits = 0, Flags = PropFlags.Coord }, + nameof(VehicleViewClampEyeAngles), + new(nameof(VehicleViewPitchCurveZero)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VehicleViewPitchCurveLinear)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VehicleViewRollCurveZero)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VehicleViewRollCurveLinear)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VehicleViewFOV)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VehicleViewYawMin)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VehicleViewYawMax)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VehicleViewPitchMin)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VehicleViewPitchMax)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; + + [NetworkVar("m_hPlayer")] public EHANDLE Player; - [NetworkName("m_bEnterAnimOn")] + [NetworkVar("m_bEnterAnimOn")] public bool EnterAnimOn; - [NetworkName("m_bExitAnimOn")] + [NetworkVar("m_bExitAnimOn")] public bool ExitAnimOn; - [NetworkName("m_bForceEyesToAttachment")] + [NetworkVar("m_bForceEyesToAttachment")] public bool ForceEyesToAttachment; - [NetworkName("m_vecEyeExitEndpoint")] + [NetworkVar("m_vecEyeExitEndpoint")] public Vector3 EyeExitEndpoint; - [NetworkName("m_vehicleView.bClampEyeAngles")] + [NetworkVar("m_vehicleView.bClampEyeAngles")] public bool VehicleViewClampEyeAngles; - [NetworkName("m_vehicleView.flPitchCurveZero")] + [NetworkVar("m_vehicleView.flPitchCurveZero")] public float VehicleViewPitchCurveZero; - [NetworkName("m_vehicleView.flPitchCurveLinear")] + [NetworkVar("m_vehicleView.flPitchCurveLinear")] public float VehicleViewPitchCurveLinear; - [NetworkName("m_vehicleView.flRollCurveZero")] + [NetworkVar("m_vehicleView.flRollCurveZero")] public float VehicleViewRollCurveZero; - [NetworkName("m_vehicleView.flRollCurveLinear")] + [NetworkVar("m_vehicleView.flRollCurveLinear")] public float VehicleViewRollCurveLinear; - [NetworkName("m_vehicleView.flFOV")] + [NetworkVar("m_vehicleView.flFOV")] public float VehicleViewFOV; - [NetworkName("m_vehicleView.flYawMin")] + [NetworkVar("m_vehicleView.flYawMin")] public float VehicleViewYawMin; - [NetworkName("m_vehicleView.flYawMax")] + [NetworkVar("m_vehicleView.flYawMax")] public float VehicleViewYawMax; - [NetworkName("m_vehicleView.flPitchMin")] + [NetworkVar("m_vehicleView.flPitchMin")] public float VehicleViewPitchMin; - [NetworkName("m_vehicleView.flPitchMax")] + [NetworkVar("m_vehicleView.flPitchMax")] public float VehicleViewPitchMax; - public static readonly RecvTable DT_PropVehicleChoreoGeneric = new(DT_DynamicProp, [ - RecvPropEHandle(FIELD.OF(nameof(Player))), - RecvPropBool(FIELD.OF(nameof(EnterAnimOn))), - RecvPropBool(FIELD.OF(nameof(ExitAnimOn))), - RecvPropBool(FIELD.OF(nameof(ForceEyesToAttachment))), - RecvPropVector(FIELD.OF(nameof(EyeExitEndpoint))), - RecvPropBool(FIELD.OF(nameof(VehicleViewClampEyeAngles))), - RecvPropFloat(FIELD.OF(nameof(VehicleViewPitchCurveZero))), - RecvPropFloat(FIELD.OF(nameof(VehicleViewPitchCurveLinear))), - RecvPropFloat(FIELD.OF(nameof(VehicleViewRollCurveZero))), - RecvPropFloat(FIELD.OF(nameof(VehicleViewRollCurveLinear))), - RecvPropFloat(FIELD.OF(nameof(VehicleViewFOV))), - RecvPropFloat(FIELD.OF(nameof(VehicleViewYawMin))), - RecvPropFloat(FIELD.OF(nameof(VehicleViewYawMax))), - RecvPropFloat(FIELD.OF(nameof(VehicleViewPitchMin))), - RecvPropFloat(FIELD.OF(nameof(VehicleViewPitchMax))), - ]); - public static new readonly ClientClass ClientClass = new ClientClass(DT_PropVehicleChoreoGeneric); } diff --git a/Game.Client/C_PropVehicleDriveable.cs b/Game.Client/C_PropVehicleDriveable.cs index bcdafcf2..bec66cc8 100644 --- a/Game.Client/C_PropVehicleDriveable.cs +++ b/Game.Client/C_PropVehicleDriveable.cs @@ -5,52 +5,51 @@ using System.Numerics; namespace Game.Client; -using FIELD = Source.FIELD; [NetworkName("CPropVehicleDriveable")] -public class C_PropVehicleDriveable : C_BaseAnimating +public partial class C_PropVehicleDriveable : C_BaseAnimating { - public static readonly RecvTable DT_PropVehicleDriveable = new(DT_BaseAnimating, [ - RecvPropEHandle(FIELD.OF(nameof(Player))), - RecvPropInt(FIELD.OF(nameof(Speed))), - RecvPropInt(FIELD.OF(nameof(RPM))), - RecvPropFloat(FIELD.OF(nameof(Throttle))), - RecvPropInt(FIELD.OF(nameof(BoostTimeLeft))), - RecvPropBool(FIELD.OF(nameof(HasBoost))), - RecvPropBool(FIELD.OF(nameof(EnterAnimOn))), - RecvPropBool(FIELD.OF(nameof(ExitAnimOn))), - RecvPropBool(FIELD.OF(nameof(UnableToFire))), - RecvPropVector(FIELD.OF(nameof(EyeExitEndpoint))), - RecvPropBool(FIELD.OF(nameof(HasGun))), - RecvPropVector(FIELD.OF(nameof(GunCrosshair))), - RecvPropBool(FIELD.OF(nameof(Locked))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PropVehicleDriveable); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Player), + nameof(Speed), + new(nameof(RPM)) { Bits = 13 }, + new(nameof(Throttle)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(BoostTimeLeft)) { Bits = 8 }, + nameof(HasBoost), + nameof(EnterAnimOn), + nameof(ExitAnimOn), + nameof(UnableToFire), + new(nameof(EyeExitEndpoint)) { Bits = 0, Flags = PropFlags.Coord }, + nameof(HasGun), + new(nameof(GunCrosshair)) { Bits = 0, Flags = PropFlags.Coord }, + nameof(Locked), + ]; - [NetworkName("m_hPlayer")] + [NetworkVar("m_hPlayer")] public EHANDLE Player = new(); - [NetworkName("m_nRPM")] + [NetworkVar("m_nRPM")] public int RPM; - [NetworkName("m_flThrottle")] + [NetworkVar("m_flThrottle")] public float Throttle; - [NetworkName("m_nBoostTimeLeft")] + [NetworkVar("m_nBoostTimeLeft")] public int BoostTimeLeft; - [NetworkName("m_nHasBoost")] + [NetworkVar("m_nHasBoost")] public bool HasBoost; public bool ScannerDisabledWeapons; public bool ScannerDisabledVehicle; - [NetworkName("m_bEnterAnimOn")] + [NetworkVar("m_bEnterAnimOn")] public bool EnterAnimOn; - [NetworkName("m_bExitAnimOn")] + [NetworkVar("m_bExitAnimOn")] public bool ExitAnimOn; - [NetworkName("m_bUnableToFire")] + [NetworkVar("m_bUnableToFire")] public bool UnableToFire; - [NetworkName("m_vecEyeExitEndpoint")] + [NetworkVar("m_vecEyeExitEndpoint")] public Vector3 EyeExitEndpoint; - [NetworkName("m_bHasGun")] + [NetworkVar("m_bHasGun")] public bool HasGun; - [NetworkName("m_vecGunCrosshair")] + [NetworkVar("m_vecGunCrosshair")] public Vector3 GunCrosshair; - [NetworkName("m_bLocked")] + [NetworkVar("m_bLocked")] public bool Locked; } diff --git a/Game.Client/C_Props.cs b/Game.Client/C_Props.cs index a76468d7..0402a2c6 100644 --- a/Game.Client/C_Props.cs +++ b/Game.Client/C_Props.cs @@ -6,77 +6,81 @@ namespace Game.Client; using System.Numerics; -using FIELD_DP = Source.FIELD; using FIELD_PBM = Source.FIELD; using FIELD_BPD = Source.FIELD; using FIELD_PPM = Source.FIELD; [NetworkName("CDynamicProp")] -public class C_DynamicProp : C_BreakableProp +public partial class C_DynamicProp : C_BreakableProp { - public static readonly RecvTable DT_DynamicProp = new(DT_BreakableProp, [ - RecvPropBool(FIELD_DP.OF(nameof(UseHitboxesForRenderBox))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_DynamicProp); - [NetworkName("m_bUseHitboxesForRenderBox")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(UseHitboxesForRenderBox), + ]; + + [NetworkVar("m_bUseHitboxesForRenderBox")] public bool UseHitboxesForRenderBox; } [NetworkName("CPhysicsPropMultiplayer")] -public class PhysicsPropMultiplayer : C_PhysicsProp +public partial class PhysicsPropMultiplayer : C_PhysicsProp { - public static readonly RecvTable DT_PhysicsPropMultiplayer = new(DT_PhysicsProp, [ - RecvPropInt(FIELD_PPM.OF(nameof(PhysicsMode))), - RecvPropFloat(FIELD_PPM.OF(nameof(Mass))), - RecvPropVector(FIELD_PPM.OF(nameof(CollisionMins))), - RecvPropVector(FIELD_PPM.OF(nameof(CollisionMaxs))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PhysicsPropMultiplayer); - - [NetworkName("m_iPhysicsMode")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(PhysicsMode)) { Bits = 2, Flags = PropFlags.Unsigned }, + new(nameof(Mass)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(CollisionMins)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(CollisionMaxs)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; + + [NetworkVar("m_iPhysicsMode")] public int PhysicsMode; - [NetworkName("m_fMass")] + [NetworkVar("m_fMass")] public float Mass; - [NetworkName("m_collisionMins")] + [NetworkVar("m_collisionMins")] public Vector3 CollisionMins; - [NetworkName("m_collisionMaxs")] + [NetworkVar("m_collisionMaxs")] public Vector3 CollisionMaxs; } [NetworkName("CPhysBoxMultiplayer")] -public class PhysBoxMultiplayer : C_PhysBox +public partial class PhysBoxMultiplayer : C_PhysBox { - public static readonly RecvTable DT_PhysBoxMultiplayer = new(DT_PhysBox, [ - RecvPropInt(FIELD_PBM.OF(nameof(PhysicsMode)), PropFlags.Unsigned), - RecvPropFloat(FIELD_PBM.OF(nameof(Mass))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PhysBoxMultiplayer); - [NetworkName("m_iPhysicsMode")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(PhysicsMode)) { Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(Mass)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; + + [NetworkVar("m_iPhysicsMode")] public int PhysicsMode; - [NetworkName("m_fMass")] + [NetworkVar("m_fMass")] public float Mass; } [NetworkName("CBasePropDoor")] -public class C_BasePropDoor : C_DynamicProp +public partial class C_BasePropDoor : C_DynamicProp { - [NetworkName("m_bLocked")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Locked), + new(nameof(DoorState)) { Bits = 3, Flags = PropFlags.Unsigned }, + ]; + + [NetworkVar("m_bLocked")] bool Locked; - [NetworkName("m_eDoorState")] + [NetworkVar("m_eDoorState")] int DoorState; - public static readonly RecvTable DT_BasePropDoor = new(DT_DynamicProp, [ - RecvPropBool(FIELD_BPD.OF(nameof(Locked))), - RecvPropInt(FIELD_BPD.OF(nameof(DoorState))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_BasePropDoor); } [NetworkName("CPropDoorRotating")] -public class C_PropDoorRotating : C_BasePropDoor +public partial class C_PropDoorRotating : C_BasePropDoor { - public static readonly RecvTable DT_PropDoorRotating = new(DT_BasePropDoor, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PropDoorRotating); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/C_RagdollManager.cs b/Game.Client/C_RagdollManager.cs index 1863562c..b20b7f50 100644 --- a/Game.Client/C_RagdollManager.cs +++ b/Game.Client/C_RagdollManager.cs @@ -3,16 +3,14 @@ namespace Game.Client; -using FIELD = FIELD; - -[NetworkName("CRagdollManager")] -public class C_RagdollManager : C_BaseEntity +[NetworkName("CRagdollManager", NoBase = true)] +public partial class C_RagdollManager : C_BaseEntity { - [NetworkName("m_iCurrentMaxRagdollCount")] - public int CurrentMaxRagdollCount; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(CurrentMaxRagdollCount)) { Bits = 6 }, + ]; - public static readonly RecvTable DT_RagdollManager = new([ - RecvPropInt(FIELD.OF(nameof(CurrentMaxRagdollCount))), - ]); - public static new readonly ClientClass ClientClass = new ClientClass(DT_RagdollManager); + [NetworkVar("m_iCurrentMaxRagdollCount")] + public int CurrentMaxRagdollCount; } diff --git a/Game.Client/C_RagdollProp.cs b/Game.Client/C_RagdollProp.cs index 3b6b1934..613bbee6 100644 --- a/Game.Client/C_RagdollProp.cs +++ b/Game.Client/C_RagdollProp.cs @@ -1,32 +1,31 @@ using Source.Common; +using Source.Common.Mathematics; using Source; using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("CRagdollProp")] -public class C_RagdollProp : C_BaseAnimating +[NetworkName("CRagdollProp", Table = "DT_Ragdoll")] +public partial class C_RagdollProp : C_BaseAnimating { const int RAGDOLL_MAX_ELEMENTS = 32; - public static readonly RecvTable DT_Ragdoll = new(DT_BaseAnimating, [ - .. Enumerable.Range(0, RAGDOLL_MAX_ELEMENTS).Select(i => RecvPropVector(FIELD.OF_ARRAYINDEX(nameof(RagPos), i))), - .. Enumerable.Range(0, RAGDOLL_MAX_ELEMENTS).Select(i => RecvPropQAngles(FIELD.OF_ARRAYINDEX(nameof(RagAngles), i))), + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(RagPos)) { Encoding = NetEncoding.Elements, Count = RAGDOLL_MAX_ELEMENTS }, + new(nameof(RagAngles)) { Encoding = NetEncoding.Elements, Count = RAGDOLL_MAX_ELEMENTS }, + nameof(HUnragdoll), + nameof(BlendWeight), + nameof(OverlaySequence), + ]; - RecvPropEHandle(FIELD.OF(nameof(HUnragdoll))), - RecvPropFloat(FIELD.OF(nameof(BlendWeight))), - RecvPropInt(FIELD.OF(nameof(OverlaySequence))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_Ragdoll); - - [NetworkName("m_ragPos[ {0} ]")] + [NetworkVar("m_ragPos[ {0} ]")] public InlineArray32 RagPos; - [NetworkName("m_ragAngles[ {0} ]")] - public InlineArray32 RagAngles; - [NetworkName("m_hUnragdoll")] + [NetworkVar("m_ragAngles[ {0} ]")] + public InlineArray32 RagAngles; + [NetworkVar("m_hUnragdoll")] public EHANDLE HUnragdoll = new(); - [NetworkName("m_flBlendWeight")] + [NetworkVar("m_flBlendWeight")] public float BlendWeight; - [NetworkName("m_nOverlaySequence")] + [NetworkVar("m_nOverlaySequence")] public int OverlaySequence; public override bool IsRagdollProp() => true; diff --git a/Game.Client/C_RagdollPropAttached.cs b/Game.Client/C_RagdollPropAttached.cs index 498923f9..371d4c3c 100644 --- a/Game.Client/C_RagdollPropAttached.cs +++ b/Game.Client/C_RagdollPropAttached.cs @@ -4,25 +4,23 @@ namespace Game.Client; -using FIELD = FIELD; - -[NetworkName("CRagdollPropAttached")] -public class C_RagdollPropAttached : C_RagdollProp +[NetworkName("CRagdollPropAttached", Table = "DT_Ragdoll_Attached")] +public partial class C_RagdollPropAttached : C_RagdollProp { - [NetworkName("m_boneIndexAttached")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(BoneIndexAttached)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(RagdollAttachedObjectIndex)) { Bits = 6, Flags = PropFlags.Unsigned }, + new(nameof(AttachmentPointBoneSpace)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(AttachmentPointRagdollSpace)) { Bits = 0, Flags = PropFlags.Coord }, + ]; + + [NetworkVar("m_boneIndexAttached")] public int BoneIndexAttached; - [NetworkName("m_ragdollAttachedObjectIndex")] + [NetworkVar("m_ragdollAttachedObjectIndex")] public int RagdollAttachedObjectIndex; - [NetworkName("m_attachmentPointBoneSpace")] + [NetworkVar("m_attachmentPointBoneSpace")] public Vector3 AttachmentPointBoneSpace; - [NetworkName("m_attachmentPointRagdollSpace")] + [NetworkVar("m_attachmentPointRagdollSpace")] public Vector3 AttachmentPointRagdollSpace; - - public static readonly RecvTable DT_Ragdoll_Attached = new(DT_Ragdoll, [ - RecvPropInt(FIELD.OF(nameof(BoneIndexAttached))), - RecvPropInt(FIELD.OF(nameof(RagdollAttachedObjectIndex))), - RecvPropVector(FIELD.OF(nameof(AttachmentPointBoneSpace))), - RecvPropVector(FIELD.OF(nameof(AttachmentPointRagdollSpace))), - ]); - public static new readonly ClientClass ClientClass = new ClientClass(DT_Ragdoll_Attached); } diff --git a/Game.Client/C_RocketTrail.cs b/Game.Client/C_RocketTrail.cs index d27bd49a..6694701a 100644 --- a/Game.Client/C_RocketTrail.cs +++ b/Game.Client/C_RocketTrail.cs @@ -3,57 +3,56 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("RocketTrail")] -public class C_RocketTrail : C_BaseParticleEntity +[NetworkName("RocketTrail", Table = "DT_RocketTrail")] +public partial class C_RocketTrail : C_BaseParticleEntity { - public static readonly RecvTable DT_RocketTrail = new(DT_BaseParticleEntity, [ - RecvPropFloat(FIELD.OF(nameof(SpawnRate))), - RecvPropVector(FIELD.OF(nameof(StartColor))), - RecvPropVector(FIELD.OF(nameof(EndColor))), - RecvPropFloat(FIELD.OF(nameof(ParticleLifetime))), - RecvPropFloat(FIELD.OF(nameof(StopEmitTime))), - RecvPropFloat(FIELD.OF(nameof(MinSpeed))), - RecvPropFloat(FIELD.OF(nameof(MaxSpeed))), - RecvPropFloat(FIELD.OF(nameof(StartSize))), - RecvPropFloat(FIELD.OF(nameof(EndSize))), - RecvPropFloat(FIELD.OF(nameof(SpawnRadius))), - RecvPropBool(FIELD.OF(nameof(Emit))), - RecvPropInt(FIELD.OF(nameof(Attachment))), - RecvPropFloat(FIELD.OF(nameof(Opacity))), - RecvPropBool(FIELD.OF(nameof(Damaged))), - RecvPropFloat(FIELD.OF(nameof(FlareScale))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_RocketTrail); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SpawnRate)) { Bits = 8, Low = 1.0f, High = 1024.0f }, + new(nameof(StartColor)) { Bits = 8, Low = 0.0f, High = 1.0f }, + new(nameof(EndColor)) { Bits = 8, Low = 0.0f, High = 1.0f }, + new(nameof(ParticleLifetime)) { Bits = 16, Flags = PropFlags.RoundUp, Low = 0.1f, High = 100.0f }, + new(nameof(StopEmitTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MinSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EndSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpawnRadius)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Emit), + new(nameof(Attachment)) { Bits = 12 }, + new(nameof(Opacity)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Damaged), + new(nameof(FlareScale)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_SpawnRate")] + [NetworkVar("m_SpawnRate")] public float SpawnRate; - [NetworkName("m_StartColor")] + [NetworkVar("m_StartColor")] public Vector3 StartColor; - [NetworkName("m_EndColor")] + [NetworkVar("m_EndColor")] public Vector3 EndColor; - [NetworkName("m_ParticleLifetime")] + [NetworkVar("m_ParticleLifetime")] public float ParticleLifetime; - [NetworkName("m_StopEmitTime")] + [NetworkVar("m_StopEmitTime")] public float StopEmitTime; - [NetworkName("m_MinSpeed")] + [NetworkVar("m_MinSpeed")] public float MinSpeed; - [NetworkName("m_MaxSpeed")] + [NetworkVar("m_MaxSpeed")] public float MaxSpeed; - [NetworkName("m_StartSize")] + [NetworkVar("m_StartSize")] public float StartSize; - [NetworkName("m_EndSize")] + [NetworkVar("m_EndSize")] public float EndSize; - [NetworkName("m_SpawnRadius")] + [NetworkVar("m_SpawnRadius")] public float SpawnRadius; - [NetworkName("m_bEmit")] + [NetworkVar("m_bEmit")] public bool Emit; - [NetworkName("m_nAttachment")] + [NetworkVar("m_nAttachment")] public int Attachment; - [NetworkName("m_Opacity")] + [NetworkVar("m_Opacity")] public float Opacity; - [NetworkName("m_bDamaged")] + [NetworkVar("m_bDamaged")] public bool Damaged; - [NetworkName("m_flFlareScale")] + [NetworkVar("m_flFlareScale")] public float FlareScale; } diff --git a/Game.Client/C_Rope.cs b/Game.Client/C_Rope.cs index 3c37efe4..be89ffd4 100644 --- a/Game.Client/C_Rope.cs +++ b/Game.Client/C_Rope.cs @@ -8,79 +8,78 @@ using Source.Common.MaterialSystem; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("CRopeKeyframe")] -public class C_RopeKeyframe : C_BaseEntity +[NetworkName("CRopeKeyframe", NoBase = true)] +public partial class C_RopeKeyframe : C_BaseEntity { - public static readonly RecvTable DT_RopeKeyframe = new([ - RecvPropEHandle(FIELD.OF(nameof(StartPoint))), - RecvPropEHandle(FIELD.OF(nameof(EndPoint))), - RecvPropInt(FIELD.OF(nameof(StartAttachment))), - RecvPropInt(FIELD.OF(nameof(EndAttachment))), - RecvPropInt(FIELD.OF(nameof(StartBone))), - RecvPropInt(FIELD.OF(nameof(EndBone))), - RecvPropVector(FIELD.OF(nameof(StartOffset))), - RecvPropVector(FIELD.OF(nameof(EndOffset))), - RecvPropInt(FIELD.OF(nameof(RenderColor))), + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(RopeMaterialModelIndex), + nameof(StartPoint), + nameof(EndPoint), + nameof(StartAttachment), + nameof(EndAttachment), + nameof(StartBone), + nameof(EndBone), + nameof(StartOffset), + nameof(EndOffset), + new(nameof(RenderColor)) { Encoding = NetEncoding.Int }, + nameof(LockedPoints), // todo: RecvProxy_RecomputeSprings - RecvPropInt(FIELD.OF(nameof(Slack))), + nameof(Slack), // todo: RecvProxy_RecomputeSprings - RecvPropInt(FIELD.OF(nameof(RopeLength))), - RecvPropInt(FIELD.OF(nameof(LockedPoints))), - RecvPropInt(FIELD.OF(nameof(RopeFlags))), - RecvPropInt(FIELD.OF(nameof(Segments))), - RecvPropBool(FIELD.OF(nameof(ConstrainBetweenEndpoints))), - RecvPropInt(FIELD.OF(nameof(RopeMaterialModelIndex))), - RecvPropInt(FIELD.OF(nameof(Subdiv))), - RecvPropFloat(FIELD.OF(nameof(TextureScale))), - RecvPropFloat(FIELD.OF(nameof(Width))), - RecvPropFloat(FIELD.OF(nameof(ScrollSpeed))), - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropEHandle(FIELD.OF(nameof(MoveParent))), - RecvPropInt(FIELD.OF(nameof(ParentAttachment))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_RopeKeyframe); + nameof(RopeLength), + nameof(RopeFlags), + nameof(TextureScale), + nameof(Segments), + nameof(ConstrainBetweenEndpoints), + nameof(Subdiv), + nameof(Width), + nameof(ScrollSpeed), + nameof(Origin), + new(nameof(NetworkMoveParent)) { Encoding = NetEncoding.Int, Proxy = typeof(MoveParentProxy) }, + nameof(ParentAttachment), + ]; - [NetworkName("m_hStartPoint")] + [NetworkVar("m_hStartPoint")] public EHANDLE StartPoint = new(); - [NetworkName("m_hEndPoint")] + [NetworkVar("m_hEndPoint")] public EHANDLE EndPoint = new(); - [NetworkName("m_iStartAttachment")] + [NetworkVar("m_iStartAttachment")] public int StartAttachment; - [NetworkName("m_iEndAttachment")] + [NetworkVar("m_iEndAttachment")] public int EndAttachment; - [NetworkName("m_iStartBone")] + [NetworkVar("m_iStartBone")] public int StartBone; - [NetworkName("m_iEndBone")] + [NetworkVar("m_iEndBone")] public int EndBone; - [NetworkName("m_vecStartOffset")] + [NetworkVar("m_vecStartOffset")] public Vector3 StartOffset; - [NetworkName("m_vecEndOffset")] + [NetworkVar("m_vecEndOffset")] public Vector3 EndOffset; - [NetworkName("m_clrRender")] + [NetworkVar("m_clrRender")] public Color RenderColor; - [NetworkName("m_Slack")] + [NetworkVar("m_Slack")] public int Slack; - [NetworkName("m_RopeLength")] + [NetworkVar("m_RopeLength")] public int RopeLength; - [NetworkName("m_fLockedPoints")] + [NetworkVar("m_fLockedPoints")] public int LockedPoints; - [NetworkName("m_RopeFlags")] + [NetworkVar("m_RopeFlags")] public int RopeFlags; - [NetworkName("m_nSegments")] + [NetworkVar("m_nSegments")] public int Segments; - [NetworkName("m_bConstrainBetweenEndpoints")] + [NetworkVar("m_bConstrainBetweenEndpoints")] public bool ConstrainBetweenEndpoints; - [NetworkName("m_iRopeMaterialModelIndex")] + [NetworkVar("m_iRopeMaterialModelIndex")] public int RopeMaterialModelIndex; - [NetworkName("m_Subdiv")] + [NetworkVar("m_Subdiv")] public int Subdiv; - [NetworkName("m_TextureScale")] + [NetworkVar("m_TextureScale")] public float TextureScale; - [NetworkName("m_Width")] + [NetworkVar("m_Width")] public float Width; - [NetworkName("m_flScrollSpeed")] + [NetworkVar("m_flScrollSpeed")] public float ScrollSpeed; } diff --git a/Game.Client/C_RotorWashEmitter.cs b/Game.Client/C_RotorWashEmitter.cs index 9d5ef56f..4ee6bae1 100644 --- a/Game.Client/C_RotorWashEmitter.cs +++ b/Game.Client/C_RotorWashEmitter.cs @@ -3,15 +3,14 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CRotorWashEmitter")] -public class C_RotorWashEmitter : C_BaseEntity +public partial class C_RotorWashEmitter : C_BaseEntity { - public static readonly RecvTable DT_RotorWashEmitter = new(DT_BaseEntity, [ - RecvPropFloat(FIELD.OF(nameof(Altitude))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_RotorWashEmitter); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Altitude)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flAltitude")] + [NetworkVar("m_flAltitude")] public float Altitude; } diff --git a/Game.Client/C_RpgRocket.cs b/Game.Client/C_RpgRocket.cs index 28efc603..20bbcdee 100644 --- a/Game.Client/C_RpgRocket.cs +++ b/Game.Client/C_RpgRocket.cs @@ -4,10 +4,11 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CRpgRocket")] -public class C_RpgRocket : C_BaseGrenade +public partial class C_RpgRocket : C_BaseGrenade { - public static readonly RecvTable DT_RpgRocket = new(DT_BaseGrenade, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_RpgRocket); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/C_SceneEntity.cs b/Game.Client/C_SceneEntity.cs index 978e2b57..045c373c 100644 --- a/Game.Client/C_SceneEntity.cs +++ b/Game.Client/C_SceneEntity.cs @@ -6,7 +6,6 @@ namespace Game.Client; -using FIELD = FIELD; using EventType = Game.Shared.ChoreoEvent.EventType; public class ChoreoStringPool : IChoreoStringPool @@ -28,45 +27,51 @@ public bool GetString(short stringId, Span buff) { } [NetworkName("CSceneEntity")] -public class C_SceneEntity : C_BaseEntity, IChoreoEventCallback +public partial class C_SceneEntity : C_BaseEntity, IChoreoEventCallback { public const int MAX_ACTORS_IN_SCENE = 16; static readonly ChoreoStringPool g_ChoreoStringPool = new(); - [NetworkName("m_nSceneStringIndex")] + [NetworkVar("m_nSceneStringIndex")] public int SceneStringIndex; - [NetworkName("m_bIsPlayingBack")] + [NetworkVar("m_bIsPlayingBack")] public bool IsPlayingBack; - [NetworkName("m_bPaused")] + [NetworkVar("m_bPaused")] public bool Paused; - [NetworkName("m_bMultiplayer")] + [NetworkVar("m_bMultiplayer")] public bool Multiplayer; - [NetworkName("m_flForceClientTime")] + [NetworkVar("m_flForceClientTime")] public float ForceClientTime; - [NetworkName("m_hActorList")] + [NetworkVar("m_hActorList")] readonly List ActorList = []; - public static readonly RecvTable DT_SceneEntity = new([ - RecvPropInt(FIELD.OF(nameof(SceneStringIndex))), - RecvPropBool(FIELD.OF(nameof(IsPlayingBack))), - RecvPropBool(FIELD.OF(nameof(Paused))), - RecvPropBool(FIELD.OF(nameof(Multiplayer))), - RecvPropFloat(FIELD.OF(nameof(ForceClientTime)), 0, RecvProxy_ForcedClientTime), - RecvPropList(FIELD.OF_LIST(nameof(ActorList), MAX_ACTORS_IN_SCENE), ResizeActorList, RecvPropEHandle()), - ]); - public static new readonly ClientClass ClientClass = new ClientClass(DT_SceneEntity); - - static void ResizeActorList(object instance, object list, int len) { - var vec = (List)list; - while (vec.Count < len) vec.Add(new()); - while (vec.Count > len) vec.RemoveAt(vec.Count - 1); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(SceneStringIndex), + nameof(IsPlayingBack), + nameof(Paused), + nameof(Multiplayer), + new(nameof(ForceClientTime)) { Proxy = typeof(ForceClientTimeProxy) }, + new(nameof(ActorList)) { Encoding = NetEncoding.List, Count = MAX_ACTORS_IN_SCENE, Proxy = typeof(ActorListProxy) }, + ]; + + public static class ActorListProxy + { + public static void Resize(object instance, object list, int len) { + var vec = (List)list; + while (vec.Count < len) vec.Add(new()); + while (vec.Count > len) vec.RemoveAt(vec.Count - 1); + } } - static void RecvProxy_ForcedClientTime(ref readonly RecvProxyData data, object instance, IFieldAccessor field) { - C_SceneEntity scene = (C_SceneEntity)instance; - field.SetValue(instance, data.Value.Float); - scene.OnResetClientTime(); + public static class ForceClientTimeProxy + { + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) { + C_SceneEntity scene = (C_SceneEntity)instance; + field.SetValue(instance, data.Value.Float); + scene.OnResetClientTime(); + } } struct QueuedEvents diff --git a/Game.Client/C_ScriptIntro.cs b/Game.Client/C_ScriptIntro.cs index e98e2932..ed2bf0e0 100644 --- a/Game.Client/C_ScriptIntro.cs +++ b/Game.Client/C_ScriptIntro.cs @@ -7,68 +7,65 @@ namespace Game.Client; -using FIELD = FIELD; - [NetworkName("CScriptIntro")] -public class C_ScriptIntro : C_BaseEntity +public partial class C_ScriptIntro : C_BaseEntity { - [NetworkName("m_vecCameraView")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(CameraView)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(CameraViewAngles)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(BlendMode)) { Bits = 5 }, + new(nameof(NextBlendMode)) { Bits = 5 }, + new(nameof(NextBlendTime)) { Encoding = NetEncoding.Time64 }, + new(nameof(BlendStartTime)) { Encoding = NetEncoding.Time64 }, + nameof(Active), + new(nameof(FOV)) { Bits = 9 }, + new(nameof(NextFOV)) { Bits = 9 }, + new(nameof(StartFOV)) { Bits = 9 }, + new(nameof(NextFOVBlendTime)) { Encoding = NetEncoding.Time64 }, + new(nameof(FOVBlendStartTime)) { Encoding = NetEncoding.Time64 }, + nameof(AlternateFOV), + new(nameof(FadeAlpha)) { Bits = 10 }, + new(nameof(FadeColor)) { Encoding = NetEncoding.Array2, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeDuration)) { Bits = 10, Flags = PropFlags.RoundDown, Low = 0.0f, High = 255.0f }, + nameof(CameraEntity), + ]; + + [NetworkVar("m_vecCameraView")] public Vector3 CameraView; - [NetworkName("m_vecCameraViewAngles")] + [NetworkVar("m_vecCameraViewAngles")] public Vector3 CameraViewAngles; - [NetworkName("m_iBlendMode")] + [NetworkVar("m_iBlendMode")] public int BlendMode; - [NetworkName("m_iNextBlendMode")] + [NetworkVar("m_iNextBlendMode")] public int NextBlendMode; - [NetworkName("m_flNextBlendTime")] + [NetworkVar("m_flNextBlendTime")] public TimeUnit_t NextBlendTime; - [NetworkName("m_flBlendStartTime")] + [NetworkVar("m_flBlendStartTime")] public TimeUnit_t BlendStartTime; - [NetworkName("m_bActive")] + [NetworkVar("m_bActive")] public bool Active; - [NetworkName("m_iFOV")] + [NetworkVar("m_iFOV")] public int FOV; - [NetworkName("m_iNextFOV")] + [NetworkVar("m_iNextFOV")] public int NextFOV; - [NetworkName("m_iStartFOV")] + [NetworkVar("m_iStartFOV")] public int StartFOV; - [NetworkName("m_flNextFOVBlendTime")] + [NetworkVar("m_flNextFOVBlendTime")] public TimeUnit_t NextFOVBlendTime; - [NetworkName("m_flFOVBlendStartTime")] + [NetworkVar("m_flFOVBlendStartTime")] public TimeUnit_t FOVBlendStartTime; - [NetworkName("m_bAlternateFOV")] + [NetworkVar("m_bAlternateFOV")] public bool AlternateFOV; - [NetworkName("m_flFadeAlpha")] + [NetworkVar("m_flFadeAlpha")] public float FadeAlpha; - [NetworkName("m_flFadeColor")] + [NetworkVar("m_flFadeColor")] public InlineArray3 FadeColor; - [NetworkName("m_flFadeDuration")] + [NetworkVar("m_flFadeDuration")] public float FadeDuration; - [NetworkName("m_hCameraEntity")] + [NetworkVar("m_hCameraEntity")] public EHANDLE CameraEntity = new(); - public static readonly RecvTable DT_ScriptIntro = new(DT_BaseEntity, [ - RecvPropVector(FIELD.OF(nameof(CameraView))), - RecvPropVector(FIELD.OF(nameof(CameraViewAngles))), - RecvPropInt(FIELD.OF(nameof(BlendMode))), - RecvPropInt(FIELD.OF(nameof(NextBlendMode))), - RecvPropTime64(FIELD.OF(nameof(NextBlendTime))), - RecvPropTime64(FIELD.OF(nameof(BlendStartTime))), - RecvPropBool(FIELD.OF(nameof(Active))), - RecvPropInt(FIELD.OF(nameof(FOV))), - RecvPropInt(FIELD.OF(nameof(NextFOV))), - RecvPropInt(FIELD.OF(nameof(StartFOV))), - RecvPropTime64(FIELD.OF(nameof(NextFOVBlendTime))), - RecvPropTime64(FIELD.OF(nameof(FOVBlendStartTime))), - RecvPropBool(FIELD.OF(nameof(AlternateFOV))), - RecvPropFloat(FIELD.OF(nameof(FadeAlpha))), - RecvPropFloat(FIELD.OF_ARRAYINDEX(nameof(FadeColor), 0)), - RecvPropArray(FIELD.OF_ARRAY(nameof(FadeColor))), - RecvPropFloat(FIELD.OF(nameof(FadeDuration))), - RecvPropEHandle(FIELD.OF(nameof(CameraEntity))), - ]); - public static new readonly ClientClass ClientClass = new ClientClass(DT_ScriptIntro); - int PrevFOV; readonly IntroData IntroData = new(); diff --git a/Game.Client/C_ShadowControl.cs b/Game.Client/C_ShadowControl.cs index 080b087e..673cb798 100644 --- a/Game.Client/C_ShadowControl.cs +++ b/Game.Client/C_ShadowControl.cs @@ -7,28 +7,27 @@ using System.Numerics; namespace Game.Server; -using FIELD = Source.FIELD; [NetworkName("CShadowControl")] -public class C_ShadowControl : C_BaseEntity +public partial class C_ShadowControl : C_BaseEntity { - public static readonly RecvTable DT_ShadowControl = new([ - RecvPropVector(FIELD.OF(nameof(ShadowDirection))), - RecvPropInt(FIELD.OF(nameof(ShadowColor))), - RecvPropFloat(FIELD.OF(nameof(ShadowMaxDist))), - RecvPropBool(FIELD.OF(nameof(DisableShadows))), - RecvPropBool(FIELD.OF(nameof(EnableLocalLightShadows))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_ShadowControl); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ShadowDirection)) { Bits = -1, Flags = PropFlags.NoScale }, + new(nameof(ShadowColor)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(ShadowMaxDist)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(DisableShadows), + nameof(EnableLocalLightShadows), + ]; - [NetworkName("m_shadowDirection")] + [NetworkVar("m_shadowDirection")] public Vector3 ShadowDirection; - [NetworkName("m_shadowColor")] + [NetworkVar("m_shadowColor")] public Color ShadowColor; - [NetworkName("m_flShadowMaxDist")] + [NetworkVar("m_flShadowMaxDist")] public float ShadowMaxDist; - [NetworkName("m_bDisableShadows")] + [NetworkVar("m_bDisableShadows")] public bool DisableShadows; - [NetworkName("m_bEnableLocalLightShadows")] + [NetworkVar("m_bEnableLocalLightShadows")] public bool EnableLocalLightShadows; } diff --git a/Game.Client/C_SlideshowDisplay.cs b/Game.Client/C_SlideshowDisplay.cs index b2b22127..34a194ff 100644 --- a/Game.Client/C_SlideshowDisplay.cs +++ b/Game.Client/C_SlideshowDisplay.cs @@ -3,36 +3,35 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CSlideshowDisplay")] -public class C_SlideshowDisplay : C_BaseEntity +public partial class C_SlideshowDisplay : C_BaseEntity { - public static readonly RecvTable DT_SlideshowDisplay = new(DT_BaseEntity, [ - RecvPropBool(FIELD.OF(nameof(Enabled))), - RecvPropString(FIELD.OF(nameof(DisplayText))), - RecvPropString(FIELD.OF(nameof(SlideshowDirectory))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(ChCurrentSlideLists)), RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(ChCurrentSlideLists), 0))), - RecvPropFloat(FIELD.OF(nameof(MinSlideTime))), - RecvPropFloat(FIELD.OF(nameof(MaxSlideTime))), - RecvPropInt(FIELD.OF(nameof(CycleType))), - RecvPropBool(FIELD.OF(nameof(NoListRepeats))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_SlideshowDisplay); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Enabled), + new(nameof(DisplayText)) { Encoding = NetEncoding.String }, + new(nameof(SlideshowDirectory)) { Encoding = NetEncoding.String }, + new(nameof(ChCurrentSlideLists)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(MinSlideTime)) { Bits = 11, Low = 0.0f, High = 20.0f }, + new(nameof(MaxSlideTime)) { Bits = 11, Low = 0.0f, High = 20.0f }, + new(nameof(CycleType)) { Bits = 2, Flags = PropFlags.Unsigned }, + nameof(NoListRepeats), + ]; - [NetworkName("m_bEnabled")] + [NetworkVar("m_bEnabled")] public bool Enabled; - [NetworkName("m_szDisplayText")] + [NetworkVar("m_szDisplayText")] public InlineArray128 DisplayText; - [NetworkName("m_szSlideshowDirectory")] + [NetworkVar("m_szSlideshowDirectory")] public InlineArray128 SlideshowDirectory; - [NetworkName("m_chCurrentSlideLists")] + [NetworkVar("m_chCurrentSlideLists")] public InlineArray16 ChCurrentSlideLists; - [NetworkName("m_fMinSlideTime")] + [NetworkVar("m_fMinSlideTime")] public float MinSlideTime; - [NetworkName("m_fMaxSlideTime")] + [NetworkVar("m_fMaxSlideTime")] public float MaxSlideTime; - [NetworkName("m_iCycleType")] + [NetworkVar("m_iCycleType")] public int CycleType; - [NetworkName("m_bNoListRepeats")] + [NetworkVar("m_bNoListRepeats")] public bool NoListRepeats; } diff --git a/Game.Client/C_SmokeStack.cs b/Game.Client/C_SmokeStack.cs index 7676ea2c..2ebb1161 100644 --- a/Game.Client/C_SmokeStack.cs +++ b/Game.Client/C_SmokeStack.cs @@ -3,58 +3,57 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CSmokeStack")] -public class C_SmokeStack : C_BaseParticleEntity +public partial class C_SmokeStack : C_BaseParticleEntity { - public static readonly RecvTable DT_SmokeStack = new(DT_BaseParticleEntity, [ - RecvPropFloat(FIELD.OF(nameof(SpreadSpeed))), - RecvPropFloat(FIELD.OF(nameof(Speed))), - RecvPropFloat(FIELD.OF(nameof(StartSize))), - RecvPropFloat(FIELD.OF(nameof(EndSize))), - RecvPropFloat(FIELD.OF(nameof(Rate))), - RecvPropFloat(FIELD.OF(nameof(JetLength))), - RecvPropBool(FIELD.OF(nameof(Emit))), - RecvPropFloat(FIELD.OF(nameof(BaseSpread))), - RecvPropFloat(FIELD.OF(nameof(RollSpeed))), - RecvPropVector(FIELD.OF("DirLight.Pos")), - RecvPropVector(FIELD.OF("DirLight.Color")), - RecvPropFloat(FIELD.OF("DirLight.Intensity")), - RecvPropVector(FIELD.OF("AmbientLight.Pos")), - RecvPropVector(FIELD.OF("AmbientLight.Color")), - RecvPropFloat(FIELD.OF("AmbientLight.Intensity")), - RecvPropVector(FIELD.OF(nameof(Wind))), - RecvPropFloat(FIELD.OF(nameof(Twist))), - RecvPropIntWithMinusOneFlag(FIELD.OF(nameof(MaterialModel))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_SmokeStack); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SpreadSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Speed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EndSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Rate)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(JetLength)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Emit), + new(nameof(BaseSpread)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Twist)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(RollSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaterialModel)) { Bits = 16, Encoding = NetEncoding.IntWithMinusOneFlag }, + new(nameof(AmbientLight.Pos)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(AmbientLight.Color)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(AmbientLight.Intensity)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DirLight.Pos)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DirLight.Color)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DirLight.Intensity)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Wind)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_SpreadSpeed")] + [NetworkVar("m_SpreadSpeed")] public float SpreadSpeed; - [NetworkName("m_Speed")] + [NetworkVar("m_Speed")] public new float Speed; - [NetworkName("m_StartSize")] + [NetworkVar("m_StartSize")] public float StartSize; - [NetworkName("m_EndSize")] + [NetworkVar("m_EndSize")] public float EndSize; - [NetworkName("m_Rate")] + [NetworkVar("m_Rate")] public float Rate; - [NetworkName("m_JetLength")] + [NetworkVar("m_JetLength")] public float JetLength; - [NetworkName("m_bEmit")] + [NetworkVar("m_bEmit")] public bool Emit; - [NetworkName("m_flBaseSpread")] + [NetworkVar("m_flBaseSpread")] public float BaseSpread; - [NetworkName("m_flRollSpeed")] + [NetworkVar("m_flRollSpeed")] public float RollSpeed; - [NetworkName("m_AmbientLight")] + [NetworkVar("m_AmbientLight")] public ParticleLightInfo AmbientLight; - [NetworkName("m_DirLight")] + [NetworkVar("m_DirLight")] public ParticleLightInfo DirLight; - [NetworkName("m_vWind")] + [NetworkVar("m_vWind")] public Vector3 Wind; - [NetworkName("m_flTwist")] + [NetworkVar("m_flTwist")] public float Twist; - [NetworkName("m_iMaterialModel")] + [NetworkVar("m_iMaterialModel")] public int MaterialModel; } diff --git a/Game.Client/C_SmokeTrail.cs b/Game.Client/C_SmokeTrail.cs index 02f03964..8f0c50f6 100644 --- a/Game.Client/C_SmokeTrail.cs +++ b/Game.Client/C_SmokeTrail.cs @@ -3,57 +3,56 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("SmokeTrail")] -public class C_SmokeTrail : C_BaseParticleEntity +[NetworkName("SmokeTrail", Table = "DT_SmokeTrail")] +public partial class C_SmokeTrail : C_BaseParticleEntity { - public static readonly RecvTable DT_SmokeTrail = new(DT_BaseParticleEntity, [ - RecvPropFloat(FIELD.OF(nameof(SpawnRate))), - RecvPropVector(FIELD.OF(nameof(StartColor))), - RecvPropVector(FIELD.OF(nameof(EndColor))), - RecvPropFloat(FIELD.OF(nameof(ParticleLifetime))), - RecvPropFloat(FIELD.OF(nameof(StopEmitTime))), - RecvPropFloat(FIELD.OF(nameof(MinSpeed))), - RecvPropFloat(FIELD.OF(nameof(MaxSpeed))), - RecvPropFloat(FIELD.OF(nameof(MinDirectedSpeed))), - RecvPropFloat(FIELD.OF(nameof(MaxDirectedSpeed))), - RecvPropFloat(FIELD.OF(nameof(StartSize))), - RecvPropFloat(FIELD.OF(nameof(EndSize))), - RecvPropFloat(FIELD.OF(nameof(SpawnRadius))), - RecvPropBool(FIELD.OF(nameof(Emit))), - RecvPropInt(FIELD.OF(nameof(Attachment))), - RecvPropFloat(FIELD.OF(nameof(Opacity))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_SmokeTrail); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SpawnRate)) { Bits = 8, Low = 1.0f, High = 1024.0f }, + new(nameof(StartColor)) { Bits = 8, Low = 0.0f, High = 1.0f }, + new(nameof(EndColor)) { Bits = 8, Low = 0.0f, High = 1.0f }, + new(nameof(ParticleLifetime)) { Bits = 16, Flags = PropFlags.RoundUp, Low = 0.1f, High = 100.0f }, + new(nameof(StopEmitTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MinSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MinDirectedSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxDirectedSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EndSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpawnRadius)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Emit), + new(nameof(Attachment)) { Bits = 12 }, + new(nameof(Opacity)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_SpawnRate")] + [NetworkVar("m_SpawnRate")] public float SpawnRate; - [NetworkName("m_StartColor")] + [NetworkVar("m_StartColor")] public Vector3 StartColor; - [NetworkName("m_EndColor")] + [NetworkVar("m_EndColor")] public Vector3 EndColor; - [NetworkName("m_ParticleLifetime")] + [NetworkVar("m_ParticleLifetime")] public float ParticleLifetime; - [NetworkName("m_StopEmitTime")] + [NetworkVar("m_StopEmitTime")] public float StopEmitTime; - [NetworkName("m_MinSpeed")] + [NetworkVar("m_MinSpeed")] public float MinSpeed; - [NetworkName("m_MaxSpeed")] + [NetworkVar("m_MaxSpeed")] public float MaxSpeed; - [NetworkName("m_MinDirectedSpeed")] + [NetworkVar("m_MinDirectedSpeed")] public float MinDirectedSpeed; - [NetworkName("m_MaxDirectedSpeed")] + [NetworkVar("m_MaxDirectedSpeed")] public float MaxDirectedSpeed; - [NetworkName("m_StartSize")] + [NetworkVar("m_StartSize")] public float StartSize; - [NetworkName("m_EndSize")] + [NetworkVar("m_EndSize")] public float EndSize; - [NetworkName("m_SpawnRadius")] + [NetworkVar("m_SpawnRadius")] public float SpawnRadius; - [NetworkName("m_bEmit")] + [NetworkVar("m_bEmit")] public bool Emit; - [NetworkName("m_nAttachment")] + [NetworkVar("m_nAttachment")] public int Attachment; - [NetworkName("m_Opacity")] + [NetworkVar("m_Opacity")] public float Opacity; } diff --git a/Game.Client/C_SpatialEntity.cs b/Game.Client/C_SpatialEntity.cs index 61311045..021fb4c4 100644 --- a/Game.Client/C_SpatialEntity.cs +++ b/Game.Client/C_SpatialEntity.cs @@ -4,26 +4,24 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; - [NetworkName("CSpatialEntity")] -public class C_SpatialEntity : C_BaseEntity +public partial class C_SpatialEntity : C_BaseEntity { - public static readonly RecvTable DT_SpatialEntity = new([ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropFloat(FIELD.OF(nameof(MinFalloff))), - RecvPropFloat(FIELD.OF(nameof(MaxFalloff))), - RecvPropFloat(FIELD.OF(nameof(CurWeight))), - RecvPropBool(FIELD.OF(nameof(Enabled))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_SpatialEntity); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Origin)) { Encoding = NetEncoding.Vector, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MinFalloff)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxFalloff)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(CurWeight)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Enabled), + ]; - [NetworkName("m_MinFalloff")] + [NetworkVar("m_minFalloff")] public float MinFalloff; - [NetworkName("m_MaxFalloff")] + [NetworkVar("m_maxFalloff")] public float MaxFalloff; - [NetworkName("m_flCurWeight")] + [NetworkVar("m_flCurWeight")] public float CurWeight; - [NetworkName("m_bEnabled")] + [NetworkVar("m_bEnabled")] public bool Enabled; } diff --git a/Game.Client/C_SporeExplosion.cs b/Game.Client/C_SporeExplosion.cs index e3a7c83d..5350fd36 100644 --- a/Game.Client/C_SporeExplosion.cs +++ b/Game.Client/C_SporeExplosion.cs @@ -3,33 +3,32 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("SporeExplosion")] -public class C_SporeExplosion : C_BaseParticleEntity +[NetworkName("SporeExplosion", Table = "DT_SporeExplosion")] +public partial class C_SporeExplosion : C_BaseParticleEntity { - public static readonly RecvTable DT_SporeExplosion = new(DT_BaseParticleEntity, [ - RecvPropFloat(FIELD.OF(nameof(SpawnRate))), - RecvPropFloat(FIELD.OF(nameof(ParticleLifetime))), - RecvPropFloat(FIELD.OF(nameof(StartSize))), - RecvPropFloat(FIELD.OF(nameof(EndSize))), - RecvPropFloat(FIELD.OF(nameof(SpawnRadius))), - RecvPropBool(FIELD.OF(nameof(Emit))), - RecvPropBool(FIELD.OF(nameof(DontRemove))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_SporeExplosion); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SpawnRate)) { Bits = 8, Low = 1.0f, High = 1024.0f }, + new(nameof(ParticleLifetime)) { Bits = 16, Flags = PropFlags.RoundUp, Low = 0.1f, High = 100.0f }, + new(nameof(StartSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EndSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpawnRadius)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Emit), + nameof(DontRemove), + ]; - [NetworkName("m_flSpawnRate")] + [NetworkVar("m_flSpawnRate")] public float SpawnRate; - [NetworkName("m_flParticleLifetime")] + [NetworkVar("m_flParticleLifetime")] public float ParticleLifetime; - [NetworkName("m_flStartSize")] + [NetworkVar("m_flStartSize")] public float StartSize; - [NetworkName("m_flEndSize")] + [NetworkVar("m_flEndSize")] public float EndSize; - [NetworkName("m_flSpawnRadius")] + [NetworkVar("m_flSpawnRadius")] public float SpawnRadius; - [NetworkName("m_bEmit")] + [NetworkVar("m_bEmit")] public bool Emit; - [NetworkName("m_bDontRemove")] + [NetworkVar("m_bDontRemove")] public bool DontRemove; } diff --git a/Game.Client/C_SporeTrail.cs b/Game.Client/C_SporeTrail.cs index 88f72fc5..9c5657bb 100644 --- a/Game.Client/C_SporeTrail.cs +++ b/Game.Client/C_SporeTrail.cs @@ -3,33 +3,32 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("SporeTrail")] -public class C_SporeTrail : C_BaseParticleEntity +[NetworkName("SporeTrail", Table = "DT_SporeTrail")] +public partial class C_SporeTrail : C_BaseParticleEntity { - public static readonly RecvTable DT_SporeTrail = new(DT_BaseParticleEntity, [ - RecvPropFloat(FIELD.OF(nameof(SpawnRate))), - RecvPropVector(FIELD.OF(nameof(EndColor))), - RecvPropFloat(FIELD.OF(nameof(ParticleLifetime))), - RecvPropFloat(FIELD.OF(nameof(StartSize))), - RecvPropFloat(FIELD.OF(nameof(EndSize))), - RecvPropFloat(FIELD.OF(nameof(SpawnRadius))), - RecvPropInt(FIELD.OF(nameof(Emit))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_SporeTrail); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SpawnRate)) { Bits = 8, Low = 1.0f, High = 1024.0f }, + new(nameof(EndColor)) { Bits = 8, Low = 0.0f, High = 1.0f }, + new(nameof(ParticleLifetime)) { Bits = 16, Flags = PropFlags.RoundUp, Low = 0.1f, High = 100.0f }, + new(nameof(StartSize)) { Bits = -1, Flags = PropFlags.NoScale }, + new(nameof(EndSize)) { Bits = -1, Flags = PropFlags.NoScale }, + new(nameof(SpawnRadius)) { Bits = -1, Flags = PropFlags.NoScale }, + nameof(Emit), + ]; - [NetworkName("m_flSpawnRate")] + [NetworkVar("m_flSpawnRate")] public float SpawnRate; - [NetworkName("m_vecEndColor")] + [NetworkVar("m_vecEndColor")] public Vector3 EndColor; - [NetworkName("m_flParticleLifetime")] + [NetworkVar("m_flParticleLifetime")] public float ParticleLifetime; - [NetworkName("m_flStartSize")] + [NetworkVar("m_flStartSize")] public float StartSize; - [NetworkName("m_flEndSize")] + [NetworkVar("m_flEndSize")] public float EndSize; - [NetworkName("m_flSpawnRadius")] + [NetworkVar("m_flSpawnRadius")] public float SpawnRadius; - [NetworkName("m_bEmit")] + [NetworkVar("m_bEmit")] public bool Emit; } diff --git a/Game.Client/C_SpotlightEnd.cs b/Game.Client/C_SpotlightEnd.cs index c4234d1e..8021238b 100644 --- a/Game.Client/C_SpotlightEnd.cs +++ b/Game.Client/C_SpotlightEnd.cs @@ -4,20 +4,19 @@ using Source.Common; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CSpotlightEnd")] -public class C_SpotlightEnd : C_BaseEntity +public partial class C_SpotlightEnd : C_BaseEntity { - public static readonly RecvTable DT_SpotlightEnd = new(DT_BaseEntity, [ - RecvPropFloat(FIELD.OF(nameof(LightScale))), - RecvPropFloat(FIELD.OF(nameof(Radius))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_SpotlightEnd); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(LightScale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Radius)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flLightScale")] + [NetworkVar("m_flLightScale")] public float LightScale; - [NetworkName("m_Radius")] + [NetworkVar("m_Radius")] public float Radius; } diff --git a/Game.Client/C_SteamJet.cs b/Game.Client/C_SteamJet.cs index 4528e75a..37c707ad 100644 --- a/Game.Client/C_SteamJet.cs +++ b/Game.Client/C_SteamJet.cs @@ -3,45 +3,44 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CSteamJet")] -public class C_SteamJet : C_BaseParticleEntity +public partial class C_SteamJet : C_BaseParticleEntity { - public static readonly RecvTable DT_SteamJet = new(DT_BaseParticleEntity, [ - RecvPropFloat(FIELD.OF(nameof(SpreadSpeed))), - RecvPropFloat(FIELD.OF(nameof(Speed))), - RecvPropFloat(FIELD.OF(nameof(StartSize))), - RecvPropFloat(FIELD.OF(nameof(EndSize))), - RecvPropFloat(FIELD.OF(nameof(Rate))), - RecvPropFloat(FIELD.OF(nameof(JetLength))), - RecvPropBool(FIELD.OF(nameof(Emit))), - RecvPropBool(FIELD.OF(nameof(FaceLeft))), - RecvPropInt(FIELD.OF(nameof(Type))), - RecvPropInt(FIELD.OF(nameof(Spawnflags))), - RecvPropFloat(FIELD.OF(nameof(RollSpeed))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_SteamJet); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SpreadSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Speed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EndSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Rate)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(JetLength)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Emit), + nameof(FaceLeft), + new(nameof(Type)) { Bits = 2, Flags = PropFlags.Unsigned }, + new(nameof(Spawnflags)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(RollSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_SpreadSpeed")] + [NetworkVar("m_SpreadSpeed")] public float SpreadSpeed; - [NetworkName("m_Speed")] + [NetworkVar("m_Speed")] public new float Speed; - [NetworkName("m_StartSize")] + [NetworkVar("m_StartSize")] public float StartSize; - [NetworkName("m_EndSize")] + [NetworkVar("m_EndSize")] public float EndSize; - [NetworkName("m_Rate")] + [NetworkVar("m_Rate")] public float Rate; - [NetworkName("m_JetLength")] + [NetworkVar("m_JetLength")] public float JetLength; - [NetworkName("m_bEmit")] + [NetworkVar("m_bEmit")] public bool Emit; - [NetworkName("m_bFaceLeft")] + [NetworkVar("m_bFaceLeft")] public bool FaceLeft; - [NetworkName("m_nType")] + [NetworkVar("m_nType")] public int Type; - [NetworkName("m_spawnflags")] + [NetworkVar("m_spawnflags")] public int Spawnflags; - [NetworkName("m_flRollSpeed")] + [NetworkVar("m_flRollSpeed")] public float RollSpeed; } diff --git a/Game.Client/C_Strider.cs b/Game.Client/C_Strider.cs index dc8804c5..99df4f62 100644 --- a/Game.Client/C_Strider.cs +++ b/Game.Client/C_Strider.cs @@ -3,23 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CNPC_Strider")] -public class C_Strider : C_AI_BaseNPC +public partial class C_Strider : C_AI_BaseNPC { - public static readonly RecvTable DT_NPC_Strider = new(DT_AI_BaseNPC, [ - RecvPropVector(FIELD.OF(nameof(HitPos))), - RecvPropVector(FIELD.OF_ARRAYINDEX(nameof(IKTarget), 0)), - RecvPropVector(FIELD.OF_ARRAYINDEX(nameof(IKTarget), 1)), - RecvPropVector(FIELD.OF_ARRAYINDEX(nameof(IKTarget), 2)), - RecvPropVector(FIELD.OF_ARRAYINDEX(nameof(IKTarget), 3)), - RecvPropVector(FIELD.OF_ARRAYINDEX(nameof(IKTarget), 4)), - RecvPropVector(FIELD.OF_ARRAYINDEX(nameof(IKTarget), 5)), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_NPC_Strider); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(HitPos), + new(nameof(IKTarget)) { Encoding = NetEncoding.Elements }, + ]; - [NetworkName("m_vecHitPos")] + [NetworkVar("m_vecHitPos")] public Vector3 HitPos; - [NetworkName("m_vecIKTarget")] + [NetworkVar("m_vecIKTarget")] public InlineArray6 IKTarget; } diff --git a/Game.Client/C_Sun.cs b/Game.Client/C_Sun.cs index f5b7817d..302344d2 100644 --- a/Game.Client/C_Sun.cs +++ b/Game.Client/C_Sun.cs @@ -7,40 +7,40 @@ using System.Numerics; namespace Game.Server; -using FIELD = Source.FIELD; -[NetworkName("CSun")] -public class C_Sun : C_BaseEntity +[NetworkName("CSun", NoBase = true)] +public partial class C_Sun : C_BaseEntity { - public static readonly RecvTable DT_Sun = new([ - RecvPropInt(FIELD.OF(nameof(Render)), 0, RecvProxy_IntToColor32), - RecvPropInt(FIELD.OF(nameof(Overlay)), 0, RecvProxy_IntToColor32), - RecvPropVector(FIELD.OF(nameof(Direction))), - RecvPropInt(FIELD.OF(nameof(On))), - RecvPropInt(FIELD.OF(nameof(Size))), - RecvPropInt(FIELD.OF(nameof(OverlaySize))), - RecvPropInt(FIELD.OF(nameof(Material))), - RecvPropInt(FIELD.OF(nameof(OverlayMaterial))), - // todo: RecvProxy_HDRColorScale - RecvPropFloat(FIELD.OF(nameof(HDRColorScale))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_Sun); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Render)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned, Proxy = typeof(Color32Proxy) }, + new(nameof(Overlay)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned, Proxy = typeof(Color32Proxy) }, + new(nameof(Direction)) { Bits = 0, Flags = PropFlags.Normal }, + new(nameof(On)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(Size)) { Bits = 10, Flags = PropFlags.Unsigned }, + new(nameof(OverlaySize)) { Bits = 10, Flags = PropFlags.Unsigned }, + new(nameof(Material)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(OverlayMaterial)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(HDRColorScale)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale, Low = 0.0f, High = 100.0f }, + ]; - [NetworkName("m_clrRender")] + [NetworkVar("m_clrRender")] public Color Render; - [NetworkName("m_clrOverlay")] + [NetworkVar("m_clrOverlay")] public Color Overlay; - [NetworkName("m_vDirection")] + [NetworkVar("m_vDirection")] public Vector3 Direction; - [NetworkName("m_bOn")] + [NetworkVar("m_bOn")] public bool On; - [NetworkName("m_nSize")] + [NetworkVar("m_nSize")] public int Size; - [NetworkName("m_nOverlaySize")] + [NetworkVar("m_nOverlaySize")] public int OverlaySize; - [NetworkName("m_nMaterial")] + [NetworkVar("m_nMaterial")] public int Material; - [NetworkName("m_nOverlayMaterial")] + [NetworkVar("m_nOverlayMaterial")] public int OverlayMaterial; + // todo: RecvProxy_HDRColorScale + [NetworkVar("HDRColorScale")] public int HDRColorScale; } \ No newline at end of file diff --git a/Game.Client/C_TEAntlionDust.cs b/Game.Client/C_TEAntlionDust.cs index b9edd21d..224c620a 100644 --- a/Game.Client/C_TEAntlionDust.cs +++ b/Game.Client/C_TEAntlionDust.cs @@ -4,19 +4,18 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEAntlionDust")] -public class C_TEAntlionDust : C_TEParticleSystem +public partial class C_TEAntlionDust : C_TEParticleSystem { - public static readonly RecvTable DT_TEAntlionDust = new(DT_TEParticleSystem, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropVector(FIELD.OF(nameof(Angles))), - RecvPropBool(FIELD.OF(nameof(BlockedSpawner))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEAntlionDust); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Origin)) { Encoding = NetEncoding.Vector, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Angles)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(BlockedSpawner), + ]; - [NetworkName("m_vecAngles")] + [NetworkVar("m_vecAngles")] public Vector3 Angles; - [NetworkName("m_bBlockedSpawner")] + [NetworkVar("m_bBlockedSpawner")] public bool BlockedSpawner; } diff --git a/Game.Client/C_TEArmorRicochet.cs b/Game.Client/C_TEArmorRicochet.cs index 2ec96ddf..1fbed858 100644 --- a/Game.Client/C_TEArmorRicochet.cs +++ b/Game.Client/C_TEArmorRicochet.cs @@ -3,12 +3,13 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEArmorRicochet")] -public class C_TEArmorRicochet : C_TEMetalSparks +public partial class C_TEArmorRicochet : C_TEMetalSparks { - public static readonly RecvTable DT_TEArmorRicochet = new(DT_TEMetalSparks, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEArmorRicochet); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } public static partial class TempEnts diff --git a/Game.Client/C_TEBSPDecal.cs b/Game.Client/C_TEBSPDecal.cs index 278acc5c..d80b632a 100644 --- a/Game.Client/C_TEBSPDecal.cs +++ b/Game.Client/C_TEBSPDecal.cs @@ -3,22 +3,21 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEBSPDecal")] -public class C_TEBSPDecal : C_BaseTempEntity +public partial class C_TEBSPDecal : C_BaseTempEntity { - public static readonly RecvTable DT_TEBSPDecal = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropInt(FIELD.OF(nameof(Entity))), - RecvPropInt(FIELD.OF(nameof(Index))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEBSPDecal); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Entity)) { Bits = 13, Flags = PropFlags.Unsigned }, + new(nameof(Index)) { Bits = 9, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_nEntity")] + [NetworkVar("m_nEntity")] public int Entity; - [NetworkName("m_nIndex")] + [NetworkVar("m_nIndex")] public int Index; } diff --git a/Game.Client/C_TEBeamEntPoint.cs b/Game.Client/C_TEBeamEntPoint.cs index ab6da440..34aa6b82 100644 --- a/Game.Client/C_TEBeamEntPoint.cs +++ b/Game.Client/C_TEBeamEntPoint.cs @@ -6,25 +6,24 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEBeamEntPoint")] -public class C_TEBeamEntPoint : C_BaseBeam +public partial class C_TEBeamEntPoint : C_BaseBeam { - public static readonly RecvTable DT_TEBeamEntPoint = new(DT_BaseBeam, [ - RecvPropInt(FIELD.OF(nameof(StartEntity))), - RecvPropInt(FIELD.OF(nameof(EndEntity))), - RecvPropVector(FIELD.OF(nameof(StartPoint))), - RecvPropVector(FIELD.OF(nameof(EndPoint))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEBeamEntPoint).AsEvent(); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartEntity)) { Bits = 24, Flags = PropFlags.Unsigned }, + new(nameof(EndEntity)) { Bits = 24, Flags = PropFlags.Unsigned }, + new(nameof(StartPoint)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(EndPoint)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_nStartEntity")] + [NetworkVar("m_nStartEntity")] public int StartEntity; - [NetworkName("m_nEndEntity")] + [NetworkVar("m_nEndEntity")] public int EndEntity; - [NetworkName("m_vecStartPoint")] + [NetworkVar("m_vecStartPoint")] public Vector3 StartPoint; - [NetworkName("m_vecEndPoint")] + [NetworkVar("m_vecEndPoint")] public Vector3 EndPoint; public override void PostDataUpdate(DataUpdateType updateType) { diff --git a/Game.Client/C_TEBeamEnts.cs b/Game.Client/C_TEBeamEnts.cs index db91c40d..e12aa167 100644 --- a/Game.Client/C_TEBeamEnts.cs +++ b/Game.Client/C_TEBeamEnts.cs @@ -5,19 +5,18 @@ namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEBeamEnts")] -public class C_TEBeamEnts : C_BaseBeam +public partial class C_TEBeamEnts : C_BaseBeam { - public static readonly RecvTable DT_TEBeamEnts = new(DT_BaseBeam, [ - RecvPropInt(FIELD.OF(nameof(StartEntity))), - RecvPropInt(FIELD.OF(nameof(EndEntity))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEBeamEnts).AsEvent(); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartEntity)) { Bits = 24, Flags = PropFlags.Unsigned }, + new(nameof(EndEntity)) { Bits = 24, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nStartEntity")] + [NetworkVar("m_nStartEntity")] public int StartEntity; - [NetworkName("m_nEndEntity")] + [NetworkVar("m_nEndEntity")] public int EndEntity; public override void PostDataUpdate(DataUpdateType updateType) { diff --git a/Game.Client/C_TEBeamFollow.cs b/Game.Client/C_TEBeamFollow.cs index a227548a..f891fa97 100644 --- a/Game.Client/C_TEBeamFollow.cs +++ b/Game.Client/C_TEBeamFollow.cs @@ -3,16 +3,15 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEBeamFollow")] -public class C_TEBeamFollow : C_BaseBeam +public partial class C_TEBeamFollow : C_BaseBeam { - public static readonly RecvTable DT_TEBeamFollow = new(DT_BaseBeam, [ - RecvPropInt(FIELD.OF(nameof(EntIndex))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEBeamFollow); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(EntIndex)) { Bits = 24, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_iEntIndex")] + [NetworkVar("m_iEntIndex")] public int EntIndex; } diff --git a/Game.Client/C_TEBeamLaser.cs b/Game.Client/C_TEBeamLaser.cs index 23313093..1e170854 100644 --- a/Game.Client/C_TEBeamLaser.cs +++ b/Game.Client/C_TEBeamLaser.cs @@ -5,19 +5,18 @@ namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEBeamLaser")] -public class C_TEBeamLaser : C_BaseBeam +public partial class C_TEBeamLaser : C_BaseBeam { - public static readonly RecvTable DT_TEBeamLaser = new(DT_BaseBeam, [ - RecvPropInt(FIELD.OF(nameof(StartEntity))), - RecvPropInt(FIELD.OF(nameof(EndEntity))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEBeamLaser).AsEvent(); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartEntity)) { Bits = 24, Flags = PropFlags.Unsigned }, + new(nameof(EndEntity)) { Bits = 24, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nStartEntity")] + [NetworkVar("m_nStartEntity")] public int StartEntity; - [NetworkName("m_nEndEntity")] + [NetworkVar("m_nEndEntity")] public int EndEntity; public override void PostDataUpdate(DataUpdateType updateType) { diff --git a/Game.Client/C_TEBeamPoints.cs b/Game.Client/C_TEBeamPoints.cs index d6d8a636..e74cba40 100644 --- a/Game.Client/C_TEBeamPoints.cs +++ b/Game.Client/C_TEBeamPoints.cs @@ -6,19 +6,18 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEBeamPoints")] -public class C_TEBeamPoints : C_BaseBeam +public partial class C_TEBeamPoints : C_BaseBeam { - public static readonly RecvTable DT_TEBeamPoints = new(DT_BaseBeam, [ - RecvPropVector(FIELD.OF(nameof(StartPoint))), - RecvPropVector(FIELD.OF(nameof(EndPoint))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEBeamPoints).AsEvent(); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartPoint)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(EndPoint)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_vecStartPoint")] + [NetworkVar("m_vecStartPoint")] public Vector3 StartPoint; - [NetworkName("m_vecEndPoint")] + [NetworkVar("m_vecEndPoint")] public Vector3 EndPoint; public override void PostDataUpdate(DataUpdateType updateType) { diff --git a/Game.Client/C_TEBeamRing.cs b/Game.Client/C_TEBeamRing.cs index e2afc147..3215ff17 100644 --- a/Game.Client/C_TEBeamRing.cs +++ b/Game.Client/C_TEBeamRing.cs @@ -3,19 +3,18 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEBeamRing")] -public class C_TEBeamRing : C_BaseBeam +public partial class C_TEBeamRing : C_BaseBeam { - public static readonly RecvTable DT_TEBeamRing = new(DT_BaseBeam, [ - RecvPropInt(FIELD.OF(nameof(StartEntity))), - RecvPropInt(FIELD.OF(nameof(EndEntity))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEBeamRing); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartEntity)) { Bits = 13, Flags = PropFlags.Unsigned }, + new(nameof(EndEntity)) { Bits = 13, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nStartEntity")] + [NetworkVar("m_nStartEntity")] public int StartEntity; - [NetworkName("m_nEndEntity")] + [NetworkVar("m_nEndEntity")] public int EndEntity; } diff --git a/Game.Client/C_TEBeamRingPoint.cs b/Game.Client/C_TEBeamRingPoint.cs index 89310db3..27efbf59 100644 --- a/Game.Client/C_TEBeamRingPoint.cs +++ b/Game.Client/C_TEBeamRingPoint.cs @@ -3,22 +3,21 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEBeamRingPoint")] -public class C_TEBeamRingPoint : C_BaseBeam +public partial class C_TEBeamRingPoint : C_BaseBeam { - public static readonly RecvTable DT_TEBeamRingPoint = new(DT_BaseBeam, [ - RecvPropVector(FIELD.OF(nameof(Center))), - RecvPropFloat(FIELD.OF(nameof(LStartRadius))), - RecvPropFloat(FIELD.OF(nameof(LEndRadius))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEBeamRingPoint); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Center)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(LStartRadius)) { Bits = 16, Flags = PropFlags.RoundUp, Low = 0.0f, High = 4096.0f }, + new(nameof(LEndRadius)) { Bits = 16, Flags = PropFlags.RoundUp, Low = 0.0f, High = 4096.0f }, + ]; - [NetworkName("m_vecCenter")] + [NetworkVar("m_vecCenter")] public Vector3 Center; - [NetworkName("m_flStartRadius")] + [NetworkVar("m_flStartRadius")] public float LStartRadius; - [NetworkName("m_flEndRadius")] + [NetworkVar("m_flEndRadius")] public float LEndRadius; } diff --git a/Game.Client/C_TEBeamSpline.cs b/Game.Client/C_TEBeamSpline.cs index ce06f7ab..8baee218 100644 --- a/Game.Client/C_TEBeamSpline.cs +++ b/Game.Client/C_TEBeamSpline.cs @@ -6,23 +6,20 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; - -[NetworkName("CTEBeamSpline")] -public class C_TEBeamSpline : C_BaseTempEntity +[NetworkName("CTEBeamSpline", NoBase = true)] +public partial class C_TEBeamSpline : C_BaseTempEntity { public const int MAX_SPLINE_POINTS = 16; - public static readonly RecvTable DT_TEBeamSpline = new([ - RecvPropInt(FIELD.OF(nameof(NumPoints))), - RecvPropVector(FIELD.OF_ARRAYINDEX(nameof(Points), 0)), - RecvPropArray(FIELD.OF_ARRAY(nameof(Points))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEBeamSpline).AsEvent(); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + nameof(NumPoints), + new(nameof(Points)) { Encoding = NetEncoding.Array }, + ]; - [NetworkName("m_nPoints")] + [NetworkVar("m_nPoints")] public int NumPoints; - [NetworkName("m_vecPoints")] + [NetworkVar("m_vecPoints")] public InlineArrayMaxSplinePoints Points; public override void PostDataUpdate(DataUpdateType updateType) { diff --git a/Game.Client/C_TEBloodSprite.cs b/Game.Client/C_TEBloodSprite.cs index dfed43af..e1a921ba 100644 --- a/Game.Client/C_TEBloodSprite.cs +++ b/Game.Client/C_TEBloodSprite.cs @@ -3,36 +3,35 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("CTEBloodSprite")] -public class C_TEBloodSprite +[NetworkName("CTEBloodSprite", NoBase = true)] +public partial class C_TEBloodSprite : C_BaseTempEntity { - public static readonly RecvTable DT_TEBloodSprite = new([ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropVector(FIELD.OF(nameof(Direction))), - RecvPropInt(FIELD.OF(nameof(R))), - RecvPropInt(FIELD.OF(nameof(G))), - RecvPropInt(FIELD.OF(nameof(B))), - RecvPropInt(FIELD.OF(nameof(A))), - RecvPropInt(FIELD.OF(nameof(Size))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEBloodSprite); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + nameof(Origin), + nameof(Direction), + nameof(R), + nameof(G), + nameof(B), + nameof(A), + nameof(Size), + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_vecDirection")] + [NetworkVar("m_vecDirection")] public Vector3 Direction; - [NetworkName("r")] + [NetworkVar("r")] public int R; - [NetworkName("g")] + [NetworkVar("g")] public int G; - [NetworkName("b")] + [NetworkVar("b")] public int B; - [NetworkName("a")] + [NetworkVar("a")] public int A; public int SprayModel; public int DropModel; - [NetworkName("m_nSize")] + [NetworkVar("m_nSize")] public int Size; } diff --git a/Game.Client/C_TEBloodStream.cs b/Game.Client/C_TEBloodStream.cs index 234ff6ad..cc3d295a 100644 --- a/Game.Client/C_TEBloodStream.cs +++ b/Game.Client/C_TEBloodStream.cs @@ -3,31 +3,30 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEBloodStream")] -public class C_TEBloodStream : C_TEParticleSystem +public partial class C_TEBloodStream : C_TEParticleSystem { - public static readonly RecvTable DT_TEBloodStream = new(DT_TEParticleSystem, [ - RecvPropVector(FIELD.OF(nameof(Direction))), - RecvPropInt(FIELD.OF(nameof(R))), - RecvPropInt(FIELD.OF(nameof(G))), - RecvPropInt(FIELD.OF(nameof(B))), - RecvPropInt(FIELD.OF(nameof(A))), - RecvPropInt(FIELD.OF(nameof(Amount))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEBloodStream); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Direction)) { Bits = 11, Low = -10.0f, High = 10.0f }, + new(nameof(R)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(G)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(B)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(A)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Amount)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecDirection")] + [NetworkVar("m_vecDirection")] public Vector3 Direction; - [NetworkName("r")] + [NetworkVar("r")] public int R; - [NetworkName("g")] + [NetworkVar("g")] public int G; - [NetworkName("b")] + [NetworkVar("b")] public int B; - [NetworkName("a")] + [NetworkVar("a")] public int A; - [NetworkName("m_nAmount")] + [NetworkVar("m_nAmount")] public int Amount; } diff --git a/Game.Client/C_TEBreakModel.cs b/Game.Client/C_TEBreakModel.cs index 8513bb09..f8949bbd 100644 --- a/Game.Client/C_TEBreakModel.cs +++ b/Game.Client/C_TEBreakModel.cs @@ -4,42 +4,39 @@ using System.Numerics; using Source.Common.Mathematics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEBreakModel")] -public class C_TEBreakModel : C_BaseTempEntity +public partial class C_TEBreakModel : C_BaseTempEntity { - public static readonly RecvTable DT_TEBreakModel = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(Rotation), 0)), - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(Rotation), 1)), - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(Rotation), 2)), - RecvPropVector(FIELD.OF(nameof(Size))), - RecvPropVector(FIELD.OF(nameof(Velocity))), - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - RecvPropInt(FIELD.OF(nameof(Randomization))), - RecvPropInt(FIELD.OF(nameof(Count))), - RecvPropFloat(FIELD.OF(nameof(Time))), - RecvPropInt(FIELD.OF(nameof(Flags))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEBreakModel); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + nameof(Origin), + new(nameof(Rotation)) { Encoding = NetEncoding.VectorElements }, + nameof(Size), + nameof(Velocity), + nameof(ModelIndex), + nameof(Randomization), + nameof(Count), + nameof(Time), + nameof(Flags), + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_angRotation")] + [NetworkVar("m_angRotation")] public QAngle Rotation; - [NetworkName("m_vecSize")] + [NetworkVar("m_vecSize")] public Vector3 Size; - [NetworkName("m_vecVelocity")] + [NetworkVar("m_vecVelocity")] public Vector3 Velocity; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_nRandomization")] + [NetworkVar("m_nRandomization")] public int Randomization; - [NetworkName("m_nCount")] + [NetworkVar("m_nCount")] public int Count; - [NetworkName("m_fTime")] + [NetworkVar("m_fTime")] public float Time; - [NetworkName("m_nFlags")] + [NetworkVar("m_nFlags")] public int Flags; } diff --git a/Game.Client/C_TEBubbleTrail.cs b/Game.Client/C_TEBubbleTrail.cs index ad20045f..8d592408 100644 --- a/Game.Client/C_TEBubbleTrail.cs +++ b/Game.Client/C_TEBubbleTrail.cs @@ -3,31 +3,30 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEBubbleTrail")] -public class C_TEBubbleTrail : C_BaseTempEntity +public partial class C_TEBubbleTrail : C_BaseTempEntity { - public static readonly RecvTable DT_TEBubbleTrail = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Mins))), - RecvPropVector(FIELD.OF(nameof(Maxs))), - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - RecvPropFloat(FIELD.OF(nameof(LWaterZ))), - RecvPropInt(FIELD.OF(nameof(Count))), - RecvPropFloat(FIELD.OF(nameof(Speed))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEBubbleTrail); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Mins)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Maxs)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(LWaterZ)) { Bits = 17, Low = MIN_COORD_INTEGER, High = MAX_COORD_INTEGER }, + new(nameof(Count)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Speed)) { Bits = 17, Low = MIN_COORD_INTEGER, High = MAX_COORD_INTEGER }, + ]; - [NetworkName("m_vecMins")] + [NetworkVar("m_vecMins")] public Vector3 Mins; - [NetworkName("m_vecMaxs")] + [NetworkVar("m_vecMaxs")] public Vector3 Maxs; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_flWaterZ")] + [NetworkVar("m_flWaterZ")] public float LWaterZ; - [NetworkName("m_nCount")] + [NetworkVar("m_nCount")] public int Count; - [NetworkName("m_fSpeed")] + [NetworkVar("m_fSpeed")] public float Speed; } diff --git a/Game.Client/C_TEBubbles.cs b/Game.Client/C_TEBubbles.cs index 2a1ad382..f117d222 100644 --- a/Game.Client/C_TEBubbles.cs +++ b/Game.Client/C_TEBubbles.cs @@ -3,31 +3,30 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEBubbles")] -public class C_TEBubbles : C_BaseTempEntity +public partial class C_TEBubbles : C_BaseTempEntity { - public static readonly RecvTable DT_TEBubbles = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Mins))), - RecvPropVector(FIELD.OF(nameof(Maxs))), - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - RecvPropFloat(FIELD.OF(nameof(Height))), - RecvPropInt(FIELD.OF(nameof(Count))), - RecvPropFloat(FIELD.OF(nameof(Speed))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEBubbles); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Mins)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Maxs)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(Height)) { Bits = 17, Low = MIN_COORD_INTEGER, High = MAX_COORD_INTEGER }, + new(nameof(Count)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Speed)) { Bits = 17, Low = MIN_COORD_INTEGER, High = MAX_COORD_INTEGER }, + ]; - [NetworkName("m_vecMins")] + [NetworkVar("m_vecMins")] public Vector3 Mins; - [NetworkName("m_vecMaxs")] + [NetworkVar("m_vecMaxs")] public Vector3 Maxs; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_fHeight")] + [NetworkVar("m_fHeight")] public float Height; - [NetworkName("m_nCount")] + [NetworkVar("m_nCount")] public int Count; - [NetworkName("m_fSpeed")] + [NetworkVar("m_fSpeed")] public float Speed; } diff --git a/Game.Client/C_TEClientProjectile.cs b/Game.Client/C_TEClientProjectile.cs index de9814bb..ff5d620b 100644 --- a/Game.Client/C_TEClientProjectile.cs +++ b/Game.Client/C_TEClientProjectile.cs @@ -3,28 +3,27 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEClientProjectile")] -public class C_TEClientProjectile : C_BaseTempEntity +public partial class C_TEClientProjectile : C_BaseTempEntity { - public static readonly RecvTable DT_TEClientProjectile = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropVector(FIELD.OF(nameof(Velocity))), - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - RecvPropInt(FIELD.OF(nameof(LifeTime))), - RecvPropInt(FIELD.OF(nameof(HOwner))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEClientProjectile); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Velocity)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(LifeTime)) { Bits = 6, Flags = PropFlags.Unsigned }, + new(nameof(HOwner)) { Bits = 23, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_vecVelocity")] + [NetworkVar("m_vecVelocity")] public Vector3 Velocity; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_nLifeTime")] + [NetworkVar("m_nLifeTime")] public int LifeTime; - [NetworkName("m_hOwner")] + [NetworkVar("m_hOwner")] public int HOwner; } diff --git a/Game.Client/C_TEConcussiveExplosion.cs b/Game.Client/C_TEConcussiveExplosion.cs index 07392482..fda63951 100644 --- a/Game.Client/C_TEConcussiveExplosion.cs +++ b/Game.Client/C_TEConcussiveExplosion.cs @@ -4,25 +4,24 @@ using System.Numerics; using Source.Common.Formats.Keyvalues; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEConcussiveExplosion")] -public class C_TEConcussiveExplosion : C_TEParticleSystem +public partial class C_TEConcussiveExplosion : C_TEParticleSystem { - public static readonly RecvTable DT_TEConcussiveExplosion = new(DT_TEParticleSystem, [ - RecvPropVector(FIELD.OF(nameof(Normal))), - RecvPropFloat(FIELD.OF(nameof(Scale))), - RecvPropInt(FIELD.OF(nameof(Radius))), - RecvPropInt(FIELD.OF(nameof(Magnitude))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEConcussiveExplosion); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Normal)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Scale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Radius)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Magnitude)) { Bits = 32, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecNormal")] + [NetworkVar("m_vecNormal")] public Vector3 Normal; - [NetworkName("m_flScale")] + [NetworkVar("m_flScale")] public float Scale; - [NetworkName("m_nRadius")] + [NetworkVar("m_nRadius")] public int Radius; - [NetworkName("m_nMagnitude")] + [NetworkVar("m_nMagnitude")] public int Magnitude; } diff --git a/Game.Client/C_TEDecal.cs b/Game.Client/C_TEDecal.cs index 61a4b5ed..250b4f67 100644 --- a/Game.Client/C_TEDecal.cs +++ b/Game.Client/C_TEDecal.cs @@ -5,28 +5,27 @@ using Source.Engine; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEDecal")] -public class C_TEDecal : C_BaseTempEntity +public partial class C_TEDecal : C_BaseTempEntity { - public static readonly RecvTable DT_TEDecal = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropVector(FIELD.OF(nameof(Start))), - RecvPropInt(FIELD.OF(nameof(Entity))), - RecvPropInt(FIELD.OF(nameof(Hitbox))), - RecvPropInt(FIELD.OF(nameof(Index))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEDecal); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Start)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Entity)) { Bits = 13, Flags = PropFlags.Unsigned }, + new(nameof(Hitbox)) { Bits = 12, Flags = PropFlags.Unsigned }, + new(nameof(Index)) { Bits = 9, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_vecStart")] + [NetworkVar("m_vecStart")] public Vector3 Start; - [NetworkName("m_nEntity")] + [NetworkVar("m_nEntity")] public int Entity; - [NetworkName("m_nHitbox")] + [NetworkVar("m_nHitbox")] public int Hitbox; - [NetworkName("m_nIndex")] + [NetworkVar("m_nIndex")] public int Index; public override void PostDataUpdate(DataUpdateType updateType) { diff --git a/Game.Client/C_TEDust.cs b/Game.Client/C_TEDust.cs index c840990c..12717aab 100644 --- a/Game.Client/C_TEDust.cs +++ b/Game.Client/C_TEDust.cs @@ -3,21 +3,20 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEDust")] -public class C_TEDust : C_TEParticleSystem +public partial class C_TEDust : C_TEParticleSystem { - public static readonly RecvTable DT_TEDust = new(DT_TEParticleSystem, [ - RecvPropFloat(FIELD.OF(nameof(LSize))), - RecvPropFloat(FIELD.OF(nameof(LSpeed))), - RecvPropVector(FIELD.OF(nameof(Direction))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEDust); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(LSize)) { Bits = 0, Flags = PropFlags.Coord | PropFlags.NoScale }, + new(nameof(LSpeed)) { Bits = 0, Flags = PropFlags.Coord | PropFlags.NoScale }, + new(nameof(Direction)) { Bits = 4, Low = -1.0f, High = 1.0f }, + ]; - [NetworkName("m_flSize")] + [NetworkVar("m_flSize")] public float LSize; - [NetworkName("m_flSpeed")] + [NetworkVar("m_flSpeed")] public float LSpeed; - [NetworkName("m_vecDirection")] + [NetworkVar("m_vecDirection")] public Vector3 Direction; } diff --git a/Game.Client/C_TEDynamicLight.cs b/Game.Client/C_TEDynamicLight.cs index 83582a8b..213619c3 100644 --- a/Game.Client/C_TEDynamicLight.cs +++ b/Game.Client/C_TEDynamicLight.cs @@ -6,37 +6,36 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEDynamicLight")] -public class C_TEDynamicLight : C_BaseTempEntity +public partial class C_TEDynamicLight : C_BaseTempEntity { - public static readonly RecvTable DT_TEDynamicLight = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropInt(FIELD.OF(nameof(R))), - RecvPropInt(FIELD.OF(nameof(G))), - RecvPropInt(FIELD.OF(nameof(B))), - RecvPropInt(FIELD.OF(nameof(Exponent))), - RecvPropFloat(FIELD.OF(nameof(Radius))), - RecvPropFloat(FIELD.OF(nameof(Time))), - RecvPropFloat(FIELD.OF(nameof(Decay))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEDynamicLight).AsEvent(); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(R)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(G)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(B)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Exponent)) { Bits = 8 }, + new(nameof(Radius)) { Bits = 8, Flags = PropFlags.RoundUp, Low = 0, High = 2560.0f }, + new(nameof(Time)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0, High = 25.6f }, + new(nameof(Decay)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0, High = 2560.0f }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("r")] + [NetworkVar("r")] public int R; - [NetworkName("g")] + [NetworkVar("g")] public int G; - [NetworkName("b")] + [NetworkVar("b")] public int B; - [NetworkName("exponent")] + [NetworkVar("exponent")] public int Exponent; - [NetworkName("m_fRadius")] + [NetworkVar("m_fRadius")] public float Radius; - [NetworkName("m_fTime")] + [NetworkVar("m_fTime")] public float Time; - [NetworkName("m_fDecay")] + [NetworkVar("m_fDecay")] public float Decay; public override void PostDataUpdate(DataUpdateType updateType) { diff --git a/Game.Client/C_TEEffectDispatch.cs b/Game.Client/C_TEEffectDispatch.cs index 6414af43..83407e24 100644 --- a/Game.Client/C_TEEffectDispatch.cs +++ b/Game.Client/C_TEEffectDispatch.cs @@ -4,17 +4,16 @@ using System.Numerics; namespace Game.Client; -using FIELD = Source.FIELD; [NetworkName("CTEEffectDispatch")] -public class C_TEEffectDispatch : C_BaseTempEntity +public partial class C_TEEffectDispatch : C_BaseTempEntity { - public static readonly RecvTable DT_TEEffectDispatch = new(DT_BaseTempEntity, [ - RecvPropDataTable("m_EffectData", FIELD.OF(nameof(EffectData)), EffectData.DT_EffectData, 0, RECV_GET_OBJECT_AT_FIELD(FIELD.OF(nameof(EffectData)))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEEffectDispatch); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(EffectData)) { Encoding = NetEncoding.DataTable, DataTable = "DT_EffectData" }, + ]; - [NetworkName("m_EffectData")] + [NetworkVar("m_EffectData")] public readonly EffectData EffectData = new(); } diff --git a/Game.Client/C_TEEnergySplash.cs b/Game.Client/C_TEEnergySplash.cs index c8c0e09e..8a307be4 100644 --- a/Game.Client/C_TEEnergySplash.cs +++ b/Game.Client/C_TEEnergySplash.cs @@ -3,22 +3,21 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("CTEEnergySplash")] -public class C_TEEnergySplash : C_BaseTempEntity +[NetworkName("CTEEnergySplash", NoBase = true)] +public partial class C_TEEnergySplash : C_BaseTempEntity { - public static readonly RecvTable DT_TEEnergySplash = new([ - RecvPropVector(FIELD.OF(nameof(Pos))), - RecvPropVector(FIELD.OF(nameof(Dir))), - RecvPropInt(FIELD.OF(nameof(Explosive))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEEnergySplash); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Pos)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Dir)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Explosive)) { Bits = 1, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecPos")] + [NetworkVar("m_vecPos")] public Vector3 Pos; - [NetworkName("m_vecDir")] + [NetworkVar("m_vecDir")] public Vector3 Dir; - [NetworkName("m_bExplosive")] + [NetworkVar("m_bExplosive")] public int Explosive; } diff --git a/Game.Client/C_TEExplosion.cs b/Game.Client/C_TEExplosion.cs index 8a74597a..22b9f054 100644 --- a/Game.Client/C_TEExplosion.cs +++ b/Game.Client/C_TEExplosion.cs @@ -3,29 +3,28 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEExplosion")] -public class C_TEExplosion : C_TEParticleSystem +public partial class C_TEExplosion : C_TEParticleSystem { - public static readonly RecvTable DT_TEExplosion = new(DT_TEParticleSystem, [ - RecvPropFloat(FIELD.OF(nameof(Scale))), - RecvPropInt(FIELD.OF(nameof(Flags))), - RecvPropInt(FIELD.OF(nameof(Radius))), - RecvPropInt(FIELD.OF(nameof(Magnitude))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEExplosion); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Scale)) { Bits = 9, Low = 0.0f, High = 51.2f }, + new(nameof(Flags)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Radius)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(Magnitude)) { Bits = 16, Flags = PropFlags.Unsigned }, + ]; public int ModelIndex; - [NetworkName("m_fScale")] + [NetworkVar("m_fScale")] public float Scale; public int FrameRate; - [NetworkName("m_nFlags")] + [NetworkVar("m_nFlags")] public int Flags; public Vector3 Normal; public int ChMaterialType; - [NetworkName("m_nRadius")] + [NetworkVar("m_nRadius")] public int Radius; - [NetworkName("m_nMagnitude")] + [NetworkVar("m_nMagnitude")] public int Magnitude; } diff --git a/Game.Client/C_TEFizz.cs b/Game.Client/C_TEFizz.cs index 0c6d2d7a..2dba3c0d 100644 --- a/Game.Client/C_TEFizz.cs +++ b/Game.Client/C_TEFizz.cs @@ -3,25 +3,24 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEFizz")] -public class C_TEFizz : C_BaseTempEntity +public partial class C_TEFizz : C_BaseTempEntity { - public static readonly RecvTable DT_TEFizz = new(DT_BaseTempEntity, [ - RecvPropInt(FIELD.OF(nameof(Entity))), - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - RecvPropInt(FIELD.OF(nameof(Density))), - RecvPropInt(FIELD.OF(nameof(Current))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEFizz); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Entity)) { Bits = 13, Flags = PropFlags.Unsigned }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(Density)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Current)) { Bits = 16 }, + ]; - [NetworkName("m_nEntity")] + [NetworkVar("m_nEntity")] public int Entity; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_nDensity")] + [NetworkVar("m_nDensity")] public int Density; - [NetworkName("m_nCurrent")] + [NetworkVar("m_nCurrent")] public int Current; } diff --git a/Game.Client/C_TEFootprintDecal.cs b/Game.Client/C_TEFootprintDecal.cs index fbaf438d..528064b1 100644 --- a/Game.Client/C_TEFootprintDecal.cs +++ b/Game.Client/C_TEFootprintDecal.cs @@ -3,25 +3,24 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEFootprintDecal")] -public class C_TEFootprintDecal : C_BaseTempEntity +public partial class C_TEFootprintDecal : C_BaseTempEntity { - public static readonly RecvTable DT_TEFootprintDecal = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropVector(FIELD.OF(nameof(Direction))), - RecvPropInt(FIELD.OF(nameof(Entity))), - RecvPropInt(FIELD.OF(nameof(Index))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEFootprintDecal); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Direction)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Entity)) { Bits = 11, Flags = PropFlags.Unsigned }, + new(nameof(Index)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_vecDirection")] + [NetworkVar("m_vecDirection")] public Vector3 Direction; - [NetworkName("m_nEntity")] + [NetworkVar("m_nEntity")] public int Entity; - [NetworkName("m_nIndex")] + [NetworkVar("m_nIndex")] public int Index; public int ChMaterialType; } diff --git a/Game.Client/C_TEGaussExplosion.cs b/Game.Client/C_TEGaussExplosion.cs index 45feb065..937225f4 100644 --- a/Game.Client/C_TEGaussExplosion.cs +++ b/Game.Client/C_TEGaussExplosion.cs @@ -3,18 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEGaussExplosion")] -public class C_TEGaussExplosion : C_TEParticleSystem +public partial class C_TEGaussExplosion : C_TEParticleSystem { - public static readonly RecvTable DT_TEGaussExplosion = new(DT_TEParticleSystem, [ - RecvPropInt(FIELD.OF(nameof(Type))), - RecvPropVector(FIELD.OF(nameof(Direction))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEGaussExplosion); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Type)) { Bits = 2, Flags = PropFlags.Unsigned }, + new(nameof(Direction)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_nType")] + [NetworkVar("m_nType")] public int Type; - [NetworkName("m_vecDirection")] + [NetworkVar("m_vecDirection")] public Vector3 Direction; } diff --git a/Game.Client/C_TEGlowSprite.cs b/Game.Client/C_TEGlowSprite.cs index 5148e35f..e6077087 100644 --- a/Game.Client/C_TEGlowSprite.cs +++ b/Game.Client/C_TEGlowSprite.cs @@ -3,28 +3,27 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEGlowSprite")] -public class C_TEGlowSprite : C_BaseTempEntity +public partial class C_TEGlowSprite : C_BaseTempEntity { - public static readonly RecvTable DT_TEGlowSprite = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - RecvPropFloat(FIELD.OF(nameof(Scale))), - RecvPropFloat(FIELD.OF(nameof(Life))), - RecvPropInt(FIELD.OF(nameof(Brightness))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEGlowSprite); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(Scale)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0.0f, High = 25.6f }, + new(nameof(Life)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0.0f, High = 25.6f }, + new(nameof(Brightness)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_fScale")] + [NetworkVar("m_fScale")] public float Scale; - [NetworkName("m_fLife")] + [NetworkVar("m_fLife")] public float Life; - [NetworkName("m_nBrightness")] + [NetworkVar("m_nBrightness")] public int Brightness; } diff --git a/Game.Client/C_TEHL2MPFireBullets.cs b/Game.Client/C_TEHL2MPFireBullets.cs index 981208dc..9dbc8b9e 100644 --- a/Game.Client/C_TEHL2MPFireBullets.cs +++ b/Game.Client/C_TEHL2MPFireBullets.cs @@ -6,45 +6,44 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("CTEHL2MPFireBullets")] -public class C_TEHL2MPFireBullets : C_BaseTempEntity +[NetworkName("CTEHL2MPFireBullets", NoBase = true)] +public partial class C_TEHL2MPFireBullets : C_BaseTempEntity { - public static readonly RecvTable DT_TEHL2MPFireBullets = new([ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropVector(FIELD.OF(nameof(Dir))), - RecvPropInt(FIELD.OF(nameof(AmmoID))), - RecvPropInt(FIELD.OF(nameof(Seed))), - RecvPropInt(FIELD.OF(nameof(Shots))), - RecvPropInt(FIELD.OF(nameof(Player))), - RecvPropFloat(FIELD.OF(nameof(Spread))), - RecvPropInt(FIELD.OF(nameof(DoImpacts))), - RecvPropInt(FIELD.OF(nameof(DoTracers))), - RecvPropString(FIELD.OF(nameof(TracerType))), - RecvPropFloat(FIELD.OF(nameof(SpreadY))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEHL2MPFireBullets); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Dir)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(AmmoID)) { Bits = 5, Flags = PropFlags.Unsigned }, + new(nameof(Seed)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Shots)) { Bits = 5, Flags = PropFlags.Unsigned }, + new(nameof(Player)) { Bits = 6, Flags = PropFlags.Unsigned }, + new(nameof(Spread)) { Bits = 10, Low = 0, High = 1 }, + new(nameof(DoImpacts)) { Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(DoTracers)) { Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(TracerType)) { Encoding = NetEncoding.String }, + new(nameof(SpreadY)) { Bits = 10, Low = 0, High = 1 }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_vecDir")] + [NetworkVar("m_vecDir")] public Vector3 Dir; - [NetworkName("m_iAmmoID")] + [NetworkVar("m_iAmmoID")] public int AmmoID; - [NetworkName("m_iSeed")] + [NetworkVar("m_iSeed")] public int Seed; - [NetworkName("m_iShots")] + [NetworkVar("m_iShots")] public int Shots; - [NetworkName("m_iPlayer")] + [NetworkVar("m_iPlayer")] public int Player; - [NetworkName("m_flSpread")] + [NetworkVar("m_flSpread")] public float Spread; - [NetworkName("m_bDoImpacts")] + [NetworkVar("m_bDoImpacts")] public int DoImpacts; - [NetworkName("m_bDoTracers")] + [NetworkVar("m_bDoTracers")] public int DoTracers; - [NetworkName("m_TracerType")] + [NetworkVar("m_TracerType")] public InlineArray512 TracerType; - [NetworkName("m_flSpreadY")] + [NetworkVar("m_flSpreadY")] public float SpreadY; } diff --git a/Game.Client/C_TEKillPlayerAttachments.cs b/Game.Client/C_TEKillPlayerAttachments.cs index 4a3491de..8915451a 100644 --- a/Game.Client/C_TEKillPlayerAttachments.cs +++ b/Game.Client/C_TEKillPlayerAttachments.cs @@ -3,16 +3,15 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEKillPlayerAttachments")] -public class C_TEKillPlayerAttachments : C_BaseTempEntity +public partial class C_TEKillPlayerAttachments : C_BaseTempEntity { - public static readonly RecvTable DT_TEKillPlayerAttachments = new(DT_BaseTempEntity, [ - RecvPropInt(FIELD.OF(nameof(Player))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEKillPlayerAttachments); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Player)) { Bits = 5, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nPlayer")] + [NetworkVar("m_nPlayer")] public int Player; } diff --git a/Game.Client/C_TELargeFunnel.cs b/Game.Client/C_TELargeFunnel.cs index 0ccd20ee..9a6bc0d0 100644 --- a/Game.Client/C_TELargeFunnel.cs +++ b/Game.Client/C_TELargeFunnel.cs @@ -3,17 +3,16 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTELargeFunnel")] -public class C_TELargeFunnel : C_TEParticleSystem +public partial class C_TELargeFunnel : C_TEParticleSystem { - public static readonly RecvTable DT_TELargeFunnel = new(DT_TEParticleSystem, [ - RecvPropInt(FIELD.OF(nameof(Reversed))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TELargeFunnel); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Reversed)) { Bits = 2, Flags = PropFlags.Unsigned }, + ]; public int ModelIndex; - [NetworkName("m_nReversed")] + [NetworkVar("m_nReversed")] public int Reversed; } diff --git a/Game.Client/C_TEMetalSparks.cs b/Game.Client/C_TEMetalSparks.cs index de74a03d..8133e3b2 100644 --- a/Game.Client/C_TEMetalSparks.cs +++ b/Game.Client/C_TEMetalSparks.cs @@ -3,19 +3,18 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; -[NetworkName("CTEMetalSparks")] -public class C_TEMetalSparks : C_BaseTempEntity +[NetworkName("CTEMetalSparks", NoBase = true)] +public partial class C_TEMetalSparks : C_BaseTempEntity { - public static readonly RecvTable DT_TEMetalSparks = new([ - RecvPropVector(FIELD.OF(nameof(Pos))), - RecvPropVector(FIELD.OF(nameof(Dir))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEMetalSparks); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Pos)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Dir)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_vecPos")] + [NetworkVar("m_vecPos")] public Vector3 Pos; - [NetworkName("m_vecDir")] + [NetworkVar("m_vecDir")] public Vector3 Dir; } diff --git a/Game.Client/C_TEMuzzleFlash.cs b/Game.Client/C_TEMuzzleFlash.cs index 001962c9..0a2b9e8a 100644 --- a/Game.Client/C_TEMuzzleFlash.cs +++ b/Game.Client/C_TEMuzzleFlash.cs @@ -4,25 +4,24 @@ using System.Numerics; using Source.Common.Mathematics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEMuzzleFlash")] -public class C_TEMuzzleFlash : C_BaseTempEntity +public partial class C_TEMuzzleFlash : C_BaseTempEntity { - public static readonly RecvTable DT_TEMuzzleFlash = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropVector(FIELD.OF(nameof(Angles))), - RecvPropFloat(FIELD.OF(nameof(Scale))), - RecvPropInt(FIELD.OF(nameof(Type))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEMuzzleFlash); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Angles)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Scale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Type)) { Bits = 4, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_vecAngles")] + [NetworkVar("m_vecAngles")] public Vector3 Angles; - [NetworkName("m_flScale")] + [NetworkVar("m_flScale")] public float Scale; - [NetworkName("m_nType")] + [NetworkVar("m_nType")] public int Type; } diff --git a/Game.Client/C_TEParticleSystem.cs b/Game.Client/C_TEParticleSystem.cs index 0e206d89..f9ae7e9d 100644 --- a/Game.Client/C_TEParticleSystem.cs +++ b/Game.Client/C_TEParticleSystem.cs @@ -4,17 +4,14 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEParticleSystem")] -public class C_TEParticleSystem : C_BaseTempEntity +public partial class C_TEParticleSystem : C_BaseTempEntity { - public static readonly RecvTable DT_TEParticleSystem = new(DT_BaseTempEntity, [ - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(Origin), 0)), - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(Origin), 1)), - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(Origin), 2)), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEParticleSystem); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Encoding = NetEncoding.VectorElements, Bits = 0, Flags = PropFlags.Coord | PropFlags.NoScale | PropFlags.IsAVectorElem }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; } diff --git a/Game.Client/C_TEPhysicsProp.cs b/Game.Client/C_TEPhysicsProp.cs index 3f31d7ab..d89bdb44 100644 --- a/Game.Client/C_TEPhysicsProp.cs +++ b/Game.Client/C_TEPhysicsProp.cs @@ -4,42 +4,39 @@ using System.Numerics; using Source.Common.Mathematics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEPhysicsProp")] -public class C_TEPhysicsProp : C_BaseTempEntity +public partial class C_TEPhysicsProp : C_BaseTempEntity { - public static readonly RecvTable DT_TEPhysicsProp = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(Rotation), 0)), - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(Rotation), 1)), - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(Rotation), 2)), - RecvPropVector(FIELD.OF(nameof(Velocity))), - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - RecvPropInt(FIELD.OF(nameof(Skin))), - RecvPropInt(FIELD.OF(nameof(Flags))), - RecvPropInt(FIELD.OF(nameof(Effects))), - RecvPropInt(FIELD.OF(nameof(ClrRender))), - RecvPropFloat(FIELD.OF(nameof(ModelScale))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEPhysicsProp); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + nameof(Origin), + new(nameof(Rotation)) { Encoding = NetEncoding.VectorElements }, + nameof(Velocity), + nameof(ModelIndex), + nameof(Flags), + nameof(Skin), + nameof(Effects), + nameof(ClrRender), + nameof(ModelScale), + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_angRotation")] + [NetworkVar("m_angRotation")] public QAngle Rotation; - [NetworkName("m_vecVelocity")] + [NetworkVar("m_vecVelocity")] public Vector3 Velocity; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_nSkin")] + [NetworkVar("m_nSkin")] public int Skin; - [NetworkName("m_nFlags")] + [NetworkVar("m_nFlags")] public int Flags; - [NetworkName("m_nEffects")] + [NetworkVar("m_nEffects")] public int Effects; - [NetworkName("m_clrRender")] + [NetworkVar("m_clrRender")] public int ClrRender; - [NetworkName("m_fModelScale")] + [NetworkVar("m_fModelScale")] public float ModelScale; } diff --git a/Game.Client/C_TEPlayerAnimEvent.cs b/Game.Client/C_TEPlayerAnimEvent.cs index 9ca141c9..22eae036 100644 --- a/Game.Client/C_TEPlayerAnimEvent.cs +++ b/Game.Client/C_TEPlayerAnimEvent.cs @@ -3,22 +3,21 @@ using Source.Common; namespace Game.Client; -using FIELD = Source.FIELD; -[NetworkName("CTEPlayerAnimEvent")] -public class C_TEPlayerAnimEvent : C_BaseTempEntity +[NetworkName("CTEPlayerAnimEvent", NoBase = true)] +public partial class C_TEPlayerAnimEvent : C_BaseTempEntity { - public static readonly RecvTable DT_TEPlayerAnimEvent = new([ - RecvPropEHandle(FIELD.OF(nameof(Player))), - RecvPropInt(FIELD.OF(nameof(Event))), - RecvPropInt(FIELD.OF(nameof(Data))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEPlayerAnimEvent); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + nameof(Player), + new(nameof(Event)) { Bits = 6, Flags = PropFlags.Unsigned }, + new(nameof(Data)) { Bits = 32 }, + ]; - [NetworkName("m_hPlayer")] + [NetworkVar("m_hPlayer")] public EHANDLE Player = new(); - [NetworkName("m_iEvent")] + [NetworkVar("m_iEvent")] public readonly int Event; - [NetworkName("m_nData")] + [NetworkVar("m_nData")] public readonly int Data; } diff --git a/Game.Client/C_TEPlayerDecal.cs b/Game.Client/C_TEPlayerDecal.cs index 77aef708..2125a1d3 100644 --- a/Game.Client/C_TEPlayerDecal.cs +++ b/Game.Client/C_TEPlayerDecal.cs @@ -10,22 +10,21 @@ using System.Runtime.InteropServices; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEPlayerDecal")] -public class C_TEPlayerDecal : C_BaseTempEntity +public partial class C_TEPlayerDecal : C_BaseTempEntity { - public static readonly RecvTable DT_TEPlayerDecal = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropInt(FIELD.OF(nameof(Entity))), - RecvPropInt(FIELD.OF(nameof(Player))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEPlayerDecal); - - [NetworkName("m_vecOrigin")] + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Entity)) { Bits = 13, Flags = PropFlags.Unsigned }, + new(nameof(Player)) { Bits = 7, Flags = PropFlags.Unsigned }, + ]; + + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_nEntity")] + [NetworkVar("m_nEntity")] public int Entity; - [NetworkName("m_nPlayer")] + [NetworkVar("m_nPlayer")] public int Player; public static readonly ConVar cl_playerspraydisable = new( "cl_playerspraydisable", "0", FCvar.ClientDLL | FCvar.Archive, "Disable player sprays." ); diff --git a/Game.Client/C_TEProjectedDecal.cs b/Game.Client/C_TEProjectedDecal.cs index 8b7fa51a..bf359327 100644 --- a/Game.Client/C_TEProjectedDecal.cs +++ b/Game.Client/C_TEProjectedDecal.cs @@ -4,25 +4,24 @@ using System.Numerics; using Source.Common.Mathematics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEProjectedDecal")] -public class C_TEProjectedDecal : C_BaseTempEntity +public partial class C_TEProjectedDecal : C_BaseTempEntity { - public static readonly RecvTable DT_TEProjectedDecal = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropVector(FIELD.OF(nameof(Rotation))), - RecvPropFloat(FIELD.OF(nameof(LDistance))), - RecvPropInt(FIELD.OF(nameof(Index))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEProjectedDecal); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Rotation)) { Bits = 10, Flags = PropFlags.RoundDown }, + new(nameof(LDistance)) { Bits = 10, Flags = PropFlags.RoundUp }, + new(nameof(Index)) { Bits = 9, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_angRotation")] + [NetworkVar("m_angRotation")] public Vector3 Rotation; - [NetworkName("m_flDistance")] + [NetworkVar("m_flDistance")] public float LDistance; - [NetworkName("m_nIndex")] + [NetworkVar("m_nIndex")] public int Index; } diff --git a/Game.Client/C_TEShatterSurface.cs b/Game.Client/C_TEShatterSurface.cs index ff227074..26507992 100644 --- a/Game.Client/C_TEShatterSurface.cs +++ b/Game.Client/C_TEShatterSurface.cs @@ -4,47 +4,42 @@ using System.Numerics; using Source.Common.Mathematics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEShatterSurface")] -public class C_TEShatterSurface : C_BaseTempEntity +public partial class C_TEShatterSurface : C_BaseTempEntity { - public static readonly RecvTable DT_TEShatterSurface = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropVector(FIELD.OF(nameof(Angles))), - RecvPropVector(FIELD.OF(nameof(Force))), - RecvPropVector(FIELD.OF(nameof(ForcePos))), - RecvPropFloat(FIELD.OF(nameof(Width))), - RecvPropFloat(FIELD.OF(nameof(Height))), - RecvPropFloat(FIELD.OF(nameof(ShardSize))), - RecvPropInt(FIELD.OF(nameof(SurfaceType))), - RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(UchFrontColor), 0)), - RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(UchFrontColor), 1)), - RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(UchFrontColor), 2)), - RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(UchBackColor), 0)), - RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(UchBackColor), 1)), - RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(UchBackColor), 2)), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEShatterSurface); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Angles)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Force)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ForcePos)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Width)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Height)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ShardSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SurfaceType)) { Bits = 2, Flags = PropFlags.Unsigned }, + new(nameof(UchFrontColor)) { Encoding = NetEncoding.Elements, Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(UchBackColor)) { Encoding = NetEncoding.Elements, Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_vecAngles")] + [NetworkVar("m_vecAngles")] public Vector3 Angles; - [NetworkName("m_vecForce")] + [NetworkVar("m_vecForce")] public Vector3 Force; - [NetworkName("m_vecForcePos")] + [NetworkVar("m_vecForcePos")] public Vector3 ForcePos; - [NetworkName("m_flWidth")] + [NetworkVar("m_flWidth")] public float Width; - [NetworkName("m_flHeight")] + [NetworkVar("m_flHeight")] public float Height; - [NetworkName("m_flShardSize")] + [NetworkVar("m_flShardSize")] public float ShardSize; - [NetworkName("m_nSurfaceType")] + [NetworkVar("m_nSurfaceType")] public int SurfaceType; - [NetworkName("m_uchFrontColor")] + [NetworkVar("m_uchFrontColor")] public InlineArray3 UchFrontColor; - [NetworkName("m_uchBackColor")] + [NetworkVar("m_uchBackColor")] public InlineArray3 UchBackColor; } diff --git a/Game.Client/C_TEShowLine.cs b/Game.Client/C_TEShowLine.cs index 33c3e5cf..673f6051 100644 --- a/Game.Client/C_TEShowLine.cs +++ b/Game.Client/C_TEShowLine.cs @@ -3,16 +3,15 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEShowLine")] -public class C_TEShowLine : C_TEParticleSystem +public partial class C_TEShowLine : C_TEParticleSystem { - public static readonly RecvTable DT_TEShowLine = new(DT_TEParticleSystem, [ - RecvPropVector(FIELD.OF(nameof(End))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEShowLine); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(End)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_vecEnd")] + [NetworkVar("m_vecEnd")] public Vector3 End; } diff --git a/Game.Client/C_TESmoke.cs b/Game.Client/C_TESmoke.cs index d05246cc..eb5021e9 100644 --- a/Game.Client/C_TESmoke.cs +++ b/Game.Client/C_TESmoke.cs @@ -3,25 +3,24 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTESmoke")] -public class C_TESmoke : C_BaseTempEntity +public partial class C_TESmoke : C_BaseTempEntity { - public static readonly RecvTable DT_TESmoke = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - RecvPropFloat(FIELD.OF(nameof(Scale))), - RecvPropInt(FIELD.OF(nameof(FrameRate))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TESmoke); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(Scale)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0.0f, High = 25.6f }, + new(nameof(FrameRate)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_fScale")] + [NetworkVar("m_fScale")] public float Scale; - [NetworkName("m_nFrameRate")] + [NetworkVar("m_nFrameRate")] public int FrameRate; } diff --git a/Game.Client/C_TESparks.cs b/Game.Client/C_TESparks.cs index 3f57d22c..6c6b20a3 100644 --- a/Game.Client/C_TESparks.cs +++ b/Game.Client/C_TESparks.cs @@ -3,22 +3,21 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTESparks")] -public class C_TESparks : C_TEParticleSystem +public partial class C_TESparks : C_TEParticleSystem { - public static readonly RecvTable DT_TESparks = new(DT_TEParticleSystem, [ - RecvPropInt(FIELD.OF(nameof(Magnitude))), - RecvPropInt(FIELD.OF(nameof(TrailLength))), - RecvPropVector(FIELD.OF(nameof(Dir))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TESparks); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Magnitude)) { Bits = 4, Flags = PropFlags.Unsigned }, + new(nameof(TrailLength)) { Bits = 4, Flags = PropFlags.Unsigned }, + new(nameof(Dir)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_nMagnitude")] + [NetworkVar("m_nMagnitude")] public int Magnitude; - [NetworkName("m_nTrailLength")] + [NetworkVar("m_nTrailLength")] public int TrailLength; - [NetworkName("m_vecDir")] + [NetworkVar("m_vecDir")] public Vector3 Dir; } diff --git a/Game.Client/C_TESprite.cs b/Game.Client/C_TESprite.cs index ee8368d7..0c30abb4 100644 --- a/Game.Client/C_TESprite.cs +++ b/Game.Client/C_TESprite.cs @@ -3,25 +3,24 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTESprite")] -public class C_TESprite : C_BaseTempEntity +public partial class C_TESprite : C_BaseTempEntity { - public static readonly RecvTable DT_TESprite = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - RecvPropFloat(FIELD.OF(nameof(Scale))), - RecvPropInt(FIELD.OF(nameof(Brightness))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TESprite); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(Scale)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0.0f, High = 25.6f }, + new(nameof(Brightness)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_fScale")] + [NetworkVar("m_fScale")] public float Scale; - [NetworkName("m_nBrightness")] + [NetworkVar("m_nBrightness")] public int Brightness; } diff --git a/Game.Client/C_TESpriteSpray.cs b/Game.Client/C_TESpriteSpray.cs index fac45eae..2d50d9e8 100644 --- a/Game.Client/C_TESpriteSpray.cs +++ b/Game.Client/C_TESpriteSpray.cs @@ -3,32 +3,31 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTESpriteSpray")] -public class C_TESpriteSpray : C_BaseTempEntity +public partial class C_TESpriteSpray : C_BaseTempEntity { - public static readonly RecvTable DT_TESpriteSpray = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropVector(FIELD.OF(nameof(Direction))), - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - RecvPropFloat(FIELD.OF(nameof(Noise))), - RecvPropInt(FIELD.OF(nameof(Speed))), - RecvPropInt(FIELD.OF(nameof(Count))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TESpriteSpray); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Direction)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(Noise)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0.0f, High = 2.56f }, + new(nameof(Count)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Speed)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_vecDirection")] + [NetworkVar("m_vecDirection")] public Vector3 Direction; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_fNoise")] + [NetworkVar("m_fNoise")] public float Noise; - [NetworkName("m_nSpeed")] - public int Speed; - [NetworkName("m_nCount")] + [NetworkVar("m_nCount")] public int Count; + [NetworkVar("m_nSpeed")] + public int Speed; } public static partial class TempEnts diff --git a/Game.Client/C_TEWorldDecal.cs b/Game.Client/C_TEWorldDecal.cs index 6b8790d5..48b6d2ba 100644 --- a/Game.Client/C_TEWorldDecal.cs +++ b/Game.Client/C_TEWorldDecal.cs @@ -3,19 +3,18 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTEWorldDecal")] -public class C_TEWorldDecal : C_BaseTempEntity +public partial class C_TEWorldDecal : C_BaseTempEntity { - public static readonly RecvTable DT_TEWorldDecal = new(DT_BaseTempEntity, [ - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropInt(FIELD.OF(nameof(Index))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TEWorldDecal); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Index)) { Bits = 9, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_nIndex")] + [NetworkVar("m_nIndex")] public int Index; } diff --git a/Game.Client/C_Team.cs b/Game.Client/C_Team.cs index 56d064c8..6fa66f55 100644 --- a/Game.Client/C_Team.cs +++ b/Game.Client/C_Team.cs @@ -5,8 +5,6 @@ using Source; using Source.Common; -using FIELD = Source.FIELD; - namespace Game.Client; public static class TeamGlobals @@ -44,44 +42,49 @@ public static bool ArePlayersOnSameTeam(int playerIndex1, int playerIndex2){ [NetworkName("CTeam")] -public class C_Team : C_BaseEntity +public partial class C_Team : C_BaseEntity { - public static readonly RecvTable DT_Team = new([ - RecvPropInt( FIELD.OF(nameof(TeamNum))), - RecvPropInt( FIELD.OF(nameof(Score))), - RecvPropInt( FIELD.OF(nameof(RoundsWon)) ), - RecvPropString( FIELD.OF(nameof(Teamname))), - - RecvPropInt( "player_array_element", 0, RecvProxy_PlayerList ), - RecvPropArray2(RecvProxyArrayLength_PlayerArray, Constants.MAX_PLAYERS, "\"player_array\"") - ]); - - private static void RecvProxyArrayLength_PlayerArray(object instance, int objectID, int currentArrayLength) { - C_Team team = (C_Team)instance; - - if (team.Players.Count != currentArrayLength) - team.Players.SetSize(currentArrayLength); + [NetworkTable(NoBase = true)] + public static readonly new NetworkProp[] Props = [ + nameof(TeamNum), + nameof(Score), + nameof(RoundsWon), + nameof(Teamname), + + new("player_array_element") { Encoding = NetEncoding.Int, Proxy = typeof(PlayerListProxy) }, + new("\"player_array\"") { Encoding = NetEncoding.Array2, Count = Constants.MAX_PLAYERS, Proxy = typeof(PlayerArrayLengthProxy) }, + ]; + + public static class PlayerArrayLengthProxy + { + public static void Recv(object instance, int objectID, int currentArrayLength) { + C_Team team = (C_Team)instance; + + if (team.Players.Count != currentArrayLength) + team.Players.SetSize(currentArrayLength); + } } - private static void RecvProxy_PlayerList(ref readonly RecvProxyData data, object instance, IFieldAccessor field) { - C_Team team = (C_Team)instance; - team.Players[data.Element] = data.Value.Int; + public static class PlayerListProxy + { + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) { + C_Team team = (C_Team)instance; + team.Players[data.Element] = data.Value.Int; + } } - public static readonly new ClientClass ClientClass = new ClientClass(DT_Team); - public readonly List Players = []; - [NetworkName("m_szTeamname")] + [NetworkVar("m_szTeamname")] public InlineArray32 Teamname; - [NetworkName("m_iScore")] + [NetworkVar("m_iScore")] public int Score; - [NetworkName("m_iRoundsWon")] + [NetworkVar("m_iRoundsWon")] public int RoundsWon; public int Deaths; public int Ping; public int Packetloss; - [NetworkName("m_iTeamNum")] + [NetworkVar("m_iTeamNum")] public new int TeamNum; public void RemoveAllPlayers() => Players.Clear(); diff --git a/Game.Client/C_Tesla.cs b/Game.Client/C_Tesla.cs index 6af38b2c..ad81b549 100644 --- a/Game.Client/C_Tesla.cs +++ b/Game.Client/C_Tesla.cs @@ -3,18 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTesla")] -public class C_Tesla : C_BaseEntity +public partial class C_Tesla : C_BaseEntity { - public static readonly RecvTable DT_Tesla = new(DT_BaseEntity, [ - RecvPropString(FIELD.OF(nameof(SoundName))), - RecvPropString(FIELD.OF(nameof(SpriteName))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_Tesla); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SoundName)) { Encoding = NetEncoding.String }, + new(nameof(SpriteName)) { Encoding = NetEncoding.String }, + ]; - [NetworkName("m_SoundName")] + [NetworkVar("m_SoundName")] public InlineArray64 SoundName; - [NetworkName("m_iszSpriteName")] + [NetworkVar("m_iszSpriteName")] public InlineArray256 SpriteName; } diff --git a/Game.Client/C_TriggerPlayerMovement.cs b/Game.Client/C_TriggerPlayerMovement.cs index c03610cb..b28e0a55 100644 --- a/Game.Client/C_TriggerPlayerMovement.cs +++ b/Game.Client/C_TriggerPlayerMovement.cs @@ -4,10 +4,11 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CTriggerPlayerMovement")] -public class C_TriggerPlayerMovement : C_BaseTrigger +public partial class C_TriggerPlayerMovement : C_BaseTrigger { - public static readonly RecvTable DT_TriggerPlayerMovement = new(DT_BaseTrigger, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_TriggerPlayerMovement); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/C_Triggers.cs b/Game.Client/C_Triggers.cs index bb24787c..e1938b45 100644 --- a/Game.Client/C_Triggers.cs +++ b/Game.Client/C_Triggers.cs @@ -4,18 +4,18 @@ using Source; namespace Game.Client; -using FIELD_BT = FIELD; // I don't know if this is correct, but they have a datatable, so... [NetworkName("CBaseTrigger")] -public class C_BaseTrigger : BaseToggle +public partial class C_BaseTrigger : BaseToggle { - public static readonly RecvTable DT_BaseTrigger = new(DT_BaseToggle, [ - RecvPropBool(FIELD_BT.OF(nameof(ClientSidePredicted))), - RecvPropInt(FIELD_BT.OF(nameof(SpawnFlags))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseTrigger); - [NetworkName("m_bClientSidePredicted")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(ClientSidePredicted), + new(nameof(SpawnFlags)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.NoScale }, + ]; + + [NetworkVar("m_bClientSidePredicted")] public bool ClientSidePredicted; } diff --git a/Game.Client/C_VGuiScreen.cs b/Game.Client/C_VGuiScreen.cs index 5358c581..053abc24 100644 --- a/Game.Client/C_VGuiScreen.cs +++ b/Game.Client/C_VGuiScreen.cs @@ -3,33 +3,32 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CVGuiScreen")] -public class C_VGuiScreen : C_BaseEntity +public partial class C_VGuiScreen : C_BaseEntity { - public static readonly RecvTable DT_VGuiScreen = new(DT_BaseEntity, [ - RecvPropFloat(FIELD.OF(nameof(Width))), - RecvPropFloat(FIELD.OF(nameof(Height))), - RecvPropInt(FIELD.OF(nameof(AttachmentIndex))), - RecvPropInt(FIELD.OF(nameof(PanelName))), - RecvPropInt(FIELD.OF(nameof(ScreenFlags))), - RecvPropInt(FIELD.OF(nameof(OverlayMaterial))), - RecvPropEHandle(FIELD.OF(nameof(HPlayerOwner))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_VGuiScreen); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Width)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Height)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ScreenFlags)) { Bits = 5, Flags = PropFlags.Unsigned }, + new(nameof(PanelName)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(AttachmentIndex)) { Bits = 5, Flags = PropFlags.Unsigned }, + new(nameof(OverlayMaterial)) { Bits = 10, Flags = PropFlags.Unsigned }, + nameof(HPlayerOwner), + ]; - [NetworkName("m_flWidth")] + [NetworkVar("m_flWidth")] public float Width; - [NetworkName("m_flHeight")] + [NetworkVar("m_flHeight")] public float Height; - [NetworkName("m_nAttachmentIndex")] - public int AttachmentIndex; - [NetworkName("m_nPanelName")] - public int PanelName; - [NetworkName("m_fScreenFlags")] + [NetworkVar("m_fScreenFlags")] public int ScreenFlags; - [NetworkName("m_nOverlayMaterial")] + [NetworkVar("m_nPanelName")] + public int PanelName; + [NetworkVar("m_nAttachmentIndex")] + public int AttachmentIndex; + [NetworkVar("m_nOverlayMaterial")] public int OverlayMaterial; - [NetworkName("m_hPlayerOwner")] + [NetworkVar("m_hPlayerOwner")] public EHANDLE HPlayerOwner = new(); } diff --git a/Game.Client/C_VortigauntChargeToken.cs b/Game.Client/C_VortigauntChargeToken.cs index 29209551..96f68841 100644 --- a/Game.Client/C_VortigauntChargeToken.cs +++ b/Game.Client/C_VortigauntChargeToken.cs @@ -3,15 +3,14 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CVortigauntChargeToken")] -public class C_VortigauntChargeToken : C_BaseEntity +public partial class C_VortigauntChargeToken : C_BaseEntity { - public static readonly RecvTable DT_VortigauntChargeToken = new(DT_BaseEntity, [ - RecvPropBool(FIELD.OF(nameof(FadeOut))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_VortigauntChargeToken); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(FadeOut), + ]; - [NetworkName("m_bFadeOut")] + [NetworkVar("m_bFadeOut")] public bool FadeOut; } diff --git a/Game.Client/C_VortigauntEffectDispel.cs b/Game.Client/C_VortigauntEffectDispel.cs index d80906aa..c842eafa 100644 --- a/Game.Client/C_VortigauntEffectDispel.cs +++ b/Game.Client/C_VortigauntEffectDispel.cs @@ -3,15 +3,14 @@ using Game.Shared; using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CVortigauntEffectDispel")] -public class C_VortigauntEffectDispel : C_BaseEntity +public partial class C_VortigauntEffectDispel : C_BaseEntity { - public static readonly RecvTable DT_VortigauntEffectDispel = new(DT_BaseEntity, [ - RecvPropBool(FIELD.OF(nameof(FadeOut))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_VortigauntEffectDispel); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(FadeOut), + ]; - [NetworkName("m_bFadeOut")] + [NetworkVar("m_bFadeOut")] public bool FadeOut; } diff --git a/Game.Client/C_WaterBullet.cs b/Game.Client/C_WaterBullet.cs index b0985fe5..840acc6b 100644 --- a/Game.Client/C_WaterBullet.cs +++ b/Game.Client/C_WaterBullet.cs @@ -4,10 +4,11 @@ using System.Numerics; namespace Game.Client; -using FIELD = FIELD; [NetworkName("CWaterBullet")] -public class C_WaterBullet : C_BaseAnimating +public partial class C_WaterBullet : C_BaseAnimating { - public static readonly RecvTable DT_WaterBullet = new(DT_BaseAnimating, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_WaterBullet); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/C_WaterLODControl.cs b/Game.Client/C_WaterLODControl.cs index eb545061..01894507 100644 --- a/Game.Client/C_WaterLODControl.cs +++ b/Game.Client/C_WaterLODControl.cs @@ -5,20 +5,18 @@ namespace Game.Client; -using FIELD = FIELD; - [NetworkName("CWaterLODControl")] -public class C_WaterLODControl : C_BaseEntity +public partial class C_WaterLODControl : C_BaseEntity { - public static readonly RecvTable DT_WaterLODControl = new([ - RecvPropFloat(FIELD.OF(nameof(CheapWaterStartDistance))), - RecvPropFloat(FIELD.OF(nameof(CheapWaterEndDistance))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_WaterLODControl); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(CheapWaterStartDistance)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(CheapWaterEndDistance)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flCheapWaterStartDistance")] + [NetworkVar("m_flCheapWaterStartDistance")] public float CheapWaterStartDistance; - [NetworkName("m_flCheapWaterEndDistance")] + [NetworkVar("m_flCheapWaterEndDistance")] public float CheapWaterEndDistance; public override void OnDataChanged(DataUpdateType updateType) { diff --git a/Game.Client/C_World.cs b/Game.Client/C_World.cs index f01d2910..686de6d8 100644 --- a/Game.Client/C_World.cs +++ b/Game.Client/C_World.cs @@ -5,12 +5,10 @@ using System.Numerics; -using FIELD = Source.FIELD; - namespace Game.Client; -[NetworkName("CWorld")] -public class C_World : C_BaseEntity +[NetworkName("CWorld", Table = "DT_WORLD")] +public partial class C_World : C_BaseEntity { [ImplementClientClassFactory] public static C_World ClientWorldFactory(int entnum, int serialnum) { @@ -23,18 +21,17 @@ public C_World() : base() { } - public static readonly RecvTable DT_WORLD = new(DT_BaseEntity, [ - RecvPropVector(FIELD.OF(nameof(WorldMins))), - RecvPropVector(FIELD.OF(nameof(WorldMaxs))), - RecvPropInt(FIELD.OF(nameof(StartDark))), - RecvPropFloat(FIELD.OF(nameof(MaxOccludeeArea))), - RecvPropFloat(FIELD.OF(nameof(MinOccluderArea))), - RecvPropFloat(FIELD.OF(nameof(MaxPropScreenSpaceWidth))), - RecvPropFloat(FIELD.OF(nameof(MinPropScreenSpaceWidth))), - RecvPropString(FIELD.OF(nameof(DetailSpriteMaterial))), - ]); - - public static new readonly ClientClass ClientClass = new ClientClass(DT_WORLD); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(WorldMins), + nameof(WorldMaxs), + nameof(StartDark), + nameof(MaxOccludeeArea), + nameof(MinOccluderArea), + nameof(MaxPropScreenSpaceWidth), + nameof(MinPropScreenSpaceWidth), + nameof(DetailSpriteMaterial), + ]; public override bool Init(int entNum, int serialNum) { WaveHeight = 0.0f; @@ -50,21 +47,21 @@ public override void Release() { } float WaveHeight; - [NetworkName("m_WorldMins")] + [NetworkVar("m_WorldMins")] Vector3 WorldMins; - [NetworkName("m_WorldMaxs")] + [NetworkVar("m_WorldMaxs")] Vector3 WorldMaxs; - [NetworkName("m_bStartDark")] + [NetworkVar("m_bStartDark")] bool StartDark; - [NetworkName("m_flMaxOccludeeArea")] + [NetworkVar("m_flMaxOccludeeArea")] float MaxOccludeeArea; - [NetworkName("m_flMinOccluderArea")] + [NetworkVar("m_flMinOccluderArea")] float MinOccluderArea; - [NetworkName("m_flMaxPropScreenSpaceWidth")] + [NetworkVar("m_flMaxPropScreenSpaceWidth")] float MaxPropScreenSpaceWidth; - [NetworkName("m_flMinPropScreenSpaceWidth")] + [NetworkVar("m_flMinPropScreenSpaceWidth")] float MinPropScreenSpaceWidth; - [NetworkName("m_iszDetailSpriteMaterial")] + [NetworkVar("m_iszDetailSpriteMaterial")] InlineArray256 DetailSpriteMaterial; bool ColdWorld; diff --git a/Game.Client/Game.Client.csproj b/Game.Client/Game.Client.csproj index 1d5041ab..78929b60 100644 --- a/Game.Client/Game.Client.csproj +++ b/Game.Client/Game.Client.csproj @@ -38,7 +38,6 @@ - diff --git a/Game.Client/GarrysMod/C_GMOD_Player.cs b/Game.Client/GarrysMod/C_GMOD_Player.cs index 5b1d3b27..cc600123 100644 --- a/Game.Client/GarrysMod/C_GMOD_Player.cs +++ b/Game.Client/GarrysMod/C_GMOD_Player.cs @@ -10,7 +10,6 @@ using System.Numerics; namespace Game.Client.GarrysMod; -using FIELD = FIELD; [LinkEntityToClass("player")] [NetworkName("CGMOD_Player")] @@ -18,60 +17,60 @@ public partial class C_GMOD_Player() : C_HL2MP_Player() { static ConVar cl_playercolor = new("1.0 0.0 0.0", FCvar.UserInfo | FCvar.Archive | FCvar.ServerCanExecute, "Default Player Model"); - public static readonly RecvTable DT_GMOD_Player = new(DT_HL2MP_Player, [ - RecvPropInt(FIELD.OF(nameof(GModPlayerFlags))), - RecvPropEHandle(FIELD.OF(nameof(HoveredWidget))), - RecvPropEHandle(FIELD.OF(nameof(PressedWidget))), - RecvPropEHandle(FIELD.OF(nameof(Driving))), - RecvPropInt(FIELD.OF(nameof(DrivingMode))), - RecvPropInt(FIELD.OF(nameof(PlayerClass))), - RecvPropBool(FIELD.OF(nameof(CanZoom))), - RecvPropBool(FIELD.OF(nameof(CanWalk))), - RecvPropBool(FIELD.OF(nameof(IsTyping))), - RecvPropFloat(FIELD.OF(nameof(StepSize))), - RecvPropFloat(FIELD.OF(nameof(JumpPower))), - RecvPropVector(FIELD.OF_NAMED(nameof(ViewOffset), "m_ViewOffset")), - RecvPropVector(FIELD.OF(nameof(ViewOffsetDucked))), - RecvPropFloat(FIELD.OF(nameof(GestureEndTime))), - RecvPropVector(FIELD.OF(nameof(PlayerColor))), - RecvPropVector(FIELD.OF(nameof(WeaponColor))), - RecvPropEHandle(FIELD.OF(nameof(Hands))), - RecvPropInt(FIELD.OF(nameof(WaterLevel))), - RecvPropInt(FIELD.OF(nameof(MaxArmor))), - RecvPropFloat(FIELD.OF(nameof(Gravity))), - RecvPropBool(FIELD.OF(nameof(SprintEnabled))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_GMOD_Player); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(GModPlayerFlags), + nameof(HoveredWidget), + nameof(PressedWidget), + nameof(Driving), + nameof(DrivingMode), + nameof(PlayerClass), + nameof(CanZoom), + nameof(CanWalk), + nameof(IsTyping), + nameof(StepSize), + nameof(JumpPower), + new(nameof(ViewOffset)) { Name = "m_ViewOffset" }, + nameof(ViewOffsetDucked), + nameof(GestureEndTime), + nameof(PlayerColor), + nameof(WeaponColor), + nameof(Hands), + nameof(WaterLevel), + nameof(MaxArmor), + nameof(Gravity), + nameof(SprintEnabled), + ]; - [NetworkName("m_iGModPlayerFlags")] + [NetworkVar("m_iGModPlayerFlags")] public int GModPlayerFlags; - [NetworkName("m_HoveredWidget")] + [NetworkVar("m_HoveredWidget")] public EHANDLE HoveredWidget = new(); - [NetworkName("m_PressedWidget")] + [NetworkVar("m_PressedWidget")] public EHANDLE PressedWidget = new(); - [NetworkName("m_Driving")] + [NetworkVar("m_Driving")] public EHANDLE Driving = new(); - [NetworkName("m_DrivingMode")] + [NetworkVar("m_DrivingMode")] public int DrivingMode; - [NetworkName("m_PlayerClass")] + [NetworkVar("m_PlayerClass")] public int PlayerClass; - [NetworkName("m_bCanZoom")] + [NetworkVar("m_bCanZoom")] public bool CanZoom; - [NetworkName("m_bCanWalk")] + [NetworkVar("m_bCanWalk")] public bool CanWalk; - [NetworkName("m_bIsTyping")] + [NetworkVar("m_bIsTyping")] public bool IsTyping; - [NetworkName("m_StepSize")] + [NetworkVar("m_StepSize")] public float StepSize; - [NetworkName("m_JumpPower")] + [NetworkVar("m_JumpPower")] public float JumpPower; - [NetworkName("m_ViewOffsetDucked")] + [NetworkVar("m_ViewOffsetDucked")] public Vector3 ViewOffsetDucked; - [NetworkName("m_fGestureEndTime")] + [NetworkVar("m_fGestureEndTime")] public float GestureEndTime; - [NetworkName("m_PlayerColor")] + [NetworkVar("m_PlayerColor")] public Vector3 PlayerColor; - [NetworkName("m_WeaponColor")] + [NetworkVar("m_WeaponColor")] public Vector3 WeaponColor; public virtual Vector3 GetPlayerColor() => PlayerColor; @@ -85,13 +84,13 @@ public virtual void SetWeaponColor(in Vector3 color) { if (WeaponColor != color) WeaponColor = color; } - [NetworkName("m_Hands")] + [NetworkVar("m_Hands")] public EHANDLE Hands = new(); - [NetworkName("m_iMaxArmor")] + [NetworkVar("m_iMaxArmor")] public int MaxArmor; - [NetworkName("m_flGravity")] + [NetworkVar("m_flGravity")] public float Gravity; - [NetworkName("m_bSprintEnabled")] + [NetworkVar("m_bSprintEnabled")] public bool SprintEnabled; public override bool RestrictPlayerPitch() => (GModPlayerFlags & 16) == 0; diff --git a/Game.Client/GarrysMod/C_LuaNextBot.cs b/Game.Client/GarrysMod/C_LuaNextBot.cs index fca7772d..d45bdb34 100644 --- a/Game.Client/GarrysMod/C_LuaNextBot.cs +++ b/Game.Client/GarrysMod/C_LuaNextBot.cs @@ -4,20 +4,19 @@ using Source; using Source.Common; -using FIELD = Source.FIELD; - namespace Game.Client.NextBot; [LinkEntityToClass("sent_nextbot")] [NetworkName("CLuaNextBot")] -public class C_LuaNextBot : C_NextBotCombatCharacter +public partial class C_LuaNextBot : C_NextBotCombatCharacter { - public static readonly RecvTable DT_LuaNextBot = new(DT_NextBot, [ - RecvPropDataTable("m_ScriptedEntity", FIELD.OF(nameof(ScriptedEntity)), ScriptedEntity.DT_ScriptedEntity, 0, RECV_GET_OBJECT_AT_FIELD(FIELD.OF(nameof(ScriptedEntity)))), - RecvPropInt(FIELD.OF(nameof(LifeState))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_LuaNextBot); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ScriptedEntity)) { Encoding = NetEncoding.DataTable, DataTable = "DT_ScriptedEntity" }, + nameof(LifeState), + ]; + [NetworkVar("m_ScriptedEntity")] public readonly ScriptedEntity ScriptedEntity = new(); public C_LuaNextBot() { diff --git a/Game.Client/GarrysMod/WeaponCrossbow.cs b/Game.Client/GarrysMod/WeaponCrossbow.cs index e832fcfa..bd1a91d9 100644 --- a/Game.Client/GarrysMod/WeaponCrossbow.cs +++ b/Game.Client/GarrysMod/WeaponCrossbow.cs @@ -4,7 +4,9 @@ namespace Game.Shared.GarrysMod; [NetworkName("CCrossbowBolt")] -public class C_CrossbowBolt : C_BaseCombatCharacter { - public static readonly RecvTable DT_CrossbowBolt = new(DT_BaseCombatCharacter, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_CrossbowBolt); +public partial class C_CrossbowBolt : C_BaseCombatCharacter { + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/HL1/C_BaseHL1CombatWeapon.cs b/Game.Client/HL1/C_BaseHL1CombatWeapon.cs index 2111b101..5ac2205b 100644 --- a/Game.Client/HL1/C_BaseHL1CombatWeapon.cs +++ b/Game.Client/HL1/C_BaseHL1CombatWeapon.cs @@ -5,8 +5,10 @@ namespace Game.Client.HL1; [LinkEntityToClass("basehl1combatweapon")] [NetworkName("CBaseHL1CombatWeapon")] -public class C_BaseHL1CombatWeapon : C_BaseCombatWeapon +public partial class C_BaseHL1CombatWeapon : C_BaseCombatWeapon { - public static readonly RecvTable DT_BaseHL1CombatWeapon = new(DT_BaseCombatWeapon, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseHL1CombatWeapon); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/HL1/C_BaseHL1MPCombatWeapon.cs b/Game.Client/HL1/C_BaseHL1MPCombatWeapon.cs index dfdc2aa1..4dbd2286 100644 --- a/Game.Client/HL1/C_BaseHL1MPCombatWeapon.cs +++ b/Game.Client/HL1/C_BaseHL1MPCombatWeapon.cs @@ -5,8 +5,10 @@ namespace Game.Client.HL1; [LinkEntityToClass("basehl1mpcombatweapon")] [NetworkName("CBaseHL1MPCombatWeapon")] -public class C_BaseHL1MPCombatWeapon : C_BaseHL1CombatWeapon +public partial class C_BaseHL1MPCombatWeapon : C_BaseHL1CombatWeapon { - public static readonly RecvTable DT_BaseHL1MPCombatWeapon = new(DT_BaseHL1CombatWeapon, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseHL1MPCombatWeapon); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/HL1/C_BaseHelicopter_HL1.cs b/Game.Client/HL1/C_BaseHelicopter_HL1.cs index 54232b76..e1ca0d31 100644 --- a/Game.Client/HL1/C_BaseHelicopter_HL1.cs +++ b/Game.Client/HL1/C_BaseHelicopter_HL1.cs @@ -4,8 +4,10 @@ namespace Game.Client.HL1; [NetworkName("CBaseHelicopter_HL1")] -public class C_BaseHelicopter_HL1 : C_AI_BaseNPC +public partial class C_BaseHelicopter_HL1 : C_AI_BaseNPC { - public static readonly RecvTable DT_BaseHelicopter_HL1 = new(DT_AI_BaseNPC, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseHelicopter_HL1); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/HL2/C_AR2Explosion.cs b/Game.Client/HL2/C_AR2Explosion.cs index 89d99c0b..45fb44d6 100644 --- a/Game.Client/HL2/C_AR2Explosion.cs +++ b/Game.Client/HL2/C_AR2Explosion.cs @@ -4,16 +4,15 @@ using Source.Common; namespace Game.Client.HL2; -using FIELD = Source.FIELD; -[NetworkName("AR2Explosion")] +[NetworkName("AR2Explosion", Table = "DT_AR2Explosion")] public partial class C_AR2Explosion : C_BaseParticleEntity { - public static readonly RecvTable DT_AR2Explosion = new(DT_BaseParticleEntity, [ - RecvPropString(FIELD.OF(nameof(MaterialName))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_AR2Explosion); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(MaterialName), + ]; - [NetworkName("m_szMaterialName")] + [NetworkVar("m_szMaterialName")] InlineArray255 MaterialName; } diff --git a/Game.Client/HL2/C_AlyxEmpEffect.cs b/Game.Client/HL2/C_AlyxEmpEffect.cs index 35f834b1..243d1282 100644 --- a/Game.Client/HL2/C_AlyxEmpEffect.cs +++ b/Game.Client/HL2/C_AlyxEmpEffect.cs @@ -3,22 +3,21 @@ using Source.Common; namespace Game.Client.HL2; -using FIELD = Source.FIELD; [NetworkName("CAlyxEmpEffect")] public partial class C_AlyxEmpEffect : C_BaseEntity { - public static readonly RecvTable DT_AlyxEmpEffect = new(DT_BaseEntity, [ - RecvPropInt(FIELD.OF(nameof(State))), - RecvPropFloat(FIELD.OF(nameof(Duration))), - RecvPropFloat(FIELD.OF(nameof(StartTime))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_AlyxEmpEffect); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(State)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Duration)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_nState")] + [NetworkVar("m_nState")] public int State; - [NetworkName("m_flDuration")] + [NetworkVar("m_flDuration")] public TimeUnit_t Duration; - [NetworkName("m_flStartTime")] + [NetworkVar("m_flStartTime")] public TimeUnit_t StartTime; } diff --git a/Game.Client/HL2/C_BaseHLCombatWeapon.cs b/Game.Client/HL2/C_BaseHLCombatWeapon.cs index 65083645..d1970294 100644 --- a/Game.Client/HL2/C_BaseHLCombatWeapon.cs +++ b/Game.Client/HL2/C_BaseHLCombatWeapon.cs @@ -9,28 +9,28 @@ namespace Game.Client.HL2; [NetworkName("CHLMachineGun")] -public class C_HLMachineGun : BaseHLCombatWeapon +public partial class C_HLMachineGun : BaseHLCombatWeapon { - public static readonly RecvTable DT_HLMachineGun = new(DT_BaseHLCombatWeapon, [ + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_HLMachineGun); } [NetworkName("CHLSelectFireMachineGun")] -public class C_HLSelectFireMachineGun : C_HLMachineGun +public partial class C_HLSelectFireMachineGun : C_HLMachineGun { - public static readonly RecvTable DT_HLSelectFireMachineGun = new(DT_HLMachineGun, [ + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_HLSelectFireMachineGun); } [NetworkName("CBaseHLBludgeonWeapon")] -public class C_BaseHLBludgeonWeapon : BaseHLCombatWeapon +public partial class C_BaseHLBludgeonWeapon : BaseHLCombatWeapon { - public static readonly RecvTable DT_BaseHLBludgeonWeapon = new(DT_BaseHLCombatWeapon, [ + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseHLBludgeonWeapon); } diff --git a/Game.Client/HL2/C_BaseHLPlayer.cs b/Game.Client/HL2/C_BaseHLPlayer.cs index 0b9d625a..04c806ea 100644 --- a/Game.Client/HL2/C_BaseHLPlayer.cs +++ b/Game.Client/HL2/C_BaseHLPlayer.cs @@ -5,22 +5,22 @@ namespace Game.Client.HL2; -using DEFINE = Source.DEFINE; using FIELD = Source.FIELD; [NetworkName("CHL2_Player")] public partial class C_BaseHLPlayer : C_BasePlayer { - public static readonly RecvTable DT_HL2_Player = new(DT_BasePlayer, [ - RecvPropDataTable("m_HL2Local", FIELD.OF(nameof(HL2Local)), C_HL2PlayerLocalData.DT_HL2Local, 0, DataTableRecvProxy_PointerDataTable), - RecvPropBool(FIELD.OF(nameof(m_bIsSprinting))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_HL2_Player); - - public static readonly new DataMap PredMap = new(typeof(C_BaseHLPlayer), C_BasePlayer.PredMap, [ - DEFINE.PRED_TYPEDESCRIPTION( nameof(HL2Local), C_HL2PlayerLocalData.PredMap ), - DEFINE.PRED_FIELD( nameof(m_bIsSprinting), FieldType.Boolean, FieldTypeDescFlags.InSendTable ), - ]); public override DataMap? GetPredDescMap() => PredMap; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(HL2Local)) { Encoding = NetEncoding.DataTable, DataTable = "DT_HL2Local" }, + nameof(m_bIsSprinting), + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + new(nameof(HL2Local)) { Embedded = true }, + nameof(m_bIsSprinting), + ]; public C_BaseHLPlayer() { AddVar(this, FIELD.OF("Local.PunchAngle"), Local.iv_PunchAngle, LatchFlags.LatchSimulationVar); @@ -35,9 +35,9 @@ public override void OnDataChanged(DataUpdateType updateType) { public void ExitLadder(){ } - [NetworkName("m_HL2Local")] + [NetworkVar("m_HL2Local")] public readonly C_HL2PlayerLocalData HL2Local = new(); - [NetworkName("m_fIsSprinting")] + [NetworkVar("m_fIsSprinting")] public bool m_bIsSprinting; public bool m_bPlayUseDenySound; diff --git a/Game.Client/HL2/C_BaseHelicopter.cs b/Game.Client/HL2/C_BaseHelicopter.cs index 21a068ac..63beb6c9 100644 --- a/Game.Client/HL2/C_BaseHelicopter.cs +++ b/Game.Client/HL2/C_BaseHelicopter.cs @@ -5,16 +5,15 @@ namespace Game.Client; -using FIELD = FIELD; [NetworkName("CBaseHelicopter")] -public class C_BaseHelicopter : C_AI_TrackPather +public partial class C_BaseHelicopter : C_AI_TrackPather { - public static readonly RecvTable DT_BaseHelicopter = new(DT_AI_BaseNPC, [ - RecvPropFloat(FIELD.OF(nameof(StartupTime))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseHelicopter); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartupTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flStartupTime")] + [NetworkVar("m_flStartupTime")] public TimeUnit_t StartupTime; } diff --git a/Game.Client/HL2/C_HL2PlayerLocalData.cs b/Game.Client/HL2/C_HL2PlayerLocalData.cs index 562bc715..04309d90 100644 --- a/Game.Client/HL2/C_HL2PlayerLocalData.cs +++ b/Game.Client/HL2/C_HL2PlayerLocalData.cs @@ -6,47 +6,46 @@ using System.Numerics; -using DEFINE = Source.DEFINE; -using FIELD = Source.FIELD; +public partial class C_HL2PlayerLocalData { + [NetworkTable("DT_HL2Local")] + public static readonly NetworkProp[] Props = [ + nameof(SuitPower), + nameof(Zooming), + nameof(BitsActiveDevices), + nameof(SquadMemberCount), + nameof(SquadMedicCount), + nameof(SquadInFollowMode), + nameof(WeaponLowered), + nameof(Ladder), + nameof(DisplayReticle), + ]; -public class C_HL2PlayerLocalData { - public static readonly RecvTable DT_HL2Local = new(nameof(DT_HL2Local), [ - RecvPropFloat(FIELD.OF(nameof(SuitPower))), - RecvPropInt(FIELD.OF(nameof(Zooming))), - RecvPropInt(FIELD.OF(nameof(BitsActiveDevices))), - RecvPropInt(FIELD.OF(nameof(SquadMemberCount))), - RecvPropInt(FIELD.OF(nameof(SquadMedicCount))), - RecvPropBool(FIELD.OF(nameof(SquadInFollowMode))), - RecvPropBool(FIELD.OF(nameof(WeaponLowered))), - RecvPropEHandle(FIELD.OF(nameof(Ladder))), - RecvPropBool(FIELD.OF(nameof(DisplayReticle))), - ]); + [PredictionTable] + public static readonly PredictionField[] Prediction = [ + nameof(Ladder), + ]; - public static readonly DataMap PredMap = new(typeof(C_HL2PlayerLocalData), [ - DEFINE.PRED_FIELD( nameof(Ladder), FieldType.EHandle, FieldTypeDescFlags.InSendTable ), - ]); - - [NetworkName("m_flSuitPower")] + [NetworkVar("m_flSuitPower")] public float SuitPower; - [NetworkName("m_bZooming")] + [NetworkVar("m_bZooming")] public bool Zooming; - [NetworkName("m_bitsActiveDevices")] + [NetworkVar("m_bitsActiveDevices")] public int BitsActiveDevices; - [NetworkName("m_iSquadMemberCount")] + [NetworkVar("m_iSquadMemberCount")] public int SquadMemberCount; - [NetworkName("m_iSquadMedicCount")] + [NetworkVar("m_iSquadMedicCount")] public int SquadMedicCount; - [NetworkName("m_fSquadInFollowMode")] + [NetworkVar("m_fSquadInFollowMode")] public bool SquadInFollowMode; - [NetworkName("m_bWeaponLowered")] + [NetworkVar("m_bWeaponLowered")] public bool WeaponLowered; + [NetworkVar("m_hLadder")] + public EHANDLE Ladder = new(); public EHANDLE AutoAimTargetHandle = new(); public Vector3 AutoAimPoint; - [NetworkName("m_bDisplayReticle")] + [NetworkVar("m_bDisplayReticle")] public bool DisplayReticle; public bool StickyAutoAim; public bool AutoAimTarget; - [NetworkName("m_hLadder")] - public EHANDLE Ladder = new(); public LadderMove LadderMove = new(); } diff --git a/Game.Client/HL2/C_InfoTeleporterCountdown.cs b/Game.Client/HL2/C_InfoTeleporterCountdown.cs index 9b409b76..86e2df34 100644 --- a/Game.Client/HL2/C_InfoTeleporterCountdown.cs +++ b/Game.Client/HL2/C_InfoTeleporterCountdown.cs @@ -4,25 +4,24 @@ using Source.Common; namespace Game.Client.HL2; -using FIELD = Source.FIELD; [NetworkName("CInfoTeleporterCountdown")] public partial class C_InfoTeleporterCountdown : C_BaseEntity { - public static readonly RecvTable DT_InfoTeleporterCountdown = new(DT_BaseEntity, [ - RecvPropBool(FIELD.OF(nameof(CountdownStarted))), - RecvPropBool(FIELD.OF(nameof(Disabled))), - RecvPropFloat(FIELD.OF(nameof(StartTime))), - RecvPropFloat(FIELD.OF(nameof(TimeRemaining))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_InfoTeleporterCountdown); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(CountdownStarted), + nameof(Disabled), + new(nameof(StartTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(TimeRemaining)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_bCountdownStarted")] + [NetworkVar("m_bCountdownStarted")] public bool CountdownStarted; - [NetworkName("m_bDisabled")] + [NetworkVar("m_bDisabled")] public bool Disabled; - [NetworkName("m_flStartTime")] + [NetworkVar("m_flStartTime")] public TimeUnit_t StartTime; - [NetworkName("m_flTimeRemaining")] + [NetworkVar("m_flTimeRemaining")] public TimeUnit_t TimeRemaining; } diff --git a/Game.Client/HL2/C_PropAirboat.cs b/Game.Client/HL2/C_PropAirboat.cs index e2da4a74..70d28924 100644 --- a/Game.Client/HL2/C_PropAirboat.cs +++ b/Game.Client/HL2/C_PropAirboat.cs @@ -5,26 +5,25 @@ using System.Numerics; namespace Game.Client.HL2; -using FIELD = Source.FIELD; [NetworkName("CPropAirboat")] -public class C_PropAirboat : C_PropVehicleDriveable +public partial class C_PropAirboat : C_PropVehicleDriveable { - public static readonly RecvTable DT_PropAirboat = new(DT_PropVehicleDriveable, [ - RecvPropBool(FIELD.OF(nameof(HeadlightIsOn))), - RecvPropInt(FIELD.OF(nameof(AmmoCount))), - RecvPropInt(FIELD.OF(nameof(ExactWaterLevel))), - RecvPropInt(FIELD.OF(nameof(WaterLevel))), - RecvPropVector(FIELD.OF(nameof(PhysVelocity))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PropAirboat); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(HeadlightIsOn), + new(nameof(AmmoCount)) { Bits = 9 }, + new(nameof(ExactWaterLevel)) { Bits = 24 }, + new(nameof(WaterLevel)) { Encoding = NetEncoding.Int, Bits = 2, Flags = PropFlags.Unsigned }, + new(nameof(PhysVelocity)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_bHeadlightIsOn")] + [NetworkVar("m_bHeadlightIsOn")] public bool HeadlightIsOn; - [NetworkName("m_nAmmoCount")] + [NetworkVar("m_nAmmoCount")] public int AmmoCount; - [NetworkName("m_nExactWaterLevel")] + [NetworkVar("m_nExactWaterLevel")] public int ExactWaterLevel; - [NetworkName("m_vecPhysVelocity")] + [NetworkVar("m_vecPhysVelocity")] public Vector3 PhysVelocity; } diff --git a/Game.Client/HL2/C_PropCombineBall.cs b/Game.Client/HL2/C_PropCombineBall.cs index 332305f8..815997f9 100644 --- a/Game.Client/HL2/C_PropCombineBall.cs +++ b/Game.Client/HL2/C_PropCombineBall.cs @@ -12,28 +12,27 @@ using System.Numerics; using System.Text; -using FIELD = Source.FIELD; namespace Game.Client.HL2; [NetworkName("CPropCombineBall")] -public class C_PropCombineBall : C_BaseAnimating +public partial class C_PropCombineBall : C_BaseAnimating { - public static readonly RecvTable DT_PropCombineBall = new(DT_BaseAnimating, [ - RecvPropBool(FIELD.OF(nameof(Emit))), - RecvPropFloat(FIELD.OF(nameof(Radius))), - RecvPropBool(FIELD.OF(nameof(Held))), - RecvPropBool(FIELD.OF(nameof(Launched))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PropCombineBall); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Emit), + new(nameof(Radius)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Held), + nameof(Launched), + ]; public Vector3 LastOrigin; - [NetworkName("m_bEmit")] + [NetworkVar("m_bEmit")] public bool Emit; - [NetworkName("m_flRadius")] + [NetworkVar("m_flRadius")] public float Radius; - [NetworkName("m_bHeld")] + [NetworkVar("m_bHeld")] public bool Held; - [NetworkName("m_bLaunched")] + [NetworkVar("m_bLaunched")] public bool Launched; IMaterial? FlickerMaterial; diff --git a/Game.Client/HL2/C_PropVehiclePrisonerPod.cs b/Game.Client/HL2/C_PropVehiclePrisonerPod.cs index 61120e20..b6e25e0f 100644 --- a/Game.Client/HL2/C_PropVehiclePrisonerPod.cs +++ b/Game.Client/HL2/C_PropVehiclePrisonerPod.cs @@ -5,31 +5,30 @@ using System.Numerics; namespace Game.Client.HL2; -using FIELD = Source.FIELD; [NetworkName("CPropVehiclePrisonerPod")] -public class C_PropVehiclePrisonerPod : C_PhysicsProp +public partial class C_PropVehiclePrisonerPod : C_PhysicsProp { - public static readonly RecvTable DT_PropVehiclePrisonerPod = new(DT_PhysicsProp, [ - RecvPropEHandle(FIELD.OF(nameof(Player))), - RecvPropBool(FIELD.OF(nameof(EnterAnimOn))), - RecvPropBool(FIELD.OF(nameof(ExitAnimOn))), - RecvPropVector(FIELD.OF(nameof(EyeExitEndpoint))), - RecvPropBool(FIELD.OF(nameof(LimitView))), - RecvPropBool(FIELD.OF(nameof(Locked))), - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_PropVehiclePrisonerPod); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Player), + nameof(EnterAnimOn), + nameof(ExitAnimOn), + new(nameof(EyeExitEndpoint)) { Bits = 0, Flags = PropFlags.Coord }, + nameof(LimitView), + nameof(Locked), + ]; - [NetworkName("m_hPlayer")] + [NetworkVar("m_hPlayer")] public EHANDLE Player = new(); - [NetworkName("m_bEnterAnimOn")] + [NetworkVar("m_bEnterAnimOn")] public bool EnterAnimOn = new(); - [NetworkName("m_bExitAnimOn")] + [NetworkVar("m_bExitAnimOn")] public bool ExitAnimOn = new(); - [NetworkName("m_vecEyeExitEndpoint")] + [NetworkVar("m_vecEyeExitEndpoint")] public Vector3 EyeExitEndpoint = new(); - [NetworkName("m_bLimitView")] + [NetworkVar("m_bLimitView")] public bool LimitView = new(); - [NetworkName("m_bLocked")] + [NetworkVar("m_bLocked")] public bool Locked = new(); } diff --git a/Game.Client/HL2/C_Weapon_Stubs_HL2.cs b/Game.Client/HL2/C_Weapon_Stubs_HL2.cs index 1a11d421..48d712d4 100644 --- a/Game.Client/HL2/C_Weapon_Stubs_HL2.cs +++ b/Game.Client/HL2/C_Weapon_Stubs_HL2.cs @@ -8,57 +8,71 @@ namespace Game.Client.HL2; [LinkEntityToClass("cycler_weapon")] [NetworkName("CWeaponCycler")] -public class C_WeaponCycler : C_BaseCombatWeapon +public partial class C_WeaponCycler : C_BaseCombatWeapon { - public static readonly RecvTable DT_WeaponCycler = new(DT_BaseCombatWeapon, []); - public static new readonly ClientClass ClientClass = new ClientClass(DT_WeaponCycler); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } [LinkEntityToClass("weapon_annabelle")] [NetworkName("CWeaponAnnabelle")] -public class C_WeaponAnnabelle : C_BaseHLCombatWeapon +public partial class C_WeaponAnnabelle : C_BaseHLCombatWeapon { - public static readonly RecvTable DT_WeaponAnnabelle = new(DT_BaseHLCombatWeapon, []); - public static new readonly ClientClass ClientClass = new ClientClass(DT_WeaponAnnabelle); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } [LinkEntityToClass("weapon_alyxgun")] [NetworkName("CWeaponAlyxGun")] -public class C_WeaponAlyxGun : C_HLSelectFireMachineGun +public partial class C_WeaponAlyxGun : C_HLSelectFireMachineGun { - public static readonly RecvTable DT_WeaponAlyxGun = new(DT_HLSelectFireMachineGun, []); - public static new readonly ClientClass ClientClass = new ClientClass(DT_WeaponAlyxGun); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } [LinkEntityToClass("weapon_citizenpackage")] [NetworkName("CWeaponCitizenPackage")] -public class C_WeaponCitizenPackage : C_BaseHLCombatWeapon +public partial class C_WeaponCitizenPackage : C_BaseHLCombatWeapon { - public static readonly RecvTable DT_WeaponCitizenPackage = new(DT_BaseHLCombatWeapon, []); - public static new readonly ClientClass ClientClass = new ClientClass(DT_WeaponCitizenPackage); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } [LinkEntityToClass("weapon_citizensuitcase")] [NetworkName("CWeaponCitizenSuitcase")] -public class C_WeaponCitizenSuitcase : C_WeaponCitizenPackage +public partial class C_WeaponCitizenSuitcase : C_WeaponCitizenPackage { - public static readonly RecvTable DT_WeaponCitizenSuitcase = new(DT_WeaponCitizenPackage, []); - public static new readonly ClientClass ClientClass = new ClientClass(DT_WeaponCitizenSuitcase); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } [LinkEntityToClass("weapon_cubemap")] [NetworkName("CWeaponCubemap")] -public class C_WeaponCubemap : C_BaseCombatWeapon +public partial class C_WeaponCubemap : C_BaseCombatWeapon { - public static readonly RecvTable DT_WeaponCubemap = new(DT_BaseCombatWeapon, []); - public static new readonly ClientClass ClientClass = new ClientClass(DT_WeaponCubemap); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } [LinkEntityToClass("weapon_oldmanharpoon")] [NetworkName("CWeaponOldManHarpoon")] -public class C_WeaponOldManHarpoon : C_WeaponCitizenPackage +public partial class C_WeaponOldManHarpoon : C_WeaponCitizenPackage { - public static readonly RecvTable DT_WeaponOldManHarpoon = new(DT_WeaponCitizenPackage, []); - public static new readonly ClientClass ClientClass = new ClientClass(DT_WeaponOldManHarpoon); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Client/HL2MP/C_HL2MP_Player.cs b/Game.Client/HL2MP/C_HL2MP_Player.cs index 2e1dbf8c..3ddbc242 100644 --- a/Game.Client/HL2MP/C_HL2MP_Player.cs +++ b/Game.Client/HL2MP/C_HL2MP_Player.cs @@ -12,9 +12,7 @@ namespace Game.Client.HL2MP; -using DEFINE = Source.DEFINE; using FIELD = FIELD; -using FIELD_RD = FIELD; [NetworkName("CHL2MP_Player")] public partial class C_HL2MP_Player : C_BaseHLPlayer @@ -22,45 +20,43 @@ public partial class C_HL2MP_Player : C_BaseHLPlayer static ConVar cl_playermodel = new("none", FCvar.UserInfo | FCvar.Archive | FCvar.ServerCanExecute, "Default Player Model"); static ConVar cl_defaultweapon = new("weapon_physcannon", FCvar.UserInfo | FCvar.Archive, "Default Spawn Weapon"); - public static readonly new DataMap PredMap = new(typeof(C_HL2MP_Player), C_BaseHLPlayer.PredMap, [ - DEFINE.PRED_FIELD( nameof(IsWalking), FieldType.Boolean, FieldTypeDescFlags.InSendTable ), - ]); public override DataMap? GetPredDescMap() => PredMap; - - public static readonly RecvTable DT_HL2MPLocalPlayerExclusive = new(nameof(DT_HL2MPLocalPlayerExclusive), [ - RecvPropVector(FIELD.OF_NAMED(nameof(NetworkOrigin), "m_vecOrigin")), - - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(AngEyeAngles), 0)), - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(AngEyeAngles), 1)), - ]); - - public static readonly RecvTable DT_HL2MPNonLocalPlayerExclusive = new(nameof(DT_HL2MPNonLocalPlayerExclusive), [ - RecvPropVector(FIELD.OF_NAMED(nameof(NetworkOrigin), "m_vecOrigin")), - - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(AngEyeAngles), 0)), - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(AngEyeAngles), 1)), - ]); - - - public static readonly RecvTable DT_HL2MP_Player = new(DT_BasePlayer, [ - RecvPropDataTable("hl2mplocaldata", DT_HL2MPLocalPlayerExclusive), - RecvPropDataTable("hl2mpnonlocaldata", DT_HL2MPNonLocalPlayerExclusive), - RecvPropEHandle(FIELD.OF(nameof(Ragdoll))), - RecvPropInt(FIELD.OF(nameof(SpawnInterpCounter))), - RecvPropBool(FIELD.OF(nameof(IsWalking))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_HL2MP_Player); + [NetworkTable("DT_HL2MPLocalPlayerExclusive")] + public static readonly new NetworkProp[] LocalPlayerExclusiveProps = [ + nameof(NetworkOrigin), + new(nameof(AngEyeAngles)) { Encoding = NetEncoding.VectorElements, Count = 2 }, + ]; + + [NetworkTable("DT_HL2MPNonLocalPlayerExclusive")] + public static readonly NetworkProp[] NonLocalPlayerExclusiveProps = [ + nameof(NetworkOrigin), + new(nameof(AngEyeAngles)) { Encoding = NetEncoding.VectorElements, Count = 2 }, + ]; + + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(LocalPlayerExclusiveProps)) { Name = "hl2mplocaldata" }, + new(nameof(NonLocalPlayerExclusiveProps)) { Name = "hl2mpnonlocaldata" }, + nameof(Ragdoll), + nameof(SpawnInterpCounter), + nameof(IsWalking), + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(IsWalking), + ]; public readonly HL2MPPlayerAnimState PlayerAnimState; - [NetworkName("m_angEyeAngles")] + [NetworkVar("m_angEyeAngles")] public QAngle AngEyeAngles; readonly InterpolatedVar IV_AngEyeAngles = new(nameof(AngEyeAngles)); - [NetworkName("m_hRagdoll")] + [NetworkVar("m_hRagdoll")] public new EHANDLE Ragdoll = new(); - [NetworkName("m_iSpawnInterpCounter")] + [NetworkVar("m_iSpawnInterpCounter")] public int SpawnInterpCounter; public int SpawnInterpCounterCache; public int PlayerSoundType; - [NetworkName("m_fIsWalking")] + [NetworkVar("m_fIsWalking")] public bool IsWalking; public C_HL2MP_Player() : base() { @@ -125,24 +121,24 @@ public override ShadowType ShadowCastType() { public override ref readonly QAngle GetRenderAngles() => ref PlayerAnimState.GetRenderAngles(); } -[NetworkName("CHL2MPRagdoll")] -public class C_HL2MPRagdoll : C_BaseAnimatingOverlay +[NetworkName("CHL2MPRagdoll", NoBase = true)] +public partial class C_HL2MPRagdoll : C_BaseAnimatingOverlay { - public static readonly RecvTable DT_HL2MPRagdoll = new([ - RecvPropVector(FIELD_RD.OF(nameof(RagdollOrigin))), - RecvPropEHandle(FIELD_RD.OF(nameof(Player))), - RecvPropInt(FIELD_RD.OF(nameof(ModelIndex))), - RecvPropInt(FIELD_RD.OF(nameof(ForceBone))), - RecvPropVector(FIELD_RD.OF(nameof(Force))), - RecvPropVector(FIELD_RD.OF(nameof(RagdollVelocity))) - ]); - public static readonly new ClientClass ClientClass = new ClientClass(DT_HL2MPRagdoll); - - [NetworkName("m_vecRagdollOrigin")] + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(RagdollOrigin), + nameof(Player), + nameof(ModelIndex), + nameof(ForceBone), + nameof(Force), + nameof(RagdollVelocity), + ]; + + [NetworkVar("m_vecRagdollOrigin")] public Vector3 RagdollOrigin; - [NetworkName("m_hPlayer")] + [NetworkVar("m_hPlayer")] public EHANDLE Player = new(); - [NetworkName("m_vecRagdollVelocity")] + [NetworkVar("m_vecRagdollVelocity")] public Vector3 RagdollVelocity; public override bool IsRagdollProp() => true; diff --git a/Game.Client/NextBot/C_NextBotCombatCharacter.cs b/Game.Client/NextBot/C_NextBotCombatCharacter.cs index 714d30d6..2ee7c10a 100644 --- a/Game.Client/NextBot/C_NextBotCombatCharacter.cs +++ b/Game.Client/NextBot/C_NextBotCombatCharacter.cs @@ -4,9 +4,7 @@ namespace Game.Client.NextBot; -[NetworkName("NextBotCombatCharacter")] -public class C_NextBotCombatCharacter : C_BaseCombatCharacter +[NetworkName("NextBotCombatCharacter", Table = "DT_NextBot")] +public partial class C_NextBotCombatCharacter : C_BaseCombatCharacter { - public static readonly RecvTable DT_NextBot = new(DT_BaseCombatCharacter, []); - public static readonly new ClientClass ClientClass = new ClientClass(DT_NextBot); } diff --git a/Game.Client/ParticleMgr.cs b/Game.Client/ParticleMgr.cs index 5cbff3f9..a3406e57 100644 --- a/Game.Client/ParticleMgr.cs +++ b/Game.Client/ParticleMgr.cs @@ -8,10 +8,10 @@ namespace Game.Client; public struct ParticleLightInfo { - [NetworkName("m_vPos")] + [NetworkVar("m_vPos")] public Vector3 Pos; - [NetworkName("m_vColor")] + [NetworkVar("m_vColor")] public Vector3 Color; - [NetworkName("m_flIntensity")] + [NetworkVar("m_flIntensity")] public float Intensity; } diff --git a/Game.Client/PlayerLocalData.cs b/Game.Client/PlayerLocalData.cs index 3de05fdc..79cc467a 100644 --- a/Game.Client/PlayerLocalData.cs +++ b/Game.Client/PlayerLocalData.cs @@ -7,167 +7,157 @@ namespace Game.Client; using FIELD = FIELD; -using DEFINE = Source.DEFINE; -public class PlayerLocalData +public partial class PlayerLocalData { - public static readonly DataMap PredMap = new(typeof(PlayerLocalData), [ + [NetworkTable("DT_Local")] + public static readonly NetworkProp[] Props = [ + nameof(AreaBits), + nameof(AreaPortalBits), + nameof(HideHUD), + nameof(FOVRate), + new(nameof(Ducked)) { Encoding = NetEncoding.Int }, + new(nameof(Ducking)) { Encoding = NetEncoding.Int }, + new(nameof(InDuckJump)) { Encoding = NetEncoding.Int }, + nameof(DuckTime), + nameof(DuckJumpTime), + nameof(JumpTime), + nameof(FallVelocity), + new(nameof(PunchAngle)) { Encoding = NetEncoding.Vector }, + new(nameof(PunchAngleVel)) { Encoding = NetEncoding.Vector }, + new(nameof(DrawViewmodel)) { Encoding = NetEncoding.Int }, + new(nameof(WearingSuit)) { Encoding = NetEncoding.Int }, + nameof(Poisoned), + nameof(StepSize), + new(nameof(AllowAutoMovement)) { Encoding = NetEncoding.Int }, + nameof(Skybox3D.Scale), + nameof(Skybox3D.Origin), + nameof(Skybox3D.Area), + new(nameof(Skybox3D.Fog.Enable)) { Encoding = NetEncoding.Int }, + new(nameof(Skybox3D.Fog.Blend)) { Encoding = NetEncoding.Int }, + new(nameof(Skybox3D.Fog.Radial)) { Encoding = NetEncoding.Int }, + nameof(Skybox3D.Fog.DirPrimary), + new(nameof(Skybox3D.Fog.ColorPrimary)) { Encoding = NetEncoding.Int }, + new(nameof(Skybox3D.Fog.ColorSecondary)) { Encoding = NetEncoding.Int }, + new(nameof(Skybox3D.Fog.ColorPrimaryHDR)) { Encoding = NetEncoding.Int }, + new(nameof(Skybox3D.Fog.ColorSecondaryHDR)) { Encoding = NetEncoding.Int }, + nameof(Skybox3D.Fog.Start), + nameof(Skybox3D.Fog.End), + nameof(Skybox3D.Fog.MaxDensity), + nameof(Skybox3D.Fog.HDRColorScale), + nameof(PlayerFog.Ctrl), + new(nameof(Audio.LocalSound)) { Encoding = NetEncoding.Elements }, + nameof(Audio.SoundscapeIndex), + nameof(Audio.LocalBits), + nameof(Audio.Ent), + nameof(SprintSpeed), + nameof(WalkSpeed), + nameof(SlowWalkSpeed), + nameof(LadderSpeed), + nameof(CrouchedWalkSpeed), + nameof(DuckSpeed), + nameof(UnDuckSpeed), + nameof(DuckToggled), + ]; + + [PredictionTable] + public static readonly PredictionField[] Prediction = [ // DEFINE.FIELD( nameof(StepSide), FieldType.Integer ), - DEFINE.PRED_FIELD( nameof(HideHUD), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD_TOL( nameof(PunchAngle), FieldType.Vector, FieldTypeDescFlags.InSendTable, 0.125f ), - DEFINE.PRED_FIELD_TOL( nameof(PunchAngleVel), FieldType.Vector, FieldTypeDescFlags.InSendTable, 0.125f ), - DEFINE.PRED_FIELD( nameof(DrawViewmodel), FieldType.Boolean, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(WearingSuit), FieldType.Boolean, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(Poisoned), FieldType.Boolean, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(AllowAutoMovement), FieldType.Boolean, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(Ducked), FieldType.Boolean, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(Ducking), FieldType.Boolean, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(InDuckJump), FieldType.Boolean, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(DuckTime), FieldType.Float, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(DuckJumpTime), FieldType.Float, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(JumpTime), FieldType.Float, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD_TOL( nameof(FallVelocity), FieldType.Float, FieldTypeDescFlags.InSendTable, 0.5f ), - DEFINE.FIELD( nameof(OldButtons), FieldType.Integer ), - DEFINE.PRED_FIELD( nameof(StepSize), FieldType.Float, FieldTypeDescFlags.InSendTable ), - DEFINE.FIELD( nameof(FOVRate), FieldType.Float ), - DEFINE.PRED_FIELD( nameof(SprintSpeed), FieldType.Float, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(WalkSpeed), FieldType.Float, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(SlowWalkSpeed), FieldType.Float, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(LadderSpeed), FieldType.Float, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(CrouchedWalkSpeed), FieldType.Float, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(DuckSpeed), FieldType.Float, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(UnDuckSpeed), FieldType.Float, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD( nameof(DuckToggled), FieldType.Boolean, FieldTypeDescFlags.InSendTable ), - ]); - - public static readonly RecvTable DT_Local = new(nameof(DT_Local), [ - RecvPropArray3(FIELD.OF_ARRAY(nameof(AreaBits)), RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(AreaBits)))), - RecvPropArray3(FIELD.OF_ARRAY(nameof(AreaPortalBits)), RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(AreaPortalBits)))), - RecvPropInt(FIELD.OF(nameof(HideHUD))), - RecvPropFloat(FIELD.OF(nameof(FOVRate))), - RecvPropInt(FIELD.OF(nameof(Ducked))), - RecvPropInt(FIELD.OF(nameof(Ducking))), - RecvPropInt(FIELD.OF(nameof(InDuckJump))), - RecvPropFloat(FIELD.OF(nameof(DuckTime))), - RecvPropFloat(FIELD.OF(nameof(DuckJumpTime))), - RecvPropFloat(FIELD.OF(nameof(JumpTime))), - RecvPropFloat(FIELD.OF(nameof(FallVelocity))), - RecvPropVector(FIELD.OF(nameof(PunchAngle))), - RecvPropVector(FIELD.OF(nameof(PunchAngleVel))), - RecvPropInt(FIELD.OF(nameof(DrawViewmodel))), - RecvPropInt(FIELD.OF(nameof(WearingSuit))), - RecvPropBool(FIELD.OF(nameof(Poisoned))), - RecvPropFloat(FIELD.OF(nameof(StepSize))), - RecvPropInt(FIELD.OF(nameof(AllowAutoMovement))), - - RecvPropInt(FIELD.OF("Skybox3D.Scale")), - RecvPropVector(FIELD.OF("Skybox3D.Origin")), - RecvPropInt(FIELD.OF("Skybox3D.Area")), - RecvPropInt(FIELD.OF("Skybox3D.Fog.Enable")), - RecvPropInt(FIELD.OF("Skybox3D.Fog.Blend")), - RecvPropInt(FIELD.OF("Skybox3D.Fog.Radial")), - RecvPropVector(FIELD.OF("Skybox3D.Fog.DirPrimary")), - RecvPropInt(FIELD.OF("Skybox3D.Fog.ColorPrimary")), - RecvPropInt(FIELD.OF("Skybox3D.Fog.ColorSecondary")), - RecvPropInt(FIELD.OF("Skybox3D.Fog.ColorPrimaryHDR")), - RecvPropInt(FIELD.OF("Skybox3D.Fog.ColorSecondaryHDR")), - RecvPropFloat(FIELD.OF("Skybox3D.Fog.Start")), - RecvPropFloat(FIELD.OF("Skybox3D.Fog.End")), - RecvPropFloat(FIELD.OF("Skybox3D.Fog.MaxDensity")), - RecvPropFloat(FIELD.OF("Skybox3D.Fog.HDRColorScale")), - - RecvPropEHandle( FIELD.OF("PlayerFog.Ctrl")), - - RecvPropVector(FIELD.OF_ARRAYINDEX("Audio.LocalSound", 0)), - RecvPropVector(FIELD.OF_ARRAYINDEX("Audio.LocalSound", 1)), - RecvPropVector(FIELD.OF_ARRAYINDEX("Audio.LocalSound", 2)), - RecvPropVector(FIELD.OF_ARRAYINDEX("Audio.LocalSound", 3)), - RecvPropVector(FIELD.OF_ARRAYINDEX("Audio.LocalSound", 4)), - RecvPropVector(FIELD.OF_ARRAYINDEX("Audio.LocalSound", 5)), - RecvPropVector(FIELD.OF_ARRAYINDEX("Audio.LocalSound", 6)), - RecvPropVector(FIELD.OF_ARRAYINDEX("Audio.LocalSound", 7)), - RecvPropInt(FIELD.OF("Audio.SoundscapeIndex")), - RecvPropInt(FIELD.OF("Audio.LocalBits")), - RecvPropEHandle( FIELD.OF("Audio.Ent")), - - // gmod data - RecvPropFloat(FIELD.OF(nameof(SprintSpeed))), - RecvPropFloat(FIELD.OF(nameof(WalkSpeed))), - RecvPropFloat(FIELD.OF(nameof(SlowWalkSpeed))), - RecvPropFloat(FIELD.OF(nameof(LadderSpeed))), - RecvPropFloat(FIELD.OF(nameof(CrouchedWalkSpeed))), - RecvPropFloat(FIELD.OF(nameof(DuckSpeed))), - RecvPropFloat(FIELD.OF(nameof(UnDuckSpeed))), - RecvPropBool(FIELD.OF(nameof(DuckToggled))), - ]); - - [NetworkName("m_fSprintSpeed")] + nameof(HideHUD), + new(nameof(PunchAngle)) { Tolerance = 0.125f }, + new(nameof(PunchAngleVel)) { Tolerance = 0.125f }, + nameof(DrawViewmodel), + nameof(WearingSuit), + nameof(Poisoned), + nameof(AllowAutoMovement), + nameof(Ducked), + nameof(Ducking), + nameof(InDuckJump), + nameof(DuckTime), + nameof(DuckJumpTime), + nameof(JumpTime), + new(nameof(FallVelocity)) { Tolerance = 0.5f }, + nameof(OldButtons), + nameof(StepSize), + new(nameof(FOVRate)) { Flags = FieldTypeDescFlags.Save }, + nameof(SprintSpeed), + nameof(WalkSpeed), + nameof(SlowWalkSpeed), + nameof(LadderSpeed), + nameof(CrouchedWalkSpeed), + nameof(DuckSpeed), + nameof(UnDuckSpeed), + nameof(DuckToggled), + ]; + + // gmod data + [NetworkVar("m_fSprintSpeed")] public float SprintSpeed = 400; - [NetworkName("m_fWalkSpeed")] + [NetworkVar("m_fWalkSpeed")] public float WalkSpeed = 200; - [NetworkName("m_fSlowWalkSpeed")] + [NetworkVar("m_fSlowWalkSpeed")] public float SlowWalkSpeed = 100; - [NetworkName("m_fLadderSpeed")] + [NetworkVar("m_fLadderSpeed")] public float LadderSpeed = 200; - [NetworkName("m_fCrouchedWalkSpeed")] + [NetworkVar("m_fCrouchedWalkSpeed")] public float CrouchedWalkSpeed = 0.3f; - [NetworkName("m_fDuckSpeed")] + [NetworkVar("m_fDuckSpeed")] public float DuckSpeed = 0.1f; - [NetworkName("m_fUnDuckSpeed")] + [NetworkVar("m_fUnDuckSpeed")] public float UnDuckSpeed = 0.1f; - [NetworkName("m_bDuckToggled")] + [NetworkVar("m_bDuckToggled")] public bool DuckToggled; // TODO: NETWORK VARS!!!!! - [NetworkName("m_chAreaBits")] + [NetworkVar("m_chAreaBits")] public InlineArrayMaxAreaStateBytes AreaBits; - [NetworkName("m_chAreaPortalBits")] + [NetworkVar("m_chAreaPortalBits")] public InlineArrayMaxAreaPortalStateBytes AreaPortalBits; - [NetworkName("m_iHideHUD")] + [NetworkVar("m_iHideHUD")] public int HideHUD; - [NetworkName("m_flFOVRate")] + [NetworkVar("m_flFOVRate")] public float FOVRate; - [NetworkName("m_bDucked")] + [NetworkVar("m_bDucked")] public bool Ducked; - [NetworkName("m_bDucking")] + [NetworkVar("m_bDucking")] public bool Ducking; - [NetworkName("m_bInDuckJump")] + [NetworkVar("m_bInDuckJump")] public bool InDuckJump; - [NetworkName("m_flDucktime")] + [NetworkVar("m_flDucktime")] public float DuckTime; - [NetworkName("m_flDuckJumpTime")] + [NetworkVar("m_flDuckJumpTime")] public float DuckJumpTime; - [NetworkName("m_flJumpTime")] + [NetworkVar("m_flJumpTime")] public float JumpTime; public int StepSide; - [NetworkName("m_flFallVelocity")] + [NetworkVar("m_flFallVelocity")] public float FallVelocity; public int OldButtons; public int OldForwardMove; - [NetworkName("m_vecPunchAngle")] + [NetworkVar("m_vecPunchAngle")] public QAngle PunchAngle; public readonly InterpolatedVar iv_PunchAngle; - [NetworkName("m_vecPunchAngleVel")] + [NetworkVar("m_vecPunchAngleVel")] public QAngle PunchAngleVel; public readonly InterpolatedVar iv_PunchAngleVel; - [NetworkName("m_bDrawViewmodel")] + [NetworkVar("m_bDrawViewmodel")] public bool DrawViewmodel; - [NetworkName("m_bWearingSuit")] + [NetworkVar("m_bWearingSuit")] public bool WearingSuit; - [NetworkName("m_bPoisoned")] + [NetworkVar("m_bPoisoned")] public bool Poisoned; - [NetworkName("m_flStepSize")] + [NetworkVar("m_flStepSize")] public float StepSize; - [NetworkName("m_bAllowAutoMovement")] + [NetworkVar("m_bAllowAutoMovement")] public bool AllowAutoMovement; public bool SlowMovement; - [NetworkName("m_skybox3d")] + [NetworkVar("m_skybox3d")] public Sky3DParams Skybox3D = new(); - [NetworkName("m_PlayerFog")] + [NetworkVar("m_PlayerFog")] public FogPlayerParams PlayerFog = new(); - [NetworkName("m_audio")] + [NetworkVar("m_audio")] public AudioParams Audio = new(); public static readonly DynamicAccessor FIELD_PUNCHANGLE = FIELD.OF(nameof(PunchAngle)); diff --git a/Game.Server/AI_BaseNPC.cs b/Game.Server/AI_BaseNPC.cs index f5ee04c3..b935a8be 100644 --- a/Game.Server/AI_BaseNPC.cs +++ b/Game.Server/AI_BaseNPC.cs @@ -17,7 +17,6 @@ namespace Game.Server; -using FIELD = FIELD; using DEFINE = DEFINE; /// @@ -316,7 +315,7 @@ public bool EnumEntity(IHandleEntity? handleEntity) { } [NetworkName("CAI_BaseNPC")] -public class AI_BaseNPC : BaseCombatCharacter, IAI_MovementSink +public partial class AI_BaseNPC : BaseCombatCharacter, IAI_MovementSink { [Flags] public enum SF @@ -348,16 +347,16 @@ public static ReadOnlySpan GetActivityName(Activity actID) { return name; } - public static readonly SendTable DT_AI_BaseNPC = new(DT_BaseCombatCharacter, [ - SendPropInt(FIELD.OF(nameof(LifeState)), 3, PropFlags.Unsigned), - SendPropBool(FIELD.OF(nameof(PerformAvoidance))), - SendPropBool(FIELD.OF(nameof(IsMovingValue))), - SendPropBool(FIELD.OF(nameof(FadeCorpse))), - SendPropInt(FIELD.OF(nameof(DeathPose)), 12), - SendPropInt(FIELD.OF(nameof(DeathFrame)), 5), - SendPropBool(FIELD.OF(nameof(ImportantRagdoll))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_AI_BaseNPC); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(LifeState)) { Bits = 3, Flags = PropFlags.Unsigned }, + nameof(PerformAvoidance), + nameof(IsMovingValue), + nameof(FadeCorpse), + new(nameof(DeathPose)) { Bits = 12 }, + new(nameof(DeathFrame)) { Bits = 5 }, + nameof(ImportantRagdoll), + ]; public static readonly new DataMap DataDesc = new(typeof(AI_BaseNPC), BaseEntity.DataDesc, [ DEFINE.KEYFIELD(nameof(SpawnEquipment), FieldType.String, "additionalequipment"), @@ -383,21 +382,21 @@ public static ReadOnlySpan GetActivityName(Activity actID) { ]); public override DataMap? GetDataDescMap() => DataDesc; - [NetworkName("m_bPerformAvoidance")] - public bool PerformAvoidance; - [NetworkName("m_bIsMoving")] - public bool IsMovingValue; - [NetworkName("m_bFadeCorpse")] - public bool FadeCorpse; - [NetworkName("m_iDeathPose")] - public int DeathPose; - [NetworkName("m_iDeathFrame")] - public int DeathFrame; + [NetworkVar("m_bPerformAvoidance")] + public partial bool PerformAvoidance { get; set; } + [NetworkVar("m_bIsMoving")] + public partial bool IsMovingValue { get; set; } + [NetworkVar("m_bFadeCorpse")] + public partial bool FadeCorpse { get; set; } + [NetworkVar("m_iDeathPose")] + public partial int DeathPose { get; set; } + [NetworkVar("m_iDeathFrame")] + public partial int DeathFrame { get; set; } public bool SpeedModActive; public int SpeedModRadius; public int SpeedModSpeed; - [NetworkName("m_bImportanRagdoll")] - public bool ImportantRagdoll; + [NetworkVar("m_bImportanRagdoll")] + public partial bool ImportantRagdoll { get; set; } public float TimePingEffect; public static TimeUnit_t TimeLastSpawn; diff --git a/Game.Server/BaseAnimating.cs b/Game.Server/BaseAnimating.cs index ffeeefa6..89de0f6b 100644 --- a/Game.Server/BaseAnimating.cs +++ b/Game.Server/BaseAnimating.cs @@ -15,122 +15,132 @@ namespace Game.Server; -using FIELD = Source.FIELD; -using FIELD_ILR = Source.FIELD; - [LinkEntityToClass("info_lighting_relative")] [NetworkName("CInfoLightingRelative")] public partial class InfoLightingRelative : BaseEntity { - public static readonly SendTable DT_InfoLightingRelative = new(DT_BaseEntity, [ - SendPropEHandle(FIELD_ILR.OF(nameof(LightingLandmark))) - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_InfoLightingRelative); + public InfoLightingRelative() { + LightingLandmark = new(); + } - [NetworkName("m_hLightingLandmark")] - public EHANDLE LightingLandmark = new(); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(LightingLandmark), + ]; + + [NetworkVar("m_hLightingLandmark")] + public partial EHANDLE LightingLandmark { get; set; } } [NetworkName("CBaseAnimating")] public partial class BaseAnimating : BaseEntity { + public BaseAnimating() { + ModelScale = 1.0f; + LightingOrigin = new(); + LightingOriginRelative = new(); + BoneManipulator = new(); + FlexManipulator = new(); + } + public const int ANIMATION_SKIN_BITS = 10; public const int ANIMATION_BODY_BITS = 32; public const int ANIMATION_HITBOXSET_BITS = 2; public const int ANIMATION_POSEPARAMETER_BITS = 11; public const int ANIMATION_PLAYBACKRATE_BITS = 8; - public static readonly SendTable DT_ServerAnimationData = new(nameof(DT_ServerAnimationData), [ - SendPropFloat(FIELD.OF(nameof(Cycle)), ANIMATION_CYCLE_BITS, PropFlags.ChangesOften|PropFlags.RoundDown, -1.0f, 1.0f) - ]); - public static readonly SendTable DT_BaseAnimating = new(DT_BaseEntity, [ - SendPropInt( FIELD.OF(nameof(ForceBone)), 8, 0 ), - SendPropVector( FIELD.OF(nameof(Force)), 0, PropFlags.NoScale ), + [PredictionTable] + public static readonly PredictionField[] Prediction = []; + + [NetworkTable("DT_ServerAnimationData")] + public static readonly NetworkProp[] ServerAnimationDataProps = [ + new(nameof(Cycle)) { Encoding = NetEncoding.Float, Bits = ANIMATION_CYCLE_BITS, Flags = PropFlags.ChangesOften | PropFlags.RoundDown, Low = -1.0f, High = 1.0f }, + ]; + + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ForceBone)) { Bits = 8 }, + new(nameof(Force)) { Bits = 0, Flags = PropFlags.NoScale }, - SendPropInt( FIELD.OF(nameof(Skin)), ANIMATION_SKIN_BITS), - SendPropInt( FIELD.OF(nameof(Body)), ANIMATION_BODY_BITS), + new(nameof(Skin)) { Bits = ANIMATION_SKIN_BITS }, + new(nameof(Body)) { Bits = ANIMATION_BODY_BITS }, - SendPropInt( FIELD.OF(nameof(HitboxSet)),ANIMATION_HITBOXSET_BITS, PropFlags.Unsigned ), + new(nameof(HitboxSet)) { Bits = ANIMATION_HITBOXSET_BITS, Flags = PropFlags.Unsigned }, - SendPropFloat( FIELD.OF(nameof(ModelScale)) ), + nameof(ModelScale), - SendPropArray3( FIELD.OF_ARRAY(nameof(PoseParameter)), SendPropFloat(null!, ANIMATION_POSEPARAMETER_BITS, 0, 0.0f, 1.0f ) ), + new(nameof(PoseParameter)) { Bits = ANIMATION_POSEPARAMETER_BITS, Low = 0.0f, High = 1.0f }, - SendPropInt( FIELD.OF(nameof(Sequence)), ANIMATION_SEQUENCE_BITS, PropFlags.Unsigned ), - SendPropFloat( FIELD.OF(nameof(PlaybackRate)), ANIMATION_PLAYBACKRATE_BITS, PropFlags.RoundUp, -4.0f, 12.0f ), + new(nameof(Sequence)) { Bits = ANIMATION_SEQUENCE_BITS, Flags = PropFlags.Unsigned }, + new(nameof(PlaybackRate)) { Encoding = NetEncoding.Float, Bits = ANIMATION_PLAYBACKRATE_BITS, Flags = PropFlags.RoundUp, Low = -4.0f, High = 12.0f }, - SendPropArray3(FIELD.OF_ARRAY(nameof(EncodedController)), SendPropFloat(null!, 11, PropFlags.RoundDown, 0.0f, 1.0f ) ), + new(nameof(EncodedController)) { Bits = 11, Flags = PropFlags.RoundDown, Low = 0.0f, High = 1.0f }, - SendPropInt( FIELD.OF(nameof( ClientSideAnimation )), 1, PropFlags.Unsigned ), - SendPropInt( FIELD.OF(nameof( ClientSideFrameReset )), 1, PropFlags.Unsigned ), + new(nameof(ClientSideAnimation)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(ClientSideFrameReset)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, - SendPropInt( FIELD.OF(nameof( NewSequenceParity) ), (int)EntityEffects.ParityBits, PropFlags.Unsigned ), - SendPropInt( FIELD.OF(nameof( ResetEventsParity )), (int)EntityEffects.ParityBits, PropFlags.Unsigned ), - SendPropInt( FIELD.OF(nameof( MuzzleFlashParity )), (int)EntityEffects.MuzzleflashBits, PropFlags.Unsigned ), + new(nameof(NewSequenceParity)) { Bits = (int)EntityEffects.ParityBits, Flags = PropFlags.Unsigned }, + new(nameof(ResetEventsParity)) { Bits = (int)EntityEffects.ParityBits, Flags = PropFlags.Unsigned }, + new(nameof(MuzzleFlashParity)) { Bits = (int)EntityEffects.MuzzleflashBits, Flags = PropFlags.Unsigned }, - SendPropEHandle( FIELD.OF(nameof( LightingOrigin )) ), - SendPropEHandle( FIELD.OF(nameof( LightingOriginRelative )) ), + nameof(LightingOrigin), + nameof(LightingOriginRelative), - SendPropDataTable( "serveranimdata", DT_ServerAnimationData, SendProxy_ClientSideAnimation ), + new(nameof(ServerAnimationDataProps)) { Name = "serveranimdata", Proxy = typeof(ClientSideAnimationProxy) }, - SendPropFloat( FIELD.OF(nameof(FadeMinDist) ), 0, PropFlags.NoScale ), - SendPropFloat( FIELD.OF(nameof(FadeMaxDist )), 0, PropFlags.NoScale ), - SendPropFloat( FIELD.OF(nameof(FadeScale )), 0, PropFlags.NoScale ), + new(nameof(FadeMinDist)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeMaxDist)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeScale)) { Bits = 0, Flags = PropFlags.NoScale }, // Gmod specific - SendPropEHandle(FIELD.OF(nameof(BoneManipulator))), - SendPropEHandle(FIELD.OF(nameof(FlexManipulator))), - SendPropVector(FIELD.OF(nameof(OverrideViewTarget)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_BaseAnimating); - - [NetworkName("m_nForceBone")] - public int ForceBone; - [NetworkName("m_vecForce")] - public Vector3 Force; - [NetworkName("m_nSkin")] - public int Skin; - [NetworkName("m_nBody")] - public int Body; - [NetworkName("m_nHitboxSet")] - public int HitboxSet; + nameof(BoneManipulator), + nameof(FlexManipulator), + new(nameof(OverrideViewTarget)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; + + [NetworkVar("m_nForceBone")] + public partial int ForceBone { get; set; } + [NetworkVar("m_vecForce")] + public partial Vector3 Force { get; set; } + [NetworkVar("m_nSkin")] + public partial int Skin { get; set; } + [NetworkVar("m_nBody")] + public partial int Body { get; set; } + [NetworkVar("m_nHitboxSet")] + public partial int HitboxSet { get; set; } public int GetHitboxSet() => HitboxSet; - [NetworkName("m_flModelScale")] - public float ModelScale = 1.0f; - [NetworkName("m_flPoseParameter")] - public InlineArrayMaxStudioPoseParam PoseParameter; + [NetworkVar("m_flModelScale")] + public partial float ModelScale { get; set; } + [NetworkVar("m_flPoseParameter")] + public partial ref readonly InlineArrayMaxStudioPoseParam PoseParameter { get; } public InlineArrayMaxStudioPoseParam OldPoseParameters; public float PrevEventCycle; public int EventSequence; - [NetworkName("m_flEncodedController")] - public InlineArrayMaxStudioBoneCtrls EncodedController; + [NetworkVar("m_flEncodedController")] + public partial ref readonly InlineArrayMaxStudioBoneCtrls EncodedController { get; } public InlineArrayMaxStudioBoneCtrls OldEncodedController; - [NetworkName("m_nSequence")] - [NetworkVar] public partial int Sequence { get; set; } - [NetworkName("m_flPlaybackRate")] - [NetworkVar] public partial TimeUnit_t PlaybackRate { get; set; } - [NetworkName("m_bClientSideAnimation")] - public bool ClientSideAnimation; - [NetworkName("m_bClientSideFrameReset")] - public bool ClientSideFrameReset; - [NetworkName("m_nNewSequenceParity")] - [NetworkVar] public partial int NewSequenceParity { get; set; } - [NetworkName("m_nResetEventsParity")] - [NetworkVar] public partial int ResetEventsParity { get; set; } - [NetworkName("m_nMuzzleFlashParity")] - public int MuzzleFlashParity; - [NetworkName("m_hLightingOrigin")] - public EHANDLE LightingOrigin = new(); - [NetworkName("m_hLightingOriginRelative")] - public EHANDLE LightingOriginRelative = new(); - [NetworkName("m_pBoneManipulator")] - public EHANDLE BoneManipulator = new(); - [NetworkName("m_pFlexManipulator")] - public EHANDLE FlexManipulator = new(); - - public virtual void SetFlexManipulator(BaseEntity? manipulator) => FlexManipulator.Set(manipulator); + [NetworkVar("m_nSequence")] public partial int Sequence { get; set; } + [NetworkVar("m_flPlaybackRate")] public partial TimeUnit_t PlaybackRate { get; set; } + [NetworkVar("m_bClientSideAnimation")] + public partial bool ClientSideAnimation { get; set; } + [NetworkVar("m_bClientSideFrameReset")] + public partial bool ClientSideFrameReset { get; set; } + [NetworkVar("m_nNewSequenceParity")] public partial int NewSequenceParity { get; set; } + [NetworkVar("m_nResetEventsParity")] public partial int ResetEventsParity { get; set; } + [NetworkVar("m_nMuzzleFlashParity")] + public partial int MuzzleFlashParity { get; set; } + [NetworkVar("m_hLightingOrigin")] + public partial EHANDLE LightingOrigin { get; set; } + [NetworkVar("m_hLightingOriginRelative")] + public partial EHANDLE LightingOriginRelative { get; set; } + [NetworkVar("m_pBoneManipulator")] + public partial EHANDLE BoneManipulator { get; set; } + [NetworkVar("m_pFlexManipulator")] + public partial EHANDLE FlexManipulator { get; set; } + + public virtual void SetFlexManipulator(BaseEntity? manipulator) => FlexManipulator = EHANDLE.FromEntity(manipulator); public virtual BaseEntity? GetFlexManipulator(bool create) { if (FlexManipulator.Get() == null && create) { @@ -147,16 +157,15 @@ public partial class BaseAnimating : BaseEntity return FlexManipulator.Get(); } - [NetworkName("m_fadeMinDist")] - public float FadeMinDist; - [NetworkName("m_fadeMaxDist")] - public float FadeMaxDist; - [NetworkName("m_flFadeScale")] - public float FadeScale; - [NetworkName("m_flCycle")] - [NetworkVar] public partial TimeUnit_t Cycle { get; set; } - [NetworkName("m_OverrideViewTarget")] - public Vector3 OverrideViewTarget; + [NetworkVar("m_fadeMinDist")] + public partial float FadeMinDist { get; set; } + [NetworkVar("m_fadeMaxDist")] + public partial float FadeMaxDist { get; set; } + [NetworkVar("m_flFadeScale")] + public partial float FadeScale { get; set; } + [NetworkVar("m_flCycle")] public partial TimeUnit_t Cycle { get; set; } + [NetworkVar("m_OverrideViewTarget")] + public partial Vector3 OverrideViewTarget { get; set; } public override void SetModel(ReadOnlySpan modelName) { UnlockStudioHdr(); @@ -226,7 +235,7 @@ public float SetBoneController(int controller, float value) { Assert(controller >= 0 && controller < NUM_BONECTRLS); float retVal = BoneSetup.Studio_SetController(model, controller, value, out float newValue); - EncodedController[controller] = newValue; + EncodedControllerForModify()[controller] = newValue; return retVal; } @@ -346,7 +355,7 @@ public Activity GetSequenceActivity(int sequence) { public bool IsSequenceFinished() => SequenceFinished; public bool IsDissolving() => (GetFlags() & EntityFlags.Dissolving) != 0; - public virtual void SetLightingOriginRelative(BaseEntity? lightingOriginRelative) => LightingOriginRelative.Set(lightingOriginRelative); + public virtual void SetLightingOriginRelative(BaseEntity? lightingOriginRelative) => LightingOriginRelative = EHANDLE.FromEntity(lightingOriginRelative); public BaseEntity? GetLightingOriginRelative() => LightingOriginRelative.Get(); public bool IsModelScaleFractional() => ModelScale < 1.0f; @@ -917,7 +926,7 @@ public float SetPoseParameter(StudioHdr? studioHdr, int parameter, float value) if (parameter >= 0) { value = BoneSetup.Studio_SetPoseParameter(studioHdr, parameter, value, out float newValue); - PoseParameter[parameter] = newValue; + PoseParameterForModify()[parameter] = newValue; } return value; diff --git a/Game.Server/BaseAnimatingOverlay.cs b/Game.Server/BaseAnimatingOverlay.cs index 23a03cbe..2536c2f6 100644 --- a/Game.Server/BaseAnimatingOverlay.cs +++ b/Game.Server/BaseAnimatingOverlay.cs @@ -7,24 +7,24 @@ namespace Game.Server; -using FIELD = Source.FIELD; - [NetworkName("CBaseAnimatingOverlay")] -public class BaseAnimatingOverlay : BaseAnimating +public partial class BaseAnimatingOverlay : BaseAnimating { public const int MAX_OVERLAYS = 15; internal static readonly ConVar ai_sequence_debug = new("ai_sequence_debug", "0"); - public static readonly SendTable DT_OverlayVars = new(nameof(DT_OverlayVars), [ - SendPropList(FIELD.OF(nameof(AnimOverlay)), MAX_OVERLAYS, SendPropDataTable(null, AnimationLayerRef.DT_Animationlayer)) - ]); + [NetworkTable("DT_OverlayVars")] + public static readonly NetworkProp[] OverlayVarsProps = [ + new(nameof(AnimOverlay)) { Encoding = NetEncoding.List, Count = MAX_OVERLAYS, DataTable = "DT_Animationlayer" }, + ]; - public static readonly SendTable DT_BaseAnimatingOverlay = new(DT_BaseAnimating, [ - SendPropDataTable("overlay_vars", 0, DT_OverlayVars) - ]); public static readonly new ServerClass ServerClass = new ServerClass(DT_BaseAnimatingOverlay); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(OverlayVarsProps)) { Name = "overlay_vars" }, + ]; - [NetworkName("m_AnimOverlay")] + [NetworkVar("m_AnimOverlay")] readonly List AnimOverlay = []; public AnimationLayerRef GetAnimOverlay(int i) { diff --git a/Game.Server/BaseBeam.cs b/Game.Server/BaseBeam.cs index 0430ccff..5f3e1b42 100644 --- a/Game.Server/BaseBeam.cs +++ b/Game.Server/BaseBeam.cs @@ -3,57 +3,56 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; -[NetworkName("CTEBaseBeam")] -public class BaseBeam(ReadOnlySpan name) : BaseTempEntity(name) +[NetworkName("CTEBaseBeam", Table = "DT_BaseBeam", NoBase = true)] +public partial class BaseBeam(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_BaseBeam = new([ - SendPropInt(FIELD.OF(nameof(ModelIndex)), 14, 0), - SendPropInt(FIELD.OF(nameof(HaloIndex)), 14, 0), - SendPropInt(FIELD.OF(nameof(StartFrame)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(FrameRate)), 8, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(Life)), 8, 0, 0.0f, 25.6f), - SendPropFloat(FIELD.OF(nameof(Width)), 10, 0, 0.0f, 128.0f), - SendPropFloat(FIELD.OF(nameof(EndWidth)), 10, 0, 0.0f, 128.0f), - SendPropInt(FIELD.OF(nameof(FadeLength)), 8, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(Amplitude)), 8, 0, 0.0f, 64.0f), - SendPropInt(FIELD.OF(nameof(Speed)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(R)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(G)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(B)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(A)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Flags)), 20, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_BaseBeam); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(HaloIndex)) { Bits = 14 }, + new(nameof(StartFrame)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(FrameRate)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Life)) { Bits = 8, Low = 0.0f, High = 25.6f }, + new(nameof(Width)) { Bits = 10, Low = 0.0f, High = 128.0f }, + new(nameof(EndWidth)) { Bits = 10, Low = 0.0f, High = 128.0f }, + new(nameof(FadeLength)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Amplitude)) { Bits = 8, Low = 0.0f, High = 64.0f }, + new(nameof(Speed)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(R)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(G)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(B)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(A)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Flags)) { Bits = 20, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_nHaloIndex")] + [NetworkVar("m_nHaloIndex")] public int HaloIndex; - [NetworkName("m_nStartFrame")] + [NetworkVar("m_nStartFrame")] public int StartFrame; - [NetworkName("m_nFrameRate")] + [NetworkVar("m_nFrameRate")] public int FrameRate; - [NetworkName("m_fLife")] + [NetworkVar("m_fLife")] public float Life; - [NetworkName("m_fWidth")] + [NetworkVar("m_fWidth")] public float Width; - [NetworkName("m_fEndWidth")] + [NetworkVar("m_fEndWidth")] public float EndWidth; - [NetworkName("m_nFadeLength")] + [NetworkVar("m_nFadeLength")] public int FadeLength; - [NetworkName("m_fAmplitude")] + [NetworkVar("m_fAmplitude")] public float Amplitude; - [NetworkName("m_nSpeed")] + [NetworkVar("m_nSpeed")] public int Speed; - [NetworkName("r")] + [NetworkVar("r")] public int R; - [NetworkName("g")] + [NetworkVar("g")] public int G; - [NetworkName("b")] + [NetworkVar("b")] public int B; - [NetworkName("a")] + [NetworkVar("a")] public int A; - [NetworkName("m_nFlags")] + [NetworkVar("m_nFlags")] public int Flags; } diff --git a/Game.Server/BaseCombatCharacter.cs b/Game.Server/BaseCombatCharacter.cs index ebf5a7b1..16d38f89 100644 --- a/Game.Server/BaseCombatCharacter.cs +++ b/Game.Server/BaseCombatCharacter.cs @@ -13,8 +13,6 @@ namespace Game.Server; -using FIELD = Source.FIELD; - [Flags] public enum Capability { @@ -70,6 +68,12 @@ public class Relationship [NetworkName("CBaseCombatCharacter")] public partial class BaseCombatCharacter : BaseFlex { + public BaseCombatCharacter() { + MyWeaponsForModify() = new(); + LastWeapon = new(); + ActiveWeapon = new(); + } + public bool ForceServerRagdoll; public virtual Source.Common.Mathematics.QAngle BodyAngles() => GetAbsAngles(); @@ -219,52 +223,57 @@ public virtual bool FInViewCone(in Vector3 spot) { public virtual bool IsInAVehicle() => false; public virtual bool ExitVehicle() => false; - public static readonly SendTable DT_BCCLocalPlayerExclusive = new(nameof(DT_BCCLocalPlayerExclusive), [ - SendPropTime64(FIELD.OF(nameof(NextAttack))), - ]); + [NetworkTable("DT_BCCLocalPlayerExclusive")] + public static readonly NetworkProp[] BCCLocalPlayerExclusiveProps = [ + nameof(NextAttack), + ]; - public static readonly SendTable DT_BaseCombatCharacter = new(DT_BaseFlex, [ - SendPropDataTable( "bcc_localdata", DT_BCCLocalPlayerExclusive, SendProxy_SendBaseCombatCharacterLocalDataTable ), - SendPropEHandle(FIELD.OF(nameof(ActiveWeapon))), - SendPropArray3(FIELD.OF_ARRAY(nameof(MyWeapons)), SendPropEHandle( FIELD.OF_ARRAY(nameof(MyWeapons)))), - SendPropInt(FIELD.OF(nameof(BloodColor)), 5, 0) - ]); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(BCCLocalPlayerExclusiveProps)) { Name = "bcc_localdata", Proxy = typeof(BCCLocalDataProxy) }, + nameof(ActiveWeapon), + nameof(MyWeapons), + new(nameof(BloodColor)) { Bits = 5 }, + ]; public TimeUnit_t GetNextAttack() => NextAttack; public void SetNextAttack(TimeUnit_t wait) => NextAttack = wait; - [NetworkName("m_flNextAttack")] - public TimeUnit_t NextAttack; + [NetworkVar("m_flNextAttack")] + public partial TimeUnit_t NextAttack { get; set; } public float ImpactEnergyScale; - [NetworkName("m_hLastWeapon")] - public Handle LastWeapon = new(); - [NetworkName("m_hActiveWeapon")] - public Handle ActiveWeapon = new(); - [NetworkName("m_hMyWeapons")] - public InlineArrayNewMaxWeapons> MyWeapons = new(); - [NetworkName("m_iAmmo")] - [NetworkArraySize(MAX_AMMO_TYPES)] public readonly NetworkArray Ammo = new(MAX_AMMO_TYPES); - [NetworkName("m_bloodColor")] - public BloodColor BloodColor; - - private static object? SendProxy_SendBaseCombatCharacterLocalDataTable(SendProp prop, object instance, IFieldAccessor data, SendProxyRecipients recipients, int objectID) { - recipients.ClearAllRecipients(); - - BaseCombatCharacter character = (BaseCombatCharacter)instance; - if (character != null) { - if (character.IsPlayer()) - recipients.SetOnly(character.EntIndex() - 1); - else { - IServerVehicle vehicle = character.GetServerVehicle(); - if (vehicle != null) { - BaseCombatCharacter driver = vehicle.GetPassenger(); - if (driver != null) - recipients.SetOnly(driver.EntIndex() - 1); + [NetworkVar("m_hLastWeapon")] + public partial Handle LastWeapon { get; set; } + [NetworkVar("m_hActiveWeapon")] + public partial Handle ActiveWeapon { get; set; } + [NetworkVar("m_hMyWeapons")] + public partial ref readonly InlineArrayNewMaxWeapons> MyWeapons { get; } + [NetworkVar("m_iAmmo")] + public partial ref readonly InlineArray256 Ammo { get; } + [NetworkVar("m_bloodColor")] + public partial BloodColor BloodColor { get; set; } + + public static class BCCLocalDataProxy + { + public static object? Send(SendProp prop, object instance, IFieldAccessor data, SendProxyRecipients recipients, int objectID) { + recipients.ClearAllRecipients(); + + BaseCombatCharacter character = (BaseCombatCharacter)instance; + if (character != null) { + if (character.IsPlayer()) + recipients.SetOnly(character.EntIndex() - 1); + else { + IServerVehicle vehicle = character.GetServerVehicle(); + if (vehicle != null) { + BaseCombatCharacter driver = vehicle.GetPassenger(); + if (driver != null) + recipients.SetOnly(driver.EntIndex() - 1); + } } } - } - return instance; + return instance; + } } public override void SetTransmit(CheckTransmitInfo info, bool always) { if (info.TransmitEdict.Get(EntIndex()) != 0) @@ -635,7 +644,7 @@ public override void UpdateOnRemove() { public virtual void Weapon_Equip(BaseCombatWeapon weapon) { for (int i = 0; i < MAX_WEAPONS; i++) { if (MyWeapons[i].Get() == null) { - MyWeapons[i].Set(weapon); + MyWeaponsForModify()[i].Set(weapon); break; } } @@ -752,7 +761,7 @@ public virtual int GiveAmmo(int count, int ammoIndex, bool suppressSound = false if (!suppressSound) EmitSound("BaseCombatCharacter.AmmoPickup"); - Ammo.Set(ammoIndex, Ammo[ammoIndex] + add); + AmmoForModify()[ammoIndex] = Ammo[ammoIndex] + add; return add; } @@ -769,7 +778,7 @@ public int GiveAmmo(int count, ReadOnlySpan name, bool suppressSound = fal public void SetActiveWeapon(BaseCombatWeapon? newWeapon) { BaseCombatWeapon? oldWeapon = ActiveWeapon.Get(); if (newWeapon != oldWeapon) { - ActiveWeapon.Set(newWeapon); + ActiveWeapon = Handle.FromEntity(newWeapon); OnChangeActiveWeapon(oldWeapon, newWeapon); } } @@ -795,8 +804,6 @@ public override void SetLightingOriginRelative(BaseEntity? lightingOrigin) { public int WeaponCount() => MAX_WEAPONS; public BaseCombatWeapon? GetWeapon(int i) => MyWeapons[i].Get(); - public static readonly new ServerClass ServerClass = new ServerClass(DT_BaseCombatCharacter); - public override void DoMuzzleFlash() { BaseCombatWeapon? weapon = GetActiveWeapon(); if (weapon != null) diff --git a/Game.Server/BaseEntity.cs b/Game.Server/BaseEntity.cs index 5c0eb144..535809a8 100644 --- a/Game.Server/BaseEntity.cs +++ b/Game.Server/BaseEntity.cs @@ -549,9 +549,116 @@ public static void CC_Ent_Orient(in TokenizedCommand args) { } [LinkEntityToClass("func_proprrespawnzone")] -[NetworkName("CBaseEntity")] +[NetworkName("CBaseEntity", NoBase = true)] public partial class BaseEntity : IServerEntity { + [NetworkTable("DT_AnimTimeMustBeFirst")] + public static readonly NetworkProp[] AnimTimeMustBeFirstProps = [ + new(nameof(AnimTime)) { Encoding = NetEncoding.Int, Bits = 8, Flags = PropFlags.Unsigned | PropFlags.ChangesOften | PropFlags.EncodedAgainstTickCount, Proxy = typeof(AnimTimeProxy) }, + ]; + + [NetworkTable("DT_PredictableId")] + public static readonly NetworkProp[] PredictableIdProps = [ + new(nameof(PredictableId)) { Encoding = NetEncoding.PredictableId }, + new(nameof(b_IsPlayerSimulated)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + ]; + + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(AnimTimeMustBeFirstProps)) { Proxy = typeof(BaseEntity.ClientSideAnimationProxy) }, + new(nameof(SimulationTime)) { Encoding = NetEncoding.Int, Bits = SIMULATION_TIME_WINDOW_BITS, Flags = PropFlags.Unsigned | PropFlags.ChangesOften | PropFlags.EncodedAgainstTickCount, Proxy = typeof(SimulationTimeProxy) }, + new(nameof(Origin)) { Bits = -1, Flags = PropFlags.Coord | PropFlags.ChangesOften, Low = 0.0f, High = Constants.HIGH_DEFAULT, Proxy = typeof(OriginProxy) }, + new(nameof(InterpolationFrame)) { Bits = NOINTERP_PARITY_MAX_BITS, Flags = PropFlags.Unsigned }, + new(nameof(ModelIndex)) { Encoding = NetEncoding.ModelIndex }, + new(nameof(Collision)) { Encoding = NetEncoding.DataTable, DataTable = "DT_CollisionProperty" }, + new(nameof(RenderFX)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(RenderMode)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Effects)) { Bits = (int)EntityEffects.MaxBits, Flags = PropFlags.Unsigned }, + new(nameof(ColorRender)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(TeamNum)) { Bits = TEAMNUM_NUM_BITS }, + new(nameof(CollisionGroup)) { Bits = 5, Flags = PropFlags.Unsigned }, + new(nameof(Elasticity)) { Bits = 0, Flags = PropFlags.Coord | PropFlags.NoScale }, + new(nameof(ShadowCastDistance)) { Bits = 12, Flags = PropFlags.Unsigned }, + nameof(OwnerEntity), + nameof(EffectEntity), + nameof(MoveParent), + new(nameof(ParentAttachment)) { Bits = NUM_PARENTATTACHMENT_BITS, Flags = PropFlags.Unsigned }, + new(nameof(MoveType)) { Bits = (int)Source.MoveType.MaxBits, Flags = PropFlags.Unsigned }, + new(nameof(MoveCollide)) { Bits = (int)Source.MoveCollide.MaxBits, Flags = PropFlags.Unsigned }, + new(nameof(Rotation)) { Bits = 24, Flags = PropFlags.ChangesOften | PropFlags.RoundDown, Proxy = typeof(AnglesProxy) }, + new(nameof(TextureFrameIndex)) { Encoding = NetEncoding.Int, Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(PredictableIdProps)) { Name = "predictable_id", Proxy = typeof(BaseEntity.PredictableIdProxy) }, + new(nameof(SimulatedEveryTick)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(AnimatedEveryTick)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + nameof(AlternateSorting), + new(nameof(m_takedamage)) { Bits = 8 }, + new(nameof(RealClassName)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(OverrideMaterial)) { Bits = 16, Flags = PropFlags.Unsigned, Proxy = typeof(OverrideMaterialProxy) }, + new(nameof(OverrideSubMaterials)) { Encoding = NetEncoding.Array2, Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(Health)) { Bits = 32, Flags = PropFlags.Normal | PropFlags.ChangesOften | PropFlags.VarInt }, + new(nameof(MaxHealth)) { Bits = 32 }, + new(nameof(SpawnFlags)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(GModFlags)) { Bits = 7 }, + nameof(OnFire), + new(nameof(CreationTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Velocity)) { Encoding = NetEncoding.VectorElements, Bits = 0, Flags = PropFlags.NoScale | PropFlags.ChangesOften }, + new(nameof(GMOD_DataTable)) { Encoding = NetEncoding.GModTable }, + nameof(GMOD_bool), + nameof(GMOD_float), + nameof(GMOD_int), + nameof(GMOD_Vector), + new(nameof(GMOD_QAngle)) { Bits = 32, Flags = PropFlags.RoundDown }, + nameof(GMOD_EHANDLE), + new(nameof(GMOD_String0)) { Encoding = NetEncoding.String }, + new(nameof(GMOD_String1)) { Encoding = NetEncoding.String }, + new(nameof(GMOD_String2)) { Encoding = NetEncoding.String }, + new(nameof(GMOD_String3)) { Encoding = NetEncoding.String }, + new(nameof(CreationID)) { Bits = 24 }, + new(nameof(MapCreatedID)) { Bits = 16 }, + ]; + + public static class AnimTimeProxy + { + public static void Send(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) + => SendProxy_AnimTime(prop, instance, field, ref outData, element, objectID); + } + + public static class SimulationTimeProxy + { + public static void Send(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) + => SendProxy_SimulationTime(prop, instance, field, ref outData, element, objectID); + } + + public static class OriginProxy + { + public static void Send(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) + => SendProxy_Origin(prop, instance, field, ref outData, element, objectID); + } + + public static class AnglesProxy + { + public static void Send(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) + => SendProxy_Angles(prop, instance, field, ref outData, element, objectID); + } + + public static class OverrideMaterialProxy + { + public static void Send(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) + => SendProxy_OverrideMaterial(prop, instance, field, ref outData, element, objectID); + } + + public static class ClientSideAnimationProxy + { + public static object? Send(SendProp prop, object instance, IFieldAccessor data, SendProxyRecipients recipients, int objectID) + => SendProxy_ClientSideAnimation(prop, instance, data, recipients, objectID); + } + + public static class PredictableIdProxy + { + public static object? Send(SendProp prop, object instance, IFieldAccessor data, SendProxyRecipients recipients, int objectID) + => SendProxy_SendPredictableId(prop, instance, data, recipients, objectID); + } + public static Edict? g_pForceAttachEdict; public delegate void BASEPTR(BaseEntity self); @@ -682,9 +789,6 @@ internal static void SendProxy_SimulationTime(SendProp prop, object instance, IF outData.Int = addt; } - public static SendTable DT_AnimTimeMustBeFirst = new(nameof(DT_AnimTimeMustBeFirst), [ - SendPropInt (FIELD.OF(nameof(AnimTime)), 8, PropFlags.Unsigned|PropFlags.ChangesOften|PropFlags.EncodedAgainstTickCount, proxyFn: SendProxy_AnimTime), - ]); public virtual int Save(ISave save) { throw new NotImplementedException(); } public virtual int Restore(IRestore save) { throw new NotImplementedException(); } @@ -706,82 +810,16 @@ public virtual void OnRestore() { else return null; } - public static SendTable DT_PredictableId = new(nameof(DT_PredictableId), [ - SendPropPredictableId(FIELD.OF(nameof(PredictableId))), - SendPropInt(FIELD.OF(nameof(b_IsPlayerSimulated)), 1, PropFlags.Unsigned) - ]); - public static SendTable DT_BaseEntity = new([ - SendPropDataTable("AnimTimeMustBeFirst", DT_AnimTimeMustBeFirst, SendProxy_ClientSideAnimation), - - SendPropInt(FIELD.OF(nameof(SimulationTime)), SIMULATION_TIME_WINDOW_BITS, PropFlags.Unsigned | PropFlags.ChangesOften | PropFlags.EncodedAgainstTickCount, proxyFn: SendProxy_SimulationTime /* todo */), - SendPropVector(NetworkVarFields.Origin, -1, PropFlags.Coord | PropFlags.ChangesOften, 0, Constants.HIGH_DEFAULT, SendProxy_Origin), - SendPropInt(FIELD.OF(nameof(InterpolationFrame)), NOINTERP_PARITY_MAX_BITS, PropFlags.Unsigned), - SendPropModelIndex(FIELD.OF(nameof(ModelIndex))), - SendPropDataTable("m_Collision", FIELD.OF(nameof(Collision)), CollisionProperty.DT_CollisionProperty), - SendPropInt(FIELD.OF(nameof(RenderFX)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(RenderMode)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Effects)), (int)EntityEffects.MaxBits, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(ColorRender)), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(TeamNum)), TEAMNUM_NUM_BITS, 0), - SendPropInt(FIELD.OF(nameof(CollisionGroup)), 5, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(Elasticity)), 0, PropFlags.Coord | PropFlags.NoScale), - SendPropFloat(NetworkVarFields.ShadowCastDistance, 12, PropFlags.Unsigned), - SendPropEHandle(FIELD.OF(nameof(OwnerEntity))), - SendPropEHandle(FIELD.OF(nameof(EffectEntity))), - SendPropEHandle(FIELD.OF(nameof(MoveParent))), - SendPropInt(FIELD.OF(nameof(ParentAttachment)), NUM_PARENTATTACHMENT_BITS, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(MoveType)), (int)Source.MoveType.MaxBits, PropFlags.Unsigned ), - SendPropInt(FIELD.OF(nameof(MoveCollide)), (int)Source.MoveCollide.MaxBits, PropFlags.Unsigned ), - SendPropQAngles (NetworkVarFields.Rotation, 24, PropFlags.ChangesOften | PropFlags.RoundDown, SendProxy_Angles ), - SendPropInt( FIELD.OF(nameof( TextureFrameIndex) ), 8, PropFlags.Unsigned ), - SendPropDataTable( "predictable_id", DT_PredictableId, SendProxy_SendPredictableId ), - SendPropInt(FIELD.OF(nameof(SimulatedEveryTick)), 1, PropFlags.Unsigned ), - SendPropInt(FIELD.OF(nameof(AnimatedEveryTick)), 1, PropFlags.Unsigned ), - SendPropBool( NetworkVarFields.AlternateSorting ), - - // The rest of this is Garry's Mod specific in order - SendPropInt(FIELD.OF(nameof(m_takedamage)), 8), - SendPropInt(FIELD.OF(nameof(RealClassName)), 16, PropFlags.Unsigned), - - SendPropInt(FIELD.OF(nameof(OverrideMaterial)), 16, PropFlags.Unsigned, SendProxy_OverrideMaterial), - - SendPropInt(FIELD.OF_SENDINFO_ARRAY(nameof(OverrideSubMaterials)), 16, PropFlags.Unsigned), - SendPropArray2(null, 32, "m_OverrideSubMaterials"), - - SendPropInt(FIELD.OF(nameof(Health)), 32, PropFlags.Normal | PropFlags.ChangesOften | PropFlags.VarInt), - SendPropInt(NetworkVarFields.MaxHealth, 32), - SendPropInt(FIELD.OF(nameof(SpawnFlags)), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(GModFlags)), 7), - SendPropBool(FIELD.OF(nameof(OnFire))), - SendPropFloat(FIELD.OF(nameof(CreationTime)), 0, PropFlags.NoScale), - - SendPropFloat(FIELD.OF_VECTORELEM(nameof(Velocity), 0), 0, PropFlags.NoScale | PropFlags.ChangesOften), - SendPropFloat(FIELD.OF_VECTORELEM(nameof(Velocity), 1), 0, PropFlags.NoScale | PropFlags.ChangesOften), - SendPropFloat(FIELD.OF_VECTORELEM(nameof(Velocity), 2), 0, PropFlags.NoScale | PropFlags.ChangesOften), - - SendPropGModTable(FIELD.OF(nameof(GMOD_DataTable))), - - // Addon exposed data tables - SendPropArray3(FIELD.OF_ARRAY(nameof(GMOD_bool)), SendPropBool(FIELD.OF_ARRAYINDEX(nameof(GMOD_bool), 0))), - SendPropArray3(FIELD.OF_ARRAY(nameof(GMOD_float)), SendPropFloat(FIELD.OF_ARRAYINDEX(nameof(GMOD_float), 0))), - SendPropArray3(FIELD.OF_ARRAY(nameof(GMOD_int)), SendPropInt(FIELD.OF_ARRAYINDEX(nameof(GMOD_int), 0))), - SendPropArray3(FIELD.OF_ARRAY(nameof(GMOD_Vector)),SendPropVector(FIELD.OF_ARRAYINDEX(nameof(GMOD_Vector), 0))), - SendPropArray3(FIELD.OF_ARRAY(nameof(GMOD_QAngle)), SendPropQAngles(FIELD.OF_ARRAYINDEX(nameof(GMOD_QAngle), 0), 32, PropFlags.RoundDown)), - SendPropArray3(FIELD.OF_ARRAY(nameof(GMOD_EHANDLE)), SendPropEHandle(FIELD.OF_ARRAYINDEX(nameof(GMOD_EHANDLE), 0))), - SendPropString(FIELD.OF(nameof(GMOD_String0))), - SendPropString(FIELD.OF(nameof(GMOD_String1))), - SendPropString(FIELD.OF(nameof(GMOD_String2))), - SendPropString(FIELD.OF(nameof(GMOD_String3))), - - // Creation IDs - SendPropInt(FIELD.OF(nameof(CreationID)), 24), - SendPropInt(FIELD.OF(nameof(MapCreatedID)), 16), - ]); public BaseEntity() : this(false) { } public BaseEntity(bool serverOnly) { + GMOD_EHANDLEForModify() = new(); + OwnerEntity = new(); + EffectEntity = new(); + MoveParent = new(); + GroundEntity = new(); CollisionGroup = (int)Source.CollisionGroup.None; CollisionProp().Init(this); @@ -1851,146 +1889,135 @@ public bool IsFloating() { return ent; } - [NetworkName("m_nRenderFX")] - public byte RenderFX; - [NetworkName("m_nRenderMode")] - public byte RenderMode; + [NetworkVar("m_flAnimTime")] + public partial TimeUnit_t AnimTime { get; set; } + [NetworkVar("m_flSimulationTime")] + public partial TimeUnit_t SimulationTime { get; set; } + [NetworkVar("m_vecOrigin")] + public partial Vector3 Origin { get; set; } + [NetworkVar("m_ubInterpolationFrame")] + public partial byte InterpolationFrame { get; set; } + [NetworkVar("m_nModelIndex")] + public partial int ModelIndex { get; set; } + [NetworkVar("m_Collision")] + public readonly CollisionProperty Collision = new(); + [NetworkVar("m_nRenderFX")] + public partial byte RenderFX { get; set; } + [NetworkVar("m_nRenderMode")] + public partial byte RenderMode { get; set; } + [NetworkVar("m_fEffects")] + public partial int Effects { get; set; } + [NetworkVar("m_clrRender")] + public partial Source.Color ColorRender { get; set; } + [NetworkVar("m_iTeamNum")] + public partial int TeamNum { get; set; } + [NetworkVar("m_CollisionGroup")] + public partial int CollisionGroup { get; set; } + [NetworkVar("m_flElasticity")] + public partial float Elasticity { get; set; } + [NetworkVar("m_flShadowCastDistance")] + public partial float ShadowCastDistance { get; set; } + [NetworkVar("m_hOwnerEntity")] + public partial EHANDLE OwnerEntity { get; set; } + [NetworkVar("m_hEffectEntity")] + public partial EHANDLE EffectEntity { get; set; } + [NetworkVar("moveparent")] + public partial EHANDLE MoveParent { get; set; } + [NetworkVar("m_iParentAttachment")] + public partial byte ParentAttachment { get; set; } + [NetworkVar("movetype")] + public partial byte MoveType { get; set; } + [NetworkVar("movecollide")] + public partial byte MoveCollide { get; set; } + [NetworkVar("m_angRotation")] + public partial QAngle Rotation { get; set; } + [NetworkVar("m_iTextureFrameIndex")] + public partial bool TextureFrameIndex { get; set; } + [NetworkVar("m_PredictableID")] + public readonly PredictableId PredictableId = new(); + [NetworkVar("m_bSimulatedEveryTick")] + public partial bool SimulatedEveryTick { get; set; } + [NetworkVar("m_bAnimatedEveryTick")] + public partial bool AnimatedEveryTick { get; set; } + [NetworkVar("m_bAlternateSorting")] + public partial bool AlternateSorting { get; set; } + [NetworkVar("m_takedamage")] + public partial byte m_takedamage { get; set; } + [NetworkVar("m_RealClassName")] + public partial ushort RealClassName { get; set; } + [NetworkVar("m_OverrideMaterial")] + public partial ushort OverrideMaterial { get; set; } + [NetworkVar("m_OverrideSubMaterials")] + public partial ref readonly InlineArray32 OverrideSubMaterials { get; } + [NetworkVar("m_iHealth")] + public partial int Health { get; set; } + [NetworkVar("m_iMaxHealth")] + public partial int MaxHealth { get; set; } + [NetworkVar("m_spawnflags")] + public partial int SpawnFlags { get; set; } + [NetworkVar("m_iGModFlags")] + public partial int GModFlags { get; set; } + [NetworkVar("m_bOnFire")] + public partial bool OnFire { get; set; } + [NetworkVar("m_CreationTime")] + public partial float CreationTime { get; set; } + [NetworkVar("m_vecVelocity")] + public partial Vector3 Velocity { get; set; } + [NetworkVar("m_GMOD_DataTable")] + public readonly IGMODDataTable GMOD_DataTable; + [NetworkVar("m_GMOD_bool")] + public partial ref readonly InlineArray32 GMOD_bool { get; } + [NetworkVar("m_GMOD_float")] + public partial ref readonly InlineArray32 GMOD_float { get; } + [NetworkVar("m_GMOD_int")] + public partial ref readonly InlineArray32 GMOD_int { get; } + [NetworkVar("m_GMOD_Vector")] + public partial ref readonly InlineArray32 GMOD_Vector { get; } + [NetworkVar("m_GMOD_QAngle")] + public partial ref readonly InlineArray32 GMOD_QAngle { get; } + [NetworkVar("m_GMOD_EHANDLE")] + public partial ref readonly InlineArrayNew32 GMOD_EHANDLE { get; } + [NetworkVar("m_GMOD_String0")] + public partial ref readonly InlineArray512 GMOD_String0 { get; } + [NetworkVar("m_GMOD_String1")] + public partial ref readonly InlineArray512 GMOD_String1 { get; } + [NetworkVar("m_GMOD_String2")] + public partial ref readonly InlineArray512 GMOD_String2 { get; } + [NetworkVar("m_GMOD_String3")] + public partial ref readonly InlineArray512 GMOD_String3 { get; } + [NetworkVar("m_iCreationID")] + public partial int CreationID { get; set; } + [NetworkVar("m_iMapCreatedID")] + public partial int MapCreatedID { get; set; } + [NetworkVar("m_hGroundEntity")] + public partial EHANDLE GroundEntity { get; set; } + [NetworkVar("m_lifeState")] + public partial int LifeState { get; set; } + [NetworkVar("m_vecBaseVelocity")] + public partial Vector3 BaseVelocity { get; set; } + [NetworkVar("m_nNextThinkTick")] + public partial int NextThinkTick { get; set; } + [NetworkVar("m_nWaterLevel")] + public partial byte WaterLevel { get; set; } + [NetworkVar("m_vecViewOffset")] + public partial Vector3 ViewOffset { get; set; } + [NetworkVar("m_flFriction")] + public partial float Friction { get; set; } + public byte OldRenderMode; - [NetworkName("m_fEffects")] - public int Effects; - [NetworkName("m_clrRender")] - public Source.Color ColorRender; - [NetworkName("m_iTeamNum")] - public int TeamNum; - [NetworkName("m_CollisionGroup")] - public int CollisionGroup; - [NetworkName("m_flElasticity")] - public float Elasticity; - [NetworkName("m_flShadowCastDistance")] - [NetworkVar] public partial float ShadowCastDistance { get; set; } - [NetworkName("m_iParentAttachment")] - public byte ParentAttachment; - [NetworkName("movetype")] - public byte MoveType; - [NetworkName("movecollide")] - public byte MoveCollide; public Vector3 AbsOrigin; public QAngle AbsRotation; - [NetworkName("m_vecOrigin")] - [NetworkVar] public partial Vector3 Origin { get; set; } - [NetworkName("m_angRotation")] - [NetworkVar] public partial QAngle Rotation { get; set; } - [NetworkName("m_iTextureFrameIndex")] - public bool TextureFrameIndex; - [NetworkName("m_bSimulatedEveryTick")] - public bool SimulatedEveryTick; - [NetworkName("m_bAnimatedEveryTick")] - public bool AnimatedEveryTick; - [NetworkName("m_bAlternateSorting")] - [NetworkVar] public partial bool AlternateSorting { get; set; } - - public byte m_takedamage; - [NetworkName("m_RealClassName")] - public ushort RealClassName; - [NetworkName("m_OverrideMaterial")] - public ushort OverrideMaterial; - [NetworkName("m_OverrideSubMaterials")] - public InlineArray32 OverrideSubMaterials; - [NetworkName("m_iHealth")] - public int Health; - [NetworkName("m_iMaxHealth")] - [NetworkVar] public partial int MaxHealth { get; set; } - [NetworkName("m_spawnflags")] - public int SpawnFlags; - [NetworkName("m_iGModFlags")] - public int GModFlags; - [NetworkName("m_bOnFire")] - public bool OnFire; - [NetworkName("m_CreationTime")] - public float CreationTime; - [NetworkName("m_vecVelocity")] - public Vector3 Velocity; - [NetworkName("m_iCreationID")] - public int CreationID; - [NetworkName("m_iMapCreatedID")] - public int MapCreatedID; - public readonly List ThinkFunctions = []; public int CurrentThinkContext = NO_THINK_CONTEXT; - - [NetworkName("m_PredictableID")] - public readonly PredictableId PredictableId = new(); - - [NetworkName("m_GMOD_DataTable")] - public readonly IGMODDataTable GMOD_DataTable; - public float Speed; - - [NetworkName("m_hOwnerEntity")] - public EHANDLE OwnerEntity = new(); - [NetworkName("m_hEffectEntity")] - public EHANDLE EffectEntity = new(); - [NetworkName("moveparent")] - public EHANDLE MoveParent = new(); public EHANDLE MoveChild = new(); public EHANDLE MovePeer = new(); - [NetworkName("m_hGroundEntity")] - public EHANDLE GroundEntity = new(); - public string? ModelName; - - [NetworkName("m_lifeState")] - public int LifeState; - [NetworkName("m_vecBaseVelocity")] - public Vector3 BaseVelocity; - [NetworkName("m_nNextThinkTick")] - public int NextThinkTick; public int LastThinkTick; - [NetworkName("m_nWaterLevel")] - public byte WaterLevel; public byte WaterType; - - [NetworkName("m_GMOD_bool")] - public InlineArray32 GMOD_bool; - [NetworkName("m_GMOD_float")] - public InlineArray32 GMOD_float; - [NetworkName("m_GMOD_int")] - public InlineArray32 GMOD_int; - [NetworkName("m_GMOD_Vector")] - public InlineArray32 GMOD_Vector; - [NetworkName("m_GMOD_QAngle")] - public InlineArray32 GMOD_QAngle; - [NetworkName("m_GMOD_EHANDLE")] - public InlineArrayNew32 GMOD_EHANDLE = new(); - [NetworkName("m_GMOD_String0")] - public InlineArray512 GMOD_String0; - [NetworkName("m_GMOD_String1")] - public InlineArray512 GMOD_String1; - [NetworkName("m_GMOD_String2")] - public InlineArray512 GMOD_String2; - [NetworkName("m_GMOD_String3")] - public InlineArray512 GMOD_String3; - public int DataObjectTypes; - - public static readonly ServerClass ServerClass = new ServerClass(DT_BaseEntity); - - [NetworkName("m_flAnimTime")] - public TimeUnit_t AnimTime; public TimeUnit_t PrevAnimTime; - [NetworkName("m_flSimulationTime")] - public TimeUnit_t SimulationTime; - [NetworkName("m_vecViewOffset")] - public Vector3 ViewOffset; public Vector3 NetworkAngles; - [NetworkName("m_ubInterpolationFrame")] - public byte InterpolationFrame; - [NetworkName("m_nModelIndex")] - public int ModelIndex; - [NetworkName("m_Collision")] - public CollisionProperty Collision = new(); - [NetworkName("m_flFriction")] - public float Friction; public long SimulationTick; public virtual Vector3 BodyTarget(in Vector3 posSrc, bool noisy) => WorldSpaceCenter(); @@ -2544,7 +2571,7 @@ public virtual void SetOwnerEntity(BaseEntity? owner) { return; if (OwnerEntity.Get() != owner) { NetworkStateChanged(); - OwnerEntity.Set(owner); + OwnerEntity = EHANDLE.FromEntity(owner); } CollisionRulesChanged(); OnOwnerChanged(); @@ -2647,7 +2674,7 @@ public void SetAIWalkable(bool blocksLOS) { public Vector3 AbsVelocity; public QAngle AngVelocity; - public ref readonly Vector3 GetLocalVelocity() => ref Velocity; + public ref readonly Vector3 GetLocalVelocity() => ref __nv_Velocity; public ref readonly Vector3 GetAbsVelocity() { if (IsEFlagSet(EFL.DirtyAbsVelocity)) @@ -3166,13 +3193,13 @@ public void SetRefEHandle(in BaseHandle handle) { edict.NetworkSerialNumber = (short)(RefEHandle.GetSerialNumber() & ((1 << Constants.NUM_NETWORKED_EHANDLE_SERIAL_NUMBER_BITS) - 1)); } - [NetworkName("m_fFlags")] - protected int flags; + [NetworkVar("m_fFlags")] + protected partial int flags { get; set; } EFL eflags; public Matrix3x4 CoordinateFrame; - public ref readonly Vector3 GetBaseVelocity() => ref BaseVelocity; + public ref readonly Vector3 GetBaseVelocity() => ref __nv_BaseVelocity; public void SetBaseVelocity(in Vector3 v) => BaseVelocity = v; public void SetAbsOrigin(Vector3 vector3) { @@ -3215,7 +3242,7 @@ public ref readonly Vector3 GetAbsOrigin() { return ref AbsOrigin; } - public ref readonly Vector3 GetViewOffset() => ref ViewOffset; + public ref readonly Vector3 GetViewOffset() => ref __nv_ViewOffset; public ref readonly QAngle GetAbsAngles() { Assert(BaseEntity.IsAbsQueriesValid()); diff --git a/Game.Server/BaseFlex.cs b/Game.Server/BaseFlex.cs index 49b4a48f..6ac39a39 100644 --- a/Game.Server/BaseFlex.cs +++ b/Game.Server/BaseFlex.cs @@ -14,37 +14,34 @@ namespace Game.Server; -using FIELD = Source.FIELD; using EventType = Game.Shared.ChoreoEvent.EventType; [LinkEntityToClass("funCBaseFlex")] [NetworkName("CBaseFlex")] -public class BaseFlex : BaseAnimatingOverlay +public partial class BaseFlex : BaseAnimatingOverlay { - public static readonly SendTable DT_BaseFlex = new(DT_BaseAnimatingOverlay, [ - SendPropArray3 (FIELD.OF_ARRAY(nameof(FlexWeight)), SendPropFloat(FIELD.OF_ARRAY(nameof(FlexWeight)), 12, PropFlags.RoundDown, 0.0f, 1.0f )), - SendPropInt (FIELD.OF(nameof(BlinkToggle)), 1, PropFlags.Unsigned ), - SendPropVector (FIELD.OF(nameof(ViewTarget)), -1, PropFlags.Coord), - - SendPropFloat ( FIELD.OF_VECTORELEM(nameof(ViewOffset), 0), 0, PropFlags.NoScale ), - SendPropFloat ( FIELD.OF_VECTORELEM(nameof(ViewOffset), 1), 0, PropFlags.NoScale ), - SendPropFloat ( FIELD.OF_VECTORELEM(nameof(ViewOffset), 2), 0, PropFlags.NoScale ), - - SendPropVector ( FIELD.OF(nameof(Lean)), -1, PropFlags.Coord ), - SendPropVector ( FIELD.OF(nameof(Shift)), -1, PropFlags.Coord ), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_BaseFlex); - - [NetworkName("m_flexWeight")] - public InlineArray96 FlexWeight; - [NetworkName("m_blinktoggle")] - public int BlinkToggle; - [NetworkName("m_viewtarget")] - public Vector3 ViewTarget; - [NetworkName("m_vecLean")] - public Vector3 Lean; - [NetworkName("m_vecShift")] - public Vector3 Shift; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(FlexWeight)) { Bits = 12, Flags = PropFlags.RoundDown, Low = 0.0f, High = 1.0f }, + new(nameof(BlinkToggle)) { Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(ViewTarget)) { Bits = -1, Flags = PropFlags.Coord }, + + new(nameof(ViewOffset)) { Encoding = NetEncoding.VectorElements, Bits = 0, Flags = PropFlags.NoScale }, + + new(nameof(Lean)) { Bits = -1, Flags = PropFlags.Coord }, + new(nameof(Shift)) { Bits = -1, Flags = PropFlags.Coord }, + ]; + + [NetworkVar("m_flexWeight")] + public partial ref readonly InlineArray96 FlexWeight { get; } + [NetworkVar("m_blinktoggle")] + public partial int BlinkToggle { get; set; } + [NetworkVar("m_viewtarget")] + public partial Vector3 ViewTarget { get; set; } + [NetworkVar("m_vecLean")] + public partial Vector3 Lean { get; set; } + [NetworkVar("m_vecShift")] + public partial Vector3 Shift { get; set; } public override void SetModel(ReadOnlySpan modelName) { base.SetModel(modelName); @@ -66,7 +63,7 @@ public void SetFlexWeight(LocalFlexController index, float value) { value = Math.Clamp(value, 0.0f, 1.0f); } - FlexWeight[(int)index] = value; + FlexWeightForModify()[(int)index] = value; } } diff --git a/Game.Server/BaseHLBludgeonWeapon.cs b/Game.Server/BaseHLBludgeonWeapon.cs index f3159019..c9ec3ceb 100644 --- a/Game.Server/BaseHLBludgeonWeapon.cs +++ b/Game.Server/BaseHLBludgeonWeapon.cs @@ -5,10 +5,10 @@ namespace Game.Server; [NetworkName("CBaseHLBludgeonWeapon")] -public class BaseHLBludgeonWeapon : BaseHLCombatWeapon +public partial class BaseHLBludgeonWeapon : BaseHLCombatWeapon { - public static readonly SendTable DT_BaseHLBludgeonWeapon = new(DT_BaseHLCombatWeapon, [ + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; - ]); - public static new readonly ServerClass ServerClass = new ServerClass(DT_BaseHLBludgeonWeapon); } diff --git a/Game.Server/BaseHLCombatWeapon.cs b/Game.Server/BaseHLCombatWeapon.cs index a482315b..63156a93 100644 --- a/Game.Server/BaseHLCombatWeapon.cs +++ b/Game.Server/BaseHLCombatWeapon.cs @@ -5,20 +5,20 @@ namespace Game.Server; [NetworkName("CHLMachineGun")] -public class HLMachineGun : BaseHLCombatWeapon +public partial class HLMachineGun : BaseHLCombatWeapon { - public static readonly SendTable DT_HLMachineGun = new(DT_BaseHLCombatWeapon, [ + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; - ]); - public static new readonly ServerClass ServerClass = new ServerClass(DT_HLMachineGun); } [NetworkName("CHLSelectFireMachineGun")] -public class HLSelectFireMachineGun : HLMachineGun +public partial class HLSelectFireMachineGun : HLMachineGun { - public static readonly SendTable DT_HLSelectFireMachineGun = new(DT_HLMachineGun, [ + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; - ]); - public static new readonly ServerClass ServerClass = new ServerClass(DT_HLSelectFireMachineGun); } diff --git a/Game.Server/BaseTempEntity.cs b/Game.Server/BaseTempEntity.cs index 6bcab9ff..f53105fe 100644 --- a/Game.Server/BaseTempEntity.cs +++ b/Game.Server/BaseTempEntity.cs @@ -3,15 +3,12 @@ namespace Game.Server; -[NetworkName("CBaseTempEntity")] -public class BaseTempEntity +[NetworkName("CBaseTempEntity", NoBase = true)] +public partial class BaseTempEntity { string Name = ""; BaseTempEntity? Next; - public static readonly SendTable DT_BaseTempEntity = new([]); - public static readonly ServerClass ServerClass = new ServerClass(DT_BaseTempEntity); - public static BaseTempEntity? s_pTempEntities = null; public BaseTempEntity(ReadOnlySpan name){ @@ -20,9 +17,6 @@ public BaseTempEntity(ReadOnlySpan name){ s_pTempEntities = this; } - ServerClass? ServerClassCache; - public ServerClass GetServerClass() => ServerClassCache ??= ServerClassRetriever.GetOrError(GetType()); - public void Create(scoped ref IRF filter, float delay) where IRF : IRecipientFilter { Assert(!filter.IsInitMessage()); Assert(delay >= -1 && delay <= 1); diff --git a/Game.Server/BeamSpotlight.cs b/Game.Server/BeamSpotlight.cs index 732fd89a..3d1531db 100644 --- a/Game.Server/BeamSpotlight.cs +++ b/Game.Server/BeamSpotlight.cs @@ -3,37 +3,36 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("beam_spotlight")] [NetworkName("CBeamSpotlight")] -public class BeamSpotlight : BaseEntity +public partial class BeamSpotlight : BaseEntity { - public static readonly SendTable DT_BeamSpotlight = new(DT_BaseEntity, [ - SendPropInt(FIELD.OF(nameof(HaloIndex)), 16, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(SpotlightOn)), 1, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(HasDynamicLight)), 1, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(SpotlightMaxLength)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(SpotlightGoalWidth)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(HDRColorScale)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(RotationSpeed)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(RotationAxis)), 2, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_BeamSpotlight); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(HaloIndex)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(SpotlightOn)) { Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(HasDynamicLight)) { Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(SpotlightMaxLength)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpotlightGoalWidth)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(HDRColorScale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(RotationSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(RotationAxis)) { Bits = 2, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nHaloIndex")] - public int HaloIndex; - [NetworkName("m_bSpotlightOn")] - public int SpotlightOn; - [NetworkName("m_bHasDynamicLight")] - public int HasDynamicLight; - [NetworkName("m_flSpotlightMaxLength")] - public float SpotlightMaxLength; - [NetworkName("m_flSpotlightGoalWidth")] - public float SpotlightGoalWidth; - [NetworkName("m_flHDRColorScale")] - public float HDRColorScale; - [NetworkName("m_flRotationSpeed")] - public float RotationSpeed; - [NetworkName("m_nRotationAxis")] - public int RotationAxis; + [NetworkVar("m_nHaloIndex")] + public partial int HaloIndex { get; set; } + [NetworkVar("m_bSpotlightOn")] + public partial int SpotlightOn { get; set; } + [NetworkVar("m_bHasDynamicLight")] + public partial int HasDynamicLight { get; set; } + [NetworkVar("m_flSpotlightMaxLength")] + public partial float SpotlightMaxLength { get; set; } + [NetworkVar("m_flSpotlightGoalWidth")] + public partial float SpotlightGoalWidth { get; set; } + [NetworkVar("m_flHDRColorScale")] + public partial float HDRColorScale { get; set; } + [NetworkVar("m_flRotationSpeed")] + public partial float RotationSpeed { get; set; } + [NetworkVar("m_nRotationAxis")] + public partial int RotationAxis { get; set; } } diff --git a/Game.Server/BoneFollower.cs b/Game.Server/BoneFollower.cs index 428798e8..1a766108 100644 --- a/Game.Server/BoneFollower.cs +++ b/Game.Server/BoneFollower.cs @@ -3,19 +3,18 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("phys_bone_follower")] [NetworkName("CBoneFollower")] -public class BoneFollower : BaseEntity +public partial class BoneFollower : BaseEntity { - public static readonly SendTable DT_BoneFollower = new(DT_BaseEntity, [ - SendPropInt(FIELD.OF(nameof(ModelIndex)), 14, 0), - SendPropInt(FIELD.OF(nameof(SolidIndex)), 6, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_BoneFollower); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(SolidIndex)) { Bits = 6, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_modelIndex")] - public new int ModelIndex; - [NetworkName("m_solidIndex")] - public int SolidIndex; + [NetworkVar("m_modelIndex")] + public new partial int ModelIndex { get; set; } + [NetworkVar("m_solidIndex")] + public partial int SolidIndex { get; set; } } diff --git a/Game.Server/BoneManipulate.cs b/Game.Server/BoneManipulate.cs index 75f369a4..d1c010dd 100644 --- a/Game.Server/BoneManipulate.cs +++ b/Game.Server/BoneManipulate.cs @@ -3,25 +3,24 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("manipulate_bone")] [NetworkName("CBoneManipulate")] -public class BoneManipulate : BaseEntity +public partial class BoneManipulate : BaseEntity { - public static readonly SendTable DT_BoneManipulate = new(DT_BaseEntity, [ - SendPropArray3(FIELD.OF_ARRAY(nameof(BonePos)), SendPropVector(null!, 0, PropFlags.NoScale)), - SendPropArray3(FIELD.OF_ARRAY(nameof(BoneAng)), SendPropVector(null!, 0, PropFlags.NoScale)), - SendPropArray3(FIELD.OF_ARRAY(nameof(BoneScale)), SendPropVector(null!, 0, PropFlags.NoScale)), - SendPropArray3(FIELD.OF_ARRAY(nameof(BoneJiggle)), SendPropInt((IFieldAccessor)null!, 4, PropFlags.Unsigned, sizeOfVar: sizeof(int))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_BoneManipulate); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(BonePos)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(BoneAng)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(BoneScale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(BoneJiggle)) { Bits = 4, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_BonePos")] - public InlineArrayMaxStudioBones BonePos; - [NetworkName("m_BoneAng")] - public InlineArrayMaxStudioBones BoneAng; - [NetworkName("m_BoneScale")] - public InlineArrayMaxStudioBones BoneScale; - [NetworkName("m_BoneJiggle")] - public InlineArrayMaxStudioBones BoneJiggle; + [NetworkVar("m_BonePos")] + public partial ref readonly InlineArrayMaxStudioBones BonePos { get; } + [NetworkVar("m_BoneAng")] + public partial ref readonly InlineArrayMaxStudioBones BoneAng { get; } + [NetworkVar("m_BoneScale")] + public partial ref readonly InlineArrayMaxStudioBones BoneScale { get; } + [NetworkVar("m_BoneJiggle")] + public partial ref readonly InlineArrayMaxStudioBones BoneJiggle { get; } } diff --git a/Game.Server/BreakableSurface.cs b/Game.Server/BreakableSurface.cs index e463d809..5d07ed4d 100644 --- a/Game.Server/BreakableSurface.cs +++ b/Game.Server/BreakableSurface.cs @@ -6,40 +6,39 @@ using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("func_breakable_surf")] [NetworkName("CBreakableSurface")] -public class BreakableSurface : BaseEntity +public partial class BreakableSurface : BaseEntity { - public static readonly SendTable DT_BreakableSurface = new(DT_BaseEntity, [ - SendPropInt(FIELD.OF(nameof(NumWide)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(NumHigh)), 8, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(PanelWidth)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(PanelHeight)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(VNormal)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(VCorner)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(IsBroken)), 1, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(SurfaceType)), 2, PropFlags.Unsigned), - SendPropArray3(FIELD.OF_ARRAY(nameof(RawPanelBitVec)), SendPropInt((IFieldAccessor)null!, 1, PropFlags.Unsigned, sizeOfVar: sizeof(int))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_BreakableSurface); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(NumWide)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(NumHigh)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(PanelWidth)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(PanelHeight)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VNormal)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(VCorner)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(IsBroken)) { Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(SurfaceType)) { Bits = 2, Flags = PropFlags.Unsigned }, + new(nameof(RawPanelBitVec)) { Bits = 1, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nNumWide")] - public int NumWide; - [NetworkName("m_nNumHigh")] - public int NumHigh; - [NetworkName("m_flPanelWidth")] - public float PanelWidth; - [NetworkName("m_flPanelHeight")] - public float PanelHeight; - [NetworkName("m_vNormal")] - public Vector3 VNormal; - [NetworkName("m_vCorner")] - public Vector3 VCorner; - [NetworkName("m_bIsBroken")] - public int IsBroken; - [NetworkName("m_nSurfaceType")] - public int SurfaceType; - [NetworkName("m_RawPanelBitVec")] - public InlineArray256 RawPanelBitVec; + [NetworkVar("m_nNumWide")] + public partial int NumWide { get; set; } + [NetworkVar("m_nNumHigh")] + public partial int NumHigh { get; set; } + [NetworkVar("m_flPanelWidth")] + public partial float PanelWidth { get; set; } + [NetworkVar("m_flPanelHeight")] + public partial float PanelHeight { get; set; } + [NetworkVar("m_vNormal")] + public partial Vector3 VNormal { get; set; } + [NetworkVar("m_vCorner")] + public partial Vector3 VCorner { get; set; } + [NetworkVar("m_bIsBroken")] + public partial int IsBroken { get; set; } + [NetworkVar("m_nSurfaceType")] + public partial int SurfaceType { get; set; } + [NetworkVar("m_RawPanelBitVec")] + public partial ref readonly InlineArray256 RawPanelBitVec { get; } } diff --git a/Game.Server/CitadelEnergyCore.cs b/Game.Server/CitadelEnergyCore.cs index f67fb939..f5e3fbde 100644 --- a/Game.Server/CitadelEnergyCore.cs +++ b/Game.Server/CitadelEnergyCore.cs @@ -3,28 +3,27 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_citadel_energy_core")] [NetworkName("CCitadelEnergyCore")] -public class CitadelEnergyCore : BaseEntity +public partial class CitadelEnergyCore : BaseEntity { - public static readonly SendTable DT_CitadelEnergyCore = new(DT_BaseEntity, [ - SendPropFloat(FIELD.OF(nameof(Scale)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(State)), 8, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(Duration)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(StartTime)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(Spawnflags)), 32, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_CitadelEnergyCore); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Scale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(State)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Duration)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Spawnflags)) { Bits = 32, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_flScale")] - public float Scale; - [NetworkName("m_nState")] - public int State; - [NetworkName("m_flDuration")] - public float Duration; - [NetworkName("m_flStartTime")] - public float StartTime; - [NetworkName("m_spawnflags")] - public int Spawnflags; + [NetworkVar("m_flScale")] + public partial float Scale { get; set; } + [NetworkVar("m_nState")] + public partial int State { get; set; } + [NetworkVar("m_flDuration")] + public partial float Duration { get; set; } + [NetworkVar("m_flStartTime")] + public partial float StartTime { get; set; } + [NetworkVar("m_spawnflags")] + public partial int Spawnflags { get; set; } } diff --git a/Game.Server/ColorCorrection.cs b/Game.Server/ColorCorrection.cs index e0a3fd23..154ea531 100644 --- a/Game.Server/ColorCorrection.cs +++ b/Game.Server/ColorCorrection.cs @@ -8,45 +8,43 @@ namespace Game.Server; -using FIELD = FIELD; - [LinkEntityToClass("color_correction")] -[NetworkName("CColorCorrection")] -public class ColorCorrection : BaseEntity +[NetworkName("CColorCorrection", NoBase = true)] +public partial class ColorCorrection : BaseEntity { - public static readonly SendTable DT_ColorCorrection = new([ - SendPropVector(NetworkVarFields.Origin, 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MinFalloff)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MaxFalloff)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(CurWeight)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MaxWeight)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FadeInDuration)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FadeOutDuration)), 0, PropFlags.NoScale), - SendPropString(FIELD.OF(nameof(NetLookupFilename))), - SendPropBool(FIELD.OF(nameof(Enabled))), - SendPropBool(FIELD.OF(nameof(ClientSide))), - SendPropBool(FIELD.OF(nameof(Exclusive))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_ColorCorrection); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Origin)) { Encoding = NetEncoding.Vector, Bits = 0, Flags = PropFlags.NoScale, Proxy = typeof(OriginProxy) }, + new(nameof(MinFalloff)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxFalloff)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(CurWeight)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxWeight)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeInDuration)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeOutDuration)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(NetLookupFilename)) { Encoding = NetEncoding.String }, + nameof(Enabled), + nameof(ClientSide), + nameof(Exclusive), + ]; - [NetworkName("m_MinFalloff")] - public float MinFalloff; - [NetworkName("m_MaxFalloff")] - public float MaxFalloff; - [NetworkName("m_flCurWeight")] - public float CurWeight; - [NetworkName("m_flMaxWeight")] - public float MaxWeight; - [NetworkName("m_flFadeInDuration")] - public float FadeInDuration; - [NetworkName("m_flFadeOutDuration")] - public float FadeOutDuration; - [NetworkName("m_netlookupFilename")] - public InlineArrayMaxPath NetLookupFilename; - [NetworkName("m_bEnabled")] - public bool Enabled; - [NetworkName("m_bClientSide")] - public bool ClientSide; - [NetworkName("m_bExclusive")] - public bool Exclusive; + [NetworkVar("m_MinFalloff")] + public partial float MinFalloff { get; set; } + [NetworkVar("m_MaxFalloff")] + public partial float MaxFalloff { get; set; } + [NetworkVar("m_flCurWeight")] + public partial float CurWeight { get; set; } + [NetworkVar("m_flMaxWeight")] + public partial float MaxWeight { get; set; } + [NetworkVar("m_flFadeInDuration")] + public partial float FadeInDuration { get; set; } + [NetworkVar("m_flFadeOutDuration")] + public partial float FadeOutDuration { get; set; } + [NetworkVar("m_netlookupFilename")] + public partial ref readonly InlineArrayMaxPath NetLookupFilename { get; } + [NetworkVar("m_bEnabled")] + public partial bool Enabled { get; set; } + [NetworkVar("m_bClientSide")] + public partial bool ClientSide { get; set; } + [NetworkVar("m_bExclusive")] + public partial bool Exclusive { get; set; } } diff --git a/Game.Server/ColorCorrectionVolume.cs b/Game.Server/ColorCorrectionVolume.cs index b4d22f11..8fa17edb 100644 --- a/Game.Server/ColorCorrectionVolume.cs +++ b/Game.Server/ColorCorrectionVolume.cs @@ -3,29 +3,28 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("color_correction_volume")] -[NetworkName("CColorCorrectionVolume")] -public class ColorCorrectionVolume : BaseEntity +[NetworkName("CColorCorrectionVolume", NoBase = true)] +public partial class ColorCorrectionVolume : BaseEntity { - public static readonly SendTable DT_ColorCorrectionVolume = new([ - SendPropBool(FIELD.OF(nameof(Enabled))), - SendPropFloat(FIELD.OF(nameof(MaxWeight)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FadeDuration)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(Weight)), 0, PropFlags.NoScale), - SendPropString(FIELD.OF(nameof(LookupFilename))), - SendPropInt(FIELD.OF(nameof(ModelIndex)), 14, 0), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_ColorCorrectionVolume); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Enabled), + new(nameof(MaxWeight)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeDuration)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Weight)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(LookupFilename)) { Encoding = NetEncoding.String }, + new(nameof(ModelIndex)) { Encoding = NetEncoding.Int, Bits = 14 }, + ]; - [NetworkName("m_bEnabled")] - public bool Enabled; - [NetworkName("m_MaxWeight")] - public float MaxWeight; - [NetworkName("m_FadeDuration")] - public float FadeDuration; - [NetworkName("m_Weight")] - public float Weight; - [NetworkName("m_lookupFilename")] - public InlineArrayMaxPath LookupFilename; + [NetworkVar("m_bEnabled")] + public partial bool Enabled { get; set; } + [NetworkVar("m_MaxWeight")] + public partial float MaxWeight { get; set; } + [NetworkVar("m_FadeDuration")] + public partial float FadeDuration { get; set; } + [NetworkVar("m_Weight")] + public partial float Weight { get; set; } + [NetworkVar("m_lookupFilename")] + public partial ref readonly InlineArrayMaxPath LookupFilename { get; } } diff --git a/Game.Server/DustTrail.cs b/Game.Server/DustTrail.cs index a718192c..9e5b8c63 100644 --- a/Game.Server/DustTrail.cs +++ b/Game.Server/DustTrail.cs @@ -3,52 +3,51 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_dusttrail")] -[NetworkName("DustTrail")] -public class DustTrail : BaseParticleEntity +[NetworkName("DustTrail", Table = "DT_DustTrail")] +public partial class DustTrail : BaseParticleEntity { - public static readonly SendTable DT_DustTrail = new(DT_BaseParticleEntity, [ - SendPropFloat(FIELD.OF(nameof(SpawnRate)), 8, 0, 1, 1024), - SendPropVector(FIELD.OF(nameof(Color)), 8, 0, 0, 1), - SendPropFloat(FIELD.OF(nameof(ParticleLifetime)), 16, PropFlags.RoundUp, 0.1f, 100), - SendPropFloat(FIELD.OF(nameof(StopEmitTime)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MinSpeed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MaxSpeed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MinDirectedSpeed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MaxDirectedSpeed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(StartSize)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(EndSize)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(SpawnRadius)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(Emit))), - SendPropFloat(FIELD.OF(nameof(Opacity)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_DustTrail); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SpawnRate)) { Bits = 8, Low = 1.0f, High = 1024.0f }, + new(nameof(Color)) { Bits = 8, Low = 0.0f, High = 1.0f }, + new(nameof(ParticleLifetime)) { Bits = 16, Flags = PropFlags.RoundUp, Low = 0.1f, High = 100.0f }, + new(nameof(StopEmitTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MinSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MinDirectedSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxDirectedSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EndSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpawnRadius)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Emit), + new(nameof(Opacity)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_SpawnRate")] - public float SpawnRate; - [NetworkName("m_Color")] - public Vector3 Color; - [NetworkName("m_ParticleLifetime")] - public float ParticleLifetime; - [NetworkName("m_StopEmitTime")] - public float StopEmitTime; - [NetworkName("m_MinSpeed")] - public float MinSpeed; - [NetworkName("m_MaxSpeed")] - public float MaxSpeed; - [NetworkName("m_MinDirectedSpeed")] - public float MinDirectedSpeed; - [NetworkName("m_MaxDirectedSpeed")] - public float MaxDirectedSpeed; - [NetworkName("m_StartSize")] - public float StartSize; - [NetworkName("m_EndSize")] - public float EndSize; - [NetworkName("m_SpawnRadius")] - public float SpawnRadius; - [NetworkName("m_bEmit")] - public bool Emit; - [NetworkName("m_Opacity")] - public float Opacity; + [NetworkVar("m_SpawnRate")] + public partial float SpawnRate { get; set; } + [NetworkVar("m_Color")] + public partial Vector3 Color { get; set; } + [NetworkVar("m_ParticleLifetime")] + public partial float ParticleLifetime { get; set; } + [NetworkVar("m_StopEmitTime")] + public partial float StopEmitTime { get; set; } + [NetworkVar("m_MinSpeed")] + public partial float MinSpeed { get; set; } + [NetworkVar("m_MaxSpeed")] + public partial float MaxSpeed { get; set; } + [NetworkVar("m_MinDirectedSpeed")] + public partial float MinDirectedSpeed { get; set; } + [NetworkVar("m_MaxDirectedSpeed")] + public partial float MaxDirectedSpeed { get; set; } + [NetworkVar("m_StartSize")] + public partial float StartSize { get; set; } + [NetworkVar("m_EndSize")] + public partial float EndSize { get; set; } + [NetworkVar("m_SpawnRadius")] + public partial float SpawnRadius { get; set; } + [NetworkVar("m_bEmit")] + public partial bool Emit { get; set; } + [NetworkVar("m_Opacity")] + public partial float Opacity { get; set; } } diff --git a/Game.Server/DynamicLight.cs b/Game.Server/DynamicLight.cs index f8c3b9f6..6ddcbf61 100644 --- a/Game.Server/DynamicLight.cs +++ b/Game.Server/DynamicLight.cs @@ -7,35 +7,34 @@ namespace Game.Server; using static Source.Common.Networking.SVC_ClassInfo; -using FIELD = FIELD; [LinkEntityToClass("light_dynamic")] [NetworkName("CDynamicLight")] -public class DynamicLight : BaseEntity +public partial class DynamicLight : BaseEntity { - public static readonly SendTable DT_DynamicLight = new(DT_BaseEntity, [ - SendPropInt(FIELD.OF(nameof(Flags)), 4, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(LightStyle)), 4, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(Radius)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(Exponent)), 8), - SendPropFloat(FIELD.OF(nameof(InnerAngle)), 8, 0, 0.0f, 360.0f), - SendPropFloat(FIELD.OF(nameof(OuterAngle)), 8, 0, 0.0f, 360.0f), - SendPropFloat(FIELD.OF(nameof(SpotRadius)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_DynamicLight); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Flags)) { Bits = 4, Flags = PropFlags.Unsigned }, + new(nameof(LightStyle)) { Bits = 4, Flags = PropFlags.Unsigned }, + new(nameof(Radius)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Exponent)) { Bits = 8 }, + new(nameof(InnerAngle)) { Bits = 8, Low = 0.0f, High = 360.0f }, + new(nameof(OuterAngle)) { Bits = 8, Low = 0.0f, High = 360.0f }, + new(nameof(SpotRadius)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_Flags")] - public int Flags; - [NetworkName("m_LightStyle")] - public int LightStyle; - [NetworkName("m_Radius")] - public float Radius; - [NetworkName("m_Exponent")] - public int Exponent; - [NetworkName("m_InnerAngle")] - public float InnerAngle; - [NetworkName("m_OuterAngle")] - public float OuterAngle; - [NetworkName("m_SpotRadius")] - public float SpotRadius; + [NetworkVar("m_Flags")] + public partial int Flags { get; set; } + [NetworkVar("m_LightStyle")] + public partial int LightStyle { get; set; } + [NetworkVar("m_Radius")] + public partial float Radius { get; set; } + [NetworkVar("m_Exponent")] + public partial int Exponent { get; set; } + [NetworkVar("m_InnerAngle")] + public partial float InnerAngle { get; set; } + [NetworkVar("m_OuterAngle")] + public partial float OuterAngle { get; set; } + [NetworkVar("m_SpotRadius")] + public partial float SpotRadius { get; set; } } diff --git a/Game.Server/Embers.cs b/Game.Server/Embers.cs index decff9ef..0ab25b6c 100644 --- a/Game.Server/Embers.cs +++ b/Game.Server/Embers.cs @@ -3,25 +3,24 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_embers")] [NetworkName("CEmbers")] -public class Embers : BaseEntity +public partial class Embers : BaseEntity { - public static readonly SendTable DT_Embers = new(DT_BaseEntity, [ - SendPropInt(FIELD.OF(nameof(Density)), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Lifetime)), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Speed)), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Emit)), 2, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_Embers); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Density)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Lifetime)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Speed)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Emit)) { Bits = 2, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nDensity")] - public int Density; - [NetworkName("m_nLifetime")] - public int Lifetime; - [NetworkName("m_nSpeed")] - public new int Speed; - [NetworkName("m_bEmit")] - public int Emit; + [NetworkVar("m_nDensity")] + public partial int Density { get; set; } + [NetworkVar("m_nLifetime")] + public partial int Lifetime { get; set; } + [NetworkVar("m_nSpeed")] + public new partial int Speed { get; set; } + [NetworkVar("m_bEmit")] + public partial int Emit { get; set; } } diff --git a/Game.Server/EntityDissolve.cs b/Game.Server/EntityDissolve.cs index 079a2354..92fb7300 100644 --- a/Game.Server/EntityDissolve.cs +++ b/Game.Server/EntityDissolve.cs @@ -3,43 +3,42 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_entity_dissolver")] [NetworkName("CEntityDissolve")] -public class EntityDissolve : BaseEntity +public partial class EntityDissolve : BaseEntity { - public static readonly SendTable DT_EntityDissolve = new(DT_BaseEntity, [ - SendPropFloat(FIELD.OF(nameof(StartTime)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FadeInStart)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FadeInLength)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FadeOutModelStart)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FadeOutModelLength)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FadeOutStart)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FadeOutLength)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(DissolveType)), 3, PropFlags.Unsigned), - SendPropVector(FIELD.OF(nameof(DissolverOrigin)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(Magnitude)), 8, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_EntityDissolve); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeInStart)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeInLength)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeOutModelStart)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeOutModelLength)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeOutStart)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeOutLength)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DissolveType)) { Bits = 3, Flags = PropFlags.Unsigned }, + new(nameof(DissolverOrigin)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Magnitude)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_flStartTime")] - public float StartTime; - [NetworkName("m_flFadeInStart")] - public float FadeInStart; - [NetworkName("m_flFadeInLength")] - public float FadeInLength; - [NetworkName("m_flFadeOutModelStart")] - public float FadeOutModelStart; - [NetworkName("m_flFadeOutModelLength")] - public float FadeOutModelLength; - [NetworkName("m_flFadeOutStart")] - public float FadeOutStart; - [NetworkName("m_flFadeOutLength")] - public float FadeOutLength; - [NetworkName("m_nDissolveType")] - public int DissolveType; - [NetworkName("m_vDissolverOrigin")] - public Vector3 DissolverOrigin; - [NetworkName("m_nMagnitude")] - public int Magnitude; + [NetworkVar("m_flStartTime")] + public partial float StartTime { get; set; } + [NetworkVar("m_flFadeInStart")] + public partial float FadeInStart { get; set; } + [NetworkVar("m_flFadeInLength")] + public partial float FadeInLength { get; set; } + [NetworkVar("m_flFadeOutModelStart")] + public partial float FadeOutModelStart { get; set; } + [NetworkVar("m_flFadeOutModelLength")] + public partial float FadeOutModelLength { get; set; } + [NetworkVar("m_flFadeOutStart")] + public partial float FadeOutStart { get; set; } + [NetworkVar("m_flFadeOutLength")] + public partial float FadeOutLength { get; set; } + [NetworkVar("m_nDissolveType")] + public partial int DissolveType { get; set; } + [NetworkVar("m_vDissolverOrigin")] + public partial Vector3 DissolverOrigin { get; set; } + [NetworkVar("m_nMagnitude")] + public partial int Magnitude { get; set; } } diff --git a/Game.Server/EntityFlame.cs b/Game.Server/EntityFlame.cs index 0f7339ed..0a6dd84f 100644 --- a/Game.Server/EntityFlame.cs +++ b/Game.Server/EntityFlame.cs @@ -3,17 +3,21 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("entityflame")] [LinkEntityToClass("env_entity_igniter")] [NetworkName("CEntityFlame")] -public class EntityFlame : BaseEntity +public partial class EntityFlame : BaseEntity { - public static readonly SendTable DT_EntityFlame = new(DT_BaseEntity, [ - SendPropEHandle(FIELD.OF(nameof(EntAttached))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_EntityFlame); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(EntAttached), + ]; - [NetworkName("m_hEntAttached")] - public EHANDLE EntAttached = new(); + public EntityFlame() { + EntAttached = new(); + } + + + [NetworkVar("m_hEntAttached")] + public partial EHANDLE EntAttached { get; set; } } diff --git a/Game.Server/EntityParticleTrail.cs b/Game.Server/EntityParticleTrail.cs index 9a919be3..6344cd1a 100644 --- a/Game.Server/EntityParticleTrail.cs +++ b/Game.Server/EntityParticleTrail.cs @@ -4,40 +4,47 @@ namespace Game.Server; -using FIELD = FIELD; - -public class EntityParticleTrailInfo +public partial class EntityParticleTrailInfo { - [NetworkName("m_flLifetime")] - public float Lifetime; - [NetworkName("m_flStartSize")] - public float StartSize; - [NetworkName("m_flEndSize")] - public float EndSize; + [NetworkTable("DT_EntityParticleTrailInfo")] + public static readonly NetworkProp[] Props = [ + new(nameof(Lifetime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EndSize)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; + + public BaseEntity? Outer; + public void NetworkStateChanged() => Outer?.NetworkStateChanged(); + public void NetworkStateChanged(IFieldAccessor field) => Outer?.NetworkStateChanged(); - public static readonly SendTable DT_EntityParticleTrailInfo = new("DT_EntityParticleTrailInfo", [ - SendPropFloat(Source.FIELD.OF(nameof(Lifetime)), 0, PropFlags.NoScale), - SendPropFloat(Source.FIELD.OF(nameof(StartSize)), 0, PropFlags.NoScale), - SendPropFloat(Source.FIELD.OF(nameof(EndSize)), 0, PropFlags.NoScale), - ]); + [NetworkVar("m_flLifetime")] + public partial float Lifetime { get; set; } + [NetworkVar("m_flStartSize")] + public partial float StartSize { get; set; } + [NetworkVar("m_flEndSize")] + public partial float EndSize { get; set; } } // Datatable-accurate stub (gmod DT_EntityParticleTrail, baseclass DT_BaseParticleEntity). [LinkEntityToClass("env_particle_trail")] [NetworkName("CEntityParticleTrail")] -public class EntityParticleTrail : BaseParticleEntity +public partial class EntityParticleTrail : BaseParticleEntity { - [NetworkName("m_iMaterialName")] - public int MaterialName; - [NetworkName("m_Info")] - public EntityParticleTrailInfo Info = new(); - [NetworkName("m_hConstraintEntity")] - public EHANDLE ConstraintEntity; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(MaterialName)) { Bits = 10, Flags = PropFlags.Unsigned }, + new(nameof(Info)) { Encoding = NetEncoding.DataTable, DataTable = "DT_EntityParticleTrailInfo" }, + nameof(ConstraintEntity), + ]; + + [NetworkVar("m_iMaterialName")] + public partial int MaterialName { get; set; } + [NetworkVar("m_Info")] + public readonly EntityParticleTrailInfo Info = new(); + [NetworkVar("m_hConstraintEntity")] + public partial EHANDLE ConstraintEntity { get; set; } - public static readonly SendTable DT_EntityParticleTrail = new(DT_BaseParticleEntity, [ - SendPropInt(FIELD.OF(nameof(MaterialName)), 10, PropFlags.Unsigned), - SendPropDataTable("m_Info", FIELD.OF(nameof(Info)), EntityParticleTrailInfo.DT_EntityParticleTrailInfo), - SendPropEHandle(FIELD.OF(nameof(ConstraintEntity))), - ]); - public static new readonly ServerClass ServerClass = new ServerClass(DT_EntityParticleTrail); + public EntityParticleTrail() { + Info.Outer = this; + } } diff --git a/Game.Server/EnvAmbientLight.cs b/Game.Server/EnvAmbientLight.cs index 601d0fd6..ca0f5c2e 100644 --- a/Game.Server/EnvAmbientLight.cs +++ b/Game.Server/EnvAmbientLight.cs @@ -3,16 +3,15 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_ambient_light")] [NetworkName("CEnvAmbientLight")] -public class EnvAmbientLight : SpatialEntity +public partial class EnvAmbientLight : SpatialEntity { - public static readonly SendTable DT_EnvAmbientLight = new(DT_SpatialEntity, [ - SendPropVector(FIELD.OF(nameof(Color)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_EnvAmbientLight); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Color)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_vecColor")] - public Vector3 Color; + [NetworkVar("m_vecColor")] + public partial Vector3 Color { get; set; } } diff --git a/Game.Server/EnvDetailController.cs b/Game.Server/EnvDetailController.cs index 886e1237..94c0be82 100644 --- a/Game.Server/EnvDetailController.cs +++ b/Game.Server/EnvDetailController.cs @@ -3,19 +3,18 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_detail_controller")] -[NetworkName("CEnvDetailController")] -public class EnvDetailController : BaseEntity +[NetworkName("CEnvDetailController", Table = "DT_DetailController", NoBase = true)] +public partial class EnvDetailController : BaseEntity { - public static readonly SendTable DT_DetailController = new([ - SendPropFloat(FIELD.OF(nameof(FadeStartDist)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FadeEndDist)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_DetailController); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(FadeStartDist)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeEndDist)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flFadeStartDist")] - public float FadeStartDist; - [NetworkName("m_flFadeEndDist")] - public float FadeEndDist; + [NetworkVar("m_flFadeStartDist")] + public partial float FadeStartDist { get; set; } + [NetworkVar("m_flFadeEndDist")] + public partial float FadeEndDist { get; set; } } diff --git a/Game.Server/EnvHeadcrabCanister.cs b/Game.Server/EnvHeadcrabCanister.cs index 1aaf38b3..114823e8 100644 --- a/Game.Server/EnvHeadcrabCanister.cs +++ b/Game.Server/EnvHeadcrabCanister.cs @@ -5,75 +5,82 @@ namespace Game.Server; -using FIELD = FIELD; - -public class EnvHeadcrabCanisterShared +public partial class EnvHeadcrabCanisterShared { - [NetworkName("m_flFlightSpeed")] - public float FlightSpeed; - [NetworkName("m_flLaunchTime")] - public TimeUnit_t LaunchTime; - [NetworkName("m_vecParabolaDirection")] - public Vector3 ParabolaDirection; - [NetworkName("m_flFlightTime")] - public float FlightTime; - [NetworkName("m_flWorldEnterTime")] - public float WorldEnterTime; - [NetworkName("m_flInitialZSpeed")] - public float InitialZSpeed; - [NetworkName("m_flZAcceleration")] - public float ZAcceleration; - [NetworkName("m_flHorizSpeed")] - public float HorizSpeed; - [NetworkName("m_bLaunchedFromWithinWorld")] - public bool LaunchedFromWithinWorld; - [NetworkName("m_vecStartPosition")] - public Vector3 StartPosition; - [NetworkName("m_vecEnterWorldPosition")] - public Vector3 EnterWorldPosition; - [NetworkName("m_vecDirection")] - public Vector3 Direction; - [NetworkName("m_vecStartAngles")] - public Vector3 StartAngles; - [NetworkName("m_vecSkyboxOrigin")] - public Vector3 SkyboxOrigin; - [NetworkName("m_flSkyboxScale")] - public float SkyboxScale; - [NetworkName("m_bInSkybox")] - public bool InSkybox; + [NetworkTable("DT_EnvHeadcrabCanisterShared")] + public static readonly NetworkProp[] Props = [ + new(nameof(FlightSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(LaunchTime), + new(nameof(ParabolaDirection)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FlightTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(WorldEnterTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(InitialZSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ZAcceleration)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(HorizSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(LaunchedFromWithinWorld), + new(nameof(StartPosition)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EnterWorldPosition)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Direction)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartAngles)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SkyboxOrigin)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SkyboxScale)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(InSkybox), + ]; + + public BaseEntity? Outer; + public void NetworkStateChanged() => Outer?.NetworkStateChanged(); + public void NetworkStateChanged(IFieldAccessor field) => Outer?.NetworkStateChanged(); - public static readonly SendTable DT_EnvHeadcrabCanisterShared = new("DT_EnvHeadcrabCanisterShared", [ - SendPropFloat(Source.FIELD.OF(nameof(FlightSpeed)), 0, PropFlags.NoScale), - SendPropTime64(Source.FIELD.OF(nameof(LaunchTime))), - SendPropVector(Source.FIELD.OF(nameof(ParabolaDirection)), 0, PropFlags.NoScale), - SendPropFloat(Source.FIELD.OF(nameof(FlightTime)), 0, PropFlags.NoScale), - SendPropFloat(Source.FIELD.OF(nameof(WorldEnterTime)), 0, PropFlags.NoScale), - SendPropFloat(Source.FIELD.OF(nameof(InitialZSpeed)), 0, PropFlags.NoScale), - SendPropFloat(Source.FIELD.OF(nameof(ZAcceleration)), 0, PropFlags.NoScale), - SendPropFloat(Source.FIELD.OF(nameof(HorizSpeed)), 0, PropFlags.NoScale), - SendPropBool(Source.FIELD.OF(nameof(LaunchedFromWithinWorld))), - SendPropVector(Source.FIELD.OF(nameof(StartPosition)), 0, PropFlags.NoScale), - SendPropVector(Source.FIELD.OF(nameof(EnterWorldPosition)), 0, PropFlags.NoScale), - SendPropVector(Source.FIELD.OF(nameof(Direction)), 0, PropFlags.NoScale), - SendPropVector(Source.FIELD.OF(nameof(StartAngles)), 0, PropFlags.NoScale), - SendPropVector(Source.FIELD.OF(nameof(SkyboxOrigin)), 0, PropFlags.NoScale), - SendPropFloat(Source.FIELD.OF(nameof(SkyboxScale)), 0, PropFlags.NoScale), - SendPropBool(Source.FIELD.OF(nameof(InSkybox))), - ]); + [NetworkVar("m_flFlightSpeed")] + public partial float FlightSpeed { get; set; } + [NetworkVar("m_flLaunchTime")] + public partial TimeUnit_t LaunchTime { get; set; } + [NetworkVar("m_vecParabolaDirection")] + public partial Vector3 ParabolaDirection { get; set; } + [NetworkVar("m_flFlightTime")] + public partial float FlightTime { get; set; } + [NetworkVar("m_flWorldEnterTime")] + public partial float WorldEnterTime { get; set; } + [NetworkVar("m_flInitialZSpeed")] + public partial float InitialZSpeed { get; set; } + [NetworkVar("m_flZAcceleration")] + public partial float ZAcceleration { get; set; } + [NetworkVar("m_flHorizSpeed")] + public partial float HorizSpeed { get; set; } + [NetworkVar("m_bLaunchedFromWithinWorld")] + public partial bool LaunchedFromWithinWorld { get; set; } + [NetworkVar("m_vecStartPosition")] + public partial Vector3 StartPosition { get; set; } + [NetworkVar("m_vecEnterWorldPosition")] + public partial Vector3 EnterWorldPosition { get; set; } + [NetworkVar("m_vecDirection")] + public partial Vector3 Direction { get; set; } + [NetworkVar("m_vecStartAngles")] + public partial Vector3 StartAngles { get; set; } + [NetworkVar("m_vecSkyboxOrigin")] + public partial Vector3 SkyboxOrigin { get; set; } + [NetworkVar("m_flSkyboxScale")] + public partial float SkyboxScale { get; set; } + [NetworkVar("m_bInSkybox")] + public partial bool InSkybox { get; set; } } [LinkEntityToClass("env_headcrabcanister")] [NetworkName("CEnvHeadcrabCanister")] -public class EnvHeadcrabCanister : BaseAnimating +public partial class EnvHeadcrabCanister : BaseAnimating { - [NetworkName("m_Shared")] - public EnvHeadcrabCanisterShared Shared = new(); - [NetworkName("m_bLanded")] - public bool Landed; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Shared)) { Encoding = NetEncoding.DataTable, DataTable = "DT_EnvHeadcrabCanisterShared" }, + nameof(Landed), + ]; + + [NetworkVar("m_Shared")] + public readonly EnvHeadcrabCanisterShared Shared = new(); + [NetworkVar("m_bLanded")] + public partial bool Landed { get; set; } - public static readonly SendTable DT_EnvHeadcrabCanister = new(DT_BaseAnimating, [ - SendPropDataTable("m_Shared", FIELD.OF(nameof(Shared)), EnvHeadcrabCanisterShared.DT_EnvHeadcrabCanisterShared), - SendPropBool(FIELD.OF(nameof(Landed))), - ]); - public static new readonly ServerClass ServerClass = new ServerClass(DT_EnvHeadcrabCanister); + public EnvHeadcrabCanister() { + Shared.Outer = this; + } } diff --git a/Game.Server/EnvParticleScript.cs b/Game.Server/EnvParticleScript.cs index f2343ae3..4f9f9f5d 100644 --- a/Game.Server/EnvParticleScript.cs +++ b/Game.Server/EnvParticleScript.cs @@ -3,16 +3,15 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_particlescript")] [NetworkName("CEnvParticleScript")] -public class EnvParticleScript : BaseAnimating +public partial class EnvParticleScript : BaseAnimating { - public static readonly SendTable DT_EnvParticleScript = new(DT_BaseAnimating, [ - SendPropFloat(FIELD.OF(nameof(SequenceScale)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_EnvParticleScript); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SequenceScale)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flSequenceScale")] - public float SequenceScale; + [NetworkVar("m_flSequenceScale")] + public partial float SequenceScale { get; set; } } diff --git a/Game.Server/EnvProjectedTexture.cs b/Game.Server/EnvProjectedTexture.cs index d0f58e4f..fb150f8f 100644 --- a/Game.Server/EnvProjectedTexture.cs +++ b/Game.Server/EnvProjectedTexture.cs @@ -3,55 +3,59 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_projectedtexture")] [NetworkName("CEnvProjectedTexture")] -public class EnvProjectedTexture : BaseEntity +public partial class EnvProjectedTexture : BaseEntity { - public static readonly SendTable DT_EnvProjectedTexture = new(DT_BaseEntity, [ - SendPropEHandle(FIELD.OF(nameof(HTargetEntity))), - SendPropBool(FIELD.OF(nameof(State))), - SendPropFloat(FIELD.OF(nameof(LightFOV)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(EnableShadows))), - SendPropBool(FIELD.OF(nameof(LightOnlyTarget))), - SendPropBool(FIELD.OF(nameof(LightWorld))), - SendPropBool(FIELD.OF(nameof(CameraSpace))), - SendPropVector(FIELD.OF(nameof(LinearFloatLightColor)), 0, PropFlags.NoScale), - SendPropString(FIELD.OF(nameof(SpotlightTextureName))), - SendPropInt(FIELD.OF(nameof(SpotlightTextureFrame)), 14, 0), - SendPropFloat(FIELD.OF(nameof(NearZ)), 16, PropFlags.RoundDown, 0.0f, 500.0f), - SendPropFloat(FIELD.OF(nameof(FarZ)), 18, PropFlags.RoundDown, 0.0f, 56756.0f), - SendPropBool(FIELD.OF(nameof(ShadowQuality))), - SendPropInt(FIELD.OF(nameof(Style)), 8, 0), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_EnvProjectedTexture); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(HTargetEntity), + nameof(State), + new(nameof(LightFOV)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(EnableShadows), + nameof(LightOnlyTarget), + nameof(LightWorld), + nameof(CameraSpace), + new(nameof(LinearFloatLightColor)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpotlightTextureName)) { Encoding = NetEncoding.String }, + new(nameof(SpotlightTextureFrame)) { Bits = 14 }, + new(nameof(NearZ)) { Bits = 16, Flags = PropFlags.RoundDown, Low = 0.0f, High = 500.0f }, + new(nameof(FarZ)) { Bits = 18, Flags = PropFlags.RoundDown, Low = 0.0f, High = 56756.0f }, + nameof(ShadowQuality), + new(nameof(Style)) { Bits = 8 }, + ]; - [NetworkName("m_hTargetEntity")] - public EHANDLE HTargetEntity = new(); - [NetworkName("m_bState")] - public bool State; - [NetworkName("m_flLightFOV")] - public float LightFOV; - [NetworkName("m_bEnableShadows")] - public bool EnableShadows; - [NetworkName("m_bLightOnlyTarget")] - public bool LightOnlyTarget; - [NetworkName("m_bLightWorld")] - public bool LightWorld; - [NetworkName("m_bCameraSpace")] - public bool CameraSpace; - [NetworkName("m_LinearFloatLightColor")] - public Vector3 LinearFloatLightColor; - [NetworkName("m_SpotlightTextureName")] - public InlineArrayMaxPath SpotlightTextureName; - [NetworkName("m_nSpotlightTextureFrame")] - public int SpotlightTextureFrame; - [NetworkName("m_flNearZ")] - public float NearZ; - [NetworkName("m_flFarZ")] - public float FarZ; - [NetworkName("m_nShadowQuality")] - public bool ShadowQuality; - [NetworkName("m_iStyle")] - public int Style; + public EnvProjectedTexture() { + HTargetEntity = new(); + } + + + [NetworkVar("m_hTargetEntity")] + public partial EHANDLE HTargetEntity { get; set; } + [NetworkVar("m_bState")] + public partial bool State { get; set; } + [NetworkVar("m_flLightFOV")] + public partial float LightFOV { get; set; } + [NetworkVar("m_bEnableShadows")] + public partial bool EnableShadows { get; set; } + [NetworkVar("m_bLightOnlyTarget")] + public partial bool LightOnlyTarget { get; set; } + [NetworkVar("m_bLightWorld")] + public partial bool LightWorld { get; set; } + [NetworkVar("m_bCameraSpace")] + public partial bool CameraSpace { get; set; } + [NetworkVar("m_LinearFloatLightColor")] + public partial Vector3 LinearFloatLightColor { get; set; } + [NetworkVar("m_SpotlightTextureName")] + public partial ref readonly InlineArrayMaxPath SpotlightTextureName { get; } + [NetworkVar("m_nSpotlightTextureFrame")] + public partial int SpotlightTextureFrame { get; set; } + [NetworkVar("m_flNearZ")] + public partial float NearZ { get; set; } + [NetworkVar("m_flFarZ")] + public partial float FarZ { get; set; } + [NetworkVar("m_nShadowQuality")] + public partial bool ShadowQuality { get; set; } + [NetworkVar("m_iStyle")] + public partial int Style { get; set; } } diff --git a/Game.Server/EnvQuadraticBeam.cs b/Game.Server/EnvQuadraticBeam.cs index 5a0b7d42..e87ecc74 100644 --- a/Game.Server/EnvQuadraticBeam.cs +++ b/Game.Server/EnvQuadraticBeam.cs @@ -3,25 +3,24 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_quadraticbeam")] -[NetworkName("CEnvQuadraticBeam")] -public class EnvQuadraticBeam : BaseEntity +[NetworkName("CEnvQuadraticBeam", Table = "DT_QuadraticBeam")] +public partial class EnvQuadraticBeam : BaseEntity { - public static readonly SendTable DT_QuadraticBeam = new(DT_BaseEntity, [ - SendPropVector(FIELD.OF(nameof(TargetPosition)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(ControlPosition)), 0, PropFlags.Coord), - SendPropFloat(FIELD.OF(nameof(ScrollRate)), 8, 0, -4, 4), - SendPropFloat(FIELD.OF(nameof(Width)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_QuadraticBeam); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(TargetPosition)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ControlPosition)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ScrollRate)) { Bits = 8, Low = -4, High = 4 }, + new(nameof(Width)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_targetPosition")] - public Vector3 TargetPosition; - [NetworkName("m_controlPosition")] - public Vector3 ControlPosition; - [NetworkName("m_scrollRate")] - public float ScrollRate; - [NetworkName("m_flWidth")] - public float Width; + [NetworkVar("m_targetPosition")] + public partial Vector3 TargetPosition { get; set; } + [NetworkVar("m_controlPosition")] + public partial Vector3 ControlPosition { get; set; } + [NetworkVar("m_scrollRate")] + public partial float ScrollRate { get; set; } + [NetworkVar("m_flWidth")] + public partial float Width { get; set; } } diff --git a/Game.Server/EnvScreenEffect.cs b/Game.Server/EnvScreenEffect.cs index 2db4c2b9..3d7bc95a 100644 --- a/Game.Server/EnvScreenEffect.cs +++ b/Game.Server/EnvScreenEffect.cs @@ -3,19 +3,18 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_screeneffect")] [NetworkName("CEnvScreenEffect")] -public class EnvScreenEffect : BaseEntity +public partial class EnvScreenEffect : BaseEntity { - public static readonly SendTable DT_EnvScreenEffect = new(DT_BaseEntity, [ - SendPropFloat(FIELD.OF(nameof(Duration)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(Type)), 12, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_EnvScreenEffect); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Duration)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Type)) { Bits = 12, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_flDuration")] - public float Duration; - [NetworkName("m_nType")] - public int Type; + [NetworkVar("m_flDuration")] + public partial float Duration { get; set; } + [NetworkVar("m_nType")] + public partial int Type { get; set; } } diff --git a/Game.Server/EnvScreenOverlay.cs b/Game.Server/EnvScreenOverlay.cs index a74cc608..7b8da37e 100644 --- a/Game.Server/EnvScreenOverlay.cs +++ b/Game.Server/EnvScreenOverlay.cs @@ -4,33 +4,29 @@ namespace Game.Server; -using FIELD = FIELD; - [LinkEntityToClass("env_screenoverlay")] [NetworkName("CEnvScreenOverlay")] -public class EnvScreenOverlay : BaseEntity +public partial class EnvScreenOverlay : BaseEntity { public const int MAX_SCREEN_OVERLAYS = 10; - [NetworkName("m_iszOverlayNames")] - public InlineArray10> OverlayNames; - [NetworkName("m_flOverlayTimes")] - public InlineArray10 OverlayTimes; - [NetworkName("m_flStartTime")] - public float StartTime; - [NetworkName("m_iDesiredOverlay")] - public int DesiredOverlay; - [NetworkName("m_bIsActive")] - public bool IsActive; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(OverlayNames)) { Encoding = NetEncoding.Array }, + new(nameof(OverlayTimes)) { Encoding = NetEncoding.Array, Bits = 11, Flags = PropFlags.RoundDown, Low = -1.0f, High = 63.0f }, + new(nameof(StartTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DesiredOverlay)) { Bits = 5 }, + nameof(IsActive), + ]; - public static readonly SendTable DT_EnvScreenOverlay = new(DT_BaseEntity, [ - SendPropString(FIELD.OF_SENDINFO_ARRAY(nameof(OverlayNames))), - SendPropArray(FIELD.OF_ARRAY(nameof(OverlayNames))), - SendPropFloat(FIELD.OF_SENDINFO_ARRAY(nameof(OverlayTimes)), 11, PropFlags.RoundDown, -1.0f, 63.0f), - SendPropArray(FIELD.OF_ARRAY(nameof(OverlayTimes))), - SendPropFloat(FIELD.OF(nameof(StartTime)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(DesiredOverlay)), 5), - SendPropBool(FIELD.OF(nameof(IsActive))), - ]); - public static new readonly ServerClass ServerClass = new ServerClass(DT_EnvScreenOverlay); + [NetworkVar("m_iszOverlayNames")] + public partial ref readonly InlineArray10> OverlayNames { get; } + [NetworkVar("m_flOverlayTimes")] + public partial ref readonly InlineArray10 OverlayTimes { get; } + [NetworkVar("m_flStartTime")] + public partial float StartTime { get; set; } + [NetworkVar("m_iDesiredOverlay")] + public partial int DesiredOverlay { get; set; } + [NetworkVar("m_bIsActive")] + public partial bool IsActive { get; set; } } diff --git a/Game.Server/EnvStarfield.cs b/Game.Server/EnvStarfield.cs index dc9440b9..52499f8c 100644 --- a/Game.Server/EnvStarfield.cs +++ b/Game.Server/EnvStarfield.cs @@ -3,19 +3,18 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_starfield")] [NetworkName("CEnvStarfield")] -public class EnvStarfield : BaseEntity +public partial class EnvStarfield : BaseEntity { - public static readonly SendTable DT_EnvStarfield = new(DT_BaseEntity, [ - SendPropBool(FIELD.OF(nameof(On))), - SendPropFloat(FIELD.OF(nameof(Density)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_EnvStarfield); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(On), + new(nameof(Density)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_bOn")] - public bool On; - [NetworkName("m_flDensity")] - public float Density; + [NetworkVar("m_bOn")] + public partial bool On { get; set; } + [NetworkVar("m_flDensity")] + public partial float Density { get; set; } } diff --git a/Game.Server/EnvTonemapController.cs b/Game.Server/EnvTonemapController.cs index b996ebae..77eb236e 100644 --- a/Game.Server/EnvTonemapController.cs +++ b/Game.Server/EnvTonemapController.cs @@ -13,17 +13,18 @@ [LinkEntityToClass("env_tonemap_controller")] [NetworkName("CEnvTonemapController")] -public class EnvTonemapController : PointEntity +public partial class EnvTonemapController : PointEntity { - public static readonly SendTable DT_EnvTonemapController = new(DT_BaseEntity, [ - SendPropBool(FIELD.OF(nameof(UseCustomAutoExposureMin))), - SendPropBool(FIELD.OF(nameof(UseCustomAutoExposureMax))), - SendPropBool(FIELD.OF(nameof(UseCustomBloomScale))), - SendPropFloat(FIELD.OF(nameof(CustomAutoExposureMin)), 0, PropFlags.NoScale, 0, 0), - SendPropFloat(FIELD.OF(nameof(CustomAutoExposureMax)), 0, PropFlags.NoScale, 0, 0), - SendPropFloat(FIELD.OF(nameof(CustomBloomScale)), 0, PropFlags.NoScale, 0, 0), - SendPropFloat(FIELD.OF(nameof(CustomBloomScaleMinimum)), 0, PropFlags.NoScale, 0, 0), - ]); public static readonly new ServerClass ServerClass = new ServerClass(DT_EnvTonemapController); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(UseCustomAutoExposureMin), + nameof(UseCustomAutoExposureMax), + nameof(UseCustomBloomScale), + new(nameof(CustomAutoExposureMin)) { Bits = 0, Flags = PropFlags.NoScale, Low = 0, High = 0 }, + new(nameof(CustomAutoExposureMax)) { Bits = 0, Flags = PropFlags.NoScale, Low = 0, High = 0 }, + new(nameof(CustomBloomScale)) { Bits = 0, Flags = PropFlags.NoScale, Low = 0, High = 0 }, + new(nameof(CustomBloomScaleMinimum)) { Bits = 0, Flags = PropFlags.NoScale, Low = 0, High = 0 }, + ]; public static readonly ConVar mat_hdr_tonemapscale = new("1.0", FCvar.Cheat, "The HDR tonemap scale. 1 = Use autoexposure, 0 = eyes fully closed, 16 = eyes wide open."); @@ -32,20 +33,20 @@ public class EnvTonemapController : PointEntity TimeUnit_t BlendEndTime; TimeUnit_t BlendStartTime; - [NetworkName("m_bUseCustomAutoExposureMin")] - public bool UseCustomAutoExposureMin; - [NetworkName("m_bUseCustomAutoExposureMax")] - public bool UseCustomAutoExposureMax; - [NetworkName("m_bUseCustomBloomScale")] - public bool UseCustomBloomScale; - [NetworkName("m_flCustomAutoExposureMin")] - public float CustomAutoExposureMin; - [NetworkName("m_flCustomAutoExposureMax")] - public float CustomAutoExposureMax; - [NetworkName("m_flCustomBloomScale")] - public float CustomBloomScale; - [NetworkName("m_flCustomBloomScaleMinimum")] - public float CustomBloomScaleMinimum; + [NetworkVar("m_bUseCustomAutoExposureMin")] + public partial bool UseCustomAutoExposureMin { get; set; } + [NetworkVar("m_bUseCustomAutoExposureMax")] + public partial bool UseCustomAutoExposureMax { get; set; } + [NetworkVar("m_bUseCustomBloomScale")] + public partial bool UseCustomBloomScale { get; set; } + [NetworkVar("m_flCustomAutoExposureMin")] + public partial float CustomAutoExposureMin { get; set; } + [NetworkVar("m_flCustomAutoExposureMax")] + public partial float CustomAutoExposureMax { get; set; } + [NetworkVar("m_flCustomBloomScale")] + public partial float CustomBloomScale { get; set; } + [NetworkVar("m_flCustomBloomScaleMinimum")] + public partial float CustomBloomScaleMinimum { get; set; } public static readonly new DataMap DataDesc = new(typeof(EnvTonemapController), PointEntity.DataDesc, [ DEFINE.FIELD(nameof(BlendTonemapStart), FieldType.Float), diff --git a/Game.Server/EnvWind.cs b/Game.Server/EnvWind.cs index b4937b3f..6e69c2f5 100644 --- a/Game.Server/EnvWind.cs +++ b/Game.Server/EnvWind.cs @@ -4,33 +4,19 @@ using System.Numerics; namespace Game.Server; -using FIELD = FIELD; -using FIELD_EWS = FIELD; [LinkEntityToClass("env_wind")] -[NetworkName("CEnvWind")] -public class EnvWind : BaseEntity +[NetworkName("CEnvWind", NoBase = true)] +public partial class EnvWind : BaseEntity { - public static readonly SendTable DT_EnvWindShared = new(nameof(DT_EnvWindShared), [ - SendPropInt(FIELD_EWS.OF(nameof(EnvWindShared.MinWind)), 10, PropFlags.Unsigned), - SendPropInt(FIELD_EWS.OF(nameof(EnvWindShared.MaxWind)), 10, PropFlags.Unsigned), - SendPropInt(FIELD_EWS.OF(nameof(EnvWindShared.MinGust)), 10, PropFlags.Unsigned), - SendPropInt(FIELD_EWS.OF(nameof(EnvWindShared.MaxGust)), 10, PropFlags.Unsigned), - SendPropFloat(FIELD_EWS.OF(nameof(EnvWindShared.MinGustDelay))), - SendPropFloat(FIELD_EWS.OF(nameof(EnvWindShared.MaxGustDelay))), - SendPropInt(FIELD_EWS.OF(nameof(EnvWindShared.GustDirChange)), 9, PropFlags.Unsigned), - SendPropInt(FIELD_EWS.OF(nameof(EnvWindShared.WindSeed)), 32, PropFlags.Unsigned), - SendPropInt(FIELD_EWS.OF(nameof(EnvWindShared.InitialWindDir)), 9, PropFlags.Unsigned), - SendPropFloat(FIELD_EWS.OF(nameof(EnvWindShared.InitialWindSpeed))), - SendPropFloat(FIELD_EWS.OF(nameof(EnvWindShared.StartTime))), - SendPropFloat(FIELD_EWS.OF(nameof(EnvWindShared.GustDuration))), - SendPropInt(FIELD_EWS.OF(nameof(EnvWindShared.WindRadius)), 32, PropFlags.NoScale), - ]); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(EnvWindShared)) { Encoding = NetEncoding.DataTable, DataTable = "DT_EnvWindShared" }, + ]; - public static readonly SendTable DT_EnvWind = new([ - SendPropDataTable("m_EnvWindShared", FIELD.OF(nameof(EnvWindShared)), DT_EnvWindShared), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_EnvWind); - - [NetworkName("m_EnvWindShared")] + [NetworkVar("m_EnvWindShared")] public readonly EnvWindShared EnvWindShared = new(); + + public EnvWind() { + EnvWindShared.Outer = this; + } } diff --git a/Game.Server/FireSmoke.cs b/Game.Server/FireSmoke.cs index 9a7bc050..51fc9039 100644 --- a/Game.Server/FireSmoke.cs +++ b/Game.Server/FireSmoke.cs @@ -3,31 +3,30 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("_firesmoke")] [NetworkName("CFireSmoke")] -public class FireSmoke : BaseEntity +public partial class FireSmoke : BaseEntity { - public static readonly SendTable DT_FireSmoke = new(DT_BaseEntity, [ - SendPropFloat(FIELD.OF(nameof(StartScale)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(Scale)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(ScaleTime)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(Flags)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(FlameModelIndex)), 14, 0), - SendPropInt(FIELD.OF(nameof(FlameFromAboveModelIndex)), 14, 0), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_FireSmoke); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartScale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Scale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ScaleTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Flags)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(FlameModelIndex)) { Bits = 14 }, + new(nameof(FlameFromAboveModelIndex)) { Bits = 14 }, + ]; - [NetworkName("m_flStartScale")] - public float StartScale; - [NetworkName("m_flScale")] - public float Scale; - [NetworkName("m_flScaleTime")] - public float ScaleTime; - [NetworkName("m_nFlags")] - public int Flags; - [NetworkName("m_nFlameModelIndex")] - public int FlameModelIndex; - [NetworkName("m_nFlameFromAboveModelIndex")] - public int FlameFromAboveModelIndex; + [NetworkVar("m_flStartScale")] + public partial float StartScale { get; set; } + [NetworkVar("m_flScale")] + public partial float Scale { get; set; } + [NetworkVar("m_flScaleTime")] + public partial float ScaleTime { get; set; } + [NetworkVar("m_nFlags")] + public partial int Flags { get; set; } + [NetworkVar("m_nFlameModelIndex")] + public partial int FlameModelIndex { get; set; } + [NetworkVar("m_nFlameFromAboveModelIndex")] + public partial int FlameFromAboveModelIndex { get; set; } } diff --git a/Game.Server/FireTrail.cs b/Game.Server/FireTrail.cs index 67ad6cb0..17bde1ff 100644 --- a/Game.Server/FireTrail.cs +++ b/Game.Server/FireTrail.cs @@ -3,19 +3,18 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_fire_trail")] [NetworkName("CFireTrail")] -public class FireTrail : BaseParticleEntity +public partial class FireTrail : BaseParticleEntity { - public static readonly SendTable DT_FireTrail = new(DT_BaseParticleEntity, [ - SendPropInt(FIELD.OF(nameof(Attachment)), 32, 0), - SendPropFloat(FIELD.OF(nameof(Lifetime)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_FireTrail); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Attachment)) { Bits = 32 }, + new(nameof(Lifetime)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_nAttachment")] - public int Attachment; - [NetworkName("m_flLifetime")] - public float Lifetime; + [NetworkVar("m_nAttachment")] + public partial int Attachment { get; set; } + [NetworkVar("m_flLifetime")] + public partial float Lifetime { get; set; } } diff --git a/Game.Server/Fish.cs b/Game.Server/Fish.cs index 6138d3d8..30d16eaa 100644 --- a/Game.Server/Fish.cs +++ b/Game.Server/Fish.cs @@ -3,33 +3,32 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("fish")] -[NetworkName("CFish")] -public class Fish : BaseAnimating +[NetworkName("CFish", Table = "DT_CFish", NoBase = true)] +public partial class Fish : BaseAnimating { - public static readonly SendTable DT_CFish = new([ - SendPropVector(FIELD.OF(nameof(PoolOrigin)), 0, PropFlags.Coord), - SendPropFloat(FIELD.OF(nameof(Le)), 7, 0, 0.0f, 360.0f), - SendPropFloat(FIELD.OF(nameof(X)), 7, 0, -255.0f, 255.0f), - SendPropFloat(FIELD.OF(nameof(Y)), 7, 0, -255.0f, 255.0f), - SendPropFloat(FIELD.OF(nameof(Z)), 0, PropFlags.Coord | PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(ModelIndex)), 14, 0), - SendPropInt(FIELD.OF(nameof(LifeState)), 3, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(WaterLevel)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_CFish); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(PoolOrigin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Le)) { Bits = 7, Low = 0.0f, High = 360.0f }, + new(nameof(X)) { Bits = 7, Low = -255.0f, High = 255.0f }, + new(nameof(Y)) { Bits = 7, Low = -255.0f, High = 255.0f }, + new(nameof(Z)) { Bits = 0, Flags = PropFlags.Coord | PropFlags.NoScale }, + new(nameof(ModelIndex)) { Encoding = NetEncoding.Int, Bits = 14 }, + new(nameof(LifeState)) { Bits = 3, Flags = PropFlags.Unsigned }, + new(nameof(WaterLevel)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_poolOrigin")] - public Vector3 PoolOrigin; - [NetworkName("m_angle")] - public float Le; - [NetworkName("m_x")] - public float X; - [NetworkName("m_y")] - public float Y; - [NetworkName("m_z")] - public float Z; - [NetworkName("m_waterLevel")] - public new float WaterLevel; + [NetworkVar("m_poolOrigin")] + public partial Vector3 PoolOrigin { get; set; } + [NetworkVar("m_angle")] + public partial float Le { get; set; } + [NetworkVar("m_x")] + public partial float X { get; set; } + [NetworkVar("m_y")] + public partial float Y { get; set; } + [NetworkVar("m_z")] + public partial float Z { get; set; } + [NetworkVar("m_waterLevel")] + public new partial float WaterLevel { get; set; } } diff --git a/Game.Server/Flare.cs b/Game.Server/Flare.cs index 36d5c947..ba12fd15 100644 --- a/Game.Server/Flare.cs +++ b/Game.Server/Flare.cs @@ -3,28 +3,27 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_flare")] [NetworkName("CFlare")] -public class Flare : BaseCombatCharacter +public partial class Flare : BaseCombatCharacter { - public static readonly SendTable DT_Flare = new(DT_BaseCombatCharacter, [ - SendPropFloat(FIELD.OF(nameof(TimeBurnOut)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(Scale)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(Light))), - SendPropBool(FIELD.OF(nameof(Smoke))), - SendPropBool(FIELD.OF(nameof(PropFlare))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_Flare); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(TimeBurnOut)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Scale)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Light), + nameof(Smoke), + nameof(PropFlare), + ]; - [NetworkName("m_flTimeBurnOut")] - public float TimeBurnOut; - [NetworkName("m_flScale")] - public float Scale; - [NetworkName("m_bLight")] - public bool Light; - [NetworkName("m_bSmoke")] - public bool Smoke; - [NetworkName("m_bPropFlare")] - public bool PropFlare; + [NetworkVar("m_flTimeBurnOut")] + public partial float TimeBurnOut { get; set; } + [NetworkVar("m_flScale")] + public partial float Scale { get; set; } + [NetworkVar("m_bLight")] + public partial bool Light { get; set; } + [NetworkVar("m_bSmoke")] + public partial bool Smoke { get; set; } + [NetworkVar("m_bPropFlare")] + public partial bool PropFlare { get; set; } } diff --git a/Game.Server/FleshEffectTarget.cs b/Game.Server/FleshEffectTarget.cs index d8e2f552..31e18246 100644 --- a/Game.Server/FleshEffectTarget.cs +++ b/Game.Server/FleshEffectTarget.cs @@ -3,19 +3,18 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("point_flesh_effect_target")] [NetworkName("CFleshEffectTarget")] -public class FleshEffectTarget : BaseEntity +public partial class FleshEffectTarget : BaseEntity { - public static readonly SendTable DT_FleshEffectTarget = new(DT_BaseEntity, [ - SendPropFloat(FIELD.OF(nameof(Radius)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(ScaleTime)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_FleshEffectTarget); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Radius)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ScaleTime)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flRadius")] - public float Radius; - [NetworkName("m_flScaleTime")] - public float ScaleTime; + [NetworkVar("m_flRadius")] + public partial float Radius { get; set; } + [NetworkVar("m_flScaleTime")] + public partial float ScaleTime { get; set; } } diff --git a/Game.Server/FlexManipulate.cs b/Game.Server/FlexManipulate.cs index b1961bfe..28004fc5 100644 --- a/Game.Server/FlexManipulate.cs +++ b/Game.Server/FlexManipulate.cs @@ -3,29 +3,28 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("manipulate_flex")] [NetworkName("CFlexManipulate")] -public class FlexManipulate : BaseEntity +public partial class FlexManipulate : BaseEntity { - public static readonly SendTable DT_FlexManipulate = new(DT_BaseEntity, [ - SendPropFloat(FIELD.OF(nameof(ExScale)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(EyesLocalTarget)), 0, PropFlags.NoScale), - SendPropArray3(FIELD.OF_ARRAY(nameof(FlexWeights)), SendPropFloat(null!, 0, PropFlags.NoScale)), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_FlexManipulate); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ExScale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EyesLocalTarget)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FlexWeights)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flexScale")] - public float ExScale; - [NetworkName("m_EyesLocalTarget")] - public Vector3 EyesLocalTarget; - [NetworkName("m_iFlexWeights")] - public InlineArray96 FlexWeights; + [NetworkVar("m_flexScale")] + public partial float ExScale { get; set; } + [NetworkVar("m_EyesLocalTarget")] + public partial Vector3 EyesLocalTarget { get; set; } + [NetworkVar("m_iFlexWeights")] + public partial ref readonly InlineArray96 FlexWeights { get; } public void SetFlexWeight(byte index, float weight) { if (index < 96 && FlexWeights[index] != weight) { NetworkStateChanged(); - FlexWeights[index] = weight; + FlexWeightsForModify()[index] = weight; } } } diff --git a/Game.Server/FogController.cs b/Game.Server/FogController.cs index a4f3b90d..064dc9c8 100644 --- a/Game.Server/FogController.cs +++ b/Game.Server/FogController.cs @@ -3,36 +3,35 @@ using Source.Common; namespace Game.Server; -using FIELD = Source.FIELD; [LinkEntityToClass("env_fog_controller")] [NetworkName("CFogController")] -public class FogController : BaseEntity +public partial class FogController : BaseEntity { - [NetworkName("m_fog")] - public FogParams Fog; - public static readonly SendTable DT_FogController = new([ - SendPropInt(FIELD.OF("Fog.Enable"), 1, PropFlags.Unsigned), - SendPropInt(FIELD.OF("Fog.Blend"), 1, PropFlags.Unsigned), - SendPropInt(FIELD.OF("Fog.Radial"), 1, PropFlags.Unsigned), - SendPropVector(FIELD.OF("Fog.DirPrimary"), 0, PropFlags.Coord), - SendPropInt(FIELD.OF("Fog.ColorPrimary"), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF("Fog.ColorSecondary"), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF("Fog.ColorPrimaryHDR"), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF("Fog.ColorSecondaryHDR"), 32, PropFlags.Unsigned), - SendPropFloat(FIELD.OF("Fog.Start"), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF("Fog.End"), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF("Fog.MaxDensity"), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF("Fog.FarZ"), 0, PropFlags.NoScale), + [NetworkVar("m_fog")] + public partial ref readonly FogParams Fog { get; } + [NetworkTable(NoBase = true)] + public static readonly new NetworkProp[] Props = [ + nameof(Fog.Enable), + nameof(Fog.Blend), + nameof(Fog.Radial), + new(nameof(Fog.DirPrimary)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Fog.ColorPrimary)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Fog.ColorSecondary)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Fog.ColorPrimaryHDR)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Fog.ColorSecondaryHDR)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Fog.Start)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Fog.End)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Fog.MaxDensity)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Fog.FarZ)) { Bits = 0, Flags = PropFlags.NoScale }, - SendPropInt(FIELD.OF("Fog.ColorPrimaryLerpTo"), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF("Fog.ColorSecondaryLerpTo"), 32, PropFlags.Unsigned), - SendPropFloat(FIELD.OF("Fog.StartLerpTo"), 0, PropFlags.NoScale, 0, 0), - SendPropFloat(FIELD.OF("Fog.EndLerpTo"), 0, PropFlags.NoScale, 0, 0), - SendPropFloat(FIELD.OF("Fog.MaxDensityLerpTo"), 0, PropFlags.NoScale, 0, 0), - SendPropFloat(FIELD.OF("Fog.LerpTime"), 0, PropFlags.NoScale, 0, 0), - SendPropFloat(FIELD.OF("Fog.Duration"), 0, PropFlags.NoScale, 0, 0), - SendPropFloat(FIELD.OF("Fog.HDRColorScale"), 0, PropFlags.NoScale, 0, 0), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_FogController); + new(nameof(Fog.ColorPrimaryLerpTo)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Fog.ColorSecondaryLerpTo)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Fog.StartLerpTo)) { Bits = 0, Flags = PropFlags.NoScale, Low = 0.0f, High = 0.0f }, + new(nameof(Fog.EndLerpTo)) { Bits = 0, Flags = PropFlags.NoScale, Low = 0.0f, High = 0.0f }, + new(nameof(Fog.MaxDensityLerpTo)) { Bits = 0, Flags = PropFlags.NoScale, Low = 0.0f, High = 0.0f }, + new(nameof(Fog.LerpTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale, Low = 0.0f, High = 0.0f }, + new(nameof(Fog.Duration)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale, Low = 0.0f, High = 0.0f }, + new(nameof(Fog.HDRColorScale)) { Bits = 0, Flags = PropFlags.NoScale, Low = 0.0f, High = 0.0f }, + ]; } diff --git a/Game.Server/FuncAreaPortalWindow.cs b/Game.Server/FuncAreaPortalWindow.cs index 2f7d4b08..e7093139 100644 --- a/Game.Server/FuncAreaPortalWindow.cs +++ b/Game.Server/FuncAreaPortalWindow.cs @@ -7,22 +7,22 @@ namespace Game.Server; -using FIELD = FIELD; using DEFINE = DEFINE; [LinkEntityToClass("func_areaportalwindow")] [NetworkName("CFuncAreaPortalWindow")] -public class FuncAreaPortalWindow : FuncAreaPortalBase +public partial class FuncAreaPortalWindow : FuncAreaPortalBase { + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(FadeDist)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeStartDist)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(TranslucencyLimit)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(BackgroundModelIndex)) { Encoding = NetEncoding.ModelIndex }, + ]; + const float FADE_DIST_BUFFER = 10; - public static readonly SendTable DT_FuncAreaPortalWindow = new(DT_BaseEntity, [ - SendPropFloat(FIELD.OF(nameof(FadeDist)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FadeStartDist)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(TranslucencyLimit)), 0, PropFlags.NoScale), - SendPropModelIndex(FIELD.OF(nameof(BackgroundModelIndex))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_FuncAreaPortalWindow); public static readonly new DataMap DataDesc = new(typeof(FuncAreaPortalWindow), FuncAreaPortalBase.DataDesc, [ DEFINE.KEYFIELD(nameof(PortalNumber), FieldType.Integer, "portalnumber"), @@ -36,14 +36,14 @@ public class FuncAreaPortalWindow : FuncAreaPortalBase ]); public override DataMap? GetDataDescMap() => DataDesc; - [NetworkName("m_flFadeDist")] - public float FadeDist; - [NetworkName("m_flFadeStartDist")] - public float FadeStartDist; - [NetworkName("m_flTranslucencyLimit")] - public float TranslucencyLimit; - [NetworkName("m_iBackgroundModelIndex")] - public int BackgroundModelIndex; + [NetworkVar("m_flFadeDist")] + public partial float FadeDist { get; set; } + [NetworkVar("m_flFadeStartDist")] + public partial float FadeStartDist { get; set; } + [NetworkVar("m_flTranslucencyLimit")] + public partial float TranslucencyLimit { get; set; } + [NetworkVar("m_iBackgroundModelIndex")] + public partial int BackgroundModelIndex { get; set; } string? BackgroundBModelName; diff --git a/Game.Server/FuncConveyor.cs b/Game.Server/FuncConveyor.cs index 2cf46916..d4132105 100644 --- a/Game.Server/FuncConveyor.cs +++ b/Game.Server/FuncConveyor.cs @@ -5,17 +5,16 @@ namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("func_conveyor")] [NetworkName("CFuncConveyor")] -public class FuncConveyor : FuncWall +public partial class FuncConveyor : FuncWall { - public static readonly SendTable DT_FuncConveyor = new(DT_BaseEntity, [ - SendPropFloat(FIELD.OF(nameof(ConveyorSpeed)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_FuncConveyor); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ConveyorSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flConveyorSpeed")] - public float ConveyorSpeed; + [NetworkVar("m_flConveyorSpeed")] + public partial float ConveyorSpeed { get; set; } } diff --git a/Game.Server/FuncMonitor.cs b/Game.Server/FuncMonitor.cs index 4d2d1df6..06aeeb5f 100644 --- a/Game.Server/FuncMonitor.cs +++ b/Game.Server/FuncMonitor.cs @@ -6,8 +6,10 @@ namespace Game.Server; [LinkEntityToClass("func_monitor")] [NetworkName("CFuncMonitor")] -public class FuncMonitor : FuncBrush +public partial class FuncMonitor : FuncBrush { - public static readonly SendTable DT_FuncMonitor = new(DT_BaseEntity, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_FuncMonitor); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Server/FuncOccluder.cs b/Game.Server/FuncOccluder.cs index c3979cb8..ceef709e 100644 --- a/Game.Server/FuncOccluder.cs +++ b/Game.Server/FuncOccluder.cs @@ -9,20 +9,18 @@ namespace Game.Server; -using FIELD = FIELD; - [LinkEntityToClass("func_occluder")] -[NetworkName("CFuncOccluder")] -public class FuncOccluder : BaseEntity +[NetworkName("CFuncOccluder", NoBase = true)] +public partial class FuncOccluder : BaseEntity { - public static readonly SendTable DT_FuncOccluder = new([ - SendPropBool(FIELD.OF(nameof(Active))), - SendPropInt(FIELD.OF(nameof(OccluderIndex)), 10, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_FuncOccluder); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Active), + new(nameof(OccluderIndex)) { Bits = 10, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_bActive")] - public bool Active; - [NetworkName("m_nOccluderIndex")] - public int OccluderIndex; + [NetworkVar("m_bActive")] + public partial bool Active { get; set; } + [NetworkVar("m_nOccluderIndex")] + public partial int OccluderIndex { get; set; } } diff --git a/Game.Server/FuncReflectiveGlass.cs b/Game.Server/FuncReflectiveGlass.cs index 31d12c91..0d894350 100644 --- a/Game.Server/FuncReflectiveGlass.cs +++ b/Game.Server/FuncReflectiveGlass.cs @@ -6,8 +6,10 @@ namespace Game.Server; [LinkEntityToClass("func_reflective_glass")] [NetworkName("CFuncReflectiveGlass")] -public class FuncReflectiveGlass : Breakable +public partial class FuncReflectiveGlass : Breakable { - public static readonly SendTable DT_FuncReflectiveGlass = new(DT_BaseEntity, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_FuncReflectiveGlass); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Server/FuncRotating.cs b/Game.Server/FuncRotating.cs index b9fc1691..966ffbd0 100644 --- a/Game.Server/FuncRotating.cs +++ b/Game.Server/FuncRotating.cs @@ -11,12 +11,11 @@ namespace Game.Server; -using FIELD = FIELD; using DEFINE = Source.DEFINE; [LinkEntityToClass("func_rotating")] [NetworkName("CFuncRotating")] -public class FuncRotating : BaseEntity +public partial class FuncRotating : BaseEntity { [Flags] public enum SF @@ -39,38 +38,30 @@ public enum SF const int FANPITCHMIN = 30; const int FANPITCHMAX = 100; - public static readonly SendTable DT_FuncRotating = new(DT_BaseEntity, [ - SendPropExclude(nameof(DT_BaseEntity), "m_angRotation"), - SendPropExclude(nameof(DT_BaseEntity), "m_vecOrigin"), - SendPropExclude(nameof(DT_BaseEntity), "m_flSimulationTime"), + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Rotation)) { Exclude = true }, + new(nameof(Origin)) { Exclude = true }, + new(nameof(SimulationTime)) { Exclude = true }, - SendPropVector(NetworkVarFields.Origin, 0, PropFlags.Coord | PropFlags.ChangesOften, 0, Constants.HIGH_DEFAULT, SendProxy_FuncRotatingOrigin), - SendPropAngle(FIELD.OF_VECTORELEM(nameof(Rotation), 0), 13, PropFlags.RoundDown | PropFlags.ChangesOften, proxyFn: SendProxy_FuncRotatingAngle), - SendPropAngle(FIELD.OF_VECTORELEM(nameof(Rotation), 1), 13, PropFlags.RoundDown | PropFlags.ChangesOften, proxyFn: SendProxy_FuncRotatingAngle), - SendPropAngle(FIELD.OF_VECTORELEM(nameof(Rotation), 2), 13, PropFlags.RoundDown | PropFlags.ChangesOften, proxyFn: SendProxy_FuncRotatingAngle), - SendPropInt(FIELD.OF(nameof(SimulationTime)), SIMULATION_TIME_WINDOW_BITS, PropFlags.Unsigned | PropFlags.ChangesOften | PropFlags.EncodedAgainstTickCount, SendProxy_FuncRotatingSimulationTime) - ]); - - private static void SendProxy_FuncRotatingOrigin(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) { - SendProxy_Origin(prop, instance, field, ref outData, element, objectID); - } - - private static void SendProxy_FuncRotatingAngle(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) { - FuncRotating? entity = (FuncRotating?)instance; - Assert(entity != null); + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord | PropFlags.ChangesOften, Low = 0.0f, High = Constants.HIGH_DEFAULT, Proxy = typeof(OriginProxy) }, + new(nameof(Rotation)) { Encoding = NetEncoding.VectorElements, Bits = 13, Flags = PropFlags.RoundDown | PropFlags.ChangesOften, Proxy = typeof(RotationAngleProxy) }, + new(nameof(SimulationTime)) { Encoding = NetEncoding.Int, Bits = SIMULATION_TIME_WINDOW_BITS, Flags = PropFlags.Unsigned | PropFlags.ChangesOften | PropFlags.EncodedAgainstTickCount, Proxy = typeof(SimulationTimeProxy) }, + ]; - float qa = field.GetValue(instance); + public static class RotationAngleProxy + { + public static void Send(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) { + FuncRotating? entity = (FuncRotating?)instance; + Assert(entity != null); - outData.Float = MathLib.anglemod(qa); - Assert(float.IsFinite(outData.Float)); - } + float qa = field.GetValue(instance); - private static void SendProxy_FuncRotatingSimulationTime(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) { - SendProxy_SimulationTime(prop, instance, field, ref outData, element, objectID); + outData.Float = MathLib.anglemod(qa); + Assert(float.IsFinite(outData.Float)); + } } - public static readonly new ServerClass ServerClass = new ServerClass(DT_FuncRotating); - public static readonly new DataMap DataDesc = new(typeof(FuncRotating), BaseEntity.DataDesc, [ DEFINE.FIELD(nameof(MoveAng), FieldType.Vector), DEFINE.FIELD(nameof(FanFriction), FieldType.Float), diff --git a/Game.Server/FuncSmokeVolume.cs b/Game.Server/FuncSmokeVolume.cs index 9a902d3c..8b8f3b89 100644 --- a/Game.Server/FuncSmokeVolume.cs +++ b/Game.Server/FuncSmokeVolume.cs @@ -9,42 +9,40 @@ namespace Game.Server; -using FIELD = FIELD; - [LinkEntityToClass("func_smokevolume")] [NetworkName("CFuncSmokeVolume")] -public class FuncSmokeVolume : BaseParticleEntity +public partial class FuncSmokeVolume : BaseParticleEntity { - public static readonly SendTable DT_FuncSmokeVolume = new(DT_BaseParticleEntity, [ - SendPropInt(FIELD.OF(nameof(Color1)), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Color2)), 32, PropFlags.Unsigned), - SendPropString(FIELD.OF(nameof(MaterialName))), - SendPropFloat(FIELD.OF(nameof(ParticleDrawWidth)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(ParticleSpacingDistance)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(DensityRampSpeed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(RotationSpeed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MovementSpeed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(Density)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(SpawnFlags)), 8, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_FuncSmokeVolume); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Color1)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Color2)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(MaterialName)) { Encoding = NetEncoding.String }, + new(nameof(ParticleDrawWidth)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ParticleSpacingDistance)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DensityRampSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(RotationSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MovementSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Density)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpawnFlags)) { Encoding = NetEncoding.Int, Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_Color1")] - public Color Color1; - [NetworkName("m_Color2")] - public Color Color2; - [NetworkName("m_MaterialName")] - public InlineArray255 MaterialName; - [NetworkName("m_ParticleDrawWidth")] - public float ParticleDrawWidth; - [NetworkName("m_ParticleSpacingDistance")] - public float ParticleSpacingDistance; - [NetworkName("m_DensityRampSpeed")] - public float DensityRampSpeed; - [NetworkName("m_RotationSpeed")] - public float RotationSpeed; - [NetworkName("m_MovementSpeed")] - public float MovementSpeed; - [NetworkName("m_Density")] - public float Density; + [NetworkVar("m_Color1")] + public partial Color Color1 { get; set; } + [NetworkVar("m_Color2")] + public partial Color Color2 { get; set; } + [NetworkVar("m_MaterialName")] + public partial ref readonly InlineArray255 MaterialName { get; } + [NetworkVar("m_ParticleDrawWidth")] + public partial float ParticleDrawWidth { get; set; } + [NetworkVar("m_ParticleSpacingDistance")] + public partial float ParticleSpacingDistance { get; set; } + [NetworkVar("m_DensityRampSpeed")] + public partial float DensityRampSpeed { get; set; } + [NetworkVar("m_RotationSpeed")] + public partial float RotationSpeed { get; set; } + [NetworkVar("m_MovementSpeed")] + public partial float MovementSpeed { get; set; } + [NetworkVar("m_Density")] + public partial float Density { get; set; } } diff --git a/Game.Server/FuncTrackTrain.cs b/Game.Server/FuncTrackTrain.cs index 8137382d..0cc02dcb 100644 --- a/Game.Server/FuncTrackTrain.cs +++ b/Game.Server/FuncTrackTrain.cs @@ -29,8 +29,12 @@ public enum TrainOrientationType [LinkEntityToClass("func_tracktrain")] [NetworkName("CFuncTrackTrain")] -public class FuncTrackTrain : BaseEntity +public partial class FuncTrackTrain : BaseEntity { + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + [Flags] public enum SF { @@ -55,8 +59,6 @@ public enum SF const float TRAIN_MAXSPEED = 1000; - public static readonly SendTable DT_FuncTrackTrain = new(DT_BaseEntity, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_FuncTrackTrain); public static readonly new DataMap DataDesc = new(typeof(FuncTrackTrain), BaseEntity.DataDesc, [ DEFINE.KEYFIELD(nameof(Length), FieldType.Float, "wheels"), diff --git a/Game.Server/Func_Dust.cs b/Game.Server/Func_Dust.cs index 3608431d..4d8d9a55 100644 --- a/Game.Server/Func_Dust.cs +++ b/Game.Server/Func_Dust.cs @@ -6,48 +6,47 @@ namespace Game.Server; -using FIELD = FIELD; -[NetworkName("CFunc_Dust")] -public class Func_Dust : BaseEntity +[NetworkName("CFunc_Dust", NoBase = true)] +public partial class Func_Dust : BaseEntity { - public static readonly SendTable DT_Func_Dust = new([ - SendPropInt(FIELD.OF(nameof(Color)), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(SpawnRate)), 12, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(SpeedMax)), 12, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(SizeMin)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(SizeMax)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(DistMax)), 16, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(LifetimeMin)), 4, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(LifetimeMax)), 4, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(DustFlags)), 3, PropFlags.Unsigned), - SendPropModelIndex(FIELD.OF(nameof(ModelIndex))), - SendPropFloat(FIELD.OF(nameof(FallSpeed)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(AffectedByWind))), - SendPropDataTable("m_Collision", CollisionProperty.DT_CollisionProperty) - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_Func_Dust); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Color)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(SpawnRate)) { Bits = 12, Flags = PropFlags.Unsigned }, + new(nameof(SpeedMax)) { Bits = 12, Flags = PropFlags.Unsigned }, + new(nameof(SizeMin)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SizeMax)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DistMax)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(LifetimeMin)) { Bits = 4, Flags = PropFlags.Unsigned }, + new(nameof(LifetimeMax)) { Bits = 4, Flags = PropFlags.Unsigned }, + new(nameof(DustFlags)) { Bits = 3, Flags = PropFlags.Unsigned }, + new(nameof(ModelIndex)) { Encoding = NetEncoding.ModelIndex }, + new(nameof(FallSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(AffectedByWind), + new(nameof(Collision)) { Encoding = NetEncoding.DataTable, DataTable = "DT_CollisionProperty" }, + ]; - [NetworkName("m_Color")] - public Color Color; - [NetworkName("m_SpawnRate")] - public int SpawnRate; - [NetworkName("m_SpeedMax")] - public int SpeedMax; - [NetworkName("m_flSizeMin")] - public float SizeMin; - [NetworkName("m_flSizeMax")] - public float SizeMax; - [NetworkName("m_DistMax")] - public int DistMax; - [NetworkName("m_LifetimeMin")] - public int LifetimeMin; - [NetworkName("m_LifetimeMax")] - public int LifetimeMax; - [NetworkName("m_DustFlags")] - public int DustFlags; - [NetworkName("m_FallSpeed")] - public float FallSpeed; - [NetworkName("m_bAffectedByWind")] - public bool AffectedByWind; + [NetworkVar("m_Color")] + public partial Color Color { get; set; } + [NetworkVar("m_SpawnRate")] + public partial int SpawnRate { get; set; } + [NetworkVar("m_SpeedMax")] + public partial int SpeedMax { get; set; } + [NetworkVar("m_flSizeMin")] + public partial float SizeMin { get; set; } + [NetworkVar("m_flSizeMax")] + public partial float SizeMax { get; set; } + [NetworkVar("m_DistMax")] + public partial int DistMax { get; set; } + [NetworkVar("m_LifetimeMin")] + public partial int LifetimeMin { get; set; } + [NetworkVar("m_LifetimeMax")] + public partial int LifetimeMax { get; set; } + [NetworkVar("m_DustFlags")] + public partial int DustFlags { get; set; } + [NetworkVar("m_FallSpeed")] + public partial float FallSpeed { get; set; } + [NetworkVar("m_bAffectedByWind")] + public partial bool AffectedByWind { get; set; } } diff --git a/Game.Server/Func_LOD.cs b/Game.Server/Func_LOD.cs index b98051d6..e1c82b76 100644 --- a/Game.Server/Func_LOD.cs +++ b/Game.Server/Func_LOD.cs @@ -5,18 +5,17 @@ namespace Game.Server; -using FIELD = FIELD; using DEFINE = Source.DEFINE; [LinkEntityToClass("func_lod")] [NetworkName("CFunc_LOD")] -public class Func_LOD : BaseEntity +public partial class Func_LOD : BaseEntity { - public static readonly SendTable DT_Func_LOD = new(DT_BaseEntity, [ - SendPropFloat(FIELD.OF(nameof(DisappearMinDist)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(DisappearMaxDist)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_Func_LOD); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(DisappearMinDist)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DisappearMaxDist)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; public static readonly new DataMap DataDesc = new(typeof(Func_LOD), BaseEntity.DataDesc, [ DEFINE.KEYFIELD(nameof(DisappearMinDist), FieldType.Float, "DisappearMinDist"), @@ -24,10 +23,10 @@ public class Func_LOD : BaseEntity ]); public override DataMap? GetDataDescMap() => DataDesc; - [NetworkName("m_fDisappearMinDist")] - public float DisappearMinDist; - [NetworkName("m_fDisappearMaxDist")] - public float DisappearMaxDist; + [NetworkVar("m_fDisappearMinDist")] + public partial float DisappearMinDist { get; set; } + [NetworkVar("m_fDisappearMaxDist")] + public partial float DisappearMaxDist { get; set; } public override void Spawn() { SetModel(GetModelName()); diff --git a/Game.Server/Game.Server.csproj b/Game.Server/Game.Server.csproj index 50e77af8..42bbf67e 100644 --- a/Game.Server/Game.Server.csproj +++ b/Game.Server/Game.Server.csproj @@ -17,8 +17,6 @@ OutputItemType="Analyzer" ReferenceOutputAssembly="false" /> - diff --git a/Game.Server/GameInterface.cs b/Game.Server/GameInterface.cs index 1f475ff2..3cd9092e 100644 --- a/Game.Server/GameInterface.cs +++ b/Game.Server/GameInterface.cs @@ -798,7 +798,7 @@ public void GetPlayerLimits(out int minPlayers, out int maxPlayers, out int defa maxPlayers = Constants.MAX_PLAYERS; } - public PlayerState? GetPlayerState(Edict player) { + public PlayerEngineState? GetPlayerState(Edict player) { if (player == null || player.GetUnknown() == null) return null; diff --git a/Game.Server/GarrysMod/GMOD_Player.cs b/Game.Server/GarrysMod/GMOD_Player.cs index 64b68548..cf0a0f95 100644 --- a/Game.Server/GarrysMod/GMOD_Player.cs +++ b/Game.Server/GarrysMod/GMOD_Player.cs @@ -12,8 +12,6 @@ namespace Game.Server.GarrysMod; -using FIELD = FIELD; - public static class GMOD_PlayerGlobals { public static GMOD_Player? ToGMODPlayer(BaseEntity? entity) { @@ -27,34 +25,47 @@ public static class GMOD_PlayerGlobals [NetworkName("CGMOD_Player")] public partial class GMOD_Player : HL2MP_Player { + public GMOD_Player() { + HoveredWidget = new(); + PressedWidget = new(); + Driving = new(); + CanZoom = true; + CanWalk = true; + StepSize = 18; + JumpPower = 200; + PlayerColor = new(255, 255, 255); + WeaponColor = new(255, 255, 255); + Hands = new(); + } + public static GMOD_Player? CreatePlayer(ReadOnlySpan classname, Edict ed) { s_PlayerEdict = ed; return (GMOD_Player?)CreateEntityByName(classname); } - public static readonly SendTable DT_GMOD_Player = new(DT_HL2MP_Player, [ - SendPropInt(FIELD.OF(nameof(GModPlayerFlags)), 5, 0), - SendPropEHandle(FIELD.OF(nameof(HoveredWidget))), - SendPropEHandle(FIELD.OF(nameof(PressedWidget))), - SendPropEHandle(FIELD.OF(nameof(Driving))), - SendPropInt(FIELD.OF(nameof(DrivingMode)), 15, 0), - SendPropInt(FIELD.OF(nameof(PlayerClass)), 15, 0), - SendPropBool(FIELD.OF(nameof(CanZoom))), - SendPropBool(FIELD.OF(nameof(CanWalk))), - SendPropBool(FIELD.OF(nameof(IsTyping))), - SendPropFloat(FIELD.OF(nameof(StepSize)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(JumpPower)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF_NAMED(nameof(ViewOffset), "m_ViewOffset"), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(ViewOffsetDucked)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(GestureEndTime)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(PlayerColor)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(WeaponColor)), 0, PropFlags.NoScale), - SendPropEHandle(FIELD.OF(nameof(Hands))), - SendPropInt(FIELD.OF(nameof(WaterLevel)), 2, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(MaxArmor)), 32, 0), - SendPropFloat(FIELD.OF(nameof(Gravity)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(SprintEnabled))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_GMOD_Player); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(GModPlayerFlags)) { Bits = 5 }, + nameof(HoveredWidget), + nameof(PressedWidget), + nameof(Driving), + new(nameof(DrivingMode)) { Bits = 15 }, + new(nameof(PlayerClass)) { Bits = 15 }, + nameof(CanZoom), + nameof(CanWalk), + nameof(IsTyping), + new(nameof(StepSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(JumpPower)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ViewOffset)) { Name = "m_ViewOffset", Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ViewOffsetDucked)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(GestureEndTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(PlayerColor)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(WeaponColor)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Hands), + new(nameof(WaterLevel)) { Bits = 2, Flags = PropFlags.Unsigned }, + new(nameof(MaxArmor)) { Bits = 32 }, + new(nameof(Gravity)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(SprintEnabled), + ]; public bool Transition; @@ -110,36 +121,36 @@ public override BaseEntity EntSelectSpawnPoint() { } public bool ShouldDropWeapon; - [NetworkName("m_iGModPlayerFlags")] - public int GModPlayerFlags; - [NetworkName("m_HoveredWidget")] - public EHANDLE HoveredWidget = new(); - [NetworkName("m_PressedWidget")] - public EHANDLE PressedWidget = new(); - [NetworkName("m_Driving")] - public EHANDLE Driving = new(); - [NetworkName("m_DrivingMode")] - public int DrivingMode; - [NetworkName("m_PlayerClass")] - public int PlayerClass; - [NetworkName("m_bCanZoom")] - public bool CanZoom = true; - [NetworkName("m_bCanWalk")] - public bool CanWalk = true; - [NetworkName("m_bIsTyping")] - public bool IsTyping; - [NetworkName("m_StepSize")] - public float StepSize = 18; - [NetworkName("m_JumpPower")] - public float JumpPower = 200; - [NetworkName("m_ViewOffsetDucked")] - public Vector3 ViewOffsetDucked; - [NetworkName("m_fGestureEndTime")] - public float GestureEndTime; - [NetworkName("m_PlayerColor")] - public Vector3 PlayerColor = new(255, 255, 255); - [NetworkName("m_WeaponColor")] - public Vector3 WeaponColor = new(255, 255, 255); + [NetworkVar("m_iGModPlayerFlags")] + public partial int GModPlayerFlags { get; set; } + [NetworkVar("m_HoveredWidget")] + public partial EHANDLE HoveredWidget { get; set; } + [NetworkVar("m_PressedWidget")] + public partial EHANDLE PressedWidget { get; set; } + [NetworkVar("m_Driving")] + public partial EHANDLE Driving { get; set; } + [NetworkVar("m_DrivingMode")] + public partial int DrivingMode { get; set; } + [NetworkVar("m_PlayerClass")] + public partial int PlayerClass { get; set; } + [NetworkVar("m_bCanZoom")] + public partial bool CanZoom { get; set; } + [NetworkVar("m_bCanWalk")] + public partial bool CanWalk { get; set; } + [NetworkVar("m_bIsTyping")] + public partial bool IsTyping { get; set; } + [NetworkVar("m_StepSize")] + public partial float StepSize { get; set; } + [NetworkVar("m_JumpPower")] + public partial float JumpPower { get; set; } + [NetworkVar("m_ViewOffsetDucked")] + public partial Vector3 ViewOffsetDucked { get; set; } + [NetworkVar("m_fGestureEndTime")] + public partial float GestureEndTime { get; set; } + [NetworkVar("m_PlayerColor")] + public partial Vector3 PlayerColor { get; set; } + [NetworkVar("m_WeaponColor")] + public partial Vector3 WeaponColor { get; set; } public virtual Vector3 GetPlayerColor() => PlayerColor; @@ -156,14 +167,14 @@ public virtual void SetWeaponColor(in Vector3 color) { WeaponColor = color; } } - [NetworkName("m_Hands")] - public EHANDLE Hands = new(); - [NetworkName("m_iMaxArmor")] - public int MaxArmor; - [NetworkName("m_flGravity")] - public float Gravity; - [NetworkName("m_bSprintEnabled")] - public bool SprintEnabled; + [NetworkVar("m_Hands")] + public partial EHANDLE Hands { get; set; } + [NetworkVar("m_iMaxArmor")] + public partial int MaxArmor { get; set; } + [NetworkVar("m_flGravity")] + public partial float Gravity { get; set; } + [NetworkVar("m_bSprintEnabled")] + public partial bool SprintEnabled { get; set; } public override void PlayerRunCommand(UserCmd ucmd, IMoveHelper moveHelper) { base.PlayerRunCommand(ucmd, moveHelper); diff --git a/Game.Server/GarrysMod/LuaNextBot.cs b/Game.Server/GarrysMod/LuaNextBot.cs index 91c575b9..60c8255b 100644 --- a/Game.Server/GarrysMod/LuaNextBot.cs +++ b/Game.Server/GarrysMod/LuaNextBot.cs @@ -4,19 +4,19 @@ using Source.Common; -using FIELD = Source.FIELD; namespace Game.Server.NextBot; [LinkEntityToClass("sent_nextbot")] [NetworkName("CLuaNextBot")] -public class LuaNextBot : NextBotCombatCharacter +public partial class LuaNextBot : NextBotCombatCharacter { - public static readonly SendTable DT_LuaNextBot = new(DT_NextBot, [ - SendPropDataTable("m_ScriptedEntity", FIELD.OF(nameof(ScriptedEntity)), ScriptedEntity.DT_ScriptedEntity), - SendPropInt(FIELD.OF(nameof(LifeState)), 3, PropFlags.Unsigned) - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_LuaNextBot); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ScriptedEntity)) { Encoding = NetEncoding.DataTable, DataTable = "DT_ScriptedEntity" }, + new(nameof(LifeState)) { Bits = 3, Flags = PropFlags.Unsigned }, + ]; + [NetworkVar("m_ScriptedEntity")] public readonly ScriptedEntity ScriptedEntity = new(); public LuaNextBot() { diff --git a/Game.Server/HL1/BaseHL1CombatWeapon.cs b/Game.Server/HL1/BaseHL1CombatWeapon.cs index 3b1bd0d4..3d630de1 100644 --- a/Game.Server/HL1/BaseHL1CombatWeapon.cs +++ b/Game.Server/HL1/BaseHL1CombatWeapon.cs @@ -5,8 +5,10 @@ namespace Game.Server.HL1; [LinkEntityToClass("basehl1combatweapon")] [NetworkName("CBaseHL1CombatWeapon")] -public class BaseHL1CombatWeapon : BaseCombatWeapon +public partial class BaseHL1CombatWeapon : BaseCombatWeapon { - public static readonly SendTable DT_BaseHL1CombatWeapon = new(DT_BaseCombatWeapon, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_BaseHL1CombatWeapon); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Server/HL1/BaseHL1MPCombatWeapon.cs b/Game.Server/HL1/BaseHL1MPCombatWeapon.cs index 6b39f68f..e9fc2dfe 100644 --- a/Game.Server/HL1/BaseHL1MPCombatWeapon.cs +++ b/Game.Server/HL1/BaseHL1MPCombatWeapon.cs @@ -5,8 +5,10 @@ namespace Game.Server.HL1; [LinkEntityToClass("basehl1mpcombatweapon")] [NetworkName("CBaseHL1MPCombatWeapon")] -public class BaseHL1MPCombatWeapon : BaseHL1CombatWeapon +public partial class BaseHL1MPCombatWeapon : BaseHL1CombatWeapon { - public static readonly SendTable DT_BaseHL1MPCombatWeapon = new(DT_BaseHL1CombatWeapon, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_BaseHL1MPCombatWeapon); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Server/HL1/BaseHelicopter_HL1.cs b/Game.Server/HL1/BaseHelicopter_HL1.cs index 965a8db7..c381a17b 100644 --- a/Game.Server/HL1/BaseHelicopter_HL1.cs +++ b/Game.Server/HL1/BaseHelicopter_HL1.cs @@ -4,8 +4,10 @@ namespace Game.Server.HL1; [NetworkName("CBaseHelicopter_HL1")] -public class BaseHelicopter_HL1 : AI_BaseNPC +public partial class BaseHelicopter_HL1 : AI_BaseNPC { - public static readonly SendTable DT_BaseHelicopter_HL1 = new(DT_AI_BaseNPC, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_BaseHelicopter_HL1); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Server/HL2/AR2Explosion.cs b/Game.Server/HL2/AR2Explosion.cs index 5c1861a3..7f03be49 100644 --- a/Game.Server/HL2/AR2Explosion.cs +++ b/Game.Server/HL2/AR2Explosion.cs @@ -4,16 +4,15 @@ using Source.Common; namespace Game.Server.HL2; -using FIELD = Source.FIELD; [LinkEntityToClass("ar2explosion")] -[NetworkName("AR2Explosion")] +[NetworkName("AR2Explosion", Table = "DT_AR2Explosion")] public partial class AR2Explosion : BaseParticleEntity { - public static readonly SendTable DT_AR2Explosion = new(DT_BaseParticleEntity, [ - SendPropString(FIELD.OF(nameof(MaterialName))) - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_AR2Explosion); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(MaterialName), + ]; - [NetworkName("m_szMaterialName")] - InlineArray255 MaterialName; + [NetworkVar("m_szMaterialName")] + partial ref readonly InlineArray255 MaterialName { get; } } diff --git a/Game.Server/HL2/AlyxEmpEffect.cs b/Game.Server/HL2/AlyxEmpEffect.cs index 4f684221..b598be03 100644 --- a/Game.Server/HL2/AlyxEmpEffect.cs +++ b/Game.Server/HL2/AlyxEmpEffect.cs @@ -3,22 +3,21 @@ using Source.Common; namespace Game.Server.HL2; -using FIELD = Source.FIELD; [LinkEntityToClass("env_alyxemp")] [NetworkName("CAlyxEmpEffect")] public partial class AlyxEmpEffect : BaseEntity { - public static readonly SendTable DT_AlyxEmpEffect = new(DT_BaseEntity, [ - SendPropInt(FIELD.OF(nameof(State)), 8, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(Duration)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(StartTime)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_AlyxEmpEffect); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(State)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Duration)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_nState")] - public int State; - [NetworkName("m_flDuration")] - public TimeUnit_t Duration; - [NetworkName("m_flStartTime")] - public TimeUnit_t StartTime; + [NetworkVar("m_nState")] + public partial int State { get; set; } + [NetworkVar("m_flDuration")] + public partial TimeUnit_t Duration { get; set; } + [NetworkVar("m_flStartTime")] + public partial TimeUnit_t StartTime { get; set; } } diff --git a/Game.Server/HL2/BaseHelicopter.cs b/Game.Server/HL2/BaseHelicopter.cs index 0afe820d..0f839ca6 100644 --- a/Game.Server/HL2/BaseHelicopter.cs +++ b/Game.Server/HL2/BaseHelicopter.cs @@ -5,16 +5,15 @@ namespace Game.Server; -using FIELD = FIELD; [NetworkName("CBaseHelicopter")] -public class BaseHelicopter : AI_TrackPather +public partial class BaseHelicopter : AI_TrackPather { - public static readonly SendTable DT_BaseHelicopter = new(DT_AI_BaseNPC, [ - SendPropFloat(FIELD.OF(nameof(StartupTime)), 0, PropFlags.NoScale) - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_BaseHelicopter); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartupTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flStartupTime")] - public TimeUnit_t StartupTime; + [NetworkVar("m_flStartupTime")] + public partial TimeUnit_t StartupTime { get; set; } } diff --git a/Game.Server/HL2/HL2PlayerLocalData.cs b/Game.Server/HL2/HL2PlayerLocalData.cs index b65e594f..c45fd301 100644 --- a/Game.Server/HL2/HL2PlayerLocalData.cs +++ b/Game.Server/HL2/HL2PlayerLocalData.cs @@ -1,52 +1,60 @@ namespace Game.Server.HL2; +using Game.Shared; using Game.Shared.HL2; using Source.Common; using System.Numerics; -using FIELD = Source.FIELD; - -public class HL2PlayerLocalData +public partial class HL2PlayerLocalData { - public static readonly SendTable DT_HL2Local = new(nameof(DT_HL2Local), [ - SendPropFloat(FIELD.OF(nameof(SuitPower)), 10, PropFlags.Unsigned | PropFlags.RoundUp, 0.0f, 100.0f), - SendPropInt(FIELD.OF(nameof(Zooming)), 1, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(BitsActiveDevices)), MAX_SUIT_DEVICES, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(SquadMemberCount)), 5, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(SquadMedicCount)), 5, PropFlags.Unsigned), - SendPropBool(FIELD.OF(nameof(SquadInFollowMode))), - SendPropBool(FIELD.OF(nameof(WeaponLowered))), - SendPropEHandle(FIELD.OF(nameof(Ladder))), - SendPropBool(FIELD.OF(nameof(DisplayReticle))), - ]); + [NetworkTable("DT_HL2Local")] + public static readonly NetworkProp[] Props = [ + new(nameof(SuitPower)) { Bits = 10, Flags = PropFlags.Unsigned | PropFlags.RoundUp, Low = 0.0f, High = 100.0f }, + new(nameof(Zooming)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(BitsActiveDevices)) { Bits = SharedDefs.MAX_SUIT_DEVICES, Flags = PropFlags.Unsigned }, + new(nameof(SquadMemberCount)) { Bits = 5, Flags = PropFlags.Unsigned }, + new(nameof(SquadMedicCount)) { Bits = 5, Flags = PropFlags.Unsigned }, + nameof(SquadInFollowMode), + nameof(WeaponLowered), + nameof(Ladder), + nameof(DisplayReticle), + ]; + + public BaseEntity? Outer; + public void NetworkStateChanged() => Outer?.NetworkStateChanged(); + public void NetworkStateChanged(IFieldAccessor field) => Outer?.NetworkStateChanged(); - [NetworkName("m_flSuitPower")] - public float SuitPower; - [NetworkName("m_bZooming")] - public bool Zooming; - [NetworkName("m_bitsActiveDevices")] - public int BitsActiveDevices; - [NetworkName("m_iSquadMemberCount")] - public int SquadMemberCount; - [NetworkName("m_iSquadMedicCount")] - public int SquadMedicCount; - [NetworkName("m_fSquadInFollowMode")] - public bool SquadInFollowMode; - [NetworkName("m_bWeaponLowered")] - public bool WeaponLowered; + [NetworkVar("m_flSuitPower")] + public partial float SuitPower { get; set; } + [NetworkVar("m_bZooming")] + public partial bool Zooming { get; set; } + [NetworkVar("m_bitsActiveDevices")] + public partial int BitsActiveDevices { get; set; } + [NetworkVar("m_iSquadMemberCount")] + public partial int SquadMemberCount { get; set; } + [NetworkVar("m_iSquadMedicCount")] + public partial int SquadMedicCount { get; set; } + [NetworkVar("m_fSquadInFollowMode")] + public partial bool SquadInFollowMode { get; set; } + [NetworkVar("m_bWeaponLowered")] + public partial bool WeaponLowered { get; set; } + [NetworkVar("m_hLadder")] + public partial EHANDLE Ladder { get; set; } public EHANDLE AutoAimTargetHandle = new(); public Vector3 AutoAimPoint; - [NetworkName("m_bDisplayReticle")] - public bool DisplayReticle; + [NetworkVar("m_bDisplayReticle")] + public partial bool DisplayReticle { get; set; } public bool StickyAutoAim; public bool AutoAimTarget; #if HL2_EPISODIC public float FlashBattery; public Vector3 LocatorOrigin; #endif - [NetworkName("m_hLadder")] - public EHANDLE Ladder = new(); public LadderMove LadderMove = new(); + + public HL2PlayerLocalData() { + Ladder = new(); + } } diff --git a/Game.Server/HL2/HL2_Player.cs b/Game.Server/HL2/HL2_Player.cs index 5b9dc7de..1e7ea83e 100644 --- a/Game.Server/HL2/HL2_Player.cs +++ b/Game.Server/HL2/HL2_Player.cs @@ -4,6 +4,7 @@ using Source.Common; using Source.Common.Commands; +using Source.Common.Engine; using Source.Common.Mathematics; using Source.Common.Physics; using Source; @@ -12,24 +13,29 @@ namespace Game.Server.HL2; using DEFINE = Source.DEFINE; -using FIELD = Source.FIELD; [PrecacheRegister("player")] [NetworkName("CHL2_Player")] -public class HL2_Player : BaseMultiplayerPlayer +public partial class HL2_Player : BaseMultiplayerPlayer { - public static readonly SendTable DT_HL2_Player = new(DT_BasePlayer, [ - SendPropDataTable("m_HL2Local", FIELD.OF(nameof(HL2Local)), HL2PlayerLocalData.DT_HL2Local, SendProxy_SendLocalDataTable), - SendPropBool(FIELD.OF(nameof(m_bIsSprinting))) - ]); - public static new readonly ServerClass ServerClass = new ServerClass(DT_HL2_Player); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(HL2Local)) { Encoding = NetEncoding.DataTable, DataTable = "DT_HL2Local", Proxy = typeof(HL2LocalDataProxy) }, + nameof(m_bIsSprinting), + ]; + + public static class HL2LocalDataProxy + { + public static object? Send(SendProp prop, object instance, IFieldAccessor data, SendProxyRecipients recipients, int objectID) + => SendProxy_SendLocalDataTable(prop, instance, data, recipients, objectID); + } public static readonly new DataMap DataDesc = new(typeof(HL2_Player), BasePlayer.DataDesc, [ DEFINE.INPUTFUNC(FieldType.Void, "ForceDropPhysObjects", nameof(InputForceDropPhysObjects), (INPUTFUNCPTR)((self, data) => ((HL2_Player)self).InputForceDropPhysObjects(data))), ]); public override DataMap? GetDataDescMap() => DataDesc; - [NetworkName("m_HL2Local")] + [NetworkVar("m_HL2Local")] public readonly HL2PlayerLocalData HL2Local = new(); #if HL2MP @@ -50,12 +56,15 @@ public class HL2_Player : BaseMultiplayerPlayer bool SprintEnabled; Class_T ControlClass; - [NetworkName("m_fIsSprinting")] - public bool m_bIsSprinting; + [NetworkVar("m_fIsSprinting")] + public partial bool m_bIsSprinting { get; set; } public bool m_bIsWalking; public bool m_bPlayUseDenySound; - public HL2_Player() => SprintEnabled = true; + public HL2_Player() { + HL2Local.Outer = this; + SprintEnabled = true; + } public ref LadderMove GetLadderMove() => ref HL2Local.LadderMove; diff --git a/Game.Server/HL2/InfoTeleporterCountdown.cs b/Game.Server/HL2/InfoTeleporterCountdown.cs index 99bfb05c..86fbd1a1 100644 --- a/Game.Server/HL2/InfoTeleporterCountdown.cs +++ b/Game.Server/HL2/InfoTeleporterCountdown.cs @@ -4,25 +4,24 @@ using Source.Common; namespace Game.Server.HL2; -using FIELD = Source.FIELD; [LinkEntityToClass("info_teleporter_countdown")] [NetworkName("CInfoTeleporterCountdown")] public partial class InfoTeleporterCountdown : BaseEntity { - public static readonly SendTable DT_InfoTeleporterCountdown = new(DT_BaseEntity, [ - SendPropBool(FIELD.OF(nameof(CountdownStarted))), - SendPropBool(FIELD.OF(nameof(Disabled))), - SendPropFloat(FIELD.OF(nameof(StartTime)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(TimeRemaining)), 0, PropFlags.NoScale) - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_InfoTeleporterCountdown); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(CountdownStarted), + nameof(Disabled), + new(nameof(StartTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(TimeRemaining)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_bCountdownStarted")] - public bool CountdownStarted; - [NetworkName("m_bDisabled")] - public bool Disabled; - [NetworkName("m_flStartTime")] - public TimeUnit_t StartTime; - [NetworkName("m_flTimeRemaining")] - public TimeUnit_t TimeRemaining; + [NetworkVar("m_bCountdownStarted")] + public partial bool CountdownStarted { get; set; } + [NetworkVar("m_bDisabled")] + public partial bool Disabled { get; set; } + [NetworkVar("m_flStartTime")] + public partial TimeUnit_t StartTime { get; set; } + [NetworkVar("m_flTimeRemaining")] + public partial TimeUnit_t TimeRemaining { get; set; } } diff --git a/Game.Server/HL2/PropAirboat.cs b/Game.Server/HL2/PropAirboat.cs index 8165fcfe..9532257a 100644 --- a/Game.Server/HL2/PropAirboat.cs +++ b/Game.Server/HL2/PropAirboat.cs @@ -6,26 +6,25 @@ using System.Numerics; namespace Game.Server.HL2; -using FIELD = Source.FIELD; [LinkEntityToClass("prop_vehicle_airboat")] [NetworkName("CPropAirboat")] -public class PropAirboat : PropVehicleDriveable +public partial class PropAirboat : PropVehicleDriveable { - public static readonly SendTable DT_PropAirboat = new(DT_PropVehicleDriveable, [ - SendPropBool(FIELD.OF(nameof(HeadlightIsOn))), - SendPropInt(FIELD.OF(nameof(AmmoCount)), 9), - SendPropInt(FIELD.OF(nameof(ExactWaterLevel)), 24), - SendPropInt(FIELD.OF(nameof(WaterLevel)), 2, PropFlags.Unsigned), - SendPropVector(FIELD.OF(nameof(PhysVelocity)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PropAirboat); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(HeadlightIsOn), + new(nameof(AmmoCount)) { Bits = 9 }, + new(nameof(ExactWaterLevel)) { Bits = 24 }, + new(nameof(WaterLevel)) { Encoding = NetEncoding.Int, Bits = 2, Flags = PropFlags.Unsigned }, + new(nameof(PhysVelocity)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_bHeadlightIsOn")] - public bool HeadlightIsOn; - [NetworkName("m_nAmmoCount")] - public int AmmoCount; - [NetworkName("m_nExactWaterLevel")] - public int ExactWaterLevel; - [NetworkName("m_vecPhysVelocity")] - public Vector3 PhysVelocity; + [NetworkVar("m_bHeadlightIsOn")] + public partial bool HeadlightIsOn { get; set; } + [NetworkVar("m_nAmmoCount")] + public partial int AmmoCount { get; set; } + [NetworkVar("m_nExactWaterLevel")] + public partial int ExactWaterLevel { get; set; } + [NetworkVar("m_vecPhysVelocity")] + public partial Vector3 PhysVelocity { get; set; } } diff --git a/Game.Server/HL2/PropCombineBall.cs b/Game.Server/HL2/PropCombineBall.cs index 70b3617a..9e70c529 100644 --- a/Game.Server/HL2/PropCombineBall.cs +++ b/Game.Server/HL2/PropCombineBall.cs @@ -6,27 +6,26 @@ using System.Collections.Generic; using System.Text; -using FIELD = Source.FIELD; namespace Game.Server.HL2; [LinkEntityToClass("prop_combine_ball")] [NetworkName("CPropCombineBall")] -public class PropCombineBall : BaseAnimating +public partial class PropCombineBall : BaseAnimating { - public static readonly SendTable DT_PropCombineBall = new(DT_BaseAnimating, [ - SendPropBool(FIELD.OF(nameof(Emit))), - SendPropFloat(FIELD.OF(nameof(Radius)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(Held))), - SendPropBool(FIELD.OF(nameof(Launched))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PropCombineBall); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Emit), + new(nameof(Radius)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Held), + nameof(Launched), + ]; - [NetworkName("m_bEmit")] - public bool Emit; - [NetworkName("m_flRadius")] - public float Radius; - [NetworkName("m_bHeld")] - public bool Held; - [NetworkName("m_bLaunched")] - public bool Launched; + [NetworkVar("m_bEmit")] + public partial bool Emit { get; set; } + [NetworkVar("m_flRadius")] + public partial float Radius { get; set; } + [NetworkVar("m_bHeld")] + public partial bool Held { get; set; } + [NetworkVar("m_bLaunched")] + public partial bool Launched { get; set; } } diff --git a/Game.Server/HL2/PropVehiclePrisonerPod.cs b/Game.Server/HL2/PropVehiclePrisonerPod.cs index a46db4fd..3f3b0f09 100644 --- a/Game.Server/HL2/PropVehiclePrisonerPod.cs +++ b/Game.Server/HL2/PropVehiclePrisonerPod.cs @@ -6,33 +6,41 @@ using System.Numerics; namespace Game.Server.HL2; -using FIELD = Source.FIELD; [LinkEntityToClass("prop_vehicle_prisoner_pod")] [NetworkName("CPropVehiclePrisonerPod")] -public class PropVehiclePrisonerPod : PhysicsProp +public partial class PropVehiclePrisonerPod : PhysicsProp { - public static readonly SendTable DT_PropVehiclePrisonerPod = new(DT_PhysicsProp, [ - SendPropEHandle(FIELD.OF(nameof(Player))), - SendPropBool(FIELD.OF(nameof(EnterAnimOn))), - SendPropBool(FIELD.OF(nameof(ExitAnimOn))), - SendPropVector(FIELD.OF(nameof(EyeExitEndpoint)), 0, PropFlags.Coord), - SendPropBool(FIELD.OF(nameof(LimitView))), - SendPropBool(FIELD.OF(nameof(Locked))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PropVehiclePrisonerPod); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Player), + nameof(EnterAnimOn), + nameof(ExitAnimOn), + new(nameof(EyeExitEndpoint)) { Bits = 0, Flags = PropFlags.Coord }, + nameof(LimitView), + nameof(Locked), + ]; - [NetworkName("m_hPlayer")] - public EHANDLE Player = new(); - [NetworkName("m_bEnterAnimOn")] - public bool EnterAnimOn = new(); - [NetworkName("m_bExitAnimOn")] - public bool ExitAnimOn = new(); - [NetworkName("m_vecEyeExitEndpoint")] - public Vector3 EyeExitEndpoint = new(); - [NetworkName("m_bLimitView")] - public bool LimitView = new(); - [NetworkName("m_bLocked")] - public bool Locked; + public PropVehiclePrisonerPod() { + Player = new(); + EnterAnimOn = new(); + ExitAnimOn = new(); + EyeExitEndpoint = new(); + LimitView = new(); + } + + + [NetworkVar("m_hPlayer")] + public partial EHANDLE Player { get; set; } + [NetworkVar("m_bEnterAnimOn")] + public partial bool EnterAnimOn { get; set; } + [NetworkVar("m_bExitAnimOn")] + public partial bool ExitAnimOn { get; set; } + [NetworkVar("m_vecEyeExitEndpoint")] + public partial Vector3 EyeExitEndpoint { get; set; } + [NetworkVar("m_bLimitView")] + public partial bool LimitView { get; set; } + [NetworkVar("m_bLocked")] + public partial bool Locked { get; set; } public override bool IsVehicle() => true; } diff --git a/Game.Server/HL2/WeaponAlyxGun.cs b/Game.Server/HL2/WeaponAlyxGun.cs index 11d1172c..9e9fcb99 100644 --- a/Game.Server/HL2/WeaponAlyxGun.cs +++ b/Game.Server/HL2/WeaponAlyxGun.cs @@ -5,8 +5,10 @@ namespace Game.Server.HL2; [LinkEntityToClass("weapon_alyxgun")] [NetworkName("CWeaponAlyxGun")] -public class WeaponAlyxGun : HLSelectFireMachineGun +public partial class WeaponAlyxGun : HLSelectFireMachineGun { - public static readonly SendTable DT_WeaponAlyxGun = new(DT_HLSelectFireMachineGun, []); - public static new readonly ServerClass ServerClass = new ServerClass(DT_WeaponAlyxGun); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Server/HL2/WeaponAnnabelle.cs b/Game.Server/HL2/WeaponAnnabelle.cs index 1ab13f90..a729acdf 100644 --- a/Game.Server/HL2/WeaponAnnabelle.cs +++ b/Game.Server/HL2/WeaponAnnabelle.cs @@ -7,8 +7,10 @@ namespace Game.Server.HL2; [LinkEntityToClass("weapon_annabelle")] [NetworkName("CWeaponAnnabelle")] -public class WeaponAnnabelle : BaseHLCombatWeapon +public partial class WeaponAnnabelle : BaseHLCombatWeapon { - public static readonly SendTable DT_WeaponAnnabelle = new(DT_BaseHLCombatWeapon, []); - public static new readonly ServerClass ServerClass = new ServerClass(DT_WeaponAnnabelle); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Server/HL2/Weapon_Stubs_HL2.cs b/Game.Server/HL2/Weapon_Stubs_HL2.cs index 9925a257..62418948 100644 --- a/Game.Server/HL2/Weapon_Stubs_HL2.cs +++ b/Game.Server/HL2/Weapon_Stubs_HL2.cs @@ -9,26 +9,31 @@ namespace Game.Server.HL2; [LinkEntityToClass("cycler_weapon")] [NetworkName("CWeaponCycler")] -public class WeaponCycler : BaseCombatWeapon +public partial class WeaponCycler : BaseCombatWeapon { - public static readonly SendTable DT_WeaponCycler = new(DT_BaseCombatWeapon, []); - public static new readonly ServerClass ServerClass = new ServerClass(DT_WeaponCycler); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } [LinkEntityToClass("weapon_cubemap")] [NetworkName("CWeaponCubemap")] -public class WeaponCubemap : BaseCombatWeapon +public partial class WeaponCubemap : BaseCombatWeapon { - public static readonly SendTable DT_WeaponCubemap = new(DT_BaseCombatWeapon, []); - public static new readonly ServerClass ServerClass = new ServerClass(DT_WeaponCubemap); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } [LinkEntityToClass("weapon_citizenpackage")] [NetworkName("CWeaponCitizenPackage")] -public class WeaponCitizenPackage : BaseHLCombatWeapon +public partial class WeaponCitizenPackage : BaseHLCombatWeapon { - public static readonly SendTable DT_WeaponCitizenPackage = new(DT_BaseHLCombatWeapon, []); - public static new readonly ServerClass ServerClass = new ServerClass(DT_WeaponCitizenPackage); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; static readonly ActTable[] acttable = [ new() { BaseAct = Activity.ACT_IDLE, WeaponAct = Activity.ACT_IDLE_PACKAGE, Required = false }, @@ -47,10 +52,11 @@ public override void Drop(in Vector3 velocity) { [LinkEntityToClass("weapon_citizensuitcase")] [NetworkName("CWeaponCitizenSuitcase")] -public class WeaponCitizenSuitcase : WeaponCitizenPackage +public partial class WeaponCitizenSuitcase : WeaponCitizenPackage { - public static readonly SendTable DT_WeaponCitizenSuitcase = new(DT_WeaponCitizenPackage, []); - public static new readonly ServerClass ServerClass = new ServerClass(DT_WeaponCitizenSuitcase); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; static readonly ActTable[] acttable = [ new() { BaseAct = Activity.ACT_IDLE, WeaponAct = Activity.ACT_IDLE_SUITCASE, Required = false }, @@ -62,10 +68,11 @@ public class WeaponCitizenSuitcase : WeaponCitizenPackage [LinkEntityToClass("weapon_oldmanharpoon")] [NetworkName("CWeaponOldManHarpoon")] -public class WeaponOldManHarpoon : WeaponCitizenPackage +public partial class WeaponOldManHarpoon : WeaponCitizenPackage { - public static readonly SendTable DT_WeaponOldManHarpoon = new(DT_WeaponCitizenPackage, []); - public static new readonly ServerClass ServerClass = new ServerClass(DT_WeaponOldManHarpoon); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; static readonly ActTable[] acttable = [ new() { BaseAct = Activity.ACT_IDLE, WeaponAct = Activity.ACT_IDLE_SUITCASE, Required = false }, diff --git a/Game.Server/HL2MP/HL2MP_Player.cs b/Game.Server/HL2MP/HL2MP_Player.cs index c7e452fa..0254a7b7 100644 --- a/Game.Server/HL2MP/HL2MP_Player.cs +++ b/Game.Server/HL2MP/HL2MP_Player.cs @@ -11,49 +11,55 @@ namespace Game.Server.HL2MP; -using FIELD = FIELD; -using FIELD_RD = FIELD; - [NetworkName("CHL2MP_Player")] public partial class HL2MP_Player : HL2_Player { - public static readonly SendTable DT_HL2MPLocalPlayerExclusive = new(nameof(DT_HL2MPLocalPlayerExclusive), [ - SendPropVector(BaseEntity.NetworkVarFields.Origin, 0, PropFlags.NoScale|PropFlags.ChangesOften, 0.0f, Constants.HIGH_DEFAULT), - - SendPropAngle(FIELD.OF_VECTORELEM(nameof(AngEyeAngles), 0), 11, PropFlags.ChangesOften | PropFlags.RoundDown, 0, 360f ), - SendPropAngle(FIELD.OF_VECTORELEM(nameof(AngEyeAngles), 1), 11, PropFlags.ChangesOften | PropFlags.RoundDown, 0, 360f ), - ]); - - public static readonly SendTable DT_HL2MPNonLocalPlayerExclusive = new(nameof(DT_HL2MPNonLocalPlayerExclusive), [ - SendPropVector(BaseEntity.NetworkVarFields.Origin, 0, PropFlags.CoordMPLowPrecision|PropFlags.ChangesOften, 0.0f, Constants.HIGH_DEFAULT), - - SendPropAngle(FIELD.OF_VECTORELEM(nameof(AngEyeAngles), 0), 11, PropFlags.ChangesOften | PropFlags.RoundDown, 0, 360f), - SendPropAngle(FIELD.OF_VECTORELEM(nameof(AngEyeAngles), 1), 11, PropFlags.ChangesOften | PropFlags.RoundDown, 0, 360f), - - ]); + [NetworkTable("DT_HL2MPLocalPlayerExclusive")] + public static readonly new NetworkProp[] LocalPlayerExclusiveProps = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.NoScale | PropFlags.ChangesOften, Low = 0.0f, High = Constants.HIGH_DEFAULT }, + new(nameof(AngEyeAngles)) { Encoding = NetEncoding.VectorElements, Count = 2, Bits = 11, Flags = PropFlags.ChangesOften | PropFlags.RoundDown }, + ]; - public static readonly SendTable DT_HL2MP_Player = new(DT_HL2_Player, [ - SendPropExclude(nameof(DT_BaseAnimating), "m_flPoseParameter"), - SendPropExclude(nameof(DT_BaseAnimating), "m_flPlaybackRate"), - SendPropExclude(nameof(DT_BaseAnimating), "m_nSequence"), - SendPropExclude(nameof(DT_BaseEntity), "m_angRotation"), - SendPropExclude(nameof(DT_BaseAnimatingOverlay), "overlay_vars"), + [NetworkTable("DT_HL2MPNonLocalPlayerExclusive")] + public static readonly NetworkProp[] NonLocalPlayerExclusiveProps = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.CoordMPLowPrecision | PropFlags.ChangesOften, Low = 0.0f, High = Constants.HIGH_DEFAULT }, + new(nameof(AngEyeAngles)) { Encoding = NetEncoding.VectorElements, Count = 2, Bits = 11, Flags = PropFlags.ChangesOften | PropFlags.RoundDown }, + ]; - SendPropExclude(nameof(DT_BaseEntity), "m_vecOrigin"), - SendPropExclude(nameof(DT_ServerAnimationData), "m_flCycle"), - SendPropExclude(nameof(DT_AnimTimeMustBeFirst), "m_flAnimTime"), - SendPropExclude(nameof(DT_BaseFlex), "m_flexWeight"), - SendPropExclude(nameof(DT_BaseFlex), "m_blinktoggle"), - SendPropExclude(nameof(DT_BaseFlex), "m_viewtarget"), + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(PoseParameter)) { Exclude = true }, + new(nameof(PlaybackRate)) { Exclude = true }, + new(nameof(Sequence)) { Exclude = true }, + new(nameof(Rotation)) { Exclude = true }, + new("overlay_vars") { Exclude = true, DataTable = "DT_BaseAnimatingOverlay" }, + + new(nameof(Origin)) { Exclude = true }, + new(nameof(Cycle)) { Exclude = true, DataTable = "DT_ServerAnimationData" }, + new(nameof(AnimTime)) { Exclude = true, DataTable = "DT_AnimTimeMustBeFirst" }, + new(nameof(FlexWeight)) { Exclude = true }, + new(nameof(BlinkToggle)) { Exclude = true }, + new("m_viewtarget") { Exclude = true, DataTable = "DT_BaseFlex" }, + + new(nameof(LocalPlayerExclusiveProps)) { Name = "hl2mplocaldata", Proxy = typeof(HL2MPLocalDataProxy) }, + new(nameof(NonLocalPlayerExclusiveProps)) { Name = "hl2mpnonlocaldata", Proxy = typeof(HL2MPNonLocalDataProxy) }, + + nameof(Ragdoll), + new(nameof(SpawnInterpCounter)) { Bits = 4 }, + nameof(IsWalking), + ]; - SendPropDataTable("hl2mplocaldata", DT_HL2MPLocalPlayerExclusive, SendProxy_SendLocalDataTable ), - SendPropDataTable("hl2mpnonlocaldata", DT_HL2MPNonLocalPlayerExclusive, SendProxy_SendNonLocalDataTable ), + public static class HL2MPLocalDataProxy + { + public static object? Send(SendProp prop, object instance, IFieldAccessor data, SendProxyRecipients recipients, int objectID) + => SendProxy_SendLocalDataTable(prop, instance, data, recipients, objectID); + } - SendPropEHandle(FIELD.OF(nameof(Ragdoll))), - SendPropInt(FIELD.OF(nameof(SpawnInterpCounter)), 4), - SendPropBool(FIELD.OF(nameof(IsWalking))), - ]); - public static new readonly ServerClass ServerClass = new ServerClass(DT_HL2MP_Player); + public static class HL2MPNonLocalDataProxy + { + public static object? Send(SendProp prop, object instance, IFieldAccessor data, SendProxyRecipients recipients, int objectID) + => SendProxy_SendNonLocalDataTable(prop, instance, data, recipients, objectID); + } public const TimeUnit_t MODEL_CHANGE_INTERVAL = 5.0; public const TimeUnit_t TEAM_CHANGE_INTERVAL = 5.0; @@ -91,15 +97,15 @@ public partial class HL2MP_Player : HL2_Player public int ModelType; - [NetworkName("m_angEyeAngles")] - public QAngle AngEyeAngles; - [NetworkName("m_hRagdoll")] - public EHANDLE Ragdoll = new(); - [NetworkName("m_iSpawnInterpCounter")] - public int SpawnInterpCounter; + [NetworkVar("m_angEyeAngles")] + public partial QAngle AngEyeAngles { get; set; } + [NetworkVar("m_hRagdoll")] + public partial EHANDLE Ragdoll { get; set; } + [NetworkVar("m_iSpawnInterpCounter")] + public partial int SpawnInterpCounter { get; set; } public int PlayerSoundType; - [NetworkName("m_fIsWalking")] - public bool IsWalking; + [NetworkVar("m_fIsWalking")] + public partial bool IsWalking { get; set; } public readonly HL2MPPlayerAnimState PlayerAnimState; @@ -108,6 +114,7 @@ public partial class HL2MP_Player : HL2_Player TimeUnit_t SlamProtectTime; public HL2MP_Player() { + Ragdoll = new(); PlayerAnimState = HL2MPPlayerAnimState.CreateHL2MPPlayerAnimState(this); AngEyeAngles.Init(); @@ -121,7 +128,7 @@ public HL2MP_Player() { public override void UpdateOnRemove() { if (Ragdoll.Get() != null) { Util.RemoveImmediate(Ragdoll.Get()); - Ragdoll.Set(null); + Ragdoll = EHANDLE.FromEntity(null); } base.UpdateOnRemove(); @@ -589,7 +596,7 @@ public override void CreateViewModel(int index = 0) { vm.SetIndex(index); Util.DispatchSpawn(vm); vm.FollowEntity(this, false); - ViewModel[index].Set(vm); + ViewModelForModify()[index].Set(vm); } } @@ -749,23 +756,27 @@ void State_PreThink_ACTIVE() { } } [LinkEntityToClass("hl2mp_ragdoll")] -[NetworkName("CHL2MPRagdoll")] -public class HL2MPRagdoll : BaseAnimatingOverlay +[NetworkName("CHL2MPRagdoll", NoBase = true)] +public partial class HL2MPRagdoll : BaseAnimatingOverlay { - public static readonly SendTable DT_HL2MPRagdoll = new([ - SendPropVector(FIELD_RD.OF(nameof(RagdollOrigin)), 0, PropFlags.Coord), - SendPropEHandle(FIELD_RD.OF(nameof(Player))), - SendPropInt(FIELD_RD.OF(nameof(ModelIndex)), 14), - SendPropInt(FIELD_RD.OF(nameof(ForceBone)), 8), - SendPropVector(FIELD_RD.OF(nameof(Force)), 0, PropFlags.NoScale), - SendPropVector(FIELD_RD.OF(nameof(RagdollVelocity)), 0, PropFlags.NoScale) - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_HL2MPRagdoll); - - [NetworkName("m_vecRagdollOrigin")] - public Vector3 RagdollOrigin; - [NetworkName("m_hPlayer")] - public EHANDLE Player = new(); - [NetworkName("m_vecRagdollVelocity")] - public Vector3 RagdollVelocity; + public HL2MPRagdoll() { + Player = new(); + } + + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(RagdollOrigin)) { Bits = 0, Flags = PropFlags.Coord }, + nameof(Player), + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(ForceBone)) { Bits = 8 }, + new(nameof(Force)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(RagdollVelocity)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; + + [NetworkVar("m_vecRagdollOrigin")] + public partial Vector3 RagdollOrigin { get; set; } + [NetworkVar("m_hPlayer")] + public partial EHANDLE Player { get; set; } + [NetworkVar("m_vecRagdollVelocity")] + public partial Vector3 RagdollVelocity { get; set; } } diff --git a/Game.Server/Hierarchy.cs b/Game.Server/Hierarchy.cs index 7507bcf8..3185b0b4 100644 --- a/Game.Server/Hierarchy.cs +++ b/Game.Server/Hierarchy.cs @@ -27,7 +27,7 @@ public static void UnlinkChild(BaseEntity parent, BaseEntity child) { prev.Set(next); // Clear hierarchy bits for this guy - list.MoveParent.Set(null); + list.MoveParent = EHANDLE.FromEntity(null); list.MovePeer.Set(null); list.NetworkProp().SetNetworkParent(new()); list.DispatchUpdateTransmitState(); diff --git a/Game.Server/InfoOverlayAccessor.cs b/Game.Server/InfoOverlayAccessor.cs index 27019bfb..14231bab 100644 --- a/Game.Server/InfoOverlayAccessor.cs +++ b/Game.Server/InfoOverlayAccessor.cs @@ -4,17 +4,16 @@ using Source.Common; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("info_overlay_accessor")] -[NetworkName("CInfoOverlayAccessor")] +[NetworkName("CInfoOverlayAccessor", NoBase = true)] public partial class InfoOverlayAccessor : BaseEntity { - public static readonly SendTable DT_InfoOverlayAccessor = new([ - SendPropInt(FIELD.OF(nameof(TextureFrameIndex)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(OverlayID)), 32, PropFlags.Unsigned) - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_InfoOverlayAccessor); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(TextureFrameIndex)) { Encoding = NetEncoding.Int, Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(OverlayID)) { Bits = 32, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_iOverlayID")] - public int OverlayID; + [NetworkVar("m_iOverlayID")] + public partial int OverlayID { get; set; } } diff --git a/Game.Server/LightGlow.cs b/Game.Server/LightGlow.cs index 17ff005b..fb9b767e 100644 --- a/Game.Server/LightGlow.cs +++ b/Game.Server/LightGlow.cs @@ -8,41 +8,40 @@ namespace Game.Server; -using FIELD = FIELD; - [LinkEntityToClass("env_lightglow")] -[NetworkName("CLightGlow")] -public class LightGlow : BaseEntity +[NetworkName("CLightGlow", NoBase = true)] +public partial class LightGlow : BaseEntity { - public static readonly SendTable DT_LightGlow = new([ - SendPropInt(FIELD.OF(nameof(RenderColor)), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(HorizontalSize)), 16, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(VerticalSize)), 16, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(MinDist)), 16, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(MaxDist)), 16, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(OuterMaxDist)), 16, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(SpawnFlags)), 8, PropFlags.Unsigned), - SendPropVector(NetworkVarFields.Origin, 0, PropFlags.Coord), - SendPropQAngles(FIELD.OF(nameof(Rotation)), 13, PropFlags.RoundDown), - SendPropEHandle(FIELD.OF(nameof(MoveParent))), - SendPropFloat(FIELD.OF(nameof(GlowProxySize)), 6, PropFlags.RoundUp, 0.0f, 64.0f), - SendPropFloat(FIELD.OF(nameof(HDRColorScale)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_LightGlow); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(RenderColor)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(HorizontalSize)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(VerticalSize)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(MinDist)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(MaxDist)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(OuterMaxDist)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(SpawnFlags)) { Encoding = NetEncoding.Int, Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Origin)) { Encoding = NetEncoding.Vector, Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Rotation)) { Encoding = NetEncoding.QAngles, Bits = 13, Flags = PropFlags.RoundDown, Proxy = typeof(AnglesProxy) }, + new(nameof(MoveParent)) { Encoding = NetEncoding.EHandle }, + new(nameof(GlowProxySize)) { Bits = 6, Flags = PropFlags.RoundUp, Low = 0.0f, High = 64.0f }, + new(nameof(HDRColorScale)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_clrRender")] - public Color RenderColor; - [NetworkName("m_nHorizontalSize")] - public int HorizontalSize; - [NetworkName("m_nVerticalSize")] - public int VerticalSize; - [NetworkName("m_nMinDist")] - public int MinDist; - [NetworkName("m_nMaxDist")] - public int MaxDist; - [NetworkName("m_nOuterMaxDist")] - public int OuterMaxDist; - [NetworkName("m_flGlowProxySize")] - public float GlowProxySize; - public float HDRColorScale; + [NetworkVar("m_clrRender")] + public partial Color RenderColor { get; set; } + [NetworkVar("m_nHorizontalSize")] + public partial int HorizontalSize { get; set; } + [NetworkVar("m_nVerticalSize")] + public partial int VerticalSize { get; set; } + [NetworkVar("m_nMinDist")] + public partial int MinDist { get; set; } + [NetworkVar("m_nMaxDist")] + public partial int MaxDist { get; set; } + [NetworkVar("m_nOuterMaxDist")] + public partial int OuterMaxDist { get; set; } + [NetworkVar("m_flGlowProxySize")] + public partial float GlowProxySize { get; set; } + [NetworkVar("HDRColorScale")] + public partial float HDRColorScale { get; set; } } diff --git a/Game.Server/MaterialModifyControl.cs b/Game.Server/MaterialModifyControl.cs index 7a720ee3..4969abca 100644 --- a/Game.Server/MaterialModifyControl.cs +++ b/Game.Server/MaterialModifyControl.cs @@ -3,49 +3,48 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("material_modify_control")] [NetworkName("CMaterialModifyControl")] -public class MaterialModifyControl : BaseEntity +public partial class MaterialModifyControl : BaseEntity { - public static readonly SendTable DT_MaterialModifyControl = new(DT_BaseEntity, [ - SendPropString(FIELD.OF(nameof(SzMaterialName))), - SendPropString(FIELD.OF(nameof(SzMaterialVar))), - SendPropString(FIELD.OF(nameof(SzMaterialVarValue))), - SendPropInt(FIELD.OF(nameof(FrameStart)), 8, 0), - SendPropInt(FIELD.OF(nameof(FrameEnd)), 8, 0), - SendPropBool(FIELD.OF(nameof(Wrap))), - SendPropFloat(FIELD.OF(nameof(Framerate)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(NewAnimCommandsSemaphore))), - SendPropFloat(FIELD.OF(nameof(FloatLerpStartValue)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FloatLerpEndValue)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FloatLerpTransitionTime)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(ModifyMode)), 2, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_MaterialModifyControl); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SzMaterialName)) { Encoding = NetEncoding.String }, + new(nameof(SzMaterialVar)) { Encoding = NetEncoding.String }, + new(nameof(SzMaterialVarValue)) { Encoding = NetEncoding.String }, + new(nameof(FrameStart)) { Bits = 8 }, + new(nameof(FrameEnd)) { Bits = 8 }, + nameof(Wrap), + new(nameof(Framerate)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(NewAnimCommandsSemaphore), + new(nameof(FloatLerpStartValue)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FloatLerpEndValue)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FloatLerpTransitionTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ModifyMode)) { Bits = 2, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_szMaterialName")] - public InlineArray255 SzMaterialName; - [NetworkName("m_szMaterialVar")] - public InlineArray255 SzMaterialVar; - [NetworkName("m_szMaterialVarValue")] - public InlineArray255 SzMaterialVarValue; - [NetworkName("m_iFrameStart")] - public int FrameStart; - [NetworkName("m_iFrameEnd")] - public int FrameEnd; - [NetworkName("m_bWrap")] - public bool Wrap; - [NetworkName("m_flFramerate")] - public float Framerate; - [NetworkName("m_bNewAnimCommandsSemaphore")] - public bool NewAnimCommandsSemaphore; - [NetworkName("m_flFloatLerpStartValue")] - public float FloatLerpStartValue; - [NetworkName("m_flFloatLerpEndValue")] - public float FloatLerpEndValue; - [NetworkName("m_flFloatLerpTransitionTime")] - public float FloatLerpTransitionTime; - [NetworkName("m_nModifyMode")] - public int ModifyMode; + [NetworkVar("m_szMaterialName")] + public partial ref readonly InlineArray255 SzMaterialName { get; } + [NetworkVar("m_szMaterialVar")] + public partial ref readonly InlineArray255 SzMaterialVar { get; } + [NetworkVar("m_szMaterialVarValue")] + public partial ref readonly InlineArray255 SzMaterialVarValue { get; } + [NetworkVar("m_iFrameStart")] + public partial int FrameStart { get; set; } + [NetworkVar("m_iFrameEnd")] + public partial int FrameEnd { get; set; } + [NetworkVar("m_bWrap")] + public partial bool Wrap { get; set; } + [NetworkVar("m_flFramerate")] + public partial float Framerate { get; set; } + [NetworkVar("m_bNewAnimCommandsSemaphore")] + public partial bool NewAnimCommandsSemaphore { get; set; } + [NetworkVar("m_flFloatLerpStartValue")] + public partial float FloatLerpStartValue { get; set; } + [NetworkVar("m_flFloatLerpEndValue")] + public partial float FloatLerpEndValue { get; set; } + [NetworkVar("m_flFloatLerpTransitionTime")] + public partial float FloatLerpTransitionTime { get; set; } + [NetworkVar("m_nModifyMode")] + public partial int ModifyMode { get; set; } } diff --git a/Game.Server/MortarShell.cs b/Game.Server/MortarShell.cs index b73cde8e..1a45f45f 100644 --- a/Game.Server/MortarShell.cs +++ b/Game.Server/MortarShell.cs @@ -3,22 +3,21 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("mortarshell")] [NetworkName("CMortarShell")] -public class MortarShell : BaseEntity +public partial class MortarShell : BaseEntity { - public static readonly SendTable DT_MortarShell = new(DT_BaseEntity, [ - SendPropFloat(FIELD.OF(nameof(Lifespan)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(Radius)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(SurfaceNormal)), 0, PropFlags.VarInt | PropFlags.VarInt), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_MortarShell); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Lifespan)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Radius)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SurfaceNormal)) { Bits = 0, Flags = PropFlags.VarInt | PropFlags.VarInt }, + ]; - [NetworkName("m_flLifespan")] - public float Lifespan; - [NetworkName("m_flRadius")] - public float Radius; - [NetworkName("m_vecSurfaceNormal")] - public Vector3 SurfaceNormal; + [NetworkVar("m_flLifespan")] + public partial float Lifespan { get; set; } + [NetworkVar("m_flRadius")] + public partial float Radius { get; set; } + [NetworkVar("m_vecSurfaceNormal")] + public partial Vector3 SurfaceNormal { get; set; } } diff --git a/Game.Server/MovieExplosion.cs b/Game.Server/MovieExplosion.cs index 10c7a346..4adbe25a 100644 --- a/Game.Server/MovieExplosion.cs +++ b/Game.Server/MovieExplosion.cs @@ -4,11 +4,8 @@ using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_movieexplosion")] -[NetworkName("MovieExplosion")] -public class MovieExplosion : BaseParticleEntity +[NetworkName("MovieExplosion", Table = "DT_MovieExplosion")] +public partial class MovieExplosion : BaseParticleEntity { - public static readonly SendTable DT_MovieExplosion = new(DT_BaseParticleEntity, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_MovieExplosion); } diff --git a/Game.Server/NPC_AntlionGuard.cs b/Game.Server/NPC_AntlionGuard.cs index f3f7e42e..ca844092 100644 --- a/Game.Server/NPC_AntlionGuard.cs +++ b/Game.Server/NPC_AntlionGuard.cs @@ -3,22 +3,21 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("npc_antlionguard")] [NetworkName("CNPC_AntlionGuard")] -public class NPC_AntlionGuard : AI_BaseNPC +public partial class NPC_AntlionGuard : AI_BaseNPC { - public static readonly SendTable DT_NPC_AntlionGuard = new(DT_AI_BaseNPC, [ - SendPropBool(FIELD.OF(nameof(CavernBreed))), - SendPropBool(FIELD.OF(nameof(InCavern))), - SendPropInt(FIELD.OF(nameof(BleedingLevel)), 2, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_NPC_AntlionGuard); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(CavernBreed), + nameof(InCavern), + new(nameof(BleedingLevel)) { Bits = 2, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_bCavernBreed")] - public bool CavernBreed; - [NetworkName("m_bInCavern")] - public bool InCavern; - [NetworkName("m_iBleedingLevel")] - public int BleedingLevel; + [NetworkVar("m_bCavernBreed")] + public partial bool CavernBreed { get; set; } + [NetworkVar("m_bInCavern")] + public partial bool InCavern { get; set; } + [NetworkVar("m_iBleedingLevel")] + public partial int BleedingLevel { get; set; } } diff --git a/Game.Server/NPC_Barnacle.cs b/Game.Server/NPC_Barnacle.cs index 9d1880dd..330bd992 100644 --- a/Game.Server/NPC_Barnacle.cs +++ b/Game.Server/NPC_Barnacle.cs @@ -3,25 +3,24 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("npc_barnacle")] -[NetworkName("CNPC_Barnacle")] -public class NPC_Barnacle : AI_BaseNPC +[NetworkName("CNPC_Barnacle", Table = "DT_Barnacle")] +public partial class NPC_Barnacle : AI_BaseNPC { - public static readonly SendTable DT_Barnacle = new(DT_AI_BaseNPC, [ - SendPropFloat(FIELD.OF(nameof(Altitude)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(Root)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(Tip)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(TipDrawOffset)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_Barnacle); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Altitude)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Root)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Tip)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(TipDrawOffset)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flAltitude")] - public float Altitude; - [NetworkName("m_vecRoot")] - public Vector3 Root; - [NetworkName("m_vecTip")] - public Vector3 Tip; - [NetworkName("m_vecTipDrawOffset")] - public Vector3 TipDrawOffset; + [NetworkVar("m_flAltitude")] + public partial float Altitude { get; set; } + [NetworkVar("m_vecRoot")] + public partial Vector3 Root { get; set; } + [NetworkVar("m_vecTip")] + public partial Vector3 Tip { get; set; } + [NetworkVar("m_vecTipDrawOffset")] + public partial Vector3 TipDrawOffset { get; set; } } diff --git a/Game.Server/NPC_Barney.cs b/Game.Server/NPC_Barney.cs index 70e4bccd..c1f6ea8d 100644 --- a/Game.Server/NPC_Barney.cs +++ b/Game.Server/NPC_Barney.cs @@ -4,11 +4,12 @@ using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("npc_barney")] [NetworkName("CNPC_Barney")] -public class NPC_Barney : AI_BaseNPC +public partial class NPC_Barney : AI_BaseNPC { - public static readonly SendTable DT_NPC_Barney = new(DT_AI_BaseNPC, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_NPC_Barney); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Server/NPC_CombineGunship.cs b/Game.Server/NPC_CombineGunship.cs index 36b75d42..22ad6322 100644 --- a/Game.Server/NPC_CombineGunship.cs +++ b/Game.Server/NPC_CombineGunship.cs @@ -3,16 +3,15 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("npc_combinegunship")] -[NetworkName("CNPC_CombineGunship")] -public class NPC_CombineGunship : BaseHelicopter +[NetworkName("CNPC_CombineGunship", Table = "DT_CombineGunship")] +public partial class NPC_CombineGunship : BaseHelicopter { - public static readonly SendTable DT_CombineGunship = new(DT_BaseHelicopter, [ - SendPropVector(FIELD.OF(nameof(HitPos)), 0, PropFlags.Coord), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_CombineGunship); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(HitPos)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_vecHitPos")] - public Vector3 HitPos; + [NetworkVar("m_vecHitPos")] + public partial Vector3 HitPos { get; set; } } diff --git a/Game.Server/NPC_Manhack.cs b/Game.Server/NPC_Manhack.cs index 9d9f19d6..0ca9c0f8 100644 --- a/Game.Server/NPC_Manhack.cs +++ b/Game.Server/NPC_Manhack.cs @@ -3,22 +3,21 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("npc_manhack")] [NetworkName("CNPC_Manhack")] -public class NPC_Manhack : AI_BaseNPC +public partial class NPC_Manhack : AI_BaseNPC { - public static readonly SendTable DT_NPC_Manhack = new(DT_AI_BaseNPC, [ - SendPropInt(FIELD.OF(nameof(EnginePitch1)), 8, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(EnginePitch1Time)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(EnginePitch2)), 8, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_NPC_Manhack); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(EnginePitch1)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(EnginePitch1Time)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EnginePitch2)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nEnginePitch1")] - public int EnginePitch1; - [NetworkName("m_flEnginePitch1Time")] - public float EnginePitch1Time; - [NetworkName("m_nEnginePitch2")] - public int EnginePitch2; + [NetworkVar("m_nEnginePitch1")] + public partial int EnginePitch1 { get; set; } + [NetworkVar("m_flEnginePitch1Time")] + public partial float EnginePitch1Time { get; set; } + [NetworkVar("m_nEnginePitch2")] + public partial int EnginePitch2 { get; set; } } diff --git a/Game.Server/NPC_Portal_FloorTurret.cs b/Game.Server/NPC_Portal_FloorTurret.cs index d2e9e823..2fb827df 100644 --- a/Game.Server/NPC_Portal_FloorTurret.cs +++ b/Game.Server/NPC_Portal_FloorTurret.cs @@ -3,22 +3,21 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("npc_portal_turret_floor")] [NetworkName("CNPC_Portal_FloorTurret")] -public class NPC_Portal_FloorTurret : AI_BaseNPC +public partial class NPC_Portal_FloorTurret : AI_BaseNPC { - public static readonly SendTable DT_NPC_Portal_FloorTurret = new(DT_AI_BaseNPC, [ - SendPropBool(FIELD.OF(nameof(OutOfAmmo))), - SendPropBool(FIELD.OF(nameof(LaserOn))), - SendPropInt(FIELD.OF(nameof(LaserHaloSprite)), 16, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_NPC_Portal_FloorTurret); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(OutOfAmmo), + nameof(LaserOn), + new(nameof(LaserHaloSprite)) { Bits = 16, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_bOutOfAmmo")] - public bool OutOfAmmo; - [NetworkName("m_bLaserOn")] - public bool LaserOn; - [NetworkName("m_sLaserHaloSprite")] - public int LaserHaloSprite; + [NetworkVar("m_bOutOfAmmo")] + public partial bool OutOfAmmo { get; set; } + [NetworkVar("m_bLaserOn")] + public partial bool LaserOn { get; set; } + [NetworkVar("m_sLaserHaloSprite")] + public partial int LaserHaloSprite { get; set; } } diff --git a/Game.Server/NPC_Puppet.cs b/Game.Server/NPC_Puppet.cs index 81beb7c6..830e56ab 100644 --- a/Game.Server/NPC_Puppet.cs +++ b/Game.Server/NPC_Puppet.cs @@ -3,19 +3,23 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("npc_puppet")] [NetworkName("CNPC_Puppet")] -public class NPC_Puppet : AI_BaseNPC +public partial class NPC_Puppet : AI_BaseNPC { - public static readonly SendTable DT_NPC_Puppet = new(DT_AI_BaseNPC, [ - SendPropEHandle(FIELD.OF(nameof(AnimationTarget))), - SendPropInt(FIELD.OF(nameof(TargetAttachment)), 12, 0), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_NPC_Puppet); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(AnimationTarget), + new(nameof(TargetAttachment)) { Bits = 12 }, + ]; - [NetworkName("m_hAnimationTarget")] - public EHANDLE AnimationTarget = new(); - [NetworkName("m_nTargetAttachment")] - public int TargetAttachment; + public NPC_Puppet() { + AnimationTarget = new(); + } + + + [NetworkVar("m_hAnimationTarget")] + public partial EHANDLE AnimationTarget { get; set; } + [NetworkVar("m_nTargetAttachment")] + public partial int TargetAttachment { get; set; } } diff --git a/Game.Server/NPC_RocketTurret.cs b/Game.Server/NPC_RocketTurret.cs index a0d83d5f..af251ac5 100644 --- a/Game.Server/NPC_RocketTurret.cs +++ b/Game.Server/NPC_RocketTurret.cs @@ -3,22 +3,21 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("npc_rocket_turret")] [NetworkName("CNPC_RocketTurret")] -public class NPC_RocketTurret : AI_BaseNPC +public partial class NPC_RocketTurret : AI_BaseNPC { - public static readonly SendTable DT_NPC_RocketTurret = new(DT_AI_BaseNPC, [ - SendPropInt(FIELD.OF(nameof(LaserState)), 2, 0), - SendPropInt(FIELD.OF(nameof(SiteHalo)), 16, PropFlags.Unsigned), - SendPropVector(FIELD.OF(nameof(CurrentAngles)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_NPC_RocketTurret); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(LaserState)) { Bits = 2 }, + new(nameof(SiteHalo)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(CurrentAngles)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_iLaserState")] - public int LaserState; - [NetworkName("m_nSiteHalo")] - public int SiteHalo; - [NetworkName("m_vecCurrentAngles")] - public Vector3 CurrentAngles; + [NetworkVar("m_iLaserState")] + public partial int LaserState { get; set; } + [NetworkVar("m_nSiteHalo")] + public partial int SiteHalo { get; set; } + [NetworkVar("m_vecCurrentAngles")] + public partial Vector3 CurrentAngles { get; set; } } diff --git a/Game.Server/NPC_RollerMine.cs b/Game.Server/NPC_RollerMine.cs index 31fa366f..1f7293f6 100644 --- a/Game.Server/NPC_RollerMine.cs +++ b/Game.Server/NPC_RollerMine.cs @@ -3,25 +3,24 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("npc_rollermine")] -[NetworkName("CNPC_RollerMine")] -public class NPC_RollerMine : AI_BaseNPC +[NetworkName("CNPC_RollerMine", Table = "DT_RollerMine")] +public partial class NPC_RollerMine : AI_BaseNPC { - public static readonly SendTable DT_RollerMine = new(DT_AI_BaseNPC, [ - SendPropBool(FIELD.OF(nameof(IsOpen))), - SendPropFloat(FIELD.OF(nameof(ActiveTime)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(HackedByAlyx))), - SendPropBool(FIELD.OF(nameof(PowerDown))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_RollerMine); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(IsOpen), + new(nameof(ActiveTime)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(HackedByAlyx), + nameof(PowerDown), + ]; - [NetworkName("m_bIsOpen")] - public bool IsOpen; - [NetworkName("m_flActiveTime")] - public float ActiveTime; - [NetworkName("m_bHackedByAlyx")] - public bool HackedByAlyx; - [NetworkName("m_bPowerDown")] - public bool PowerDown; + [NetworkVar("m_bIsOpen")] + public partial bool IsOpen { get; set; } + [NetworkVar("m_flActiveTime")] + public partial float ActiveTime { get; set; } + [NetworkVar("m_bHackedByAlyx")] + public partial bool HackedByAlyx { get; set; } + [NetworkVar("m_bPowerDown")] + public partial bool PowerDown { get; set; } } diff --git a/Game.Server/NPC_Strider.cs b/Game.Server/NPC_Strider.cs index 18c2a5b0..57b0fb1e 100644 --- a/Game.Server/NPC_Strider.cs +++ b/Game.Server/NPC_Strider.cs @@ -3,24 +3,18 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("npc_strider")] [NetworkName("CNPC_Strider")] -public class NPC_Strider : AI_BaseNPC +public partial class NPC_Strider : AI_BaseNPC { - public static readonly SendTable DT_NPC_Strider = new(DT_AI_BaseNPC, [ - SendPropVector(FIELD.OF(nameof(HitPos)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF_ARRAYINDEX(nameof(IKTarget), 0), 0, PropFlags.Coord), - SendPropVector(FIELD.OF_ARRAYINDEX(nameof(IKTarget), 1), 0, PropFlags.Coord), - SendPropVector(FIELD.OF_ARRAYINDEX(nameof(IKTarget), 2), 0, PropFlags.Coord), - SendPropVector(FIELD.OF_ARRAYINDEX(nameof(IKTarget), 3), 0, PropFlags.Coord), - SendPropVector(FIELD.OF_ARRAYINDEX(nameof(IKTarget), 4), 0, PropFlags.Coord), - SendPropVector(FIELD.OF_ARRAYINDEX(nameof(IKTarget), 5), 0, PropFlags.Coord), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_NPC_Strider); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(HitPos)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(IKTarget)) { Encoding = NetEncoding.Elements, Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_vecHitPos")] - public Vector3 HitPos; - [NetworkName("m_vecIKTarget")] - public InlineArray6 IKTarget; + [NetworkVar("m_vecHitPos")] + public partial Vector3 HitPos { get; set; } + [NetworkVar("m_vecIKTarget")] + public partial ref readonly InlineArray6 IKTarget { get; } } diff --git a/Game.Server/NPC_Vortigaunt.cs b/Game.Server/NPC_Vortigaunt.cs index 8bf82f7b..208dcc79 100644 --- a/Game.Server/NPC_Vortigaunt.cs +++ b/Game.Server/NPC_Vortigaunt.cs @@ -3,22 +3,21 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("npc_vortigaunt")] [NetworkName("CNPC_Vortigaunt")] -public class NPC_Vortigaunt : AI_BaseNPC +public partial class NPC_Vortigaunt : AI_BaseNPC { - public static readonly SendTable DT_NPC_Vortigaunt = new(DT_AI_BaseNPC, [ - SendPropFloat(FIELD.OF(nameof(BlueEndFadeTime)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(IsBlue))), - SendPropBool(FIELD.OF(nameof(IsBlack))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_NPC_Vortigaunt); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(BlueEndFadeTime)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(IsBlue), + nameof(IsBlack), + ]; - [NetworkName("m_flBlueEndFadeTime")] - public float BlueEndFadeTime; - [NetworkName("m_bIsBlue")] - public bool IsBlue; - [NetworkName("m_bIsBlack")] - public bool IsBlack; + [NetworkVar("m_flBlueEndFadeTime")] + public partial float BlueEndFadeTime { get; set; } + [NetworkVar("m_bIsBlue")] + public partial bool IsBlue { get; set; } + [NetworkVar("m_bIsBlack")] + public partial bool IsBlack { get; set; } } diff --git a/Game.Server/NavMesh/NavEntities.cs b/Game.Server/NavMesh/NavEntities.cs index 76c80aa6..1075709a 100644 --- a/Game.Server/NavMesh/NavEntities.cs +++ b/Game.Server/NavMesh/NavEntities.cs @@ -5,7 +5,6 @@ namespace Game.Server.NavMesh; - class FuncNavCost : BaseEntity { internal float GetCostMultiplier(BaseCombatCharacter who) { @@ -34,11 +33,12 @@ public static bool CalculateBlocked(bool[] resultByTeam, Vector3 mins, Vector3 m } [LinkEntityToClass("func_nav_avoidance_obstacle")] -public class FuncNavObstruction : BaseEntity, INavAvoidanceObstacle +public partial class FuncNavObstruction : BaseEntity, INavAvoidanceObstacle { - public static readonly SendTable DT_FuncNavObstruction = new([ // todo + [NetworkTable("DT_FuncNavObstruction")] + public static readonly new NetworkProp[] Props = [ // todo - ]); + ]; public bool Disabled; @@ -85,4 +85,4 @@ public void OnNavMeshLoaded() { if (!DisableTouchFuncs) ObstructNavAreas(); } -} \ No newline at end of file +} diff --git a/Game.Server/NextBot/NextBotCombatCharacter.cs b/Game.Server/NextBot/NextBotCombatCharacter.cs index 220c3970..83a8d6f5 100644 --- a/Game.Server/NextBot/NextBotCombatCharacter.cs +++ b/Game.Server/NextBot/NextBotCombatCharacter.cs @@ -5,9 +5,7 @@ namespace Game.Server.NextBot; -[NetworkName("NextBotCombatCharacter")] -public class NextBotCombatCharacter : BaseCombatCharacter +[NetworkName("NextBotCombatCharacter", Table = "DT_NextBot")] +public partial class NextBotCombatCharacter : BaseCombatCharacter { - public static readonly SendTable DT_NextBot = new(DT_BaseCombatCharacter, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_NextBot); } diff --git a/Game.Server/ParticlePerformanceMonitor.cs b/Game.Server/ParticlePerformanceMonitor.cs index c07375cc..d1bacf7d 100644 --- a/Game.Server/ParticlePerformanceMonitor.cs +++ b/Game.Server/ParticlePerformanceMonitor.cs @@ -3,19 +3,18 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_particle_performance_monitor")] [NetworkName("CParticlePerformanceMonitor")] -public class ParticlePerformanceMonitor : PointEntity +public partial class ParticlePerformanceMonitor : PointEntity { - public static readonly SendTable DT_ParticlePerformanceMonitor = new(DT_BaseEntity, [ - SendPropBool(FIELD.OF(nameof(DisplayPerf))), - SendPropBool(FIELD.OF(nameof(MeasurePerf))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_ParticlePerformanceMonitor); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(DisplayPerf), + nameof(MeasurePerf), + ]; - [NetworkName("m_bDisplayPerf")] - public bool DisplayPerf; - [NetworkName("m_bMeasurePerf")] - public bool MeasurePerf; + [NetworkVar("m_bDisplayPerf")] + public partial bool DisplayPerf { get; set; } + [NetworkVar("m_bMeasurePerf")] + public partial bool MeasurePerf { get; set; } } diff --git a/Game.Server/ParticleSmokeGrenade.cs b/Game.Server/ParticleSmokeGrenade.cs index 2a31f506..3a7e8683 100644 --- a/Game.Server/ParticleSmokeGrenade.cs +++ b/Game.Server/ParticleSmokeGrenade.cs @@ -3,25 +3,24 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_particlesmokegrenade")] -[NetworkName("ParticleSmokeGrenade")] -public class ParticleSmokeGrenade : BaseParticleEntity +[NetworkName("ParticleSmokeGrenade", Table = "DT_ParticleSmokeGrenade")] +public partial class ParticleSmokeGrenade : BaseParticleEntity { - public static readonly SendTable DT_ParticleSmokeGrenade = new(DT_BaseParticleEntity, [ - SendPropFloat(FIELD.OF(nameof(SpawnTime)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FadeStartTime)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FadeEndTime)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(CurrentStage))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_ParticleSmokeGrenade); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SpawnTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeStartTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeEndTime)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(CurrentStage), + ]; - [NetworkName("m_flSpawnTime")] - public float SpawnTime; - [NetworkName("m_FadeStartTime")] - public float FadeStartTime; - [NetworkName("m_FadeEndTime")] - public float FadeEndTime; - [NetworkName("m_CurrentStage")] - public bool CurrentStage; + [NetworkVar("m_flSpawnTime")] + public partial float SpawnTime { get; set; } + [NetworkVar("m_FadeStartTime")] + public partial float FadeStartTime { get; set; } + [NetworkVar("m_FadeEndTime")] + public partial float FadeEndTime { get; set; } + [NetworkVar("m_CurrentStage")] + public partial bool CurrentStage { get; set; } } diff --git a/Game.Server/ParticleSystem.cs b/Game.Server/ParticleSystem.cs index 6c566ab5..f61d8139 100644 --- a/Game.Server/ParticleSystem.cs +++ b/Game.Server/ParticleSystem.cs @@ -7,37 +7,41 @@ namespace Game.Server; -using FIELD = FIELD; - [LinkEntityToClass("info_particle_system")] -[NetworkName("CParticleSystem")] -public class ParticleSystem : BaseEntity +[NetworkName("CParticleSystem", NoBase = true)] +public partial class ParticleSystem : BaseEntity { - public static readonly SendTable DT_ParticleSystem = new([ - SendPropVector(NetworkVarFields.Origin, 0, PropFlags.Coord | PropFlags.ChangesOften), - SendPropEHandle(FIELD.OF(nameof(OwnerEntity))), - SendPropEHandle(FIELD.OF(nameof(MoveParent))), - SendPropInt(FIELD.OF(nameof(ParentAttachment)), 8, PropFlags.Unsigned), - SendPropQAngles(FIELD.OF(nameof(Rotation)), 13, PropFlags.RoundDown | PropFlags.ChangesOften), - SendPropInt(FIELD.OF(nameof(EffectIndex)), 12, PropFlags.Unsigned), - SendPropBool(FIELD.OF(nameof(Active))), - SendPropFloat(FIELD.OF(nameof(StartTime)), 0, PropFlags.NoScale), - SendPropArray3(FIELD.OF_ARRAY(nameof(ControlPointEnts)), SendPropEHandle(FIELD.OF_ARRAYINDEX(nameof(ControlPointEnts), 0))), - SendPropArray3(FIELD.OF_ARRAY(nameof(ControlPointParents)), SendPropInt(FIELD.OF_ARRAYINDEX(nameof(ControlPointParents), 0), 3, PropFlags.Unsigned)), - SendPropBool(FIELD.OF(nameof(WeatherEffect))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_ParticleSystem); - [NetworkName("m_iEffectIndex")] - public int EffectIndex; - [NetworkName("m_bActive")] - public bool Active; - [NetworkName("m_flStartTime")] - public TimeUnit_t StartTime; - [NetworkName("m_bWeatherEffect")] - public bool WeatherEffect; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Origin)) { Encoding = NetEncoding.Vector, Bits = 0, Flags = PropFlags.Coord | PropFlags.ChangesOften, Proxy = typeof(OriginProxy) }, + new(nameof(OwnerEntity)) { Encoding = NetEncoding.EHandle }, + new(nameof(MoveParent)) { Encoding = NetEncoding.EHandle }, + new(nameof(ParentAttachment)) { Encoding = NetEncoding.Int, Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Rotation)) { Encoding = NetEncoding.QAngles, Bits = 13, Flags = PropFlags.RoundDown | PropFlags.ChangesOften, Proxy = typeof(AnglesProxy) }, + new(nameof(EffectIndex)) { Bits = 12, Flags = PropFlags.Unsigned }, + nameof(Active), + new(nameof(StartTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + nameof(ControlPointEnts), + new(nameof(ControlPointParents)) { Bits = 3, Flags = PropFlags.Unsigned }, + nameof(WeatherEffect), + ]; + + [NetworkVar("m_iEffectIndex")] + public partial int EffectIndex { get; set; } + [NetworkVar("m_bActive")] + public partial bool Active { get; set; } + [NetworkVar("m_flStartTime")] + public partial TimeUnit_t StartTime { get; set; } + [NetworkVar("m_hControlPointEnts")] + public partial ref readonly InlineArrayNewMaxControlPoints ControlPointEnts { get; } + + [NetworkVar("m_iControlPointParents")] + public partial ref readonly InlineArrayNewMaxControlPoints ControlPointParents { get; } + [NetworkVar("m_bWeatherEffect")] + public partial bool WeatherEffect { get; set; } - [NetworkName("m_hControlPointEnts")] - public InlineArrayNewMaxControlPoints ControlPointEnts = new(); - [NetworkName("m_iControlPointParents")] - public InlineArrayNewMaxControlPoints ControlPointParents = new(); + public ParticleSystem() { + ControlPointEntsForModify() = new(); + ControlPointParentsForModify() = new(); + } } diff --git a/Game.Server/PhysMagnet.cs b/Game.Server/PhysMagnet.cs index c2993afa..a9ba4aaa 100644 --- a/Game.Server/PhysMagnet.cs +++ b/Game.Server/PhysMagnet.cs @@ -6,8 +6,10 @@ namespace Game.Server; [LinkEntityToClass("phys_magnet")] [NetworkName("CPhysMagnet")] -public class PhysMagnet : BaseAnimating +public partial class PhysMagnet : BaseAnimating { - public static readonly SendTable DT_PhysMagnet = new(DT_BaseAnimating, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PhysMagnet); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Server/PhysObj.cs b/Game.Server/PhysObj.cs index d6954672..22d0df01 100644 --- a/Game.Server/PhysObj.cs +++ b/Game.Server/PhysObj.cs @@ -15,16 +15,18 @@ namespace Game.Server; [LinkEntityToClass("func_physbox")] [NetworkName("CPhysBox")] -public class PhysBox : Breakable +public partial class PhysBox : Breakable { + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + [Flags] public enum SF { EnableOnPhyscannon = 0x20000, } - public static readonly SendTable DT_PhysBox = new(DT_BaseEntity, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PhysBox); } [LinkEntityToClass("env_physimpact")] diff --git a/Game.Server/Plasma.cs b/Game.Server/Plasma.cs index 9b388f93..69b2d257 100644 --- a/Game.Server/Plasma.cs +++ b/Game.Server/Plasma.cs @@ -3,31 +3,30 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("_plasma")] [NetworkName("CPlasma")] -public class Plasma : BaseEntity +public partial class Plasma : BaseEntity { - public static readonly SendTable DT_Plasma = new(DT_BaseEntity, [ - SendPropFloat(FIELD.OF(nameof(Scale)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(ScaleTime)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(Flags)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(PlasmaModelIndex)), 14, 0), - SendPropInt(FIELD.OF(nameof(PlasmaModelIndex2)), 14, 0), - SendPropInt(FIELD.OF(nameof(GlowModelIndex)), 14, 0), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_Plasma); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Scale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ScaleTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Flags)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(PlasmaModelIndex)) { Bits = 14 }, + new(nameof(PlasmaModelIndex2)) { Bits = 14 }, + new(nameof(GlowModelIndex)) { Bits = 14 }, + ]; - [NetworkName("m_flScale")] - public float Scale; - [NetworkName("m_flScaleTime")] - public float ScaleTime; - [NetworkName("m_nFlags")] - public int Flags; - [NetworkName("m_nPlasmaModelIndex")] - public int PlasmaModelIndex; - [NetworkName("m_nPlasmaModelIndex2")] - public int PlasmaModelIndex2; - [NetworkName("m_nGlowModelIndex")] - public int GlowModelIndex; + [NetworkVar("m_flScale")] + public partial float Scale { get; set; } + [NetworkVar("m_flScaleTime")] + public partial float ScaleTime { get; set; } + [NetworkVar("m_nFlags")] + public partial int Flags { get; set; } + [NetworkVar("m_nPlasmaModelIndex")] + public partial int PlasmaModelIndex { get; set; } + [NetworkVar("m_nPlasmaModelIndex2")] + public partial int PlasmaModelIndex2 { get; set; } + [NetworkVar("m_nGlowModelIndex")] + public partial int GlowModelIndex { get; set; } } diff --git a/Game.Server/Player.cs b/Game.Server/Player.cs index 44fb2a78..691f00ab 100644 --- a/Game.Server/Player.cs +++ b/Game.Server/Player.cs @@ -22,8 +22,6 @@ namespace Game.Server; -using FIELD = Source.FIELD; - public enum PlayerConnectedState { Connected, @@ -257,8 +255,8 @@ public enum PlayerPhysFlag [NetworkName("CBasePlayer")] public partial class BasePlayer : BaseCombatCharacter { - [NetworkName("m_ArmorValue")] - public int ArmorValue; + [NetworkVar("m_ArmorValue")] + public partial int ArmorValue { get; set; } public int GetArmorValue() => ArmorValue; @@ -290,10 +288,6 @@ public enum SF } public const float DOT_30DEGREE = 0.866025403784f; public const float DOT_45DEGREE = 0.707106781187f; - public static readonly SendTable DT_PlayerState = new(nameof(DT_PlayerState), [ - SendPropInt(FIELD.OF(nameof(PlayerState.DeadFlag)), 1, PropFlags.Unsigned) - ]); - public override bool IsPlayer() => true; public override Class_T Classify() => Class_T.Player; public virtual bool IsBot() => (GetFlags() & EntityFlags.FakeClient) != 0; @@ -311,49 +305,48 @@ public enum SF public BaseViewModel? GetViewModel(int index) => ViewModel[index].Get(); - public static readonly SendTable DT_LocalPlayerExclusive = new(nameof(DT_LocalPlayerExclusive), [ - SendPropDataTable("m_Local", FIELD.OF(nameof(Local)), PlayerLocalData.DT_Local), - SendPropFloat(FIELD.OF(nameof(Friction)), 0, PropFlags.NoScale | PropFlags.RoundDown, 0.0f, 4.0f), - SendPropArray3(FIELD.OF_ARRAY(nameof(Ammo)), SendPropInt( FIELD.OF_ARRAYINDEX(nameof(Ammo)), 16, PropFlags.Unsigned)), - SendPropInt(FIELD.OF(nameof(TickBase)), -1, PropFlags.ChangesOften), - SendPropInt(FIELD.OF(nameof(NextThinkTick))), - SendPropEHandle(FIELD.OF(nameof(LastWeapon))), - SendPropEHandle(FIELD.OF(nameof(GroundEntity)), PropFlags.ChangesOften), - SendPropVector(FIELD.OF(nameof(BaseVelocity)), 0, PropFlags.NoScale), - SendPropEHandle(FIELD.OF(nameof(ConstraintEntity))), - SendPropVector(FIELD.OF(nameof(ConstraintCenter)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(ConstraintRadius)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(ConstraintWidth)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(ConstraintSpeedFactor)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(DeathTime)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(LaggedMovementValue)), 0, PropFlags.NoScale), - SendPropEHandle(FIELD.OF(nameof(TonemapController))), - SendPropEHandle(FIELD.OF(nameof(ViewEntity))), - SendPropBool(FIELD.OF(nameof(DisableWorldClicking))), - ]); - - public static readonly SendTable DT_BasePlayer = new(DT_BaseCombatCharacter, [ - SendPropDataTable(nameof(pl), FIELD.OF(nameof(pl)), DT_PlayerState, SendProxy_DataTableToDataTable), - SendPropEHandle(FIELD.OF(nameof(Vehicle))), - SendPropEHandle(FIELD.OF(nameof(UseEntity))), - SendPropInt(FIELD.OF(nameof(LifeState)), 3, PropFlags.Unsigned ), - SendPropEHandle(FIELD.OF(nameof(ColorCorrectionCtrl))), // << gmod specific - SendPropFloat(FIELD.OF(nameof(Maxspeed)), 12, PropFlags.RoundDown, 0.0f, 2048.0f ), - SendPropInt(FIELD.OF("flags"), Constants.PLAYER_FLAG_BITS, PropFlags.Unsigned|PropFlags.ChangesOften, SendProxy_CropFlagsToPlayerFlagBitsLength), - SendPropInt(FIELD.OF(nameof(ObserverMode)), 3, PropFlags.Unsigned), - SendPropEHandle(FIELD.OF(nameof(ObserverTarget))), - SendPropFloat(FIELD.OF(nameof(FOV)), 16, PropFlags.Unsigned, 0, 65536), - SendPropFloat(FIELD.OF(nameof(FOVStart)), 16, PropFlags.Unsigned, 0, 65536), - SendPropTime64(FIELD.OF(nameof(FOVTime))), - SendPropFloat(FIELD.OF(nameof(DefaultFOV)), 16, PropFlags.Unsigned, 0, 65536), - SendPropEHandle(FIELD.OF(nameof(ZoomOwner))), - - SendPropEHandle(FIELD.OF_SENDINFO_ARRAY(nameof(ViewModel))), - SendPropArray(FIELD.OF_ARRAY(nameof(ViewModel))), - - SendPropBool(FIELD.OF(nameof(UseWeaponsInVehicle))), - SendPropDataTable( "localdata", DT_LocalPlayerExclusive, SendProxy_SendLocalDataTable), - ]); + [NetworkTable("DT_LocalPlayerExclusive")] + public static readonly NetworkProp[] LocalPlayerExclusiveProps = [ + new(nameof(Local)) { Encoding = NetEncoding.DataTable, DataTable = "DT_Local" }, + new(nameof(Friction)) { Bits = 0, Flags = PropFlags.NoScale | PropFlags.RoundDown, Low = 0.0f, High = 4.0f }, + new(nameof(Ammo)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(TickBase)) { Bits = -1, Flags = PropFlags.ChangesOften }, + nameof(NextThinkTick), + nameof(LastWeapon), + new(nameof(GroundEntity)) { Flags = PropFlags.ChangesOften }, + new(nameof(BaseVelocity)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(ConstraintEntity), + new(nameof(ConstraintCenter)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ConstraintRadius)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ConstraintWidth)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ConstraintSpeedFactor)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DeathTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(LaggedMovementValue)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + nameof(TonemapController), + nameof(ViewEntity), + nameof(DisableWorldClicking), + ]; + + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(pl)) { Encoding = NetEncoding.DataTable, DataTable = "DT_PlayerState" }, + nameof(Vehicle), + nameof(UseEntity), + new(nameof(LifeState)) { Bits = 3, Flags = PropFlags.Unsigned }, + nameof(ColorCorrectionCtrl), // << gmod specific + new(nameof(Maxspeed)) { Bits = 12, Flags = PropFlags.RoundDown, Low = 0.0f, High = 2048.0f }, + new(nameof(flags)) { Bits = Constants.PLAYER_FLAG_BITS, Flags = PropFlags.Unsigned | PropFlags.ChangesOften, Proxy = typeof(CropFlagsToPlayerFlagBitsLengthProxy) }, + new(nameof(ObserverMode)) { Bits = 3, Flags = PropFlags.Unsigned }, + nameof(ObserverTarget), + new(nameof(FOV)) { Encoding = NetEncoding.Float, Bits = 16, Flags = PropFlags.Unsigned, Low = 0, High = 65536 }, + new(nameof(FOVStart)) { Encoding = NetEncoding.Float, Bits = 16, Flags = PropFlags.Unsigned, Low = 0, High = 65536 }, + nameof(FOVTime), + new(nameof(DefaultFOV)) { Bits = 16, Flags = PropFlags.Unsigned, Low = 0, High = 65536 }, + nameof(ZoomOwner), + new(nameof(ViewModel)) { Encoding = NetEncoding.Array }, + nameof(UseWeaponsInVehicle), + new(nameof(LocalPlayerExclusiveProps)) { Name = "localdata", Proxy = typeof(LocalPlayerExclusiveProxy) }, + ]; public static Edict? s_PlayerEdict; public static BaseEntity? g_LastSpawn; @@ -429,18 +422,36 @@ public void SetPhysicsFlag(PlayerPhysFlag flag, bool set) { public bool PredictWeapons; readonly List AvailableCommandsBuf = []; - public static void SendProxy_CropFlagsToPlayerFlagBitsLength(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) { - int mask = (1 << Constants.PLAYER_FLAG_BITS) - 1; - int data = field.GetValue(instance); - outData.Int = data & mask; + public static class CropFlagsToPlayerFlagBitsLengthProxy + { + public static void Send(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) { + int mask = (1 << Constants.PLAYER_FLAG_BITS) - 1; + int data = field.GetValue(instance); + outData.Int = data & mask; + } + } + + public static class LocalPlayerExclusiveProxy + { + public static object? Send(SendProp prop, object instance, IFieldAccessor data, SendProxyRecipients recipients, int objectID) + => SendProxy_SendLocalDataTable(prop, instance, data, recipients, objectID); } GamePlayerInfo PlayerInfo = new(); - public static readonly new ServerClass ServerClass = new ServerClass(DT_BasePlayer); - public BasePlayer() { + Local.Outer = this; + pl.OnNetworkStateChanged = NetworkStateChanged; + ViewModelForModify() = new(); + Vehicle = new(); + UseEntity = new(); + ObserverTarget = new(); + ZoomOwner = new(); + ConstraintEntity = new(); + TonemapController = new(); + ViewEntity = new(); + ColorCorrectionCtrl = new(); AddEFlags(EFL.NoAutoEdictAttach); #if DEBUG @@ -475,7 +486,7 @@ public BasePlayer() { bitsDamageType = 0; ForceOrigin = false; - Vehicle.Set(null); + Vehicle = EHANDLE.FromEntity(null); CurrentCommand = default; LockViewanglesTickNumber = 0; LockedViewangles.Init(); @@ -483,7 +494,7 @@ public BasePlayer() { // Setup our default FOV DefaultFOV = g_pGameRules.DefaultFOV(); - ZoomOwner.Set(null); + ZoomOwner = EHANDLE.FromEntity(null); UpdateRate = 20; // cl_updaterate defualt LerpTime = 0.1f; // cl_interp default @@ -533,11 +544,13 @@ public BasePlayer() { LastObjectiveTime = -1; } + [NetworkVar("pl")] public readonly PlayerState pl = new(); - [NetworkName("m_Local")] + [NetworkVar("m_Local")] public readonly PlayerLocalData Local = new(); - public ref AudioParams GetAudioParams() => ref Local.Audio; + public ref readonly AudioParams GetAudioParams() => ref Local.Audio; + public ref AudioParams GetAudioParamsForModify() => ref Local.AudioForModify(); // Used by env_soundscape_triggerable to manage when the player is touching multiple // soundscape triggers simultaneously. @@ -549,22 +562,22 @@ public void SetBodyPitch(float pitch) { SetPoseParameter(BodyPitchPoseParam, pitch); } - [NetworkName("m_hVehicle")] - public EHANDLE Vehicle = new(); - [NetworkName("m_hUseEntity")] - public EHANDLE UseEntity = new(); - [NetworkName("m_hObserverTarget")] - public EHANDLE ObserverTarget = new(); - [NetworkName("m_hZoomOwner")] - public EHANDLE ZoomOwner = new(); - [NetworkName("m_hConstraintEntity")] - public EHANDLE ConstraintEntity = new(); - [NetworkName("m_hTonemapController")] - public EHANDLE TonemapController = new(); - [NetworkName("m_hViewEntity")] - public EHANDLE ViewEntity = new(); - [NetworkName("m_hViewModel")] - protected InlineArrayNewMaxViewmodels> ViewModel = new(); + [NetworkVar("m_hVehicle")] + public partial EHANDLE Vehicle { get; set; } + [NetworkVar("m_hUseEntity")] + public partial EHANDLE UseEntity { get; set; } + [NetworkVar("m_hObserverTarget")] + public partial EHANDLE ObserverTarget { get; set; } + [NetworkVar("m_hZoomOwner")] + public partial EHANDLE ZoomOwner { get; set; } + [NetworkVar("m_hConstraintEntity")] + public partial EHANDLE ConstraintEntity { get; set; } + [NetworkVar("m_hTonemapController")] + public partial EHANDLE TonemapController { get; set; } + [NetworkVar("m_hViewEntity")] + public partial EHANDLE ViewEntity { get; set; } + [NetworkVar("m_hViewModel")] + protected partial ref readonly InlineArrayNewMaxViewmodels> ViewModel { get; } readonly List> SimulatedByThisPlayer = []; public IServerVehicle? GetVehicle() => Vehicle.Get()?.GetServerVehicle(); @@ -581,7 +594,7 @@ public void SetBodyPitch(float pitch) { public virtual ReadOnlySpan GetSceneSoundToken() => ""; public void SetViewEntity(BaseEntity? entity) { - ViewEntity.Set(entity); + ViewEntity = EHANDLE.FromEntity(entity); if (ViewEntity.Get() != null) engine.SetView(Edict()!, ViewEntity.Get()!.Edict()!); @@ -597,47 +610,47 @@ public void EnableControl(bool control) { } bool HasHaptics; - [NetworkName("m_bDisableWorldClicking")] - public bool DisableWorldClicking; + [NetworkVar("m_bDisableWorldClicking")] + public partial bool DisableWorldClicking { get; set; } public bool WorldClicking; public Vector3 WorldClickVector; - [NetworkName("m_flMaxspeed")] - float Maxspeed; - [NetworkName("m_iObserverMode")] - int ObserverMode; - [NetworkName("m_iFOV")] - int FOV; - [NetworkName("m_nTickBase")] - public int TickBase; - [NetworkName("m_iFOVStart")] - int FOVStart; - [NetworkName("m_flFOVTime")] - TimeUnit_t FOVTime; - [NetworkName("m_iDefaultFOV")] - float DefaultFOV; - [NetworkName("m_vecConstraintCenter")] - public Vector3 ConstraintCenter; - [NetworkName("m_flConstraintRadius")] - public float ConstraintRadius; - [NetworkName("m_flConstraintWidth")] - public float ConstraintWidth; - [NetworkName("m_flConstraintSpeedFactor")] - public float ConstraintSpeedFactor; + [NetworkVar("m_flMaxspeed")] + private partial float Maxspeed { get; set; } + [NetworkVar("m_iObserverMode")] + private partial int ObserverMode { get; set; } + [NetworkVar("m_iFOV")] + private partial int FOV { get; set; } + [NetworkVar("m_nTickBase")] + public partial int TickBase { get; set; } + [NetworkVar("m_iFOVStart")] + private partial int FOVStart { get; set; } + [NetworkVar("m_flFOVTime")] + private partial TimeUnit_t FOVTime { get; set; } + [NetworkVar("m_iDefaultFOV")] + private partial float DefaultFOV { get; set; } + [NetworkVar("m_vecConstraintCenter")] + public partial Vector3 ConstraintCenter { get; set; } + [NetworkVar("m_flConstraintRadius")] + public partial float ConstraintRadius { get; set; } + [NetworkVar("m_flConstraintWidth")] + public partial float ConstraintWidth { get; set; } + [NetworkVar("m_flConstraintSpeedFactor")] + public partial float ConstraintSpeedFactor { get; set; } InlineArray18 LastPlaceName; - [NetworkName("m_hColorCorrectionCtrl")] - EHANDLE ColorCorrectionCtrl = new(); - [NetworkName("m_bUseWeaponsInVehicle")] - bool UseWeaponsInVehicle; + [NetworkVar("m_hColorCorrectionCtrl")] + private partial EHANDLE ColorCorrectionCtrl { get; set; } + [NetworkVar("m_bUseWeaponsInVehicle")] + private partial bool UseWeaponsInVehicle { get; set; } public bool GetAllowWeaponsInVehicle() => UseWeaponsInVehicle; public virtual void StopObserverMode() { // todo } public bool OnTarget; - [NetworkName("m_flDeathTime")] - public TimeUnit_t DeathTime; - [NetworkName("m_flLaggedMovementValue")] - public double LaggedMovementValue; + [NetworkVar("m_flDeathTime")] + public partial TimeUnit_t DeathTime { get; set; } + [NetworkVar("m_flLaggedMovementValue")] + public partial double LaggedMovementValue { get; set; } public TimeUnit_t StepSoundTime; InlineArray32 AnimExtension; @@ -1098,7 +1111,7 @@ public virtual void CreateViewModel(int index = 0) { vm.SetIndex(index); Util.DispatchSpawn(vm); vm.FollowEntity(this); - ViewModel[index].Set(vm); + ViewModelForModify()[index].Set(vm); } } @@ -2346,7 +2359,7 @@ public virtual void PlayUseDenySound() { } public virtual void PickupObject(BaseEntity obj, bool limitMassAndSize = true) { } - public void SetUseEntity(BaseEntity? useEntity) => UseEntity.Set(useEntity); + public void SetUseEntity(BaseEntity? useEntity) => UseEntity = EHANDLE.FromEntity(useEntity); public BaseEntity? GetUseEntity() => UseEntity.Get(); public static bool CanPickupObject(BaseEntity? obj, float massLimit, float sizeLimit) { @@ -2455,7 +2468,7 @@ public bool ClearUseEntity() { // Stop controlling the train/object // TODO: Send HUD Update UseEntity.Get()!.Use(this, this, UseType.Off, 0); - UseEntity.Set(null); + UseEntity = EHANDLE.FromEntity(null); return true; } diff --git a/Game.Server/PlayerLocalData.cs b/Game.Server/PlayerLocalData.cs index 48caef76..c3abc65b 100644 --- a/Game.Server/PlayerLocalData.cs +++ b/Game.Server/PlayerLocalData.cs @@ -8,135 +8,127 @@ namespace Game.Server; -using FIELD = FIELD; - -public class PlayerLocalData +public partial class PlayerLocalData { - public static readonly SendTable DT_Local = new(nameof(DT_Local), [ - SendPropArray3(FIELD.OF_ARRAY(nameof(AreaBits)), SendPropInt(FIELD.OF_ARRAYINDEX(nameof(AreaBits)), 8, PropFlags.Unsigned)), - SendPropArray3(FIELD.OF_ARRAY(nameof(AreaPortalBits)), SendPropInt(FIELD.OF_ARRAYINDEX(nameof(AreaPortalBits)), 8, PropFlags.Unsigned)), - SendPropInt(FIELD.OF(nameof(HideHUD)), (int)HideHudBits.BitCount, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(FOVRate)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(Ducked)), 1, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Ducking)), 1, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(InDuckJump)), 1, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(DuckTime)), 12, PropFlags.RoundDown | PropFlags.ChangesOften, 0.0f, 2048.0f), - SendPropFloat(FIELD.OF(nameof(DuckJumpTime)), 12, PropFlags.RoundDown, 0.0f, 2048.0f), - SendPropFloat(FIELD.OF(nameof(JumpTime)), 12, PropFlags.RoundDown, 0.0f, 2048.0f), - SendPropFloat(FIELD.OF(nameof(FallVelocity)), 32, PropFlags.NoScale | PropFlags.ChangesOften, -4096.0f, 4096.0f), - SendPropVector(FIELD.OF(nameof(PunchAngle)), -1, PropFlags.NoScale|PropFlags.ChangesOften), - SendPropVector(FIELD.OF(nameof(PunchAngleVel)), -1, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(DrawViewmodel)), 1, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(WearingSuit)), 1, PropFlags.Unsigned), - SendPropBool(FIELD.OF(nameof(Poisoned))), - SendPropFloat(FIELD.OF(nameof(StepSize)), 16, PropFlags.RoundUp, 0.0f, 512.0f), - SendPropInt(FIELD.OF(nameof(AllowAutoMovement)),1, PropFlags.Unsigned), - - SendPropInt(FIELD.OF("Skybox3D.Scale"), 12), - SendPropVector(FIELD.OF("Skybox3D.Origin"), -1, PropFlags.Coord), - SendPropInt(FIELD.OF("Skybox3D.Area"), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF("Skybox3D.Fog.Enable"), 1, PropFlags.Unsigned), - SendPropInt(FIELD.OF("Skybox3D.Fog.Blend"), 1, PropFlags.Unsigned), - SendPropInt(FIELD.OF("Skybox3D.Fog.Radial"), 1, PropFlags.Unsigned), - SendPropVector(FIELD.OF("Skybox3D.Fog.DirPrimary"), -1, PropFlags.Coord), - SendPropInt(FIELD.OF("Skybox3D.Fog.ColorPrimary"), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF("Skybox3D.Fog.ColorSecondary"), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF("Skybox3D.Fog.ColorPrimaryHDR"), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF("Skybox3D.Fog.ColorSecondaryHDR"), 32, PropFlags.Unsigned), - SendPropFloat(FIELD.OF("Skybox3D.Fog.Start"), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF("Skybox3D.Fog.End"), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF("Skybox3D.Fog.MaxDensity"), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF("Skybox3D.Fog.HDRColorScale"), 0, PropFlags.NoScale), - - SendPropEHandle( FIELD.OF("PlayerFog.Ctrl") ), - - SendPropVector(FIELD.OF_ARRAYINDEX("Audio.LocalSound", 0), -1, PropFlags.Coord), - SendPropVector(FIELD.OF_ARRAYINDEX("Audio.LocalSound", 1), -1, PropFlags.Coord), - SendPropVector(FIELD.OF_ARRAYINDEX("Audio.LocalSound", 2), -1, PropFlags.Coord), - SendPropVector(FIELD.OF_ARRAYINDEX("Audio.LocalSound", 3), -1, PropFlags.Coord), - SendPropVector(FIELD.OF_ARRAYINDEX("Audio.LocalSound", 4), -1, PropFlags.Coord), - SendPropVector(FIELD.OF_ARRAYINDEX("Audio.LocalSound", 5), -1, PropFlags.Coord), - SendPropVector(FIELD.OF_ARRAYINDEX("Audio.LocalSound", 6), -1, PropFlags.Coord), - SendPropVector(FIELD.OF_ARRAYINDEX("Audio.LocalSound", 7), -1, PropFlags.Coord), - SendPropInt(FIELD.OF("Audio.SoundscapeIndex"), 17, 0), - SendPropInt(FIELD.OF("Audio.LocalBits"), NUM_AUDIO_LOCAL_SOUNDS, PropFlags.Unsigned), - SendPropEHandle(FIELD.OF("Audio.Ent")), - - SendPropFloat(FIELD.OF(nameof(SprintSpeed))), - SendPropFloat(FIELD.OF(nameof(WalkSpeed))), - SendPropFloat(FIELD.OF(nameof(SlowWalkSpeed))), - SendPropFloat(FIELD.OF(nameof(LadderSpeed))), - SendPropFloat(FIELD.OF(nameof(CrouchedWalkSpeed))), - SendPropFloat(FIELD.OF(nameof(DuckSpeed))), - SendPropFloat(FIELD.OF(nameof(UnDuckSpeed))), - SendPropBool(FIELD.OF(nameof(DuckToggled))), - ]); - - [NetworkName("m_fSprintSpeed")] - public float SprintSpeed; - [NetworkName("m_fWalkSpeed")] - public float WalkSpeed; - [NetworkName("m_fSlowWalkSpeed")] - public float SlowWalkSpeed; - [NetworkName("m_fLadderSpeed")] - public float LadderSpeed; - [NetworkName("m_fCrouchedWalkSpeed")] - public float CrouchedWalkSpeed; - [NetworkName("m_fDuckSpeed")] - public float DuckSpeed; - [NetworkName("m_fUnDuckSpeed")] - public float UnDuckSpeed; - [NetworkName("m_bDuckToggled")] - public bool DuckToggled; + [NetworkTable("DT_Local")] + public static readonly NetworkProp[] Props = [ + new(nameof(AreaBits)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(AreaPortalBits)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(HideHUD)) { Encoding = NetEncoding.Int, Bits = (int)HideHudBits.BitCount, Flags = PropFlags.Unsigned }, + new(nameof(FOVRate)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Ducked)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(Ducking)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(InDuckJump)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(DuckTime)) { Encoding = NetEncoding.Float, Bits = 12, Flags = PropFlags.RoundDown | PropFlags.ChangesOften, Low = 0.0f, High = 2048.0f }, + new(nameof(DuckJumpTime)) { Encoding = NetEncoding.Float, Bits = 12, Flags = PropFlags.RoundDown, Low = 0.0f, High = 2048.0f }, + new(nameof(JumpTime)) { Encoding = NetEncoding.Float, Bits = 12, Flags = PropFlags.RoundDown, Low = 0.0f, High = 2048.0f }, + new(nameof(FallVelocity)) { Bits = 32, Flags = PropFlags.NoScale | PropFlags.ChangesOften, Low = -4096.0f, High = 4096.0f }, + new(nameof(PunchAngle)) { Encoding = NetEncoding.Vector, Bits = -1, Flags = PropFlags.NoScale | PropFlags.ChangesOften }, + new(nameof(PunchAngleVel)) { Encoding = NetEncoding.Vector, Bits = -1, Flags = PropFlags.NoScale }, + new(nameof(DrawViewmodel)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(WearingSuit)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + nameof(Poisoned), + new(nameof(StepSize)) { Bits = 16, Flags = PropFlags.RoundUp, Low = 0.0f, High = 512.0f }, + new(nameof(AllowAutoMovement)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(Skybox3D.Scale)) { Bits = 12 }, + new(nameof(Skybox3D.Origin)) { Bits = -1, Flags = PropFlags.Coord }, + new(nameof(Skybox3D.Area)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Skybox3D.Fog.Enable)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(Skybox3D.Fog.Blend)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(Skybox3D.Fog.Radial)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(Skybox3D.Fog.DirPrimary)) { Bits = -1, Flags = PropFlags.Coord }, + new(nameof(Skybox3D.Fog.ColorPrimary)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Skybox3D.Fog.ColorSecondary)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Skybox3D.Fog.ColorPrimaryHDR)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Skybox3D.Fog.ColorSecondaryHDR)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Skybox3D.Fog.Start)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Skybox3D.Fog.End)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Skybox3D.Fog.MaxDensity)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Skybox3D.Fog.HDRColorScale)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(PlayerFog.Ctrl), + new(nameof(Audio.LocalSound)) { Encoding = NetEncoding.Elements, Bits = -1, Flags = PropFlags.Coord }, + new(nameof(Audio.SoundscapeIndex)) { Bits = 17 }, + new(nameof(Audio.LocalBits)) { Bits = NUM_AUDIO_LOCAL_SOUNDS, Flags = PropFlags.Unsigned }, + nameof(Audio.Ent), + nameof(SprintSpeed), + nameof(WalkSpeed), + nameof(SlowWalkSpeed), + nameof(LadderSpeed), + nameof(CrouchedWalkSpeed), + nameof(DuckSpeed), + nameof(UnDuckSpeed), + nameof(DuckToggled), + ]; + + public BaseEntity? Outer; + public void NetworkStateChanged() => Outer?.NetworkStateChanged(); + public void NetworkStateChanged(IFieldAccessor field) => Outer?.NetworkStateChanged(); + + [NetworkVar("m_fSprintSpeed")] + public partial float SprintSpeed { get; set; } + [NetworkVar("m_fWalkSpeed")] + public partial float WalkSpeed { get; set; } + [NetworkVar("m_fSlowWalkSpeed")] + public partial float SlowWalkSpeed { get; set; } + [NetworkVar("m_fLadderSpeed")] + public partial float LadderSpeed { get; set; } + [NetworkVar("m_fCrouchedWalkSpeed")] + public partial float CrouchedWalkSpeed { get; set; } + [NetworkVar("m_fDuckSpeed")] + public partial float DuckSpeed { get; set; } + [NetworkVar("m_fUnDuckSpeed")] + public partial float UnDuckSpeed { get; set; } + [NetworkVar("m_bDuckToggled")] + public partial bool DuckToggled { get; set; } // TODO: NETWORK VARS!!!!! - [NetworkName("m_chAreaBits")] - public InlineArrayMaxAreaStateBytes AreaBits; - [NetworkName("m_chAreaPortalBits")] - public InlineArrayMaxAreaPortalStateBytes AreaPortalBits; - [NetworkName("m_iHideHUD")] - public bool HideHUD; - [NetworkName("m_flFOVRate")] - public float FOVRate; - [NetworkName("m_bDucked")] - public bool Ducked; - [NetworkName("m_bDucking")] - public bool Ducking; - [NetworkName("m_bInDuckJump")] - public bool InDuckJump; - [NetworkName("m_flDucktime")] - public double DuckTime; - [NetworkName("m_flDuckJumpTime")] - public double DuckJumpTime; - [NetworkName("m_flJumpTime")] - public double JumpTime; + [NetworkVar("m_chAreaBits")] + public partial ref readonly InlineArrayMaxAreaStateBytes AreaBits { get; } + [NetworkVar("m_chAreaPortalBits")] + public partial ref readonly InlineArrayMaxAreaPortalStateBytes AreaPortalBits { get; } + [NetworkVar("m_iHideHUD")] + public partial bool HideHUD { get; set; } + [NetworkVar("m_flFOVRate")] + public partial float FOVRate { get; set; } + [NetworkVar("m_bDucked")] + public partial bool Ducked { get; set; } + [NetworkVar("m_bDucking")] + public partial bool Ducking { get; set; } + [NetworkVar("m_bInDuckJump")] + public partial bool InDuckJump { get; set; } + [NetworkVar("m_flDucktime")] + public partial double DuckTime { get; set; } + [NetworkVar("m_flDuckJumpTime")] + public partial double DuckJumpTime { get; set; } + [NetworkVar("m_flJumpTime")] + public partial double JumpTime { get; set; } public int StepSide; - [NetworkName("m_flFallVelocity")] - public float FallVelocity; + [NetworkVar("m_flFallVelocity")] + public partial float FallVelocity { get; set; } public int OldButtons; public int OldForwardMove; - [NetworkName("m_vecPunchAngle")] - public QAngle PunchAngle; - [NetworkName("m_vecPunchAngleVel")] - public QAngle PunchAngleVel; - [NetworkName("m_bDrawViewmodel")] - public bool DrawViewmodel; - [NetworkName("m_bWearingSuit")] - public bool WearingSuit; - [NetworkName("m_bPoisoned")] - public bool Poisoned; - [NetworkName("m_flStepSize")] - public float StepSize; - [NetworkName("m_bAllowAutoMovement")] - public bool AllowAutoMovement; + [NetworkVar("m_vecPunchAngle")] + public partial QAngle PunchAngle { get; set; } + [NetworkVar("m_vecPunchAngleVel")] + public partial QAngle PunchAngleVel { get; set; } + [NetworkVar("m_bDrawViewmodel")] + public partial bool DrawViewmodel { get; set; } + [NetworkVar("m_bWearingSuit")] + public partial bool WearingSuit { get; set; } + [NetworkVar("m_bPoisoned")] + public partial bool Poisoned { get; set; } + [NetworkVar("m_flStepSize")] + public partial float StepSize { get; set; } + [NetworkVar("m_bAllowAutoMovement")] + public partial bool AllowAutoMovement { get; set; } public bool SlowMovement; - [NetworkName("m_skybox3d")] - public Sky3DParams Skybox3D = new(); - [NetworkName("m_PlayerFog")] - public FogPlayerParams PlayerFog = new(); - [NetworkName("m_audio")] - public AudioParams Audio = new(); + [NetworkVar("m_skybox3d")] + public partial ref readonly Sky3DParams Skybox3D { get; } + [NetworkVar("m_PlayerFog")] + public partial ref readonly FogPlayerParams PlayerFog { get; } + [NetworkVar("m_audio")] + public partial ref readonly AudioParams Audio { get; } public void UpdateAreaBits(BasePlayer pl, ReadOnlySpan areaPortalBits) { Vector3 origin = pl.EyePosition(); @@ -146,16 +138,16 @@ public void UpdateAreaBits(BasePlayer pl, ReadOnlySpan areaPortalBits) { int i; int area = engine.GetArea(origin); engine.GetAreaBits(area, tempBits); - Span areaBits = AreaBits; + ReadOnlySpan areaBits = AreaBits; for (i = 0; i < areaBits.Length; i++) { if (tempBits[i] != areaBits[i]) - areaBits[i] = tempBits[i]; + AreaBitsForModify()[i] = tempBits[i]; } - Span portalBits = AreaPortalBits; + ReadOnlySpan portalBits = AreaPortalBits; for (i = 0; i < Constants.MAX_AREA_PORTAL_STATE_BYTES; i++) { if (areaPortalBits[i] != portalBits[i]) - portalBits[i] = areaPortalBits[i]; + AreaPortalBitsForModify()[i] = areaPortalBits[i]; } } @@ -165,12 +157,13 @@ public static void ClientData_Update(BasePlayer pl) { SkyCamera? skyCamera = SkyCamera.GetCurrentSkyCamera(); if (skyCamera == null) { - pl.Local.Skybox3D.Area = 255; + if (pl.Local.Skybox3D.Area != 255) + pl.Local.Skybox3DForModify().Area = 255; pl.Local.OldSkyCamera = null; } else if (skyCamera != pl.Local.OldSkyCamera) { pl.Local.OldSkyCamera = skyCamera; - pl.Local.Skybox3D = skyCamera.SkyboxData; + pl.Local.Skybox3DForModify() = skyCamera.SkyboxData; } } @@ -194,5 +187,8 @@ public PlayerLocalData() { SlowWalkSpeed = 100.0f; LadderSpeed = 150.0f; CrouchedWalkSpeed = 0.3f; + Skybox3DForModify() = new(); + PlayerFogForModify() = new(); + AudioForModify() = new(); } } diff --git a/Game.Server/PlayerResource.cs b/Game.Server/PlayerResource.cs index 2413dd00..ac5b0f5c 100644 --- a/Game.Server/PlayerResource.cs +++ b/Game.Server/PlayerResource.cs @@ -8,46 +8,55 @@ namespace Game.Server; using Source.Common; using Source.Common.Engine; -using FIELD = Source.FIELD; - public static class PlayerResourceGlobals { public static PlayerResource? g_pPlayerResource; } [LinkEntityToClass("player_manager")] -[NetworkName("CPlayerResource")] -public class PlayerResource : BaseEntity +[NetworkName("CPlayerResource", NoBase = true)] +public partial class PlayerResource : BaseEntity { + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Ping)) { Bits = 12, Flags = PropFlags.Unsigned }, + new(nameof(Score)) { Bits = 32 }, + new(nameof(Deaths)) { Bits = 32 }, + new(nameof(Connected)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(Team)) { Bits = 16 }, + new(nameof(Alive)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(Health)) { Bits = 32, Flags = PropFlags.VarInt | PropFlags.Unsigned | PropFlags.Normal }, + new(nameof(Armor)) { Bits = 32, Flags = PropFlags.Unsigned }, + ]; + - public static readonly SendTable DT_PlayerResource = new([ - SendPropArray3(FIELD.OF_ARRAY(nameof(Ping)), SendPropInt(FIELD.OF_ARRAYINDEX(nameof(Ping), 0), 12, PropFlags.Unsigned ) ), - SendPropArray3(FIELD.OF_ARRAY(nameof(Score)), SendPropInt(FIELD.OF_ARRAYINDEX(nameof(Score), 0), 32 ) ), - SendPropArray3(FIELD.OF_ARRAY(nameof(Deaths)), SendPropInt(FIELD.OF_ARRAYINDEX(nameof(Deaths), 0), 32 ) ), - SendPropArray3(FIELD.OF_ARRAY(nameof(Connected)), SendPropInt(FIELD.OF_ARRAYINDEX(nameof(Connected), 0), 1, PropFlags.Unsigned ) ), - SendPropArray3(FIELD.OF_ARRAY(nameof(Team)), SendPropInt(FIELD.OF_ARRAYINDEX(nameof(Team), 0), 16 ) ), - SendPropArray3(FIELD.OF_ARRAY(nameof(Alive)), SendPropInt(FIELD.OF_ARRAYINDEX(nameof(Alive), 0), 1, PropFlags.Unsigned ) ), - SendPropArray3(FIELD.OF_ARRAY(nameof(Health)), SendPropInt(FIELD.OF_ARRAYINDEX(nameof(Health), 0), 32, PropFlags.VarInt | PropFlags.Unsigned | PropFlags.Normal ) ), - SendPropArray3(FIELD.OF_ARRAY(nameof(Armor)), SendPropInt(FIELD.OF_ARRAYINDEX(nameof(Health), 0), 32, PropFlags.Unsigned) ), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PlayerResource); + [NetworkVar("m_iPing")] + partial ref readonly InlineArrayMaxPlayersPlusOne Ping { get; } + [NetworkVar("m_iScore")] + partial ref readonly InlineArrayMaxPlayersPlusOne Score { get; } + [NetworkVar("m_iDeaths")] + partial ref readonly InlineArrayMaxPlayersPlusOne Deaths { get; } + [NetworkVar("m_bConnected")] + partial ref readonly InlineArrayMaxPlayersPlusOne Connected { get; } + [NetworkVar("m_iTeam")] + partial ref readonly InlineArrayMaxPlayersPlusOne Team { get; } + [NetworkVar("m_bAlive")] + partial ref readonly InlineArrayMaxPlayersPlusOne Alive { get; } + [NetworkVar("m_iHealth")] + new partial ref readonly InlineArrayMaxPlayersPlusOne Health { get; } + [NetworkVar("m_iArmor")] + partial ref readonly InlineArrayMaxPlayersPlusOne Armor { get; } - [NetworkName("m_iPing")] - InlineArrayMaxPlayersPlusOne Ping = new(); - [NetworkName("m_iScore")] - InlineArrayMaxPlayersPlusOne Score = new(); - [NetworkName("m_iDeaths")] - InlineArrayMaxPlayersPlusOne Deaths = new(); - [NetworkName("m_bConnected")] - InlineArrayMaxPlayersPlusOne Connected = new(); - [NetworkName("m_iTeam")] - InlineArrayMaxPlayersPlusOne Team = new(); - [NetworkName("m_bAlive")] - InlineArrayMaxPlayersPlusOne Alive = new(); - [NetworkName("m_iHealth")] - new InlineArrayMaxPlayersPlusOne Health = new(); - [NetworkName("m_iArmor")] - InlineArrayMaxPlayersPlusOne Armor = new(); + public PlayerResource() { + PingForModify() = new(); + ScoreForModify() = new(); + DeathsForModify() = new(); + ConnectedForModify() = new(); + TeamForModify() = new(); + AliveForModify() = new(); + HealthForModify() = new(); + ArmorForModify() = new(); + } public override void Spawn() { SetThink(ResourceThink); @@ -72,13 +81,13 @@ void UpdatePlayerData() { } void UpdateConnectedPlayer(int index, BasePlayer player) { - Score[index] = player.FragCount(); - Deaths[index] = player.DeathCount(); - Connected[index] = true; - Team[index] = player.GetTeamNumber(); - Alive[index] = player.IsAlive(); - Health[index] = Math.Max(0, player.GetHealth()); + ScoreForModify()[index] = player.FragCount(); + DeathsForModify()[index] = player.DeathCount(); + ConnectedForModify()[index] = true; + TeamForModify()[index] = player.GetTeamNumber(); + AliveForModify()[index] = player.IsAlive(); + HealthForModify()[index] = Math.Max(0, player.GetHealth()); } - void UpdateDisconnectedPlayer(int index) => Connected[index] = false; + void UpdateDisconnectedPlayer(int index) => ConnectedForModify()[index] = false; } diff --git a/Game.Server/PointCamera.cs b/Game.Server/PointCamera.cs index 4c7677ca..6c319092 100644 --- a/Game.Server/PointCamera.cs +++ b/Game.Server/PointCamera.cs @@ -3,49 +3,48 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("point_camera")] [NetworkName("CPointCamera")] -public class PointCamera : BaseEntity +public partial class PointCamera : BaseEntity { - public static readonly SendTable DT_PointCamera = new(DT_BaseEntity, [ - SendPropFloat(FIELD.OF(nameof(FOV)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(Resolution)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(FogEnable))), - SendPropInt(FIELD.OF(nameof(FogColor)), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(FogColorHDR)), 32, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(FogStart)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FogEnd)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FogMaxDensity)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(FogRadial))), - SendPropBool(FIELD.OF(nameof(Active))), - SendPropBool(FIELD.OF(nameof(UseScreenAspectRatio))), - SendPropBool(FIELD.OF(nameof(GlobalOverride))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PointCamera); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(FOV)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Resolution)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(FogEnable), + new(nameof(FogColor)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(FogColorHDR)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(FogStart)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FogEnd)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FogMaxDensity)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(FogRadial), + nameof(Active), + nameof(UseScreenAspectRatio), + nameof(GlobalOverride), + ]; - [NetworkName("m_FOV")] - public float FOV; - [NetworkName("m_Resolution")] - public float Resolution; - [NetworkName("m_bFogEnable")] - public bool FogEnable; - [NetworkName("m_FogColor")] - public int FogColor; - [NetworkName("m_FogColorHDR")] - public int FogColorHDR; - [NetworkName("m_flFogStart")] - public float FogStart; - [NetworkName("m_flFogEnd")] - public float FogEnd; - [NetworkName("m_flFogMaxDensity")] - public float FogMaxDensity; - [NetworkName("m_bFogRadial")] - public bool FogRadial; - [NetworkName("m_bActive")] - public bool Active; - [NetworkName("m_bUseScreenAspectRatio")] - public bool UseScreenAspectRatio; - [NetworkName("m_bGlobalOverride")] - public bool GlobalOverride; + [NetworkVar("m_FOV")] + public partial float FOV { get; set; } + [NetworkVar("m_Resolution")] + public partial float Resolution { get; set; } + [NetworkVar("m_bFogEnable")] + public partial bool FogEnable { get; set; } + [NetworkVar("m_FogColor")] + public partial int FogColor { get; set; } + [NetworkVar("m_FogColorHDR")] + public partial int FogColorHDR { get; set; } + [NetworkVar("m_flFogStart")] + public partial float FogStart { get; set; } + [NetworkVar("m_flFogEnd")] + public partial float FogEnd { get; set; } + [NetworkVar("m_flFogMaxDensity")] + public partial float FogMaxDensity { get; set; } + [NetworkVar("m_bFogRadial")] + public partial bool FogRadial { get; set; } + [NetworkVar("m_bActive")] + public partial bool Active { get; set; } + [NetworkVar("m_bUseScreenAspectRatio")] + public partial bool UseScreenAspectRatio { get; set; } + [NetworkVar("m_bGlobalOverride")] + public partial bool GlobalOverride { get; set; } } diff --git a/Game.Server/PointWorldText.cs b/Game.Server/PointWorldText.cs index a7d7ee17..5d787ebf 100644 --- a/Game.Server/PointWorldText.cs +++ b/Game.Server/PointWorldText.cs @@ -3,37 +3,36 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("point_worldtext")] [NetworkName("CPointWorldText")] -public class PointWorldText : BaseEntity +public partial class PointWorldText : BaseEntity { - public static readonly SendTable DT_PointWorldText = new(DT_BaseEntity, [ - SendPropString(FIELD.OF(nameof(SzText))), - SendPropInt(FIELD.OF(nameof(ColTextColor)), 32, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(TextSize)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(TextSpacingX)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(TextSpacingY)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(Orientation)), 3, PropFlags.Unsigned), - SendPropBool(FIELD.OF(nameof(Rainbow))), - SendPropBool(FIELD.OF(nameof(TextEnabled))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PointWorldText); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SzText)) { Encoding = NetEncoding.String }, + new(nameof(ColTextColor)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(TextSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(TextSpacingX)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(TextSpacingY)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Orientation)) { Bits = 3, Flags = PropFlags.Unsigned }, + nameof(Rainbow), + nameof(TextEnabled), + ]; - [NetworkName("m_szText")] - public InlineArray512 SzText; - [NetworkName("m_colTextColor")] - public int ColTextColor; - [NetworkName("m_flTextSize")] - public float TextSize; - [NetworkName("m_flTextSpacingX")] - public float TextSpacingX; - [NetworkName("m_flTextSpacingY")] - public float TextSpacingY; - [NetworkName("m_nOrientation")] - public int Orientation; - [NetworkName("m_bRainbow")] - public bool Rainbow; - [NetworkName("m_bTextEnabled")] - public bool TextEnabled; + [NetworkVar("m_szText")] + public partial ref readonly InlineArray512 SzText { get; } + [NetworkVar("m_colTextColor")] + public partial int ColTextColor { get; set; } + [NetworkVar("m_flTextSize")] + public partial float TextSize { get; set; } + [NetworkVar("m_flTextSpacingX")] + public partial float TextSpacingX { get; set; } + [NetworkVar("m_flTextSpacingY")] + public partial float TextSpacingY { get; set; } + [NetworkVar("m_nOrientation")] + public partial int Orientation { get; set; } + [NetworkVar("m_bRainbow")] + public partial bool Rainbow { get; set; } + [NetworkVar("m_bTextEnabled")] + public partial bool TextEnabled { get; set; } } diff --git a/Game.Server/PoseController.cs b/Game.Server/PoseController.cs index d3dedd87..585b42e7 100644 --- a/Game.Server/PoseController.cs +++ b/Game.Server/PoseController.cs @@ -3,47 +3,46 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("point_posecontroller")] [NetworkName("CPoseController")] -public class PoseController : BaseEntity +public partial class PoseController : BaseEntity { - public static readonly SendTable DT_PoseController = new(DT_BaseEntity, [ - SendPropArray3(FIELD.OF_ARRAY(nameof(HProps)), SendPropEHandle(FIELD.OF_ARRAYINDEX(nameof(HProps), 0))), - SendPropArray3(FIELD.OF_ARRAY(nameof(ChPoseIndex)), SendPropInt(FIELD.OF_ARRAYINDEX(nameof(ChPoseIndex), 0), 5, PropFlags.Unsigned)), - SendPropBool(FIELD.OF(nameof(PoseValueParity))), - SendPropFloat(FIELD.OF(nameof(PoseValue)), 11, 0, 0.0f, 1.0f), - SendPropFloat(FIELD.OF(nameof(InterpolationTime)), 11, 0, 0.0f, 10.0f), - SendPropBool(FIELD.OF(nameof(InterpolationWrap))), - SendPropFloat(FIELD.OF(nameof(CycleFrequency)), 11, 0, -10.0f, 10.0f), - SendPropInt(FIELD.OF(nameof(FModType)), 3, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(FModTimeOffset)), 11, 0, -1.0f, 1.0f), - SendPropFloat(FIELD.OF(nameof(FModRate)), 11, 0, -10.0f, 10.0f), - SendPropFloat(FIELD.OF(nameof(FModAmplitude)), 11, 0, 0.0f, 10.0f), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PoseController); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(HProps), + new(nameof(ChPoseIndex)) { Bits = 5, Flags = PropFlags.Unsigned }, + nameof(PoseValueParity), + new(nameof(PoseValue)) { Bits = 11, Low = 0.0f, High = 1.0f }, + new(nameof(InterpolationTime)) { Bits = 11, Low = 0.0f, High = 10.0f }, + nameof(InterpolationWrap), + new(nameof(CycleFrequency)) { Bits = 11, Low = -10.0f, High = 10.0f }, + new(nameof(FModType)) { Bits = 3, Flags = PropFlags.Unsigned }, + new(nameof(FModTimeOffset)) { Bits = 11, Low = -1.0f, High = 1.0f }, + new(nameof(FModRate)) { Bits = 11, Low = -10.0f, High = 10.0f }, + new(nameof(FModAmplitude)) { Bits = 11, Low = 0.0f, High = 10.0f }, + ]; public const int MAX_POSE_CONTROLLED_PROPS = 4; - [NetworkName("m_hProps")] - public InlineArray4 HProps; - [NetworkName("m_chPoseIndex")] - public InlineArray4 ChPoseIndex; - [NetworkName("m_bPoseValueParity")] - public bool PoseValueParity; - [NetworkName("m_fPoseValue")] - public float PoseValue; - [NetworkName("m_fInterpolationTime")] - public float InterpolationTime; - [NetworkName("m_bInterpolationWrap")] - public bool InterpolationWrap; - [NetworkName("m_fCycleFrequency")] - public float CycleFrequency; - [NetworkName("m_nFModType")] - public int FModType; - [NetworkName("m_fFModTimeOffset")] - public float FModTimeOffset; - [NetworkName("m_fFModRate")] - public float FModRate; - [NetworkName("m_fFModAmplitude")] - public float FModAmplitude; + [NetworkVar("m_hProps")] + public partial ref readonly InlineArray4 HProps { get; } + [NetworkVar("m_chPoseIndex")] + public partial ref readonly InlineArray4 ChPoseIndex { get; } + [NetworkVar("m_bPoseValueParity")] + public partial bool PoseValueParity { get; set; } + [NetworkVar("m_fPoseValue")] + public partial float PoseValue { get; set; } + [NetworkVar("m_fInterpolationTime")] + public partial float InterpolationTime { get; set; } + [NetworkVar("m_bInterpolationWrap")] + public partial bool InterpolationWrap { get; set; } + [NetworkVar("m_fCycleFrequency")] + public partial float CycleFrequency { get; set; } + [NetworkVar("m_nFModType")] + public partial int FModType { get; set; } + [NetworkVar("m_fFModTimeOffset")] + public partial float FModTimeOffset { get; set; } + [NetworkVar("m_fFModRate")] + public partial float FModRate { get; set; } + [NetworkVar("m_fFModAmplitude")] + public partial float FModAmplitude { get; set; } } diff --git a/Game.Server/Precipitation.cs b/Game.Server/Precipitation.cs index fca9cbc1..911932c5 100644 --- a/Game.Server/Precipitation.cs +++ b/Game.Server/Precipitation.cs @@ -3,28 +3,27 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("func_precipitation")] [NetworkName("CPrecipitation")] -public class Precipitation : BaseEntity +public partial class Precipitation : BaseEntity { - public static readonly SendTable DT_Precipitation = new(DT_BaseEntity, [ - SendPropInt(FIELD.OF(nameof(PrecipType)), 4, PropFlags.Unsigned), - SendPropString(FIELD.OF(nameof(ParticleNameClose))), - SendPropString(FIELD.OF(nameof(ParticleNameInner))), - SendPropString(FIELD.OF(nameof(ParticleNameOuter))), - SendPropFloat(FIELD.OF(nameof(ParticleDist)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_Precipitation); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(PrecipType)) { Bits = 4, Flags = PropFlags.Unsigned }, + new(nameof(ParticleNameClose)) { Encoding = NetEncoding.String }, + new(nameof(ParticleNameInner)) { Encoding = NetEncoding.String }, + new(nameof(ParticleNameOuter)) { Encoding = NetEncoding.String }, + new(nameof(ParticleDist)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_nPrecipType")] - public int PrecipType; - [NetworkName("m_sParticleNameClose")] - public InlineArray512 ParticleNameClose; - [NetworkName("m_sParticleNameInner")] - public InlineArray512 ParticleNameInner; - [NetworkName("m_sParticleNameOuter")] - public InlineArray512 ParticleNameOuter; - [NetworkName("m_flParticleDist")] - public float ParticleDist; + [NetworkVar("m_nPrecipType")] + public partial int PrecipType { get; set; } + [NetworkVar("m_sParticleNameClose")] + public partial ref readonly InlineArray512 ParticleNameClose { get; } + [NetworkVar("m_sParticleNameInner")] + public partial ref readonly InlineArray512 ParticleNameInner { get; } + [NetworkVar("m_sParticleNameOuter")] + public partial ref readonly InlineArray512 ParticleNameOuter { get; } + [NetworkVar("m_flParticleDist")] + public partial float ParticleDist { get; set; } } diff --git a/Game.Server/PrecipitationBlocker.cs b/Game.Server/PrecipitationBlocker.cs index 61b4fdf1..d920d06a 100644 --- a/Game.Server/PrecipitationBlocker.cs +++ b/Game.Server/PrecipitationBlocker.cs @@ -4,11 +4,12 @@ using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("func_precipitation_blocker")] [NetworkName("CPrecipitationBlocker")] -public class PrecipitationBlocker : BaseEntity +public partial class PrecipitationBlocker : BaseEntity { - public static readonly SendTable DT_PrecipitationBlocker = new(DT_BaseEntity, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PrecipitationBlocker); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Server/PropCrane.cs b/Game.Server/PropCrane.cs index 5e046530..638b473a 100644 --- a/Game.Server/PropCrane.cs +++ b/Game.Server/PropCrane.cs @@ -3,30 +3,34 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("prop_vehicle_crane")] [NetworkName("CPropCrane")] -public class PropCrane : BaseAnimating +public partial class PropCrane : BaseAnimating { - public static readonly SendTable DT_PropCrane = new(DT_BaseAnimating, [ - SendPropEHandle(FIELD.OF(nameof(Player))), - SendPropBool(FIELD.OF(nameof(MagnetOn))), - SendPropBool(FIELD.OF(nameof(EnterAnimOn))), - SendPropBool(FIELD.OF(nameof(ExitAnimOn))), - SendPropVector(FIELD.OF(nameof(EyeExitEndpoint)), 0, PropFlags.Coord), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PropCrane); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Player), + nameof(MagnetOn), + nameof(EnterAnimOn), + nameof(ExitAnimOn), + new(nameof(EyeExitEndpoint)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_hPlayer")] - public EHANDLE Player = new(); - [NetworkName("m_bMagnetOn")] - public bool MagnetOn; - [NetworkName("m_bEnterAnimOn")] - public bool EnterAnimOn; - [NetworkName("m_bExitAnimOn")] - public bool ExitAnimOn; - [NetworkName("m_vecEyeExitEndpoint")] - public Vector3 EyeExitEndpoint; + public PropCrane() { + Player = new(); + } + + + [NetworkVar("m_hPlayer")] + public partial EHANDLE Player { get; set; } + [NetworkVar("m_bMagnetOn")] + public partial bool MagnetOn { get; set; } + [NetworkVar("m_bEnterAnimOn")] + public partial bool EnterAnimOn { get; set; } + [NetworkVar("m_bExitAnimOn")] + public partial bool ExitAnimOn { get; set; } + [NetworkVar("m_vecEyeExitEndpoint")] + public partial Vector3 EyeExitEndpoint { get; set; } public override bool IsVehicle() => true; } diff --git a/Game.Server/PropEnergyBall.cs b/Game.Server/PropEnergyBall.cs index d728df1c..f32b1a44 100644 --- a/Game.Server/PropEnergyBall.cs +++ b/Game.Server/PropEnergyBall.cs @@ -4,19 +4,18 @@ using System.Numerics; using Game.Server.HL2; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("prop_energy_ball")] [NetworkName("CPropEnergyBall")] -public class PropEnergyBall : PropCombineBall +public partial class PropEnergyBall : PropCombineBall { - public static readonly SendTable DT_PropEnergyBall = new(DT_PropCombineBall, [ - SendPropBool(FIELD.OF(nameof(IsInfiniteLife))), - SendPropFloat(FIELD.OF(nameof(TimeTillDeath)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PropEnergyBall); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(IsInfiniteLife), + new(nameof(TimeTillDeath)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_bIsInfiniteLife")] - public bool IsInfiniteLife; - [NetworkName("m_fTimeTillDeath")] - public float TimeTillDeath; + [NetworkVar("m_bIsInfiniteLife")] + public partial bool IsInfiniteLife { get; set; } + [NetworkVar("m_fTimeTillDeath")] + public partial float TimeTillDeath { get; set; } } diff --git a/Game.Server/PropJeep.cs b/Game.Server/PropJeep.cs index d35cfd52..4032fc7e 100644 --- a/Game.Server/PropJeep.cs +++ b/Game.Server/PropJeep.cs @@ -6,42 +6,36 @@ using System.Numerics; namespace Game.Server; -using FIELD_PJ = Source.FIELD; -using FIELD_PJE = Source.FIELD; [NetworkName("CPropJeep")] -public class PropJeep : PropVehicleDriveable +public partial class PropJeep : PropVehicleDriveable { - public static readonly SendTable DT_PropJeep = new(DT_PropVehicleDriveable, [ - SendPropBool(FIELD_PJ.OF(nameof(HeadlightIsOn))) - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PropJeep); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(HeadlightIsOn), + ]; - [NetworkName("m_bHeadlightIsOn")] - public bool HeadlightIsOn; + [NetworkVar("m_bHeadlightIsOn")] + public partial bool HeadlightIsOn { get; set; } public override bool IsJeep() => true; } [LinkEntityToClass("prop_vehicle_jeep")] [LinkEntityToClass("prop_vehicle_jeep_old")] -[NetworkName("CPropJeepEpisodic")] -public class PropJeepEpisodic : PropJeep +[NetworkName("CPropJeepEpisodic", Table = "DT_CPropJeepEpisodic")] +public partial class PropJeepEpisodic : PropJeep { - public static readonly SendTable DT_CPropJeepEpisodic = new(DT_PropJeep, [ - SendPropInt(FIELD_PJE.OF(nameof(NumRadarContacts)), 8), - - SendPropVector(FIELD_PJE.OF_SENDINFO_ARRAY(nameof(RadarContactPos)), 0, PropFlags.Coord), - SendPropArray2(null!, 24, "m_vecRadarContactPos"), - - SendPropInt(FIELD_PJE.OF_SENDINFO_ARRAY(nameof(RadarContactType)), 4), - SendPropArray2(null!, 24, "m_iRadarContactType"), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_CPropJeepEpisodic); - - [NetworkName("m_iNumRadarContacts")] - public int NumRadarContacts; - [NetworkName("m_vecRadarContactPos")] - public InlineArray24 RadarContactPos; - [NetworkName("m_iRadarContactType")] - public InlineArray24 RadarContactType; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(NumRadarContacts)) { Bits = 8 }, + new(nameof(RadarContactPos)) { Encoding = NetEncoding.Array2, Bits = 0, Flags = PropFlags.Coord }, + new(nameof(RadarContactType)) { Encoding = NetEncoding.Array2, Bits = 4 }, + ]; + + [NetworkVar("m_iNumRadarContacts")] + public partial int NumRadarContacts { get; set; } + [NetworkVar("m_vecRadarContactPos")] + public partial ref readonly InlineArray24 RadarContactPos { get; } + [NetworkVar("m_iRadarContactType")] + public partial ref readonly InlineArray24 RadarContactType { get; } } diff --git a/Game.Server/PropScalable.cs b/Game.Server/PropScalable.cs index 9c363028..ecdb30be 100644 --- a/Game.Server/PropScalable.cs +++ b/Game.Server/PropScalable.cs @@ -3,41 +3,40 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("prop_coreball")] [LinkEntityToClass("prop_scalable")] [NetworkName("CPropScalable")] -public class PropScalable : BaseAnimating +public partial class PropScalable : BaseAnimating { - public static readonly SendTable DT_PropScalable = new(DT_BaseAnimating, [ - SendPropFloat(FIELD.OF(nameof(ScaleX)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(ScaleY)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(ScaleZ)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(LerpTimeX)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(LerpTimeY)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(LerpTimeZ)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(GoalTimeX)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(GoalTimeY)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(GoalTimeZ)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PropScalable); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ScaleX)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ScaleY)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ScaleZ)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(LerpTimeX)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(LerpTimeY)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(LerpTimeZ)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(GoalTimeX)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(GoalTimeY)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(GoalTimeZ)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flScaleX")] - public float ScaleX; - [NetworkName("m_flScaleY")] - public float ScaleY; - [NetworkName("m_flScaleZ")] - public float ScaleZ; - [NetworkName("m_flLerpTimeX")] - public float LerpTimeX; - [NetworkName("m_flLerpTimeY")] - public float LerpTimeY; - [NetworkName("m_flLerpTimeZ")] - public float LerpTimeZ; - [NetworkName("m_flGoalTimeX")] - public float GoalTimeX; - [NetworkName("m_flGoalTimeY")] - public float GoalTimeY; - [NetworkName("m_flGoalTimeZ")] - public float GoalTimeZ; + [NetworkVar("m_flScaleX")] + public partial float ScaleX { get; set; } + [NetworkVar("m_flScaleY")] + public partial float ScaleY { get; set; } + [NetworkVar("m_flScaleZ")] + public partial float ScaleZ { get; set; } + [NetworkVar("m_flLerpTimeX")] + public partial float LerpTimeX { get; set; } + [NetworkVar("m_flLerpTimeY")] + public partial float LerpTimeY { get; set; } + [NetworkVar("m_flLerpTimeZ")] + public partial float LerpTimeZ { get; set; } + [NetworkVar("m_flGoalTimeX")] + public partial float GoalTimeX { get; set; } + [NetworkVar("m_flGoalTimeY")] + public partial float GoalTimeY { get; set; } + [NetworkVar("m_flGoalTimeZ")] + public partial float GoalTimeZ { get; set; } } diff --git a/Game.Server/PropVehicleChoreoGeneric.cs b/Game.Server/PropVehicleChoreoGeneric.cs index 6dc10836..09c43f78 100644 --- a/Game.Server/PropVehicleChoreoGeneric.cs +++ b/Game.Server/PropVehicleChoreoGeneric.cs @@ -5,59 +5,59 @@ namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("prop_vehicle_choreo_generic")] [NetworkName("CPropVehicleChoreoGeneric")] -public class PropVehicleChoreoGeneric : DynamicProp +public partial class PropVehicleChoreoGeneric : DynamicProp { - [NetworkName("m_hPlayer")] - public EHANDLE Player; - [NetworkName("m_bEnterAnimOn")] - public bool EnterAnimOn; - [NetworkName("m_bExitAnimOn")] - public bool ExitAnimOn; - [NetworkName("m_bForceEyesToAttachment")] - public bool ForceEyesToAttachment; - [NetworkName("m_vecEyeExitEndpoint")] - public Vector3 EyeExitEndpoint; - [NetworkName("m_vehicleView.bClampEyeAngles")] - public bool VehicleViewClampEyeAngles; - [NetworkName("m_vehicleView.flPitchCurveZero")] - public float VehicleViewPitchCurveZero; - [NetworkName("m_vehicleView.flPitchCurveLinear")] - public float VehicleViewPitchCurveLinear; - [NetworkName("m_vehicleView.flRollCurveZero")] - public float VehicleViewRollCurveZero; - [NetworkName("m_vehicleView.flRollCurveLinear")] - public float VehicleViewRollCurveLinear; - [NetworkName("m_vehicleView.flFOV")] - public float VehicleViewFOV; - [NetworkName("m_vehicleView.flYawMin")] - public float VehicleViewYawMin; - [NetworkName("m_vehicleView.flYawMax")] - public float VehicleViewYawMax; - [NetworkName("m_vehicleView.flPitchMin")] - public float VehicleViewPitchMin; - [NetworkName("m_vehicleView.flPitchMax")] - public float VehicleViewPitchMax; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Player), + nameof(EnterAnimOn), + nameof(ExitAnimOn), + nameof(ForceEyesToAttachment), + new(nameof(EyeExitEndpoint)) { Bits = 0, Flags = PropFlags.Coord }, + nameof(VehicleViewClampEyeAngles), + new(nameof(VehicleViewPitchCurveZero)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VehicleViewPitchCurveLinear)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VehicleViewRollCurveZero)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VehicleViewRollCurveLinear)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VehicleViewFOV)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VehicleViewYawMin)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VehicleViewYawMax)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VehicleViewPitchMin)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(VehicleViewPitchMax)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; + + [NetworkVar("m_hPlayer")] + public partial EHANDLE Player { get; set; } + [NetworkVar("m_bEnterAnimOn")] + public partial bool EnterAnimOn { get; set; } + [NetworkVar("m_bExitAnimOn")] + public partial bool ExitAnimOn { get; set; } + [NetworkVar("m_bForceEyesToAttachment")] + public partial bool ForceEyesToAttachment { get; set; } + [NetworkVar("m_vecEyeExitEndpoint")] + public partial Vector3 EyeExitEndpoint { get; set; } + [NetworkVar("m_vehicleView.bClampEyeAngles")] + public partial bool VehicleViewClampEyeAngles { get; set; } + [NetworkVar("m_vehicleView.flPitchCurveZero")] + public partial float VehicleViewPitchCurveZero { get; set; } + [NetworkVar("m_vehicleView.flPitchCurveLinear")] + public partial float VehicleViewPitchCurveLinear { get; set; } + [NetworkVar("m_vehicleView.flRollCurveZero")] + public partial float VehicleViewRollCurveZero { get; set; } + [NetworkVar("m_vehicleView.flRollCurveLinear")] + public partial float VehicleViewRollCurveLinear { get; set; } + [NetworkVar("m_vehicleView.flFOV")] + public partial float VehicleViewFOV { get; set; } + [NetworkVar("m_vehicleView.flYawMin")] + public partial float VehicleViewYawMin { get; set; } + [NetworkVar("m_vehicleView.flYawMax")] + public partial float VehicleViewYawMax { get; set; } + [NetworkVar("m_vehicleView.flPitchMin")] + public partial float VehicleViewPitchMin { get; set; } + [NetworkVar("m_vehicleView.flPitchMax")] + public partial float VehicleViewPitchMax { get; set; } - public static readonly SendTable DT_PropVehicleChoreoGeneric = new(DT_DynamicProp, [ - SendPropEHandle(FIELD.OF(nameof(Player))), - SendPropBool(FIELD.OF(nameof(EnterAnimOn))), - SendPropBool(FIELD.OF(nameof(ExitAnimOn))), - SendPropBool(FIELD.OF(nameof(ForceEyesToAttachment))), - SendPropVector(FIELD.OF(nameof(EyeExitEndpoint)), 0, PropFlags.Coord), - SendPropBool(FIELD.OF(nameof(VehicleViewClampEyeAngles))), - SendPropFloat(FIELD.OF(nameof(VehicleViewPitchCurveZero)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(VehicleViewPitchCurveLinear)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(VehicleViewRollCurveZero)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(VehicleViewRollCurveLinear)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(VehicleViewFOV)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(VehicleViewYawMin)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(VehicleViewYawMax)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(VehicleViewPitchMin)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(VehicleViewPitchMax)), 0, PropFlags.NoScale), - ]); - public static new readonly ServerClass ServerClass = new ServerClass(DT_PropVehicleChoreoGeneric); } diff --git a/Game.Server/PropVehicleDriveable.cs b/Game.Server/PropVehicleDriveable.cs index fa9216ee..e474329e 100644 --- a/Game.Server/PropVehicleDriveable.cs +++ b/Game.Server/PropVehicleDriveable.cs @@ -5,57 +5,61 @@ using System.Numerics; namespace Game.Server; -using FIELD = Source.FIELD; [LinkEntityToClass("prop_vehicle_driveable")] [NetworkName("CPropVehicleDriveable")] -public class PropVehicleDriveable : BaseAnimating +public partial class PropVehicleDriveable : BaseAnimating { - public static readonly SendTable DT_PropVehicleDriveable = new(DT_BaseAnimating, [ - SendPropEHandle(FIELD.OF(nameof(Player))), - SendPropInt(FIELD.OF(nameof(Speed)), 8), - SendPropInt(FIELD.OF(nameof(RPM)), 13), - SendPropFloat(FIELD.OF(nameof(Throttle)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(BoostTimeLeft)), 8), - SendPropBool(FIELD.OF(nameof(HasBoost))), - SendPropBool(FIELD.OF(nameof(EnterAnimOn))), - SendPropBool(FIELD.OF(nameof(ExitAnimOn))), - SendPropBool(FIELD.OF(nameof(UnableToFire))), - SendPropVector(FIELD.OF(nameof(EyeExitEndpoint)), 0, PropFlags.Coord), - SendPropBool(FIELD.OF(nameof(HasGun))), - SendPropVector(FIELD.OF(nameof(GunCrosshair)), 0, PropFlags.Coord), - SendPropBool(FIELD.OF(nameof(Locked))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PropVehicleDriveable); - - [NetworkName("m_hPlayer")] - public EHANDLE Player = new(); - [NetworkName("m_nSpeed")] - public new int Speed; - [NetworkName("m_nRPM")] - public int RPM; - [NetworkName("m_flThrottle")] - public float Throttle; - [NetworkName("m_nBoostTimeLeft")] - public int BoostTimeLeft; - [NetworkName("m_nHasBoost")] - public bool HasBoost; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Player), + new(nameof(Speed)) { Bits = 8 }, + new(nameof(RPM)) { Bits = 13 }, + new(nameof(Throttle)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(BoostTimeLeft)) { Bits = 8 }, + nameof(HasBoost), + nameof(EnterAnimOn), + nameof(ExitAnimOn), + nameof(UnableToFire), + new(nameof(EyeExitEndpoint)) { Bits = 0, Flags = PropFlags.Coord }, + nameof(HasGun), + new(nameof(GunCrosshair)) { Bits = 0, Flags = PropFlags.Coord }, + nameof(Locked), + ]; + + public PropVehicleDriveable() { + Player = new(); + } + + + [NetworkVar("m_hPlayer")] + public partial EHANDLE Player { get; set; } + [NetworkVar("m_nSpeed")] + public new partial int Speed { get; set; } + [NetworkVar("m_nRPM")] + public partial int RPM { get; set; } + [NetworkVar("m_flThrottle")] + public partial float Throttle { get; set; } + [NetworkVar("m_nBoostTimeLeft")] + public partial int BoostTimeLeft { get; set; } + [NetworkVar("m_nHasBoost")] + public partial bool HasBoost { get; set; } public bool ScannerDisabledWeapons; public bool ScannerDisabledVehicle; - [NetworkName("m_bEnterAnimOn")] - public bool EnterAnimOn; - [NetworkName("m_bExitAnimOn")] - public bool ExitAnimOn; - [NetworkName("m_bUnableToFire")] - public bool UnableToFire; - [NetworkName("m_vecEyeExitEndpoint")] - public Vector3 EyeExitEndpoint; - [NetworkName("m_bHasGun")] - public bool HasGun; - [NetworkName("m_vecGunCrosshair")] - public Vector3 GunCrosshair; - [NetworkName("m_bLocked")] - public bool Locked; + [NetworkVar("m_bEnterAnimOn")] + public partial bool EnterAnimOn { get; set; } + [NetworkVar("m_bExitAnimOn")] + public partial bool ExitAnimOn { get; set; } + [NetworkVar("m_bUnableToFire")] + public partial bool UnableToFire { get; set; } + [NetworkVar("m_vecEyeExitEndpoint")] + public partial Vector3 EyeExitEndpoint { get; set; } + [NetworkVar("m_bHasGun")] + public partial bool HasGun { get; set; } + [NetworkVar("m_vecGunCrosshair")] + public partial Vector3 GunCrosshair { get; set; } + [NetworkVar("m_bLocked")] + public partial bool Locked { get; set; } public override bool IsVehicle() => true; } diff --git a/Game.Server/Props.cs b/Game.Server/Props.cs index 5b531866..72ac4c45 100644 --- a/Game.Server/Props.cs +++ b/Game.Server/Props.cs @@ -17,7 +17,6 @@ namespace Game.Server; using System.Numerics; using DEFINE = Source.DEFINE; -using FIELD_BPD = Source.FIELD; using FIELD_DP = Source.FIELD; using FIELD_PBM = Source.FIELD; using FIELD_PP = Source.FIELD; @@ -58,8 +57,12 @@ public void ParsePropData() { } } [NetworkName("CBreakableProp")] -public class BreakableProp : BaseProp, IBreakableWithPropData, IPlayerPickupVPhysics +public partial class BreakableProp : BaseProp, IBreakableWithPropData, IPlayerPickupVPhysics { + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + [Flags] public enum SF { @@ -83,8 +86,6 @@ public enum SF IsGib = 0x400000,// Limit # of active gibs } - public static readonly SendTable DT_BreakableProp = new(DT_BaseAnimating, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_BreakableProp); public bool PropDataOverrodeBlockLOS() => BlockLOSSetByPropData; @@ -287,17 +288,18 @@ public virtual Vector3 PhysGunLaunchAngularImpulse() { [LinkEntityToClass("func_physbox_multiplayer")] [NetworkName("CPhysBoxMultiplayer")] -public class PhysBoxMultiplayer : PhysBox, IMultiplayerPhysics +public partial class PhysBoxMultiplayer : PhysBox, IMultiplayerPhysics { - public static readonly SendTable DT_PhysBoxMultiplayer = new(DT_PhysBox, [ - SendPropInt(FIELD_PBM.OF(nameof(PhysicsMode)), 1, PropFlags.Unsigned), - SendPropFloat(FIELD_PBM.OF(nameof(Mass)), 0, PropFlags.NoScale) - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PhysBoxMultiplayer); - [NetworkName("m_iPhysicsMode")] - public int PhysicsMode; - [NetworkName("m_fMass")] - public float Mass; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(PhysicsMode)) { Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(Mass)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; + + [NetworkVar("m_iPhysicsMode")] + public partial int PhysicsMode { get; set; } + [NetworkVar("m_fMass")] + public partial float Mass { get; set; } public PhysicsMultiplayerMode GetMultiplayerPhysicsMode() => (PhysicsMultiplayerMode)PhysicsMode; public float GetMass() => Mass; @@ -313,14 +315,15 @@ public class PhysBoxMultiplayer : PhysBox, IMultiplayerPhysics [LinkEntityToClass("prop_flare")] [LinkEntityToClass("prop_weighted_cube")] [NetworkName("CPhysicsProp")] -public class PhysicsProp : BreakableProp +public partial class PhysicsProp : BreakableProp { - public static readonly SendTable DT_PhysicsProp = new(DT_BreakableProp, [ - SendPropBool(FIELD_PP.OF(nameof(Awake))) - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PhysicsProp); - [NetworkName("m_bAwake")] - public bool Awake; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Awake), + ]; + + [NetworkVar("m_bAwake")] + public partial bool Awake { get; set; } public static readonly new DataMap DataDesc = new(typeof(PhysicsProp), BaseEntity.DataDesc, [ DEFINE.KEYFIELD(nameof(MassScale), FieldType.Float, "massscale"), @@ -569,57 +572,61 @@ public override void Use(BaseEntity? activator, BaseEntity? caller, UseType useT [LinkEntityToClass("prop_wall_projector")] [LinkEntityToClass("team_control_point")] [NetworkName("CDynamicProp")] -public class DynamicProp : BreakableProp +public partial class DynamicProp : BreakableProp { - public static readonly SendTable DT_DynamicProp = new(DT_BreakableProp, [ - SendPropBool(FIELD_DP.OF(nameof(UseHitboxesForRenderBox))) - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_DynamicProp); - [NetworkName("m_bUseHitboxesForRenderBox")] - public bool UseHitboxesForRenderBox; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(UseHitboxesForRenderBox), + ]; + + [NetworkVar("m_bUseHitboxesForRenderBox")] + public partial bool UseHitboxesForRenderBox { get; set; } } [NetworkName("CPhysicsPropMultiplayer")] -public class PhysicsPropMultiplayer : PhysicsProp +public partial class PhysicsPropMultiplayer : PhysicsProp { - public static readonly SendTable DT_PhysicsPropMultiplayer = new(DT_PhysicsProp, [ - SendPropInt(FIELD_PPM.OF(nameof(PhysicsMode)), 2, PropFlags.Unsigned), - SendPropFloat(FIELD_PPM.OF(nameof(Mass)), 0, PropFlags.NoScale), - SendPropVector(FIELD_PPM.OF(nameof(CollisionMins)), 0, PropFlags.NoScale), - SendPropVector(FIELD_PPM.OF(nameof(CollisionMaxs)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PhysicsPropMultiplayer); - - [NetworkName("m_iPhysicsMode")] - public int PhysicsMode; - [NetworkName("m_fMass")] - public float Mass; - [NetworkName("m_collisionMins")] - public Vector3 CollisionMins; - [NetworkName("m_collisionMaxs")] - public Vector3 CollisionMaxs; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(PhysicsMode)) { Bits = 2, Flags = PropFlags.Unsigned }, + new(nameof(Mass)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(CollisionMins)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(CollisionMaxs)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; + + [NetworkVar("m_iPhysicsMode")] + public partial int PhysicsMode { get; set; } + [NetworkVar("m_fMass")] + public partial float Mass { get; set; } + [NetworkVar("m_collisionMins")] + public partial Vector3 CollisionMins { get; set; } + [NetworkVar("m_collisionMaxs")] + public partial Vector3 CollisionMaxs { get; set; } } [NetworkName("CBasePropDoor")] -public class BasePropDoor : DynamicProp +public partial class BasePropDoor : DynamicProp { - [NetworkName("m_bLocked")] - bool Locked; - [NetworkName("m_eDoorState")] - int DoorState; - public static readonly SendTable DT_BasePropDoor = new(DT_DynamicProp, [ - SendPropBool(FIELD_BPD.OF(nameof(Locked))), - SendPropInt(FIELD_BPD.OF(nameof(DoorState)), 3, PropFlags.Unsigned) - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_BasePropDoor); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Locked), + new(nameof(DoorState)) { Bits = 3, Flags = PropFlags.Unsigned }, + ]; + + [NetworkVar("m_bLocked")] + private partial bool Locked { get; set; } + [NetworkVar("m_eDoorState")] + private partial int DoorState { get; set; } } [NetworkName("CPropDoorRotating")] -public class PropDoorRotating : BasePropDoor +public partial class PropDoorRotating : BasePropDoor { - public static readonly SendTable DT_PropDoorRotating = new(DT_BasePropDoor, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_PropDoorRotating); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } [LinkEntityToClass("prop_door_rotating")] diff --git a/Game.Server/RagdollManager.cs b/Game.Server/RagdollManager.cs index 6c1ddd0d..ddf12347 100644 --- a/Game.Server/RagdollManager.cs +++ b/Game.Server/RagdollManager.cs @@ -4,17 +4,16 @@ namespace Game.Server; -using FIELD = FIELD; - [LinkEntityToClass("game_ragdoll_manager")] -[NetworkName("CRagdollManager")] -public class RagdollManager : BaseEntity +[NetworkName("CRagdollManager", NoBase = true)] +public partial class RagdollManager : BaseEntity { - [NetworkName("m_iCurrentMaxRagdollCount")] - public int CurrentMaxRagdollCount; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(CurrentMaxRagdollCount)) { Bits = 6 }, + ]; + + [NetworkVar("m_iCurrentMaxRagdollCount")] + public partial int CurrentMaxRagdollCount { get; set; } - public static readonly SendTable DT_RagdollManager = new([ - SendPropInt(FIELD.OF(nameof(CurrentMaxRagdollCount)), 6), - ]); - public static new readonly ServerClass ServerClass = new ServerClass(DT_RagdollManager); } diff --git a/Game.Server/RagdollProp.cs b/Game.Server/RagdollProp.cs index 8a82537b..6f1c0b8d 100644 --- a/Game.Server/RagdollProp.cs +++ b/Game.Server/RagdollProp.cs @@ -1,4 +1,5 @@ using Source.Common; +using Source.Common.Mathematics; using Source; using Game.Shared; @@ -6,33 +7,35 @@ using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("physics_prop_ragdoll")] [LinkEntityToClass("prop_ragdoll")] -[NetworkName("CRagdollProp")] -public class RagdollProp : BaseAnimating +[NetworkName("CRagdollProp", Table = "DT_Ragdoll")] +public partial class RagdollProp : BaseAnimating { + public RagdollProp() { + HUnragdoll = new(); + } + const int RAGDOLL_MAX_ELEMENTS = 32; - public static readonly SendTable DT_Ragdoll = new(DT_BaseAnimating, [ - .. Enumerable.Range(0, RAGDOLL_MAX_ELEMENTS).Select(i => SendPropVector(FIELD.OF_ARRAYINDEX(nameof(RagPos), i), -1, PropFlags.Coord)), - .. Enumerable.Range(0, RAGDOLL_MAX_ELEMENTS).Select(i => SendPropQAngles(FIELD.OF_ARRAYINDEX(nameof(RagAngles), i), 13, PropFlags.RoundDown)), - - SendPropEHandle(FIELD.OF(nameof(HUnragdoll))), - SendPropFloat(FIELD.OF(nameof(BlendWeight)), 8, PropFlags.RoundDown, 0.0f, 1.0f), - SendPropInt(FIELD.OF(nameof(OverlaySequence)), 11, 0), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_Ragdoll); - - [NetworkName("m_ragPos[ {0} ]")] - public InlineArray32 RagPos; - [NetworkName("m_ragAngles[ {0} ]")] - public InlineArray32 RagAngles; - [NetworkName("m_hUnragdoll")] - public EHANDLE HUnragdoll = new(); - [NetworkName("m_flBlendWeight")] - public float BlendWeight; - [NetworkName("m_nOverlaySequence")] - public int OverlaySequence; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(RagPos)) { Encoding = NetEncoding.Elements, Count = RAGDOLL_MAX_ELEMENTS, Bits = -1, Flags = PropFlags.Coord }, + new(nameof(RagAngles)) { Encoding = NetEncoding.Elements, Count = RAGDOLL_MAX_ELEMENTS, Bits = 13, Flags = PropFlags.RoundDown }, + nameof(HUnragdoll), + new(nameof(BlendWeight)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0.0f, High = 1.0f }, + new(nameof(OverlaySequence)) { Bits = 11 }, + ]; + + [NetworkVar("m_ragPos[ {0} ]")] + public partial ref readonly InlineArray32 RagPos { get; } + [NetworkVar("m_ragAngles[ {0} ]")] + public partial ref readonly InlineArray32 RagAngles { get; } + [NetworkVar("m_hUnragdoll")] + public partial EHANDLE HUnragdoll { get; set; } + [NetworkVar("m_flBlendWeight")] + public partial float BlendWeight { get; set; } + [NetworkVar("m_nOverlaySequence")] + public partial int OverlaySequence { get; set; } readonly Ragdoll ragdoll = new(); public Ragdoll GetRagdoll() => ragdoll; diff --git a/Game.Server/RagdollPropAttached.cs b/Game.Server/RagdollPropAttached.cs index 6b43524e..eea6a10e 100644 --- a/Game.Server/RagdollPropAttached.cs +++ b/Game.Server/RagdollPropAttached.cs @@ -5,26 +5,24 @@ namespace Game.Server; -using FIELD = FIELD; - [LinkEntityToClass("prop_ragdoll_attached")] -[NetworkName("CRagdollPropAttached")] -public class RagdollPropAttached : RagdollProp +[NetworkName("CRagdollPropAttached", Table = "DT_Ragdoll_Attached")] +public partial class RagdollPropAttached : RagdollProp { - [NetworkName("m_boneIndexAttached")] - public int BoneIndexAttached; - [NetworkName("m_ragdollAttachedObjectIndex")] - public int RagdollAttachedObjectIndex; - [NetworkName("m_attachmentPointBoneSpace")] - public Vector3 AttachmentPointBoneSpace; - [NetworkName("m_attachmentPointRagdollSpace")] - public Vector3 AttachmentPointRagdollSpace; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(BoneIndexAttached)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(RagdollAttachedObjectIndex)) { Bits = 6, Flags = PropFlags.Unsigned }, + new(nameof(AttachmentPointBoneSpace)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(AttachmentPointRagdollSpace)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - public static readonly SendTable DT_Ragdoll_Attached = new(DT_Ragdoll, [ - SendPropInt(FIELD.OF(nameof(BoneIndexAttached)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(RagdollAttachedObjectIndex)), 6, PropFlags.Unsigned), - SendPropVector(FIELD.OF(nameof(AttachmentPointBoneSpace)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(AttachmentPointRagdollSpace)), 0, PropFlags.Coord), - ]); - public static new readonly ServerClass ServerClass = new ServerClass(DT_Ragdoll_Attached); + [NetworkVar("m_boneIndexAttached")] + public partial int BoneIndexAttached { get; set; } + [NetworkVar("m_ragdollAttachedObjectIndex")] + public partial int RagdollAttachedObjectIndex { get; set; } + [NetworkVar("m_attachmentPointBoneSpace")] + public partial Vector3 AttachmentPointBoneSpace { get; set; } + [NetworkVar("m_attachmentPointRagdollSpace")] + public partial Vector3 AttachmentPointRagdollSpace { get; set; } } diff --git a/Game.Server/RocketTrail.cs b/Game.Server/RocketTrail.cs index 264214fe..c08f310a 100644 --- a/Game.Server/RocketTrail.cs +++ b/Game.Server/RocketTrail.cs @@ -3,58 +3,57 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_rockettrail")] -[NetworkName("RocketTrail")] -public class RocketTrail : BaseParticleEntity +[NetworkName("RocketTrail", Table = "DT_RocketTrail")] +public partial class RocketTrail : BaseParticleEntity { - public static readonly SendTable DT_RocketTrail = new(DT_BaseParticleEntity, [ - SendPropFloat(FIELD.OF(nameof(SpawnRate)), 8, 0, 1, 1024), - SendPropVector(FIELD.OF(nameof(StartColor)), 8, 0, 0, 1), - SendPropVector(FIELD.OF(nameof(EndColor)), 8, 0, 0, 1), - SendPropFloat(FIELD.OF(nameof(ParticleLifetime)), 16, PropFlags.RoundUp, 0.1f, 100), - SendPropFloat(FIELD.OF(nameof(StopEmitTime)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MinSpeed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MaxSpeed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(StartSize)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(EndSize)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(SpawnRadius)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(Emit))), - SendPropInt(FIELD.OF(nameof(Attachment)), 12, 0), - SendPropFloat(FIELD.OF(nameof(Opacity)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(Damaged))), - SendPropFloat(FIELD.OF(nameof(FlareScale)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_RocketTrail); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SpawnRate)) { Bits = 8, Low = 1.0f, High = 1024.0f }, + new(nameof(StartColor)) { Bits = 8, Low = 0.0f, High = 1.0f }, + new(nameof(EndColor)) { Bits = 8, Low = 0.0f, High = 1.0f }, + new(nameof(ParticleLifetime)) { Bits = 16, Flags = PropFlags.RoundUp, Low = 0.1f, High = 100.0f }, + new(nameof(StopEmitTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MinSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EndSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpawnRadius)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Emit), + new(nameof(Attachment)) { Bits = 12 }, + new(nameof(Opacity)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Damaged), + new(nameof(FlareScale)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_SpawnRate")] - public float SpawnRate; - [NetworkName("m_StartColor")] - public Vector3 StartColor; - [NetworkName("m_EndColor")] - public Vector3 EndColor; - [NetworkName("m_ParticleLifetime")] - public float ParticleLifetime; - [NetworkName("m_StopEmitTime")] - public float StopEmitTime; - [NetworkName("m_MinSpeed")] - public float MinSpeed; - [NetworkName("m_MaxSpeed")] - public float MaxSpeed; - [NetworkName("m_StartSize")] - public float StartSize; - [NetworkName("m_EndSize")] - public float EndSize; - [NetworkName("m_SpawnRadius")] - public float SpawnRadius; - [NetworkName("m_bEmit")] - public bool Emit; - [NetworkName("m_nAttachment")] - public int Attachment; - [NetworkName("m_Opacity")] - public float Opacity; - [NetworkName("m_bDamaged")] - public bool Damaged; - [NetworkName("m_flFlareScale")] - public float FlareScale; + [NetworkVar("m_SpawnRate")] + public partial float SpawnRate { get; set; } + [NetworkVar("m_StartColor")] + public partial Vector3 StartColor { get; set; } + [NetworkVar("m_EndColor")] + public partial Vector3 EndColor { get; set; } + [NetworkVar("m_ParticleLifetime")] + public partial float ParticleLifetime { get; set; } + [NetworkVar("m_StopEmitTime")] + public partial float StopEmitTime { get; set; } + [NetworkVar("m_MinSpeed")] + public partial float MinSpeed { get; set; } + [NetworkVar("m_MaxSpeed")] + public partial float MaxSpeed { get; set; } + [NetworkVar("m_StartSize")] + public partial float StartSize { get; set; } + [NetworkVar("m_EndSize")] + public partial float EndSize { get; set; } + [NetworkVar("m_SpawnRadius")] + public partial float SpawnRadius { get; set; } + [NetworkVar("m_bEmit")] + public partial bool Emit { get; set; } + [NetworkVar("m_nAttachment")] + public partial int Attachment { get; set; } + [NetworkVar("m_Opacity")] + public partial float Opacity { get; set; } + [NetworkVar("m_bDamaged")] + public partial bool Damaged { get; set; } + [NetworkVar("m_flFlareScale")] + public partial float FlareScale { get; set; } } diff --git a/Game.Server/Rope.cs b/Game.Server/Rope.cs index 504ed628..5a62076a 100644 --- a/Game.Server/Rope.cs +++ b/Game.Server/Rope.cs @@ -8,77 +8,81 @@ namespace Game.Server; -using FIELD = FIELD; - [LinkEntityToClass("keyframe_rope")] [LinkEntityToClass("move_rope")] -[NetworkName("CRopeKeyframe")] -public class RopeKeyframe : BaseEntity +[NetworkName("CRopeKeyframe", NoBase = true)] +public partial class RopeKeyframe : BaseEntity { - public static readonly SendTable DT_RopeKeyframe = new([ - SendPropEHandle(FIELD.OF(nameof(StartPoint))), - SendPropEHandle(FIELD.OF(nameof(EndPoint))), - SendPropInt(FIELD.OF(nameof(StartAttachment)), 5), - SendPropInt(FIELD.OF(nameof(EndAttachment)), 5), - SendPropInt(FIELD.OF(nameof(StartBone)), 5), - SendPropInt(FIELD.OF(nameof(EndBone)), 5), - SendPropVector(FIELD.OF(nameof(StartOffset)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(EndOffset)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(RenderColor)), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Slack)), 12), - SendPropInt(FIELD.OF(nameof(RopeLength)), 15), - SendPropInt(FIELD.OF(nameof(LockedPoints)), 4, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(RopeFlags)), 9, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Segments)), 4, PropFlags.Unsigned), - SendPropBool(FIELD.OF(nameof(ConstrainBetweenEndpoints))), - SendPropInt(FIELD.OF(nameof(RopeMaterialModelIndex)), 16, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Subdiv)), 4, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(TextureScale)), 10, 0, 0.1f, 10.0f), - SendPropFloat(FIELD.OF(nameof(Width)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(ScrollSpeed)), 0, PropFlags.NoScale), - SendPropVector(NetworkVarFields.Origin, 0, PropFlags.Coord), - SendPropEHandle(FIELD.OF(nameof(MoveParent))), - SendPropInt(FIELD.OF(nameof(ParentAttachment)), 8, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_RopeKeyframe); - [NetworkName("m_hStartPoint")] - public EHANDLE StartPoint = new(); - [NetworkName("m_hEndPoint")] - public EHANDLE EndPoint = new(); - [NetworkName("m_iStartAttachment")] - public int StartAttachment; - [NetworkName("m_iEndAttachment")] - public int EndAttachment; - [NetworkName("m_iStartBone")] - public int StartBone; - [NetworkName("m_iEndBone")] - public int EndBone; - [NetworkName("m_vecStartOffset")] - public Vector3 StartOffset; - [NetworkName("m_vecEndOffset")] - public Vector3 EndOffset; - [NetworkName("m_clrRender")] - public Color RenderColor; - [NetworkName("m_Slack")] - public int Slack; - [NetworkName("m_RopeLength")] - public int RopeLength; - [NetworkName("m_fLockedPoints")] - public int LockedPoints; - [NetworkName("m_RopeFlags")] - public int RopeFlags; - [NetworkName("m_nSegments")] - public int Segments; - [NetworkName("m_bConstrainBetweenEndpoints")] - public bool ConstrainBetweenEndpoints; - [NetworkName("m_iRopeMaterialModelIndex")] - public int RopeMaterialModelIndex; - [NetworkName("m_Subdiv")] - public int Subdiv; - [NetworkName("m_TextureScale")] - public float TextureScale; - [NetworkName("m_Width")] - public float Width; - [NetworkName("m_flScrollSpeed")] - public float ScrollSpeed; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(StartPoint), + nameof(EndPoint), + new(nameof(StartAttachment)) { Bits = 5 }, + new(nameof(EndAttachment)) { Bits = 5 }, + new(nameof(StartBone)) { Bits = 5 }, + new(nameof(EndBone)) { Bits = 5 }, + new(nameof(StartOffset)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(EndOffset)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(RenderColor)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Slack)) { Bits = 12 }, + new(nameof(RopeLength)) { Bits = 15 }, + new(nameof(LockedPoints)) { Bits = 4, Flags = PropFlags.Unsigned }, + new(nameof(RopeFlags)) { Bits = 9, Flags = PropFlags.Unsigned }, + new(nameof(Segments)) { Bits = 4, Flags = PropFlags.Unsigned }, + nameof(ConstrainBetweenEndpoints), + new(nameof(RopeMaterialModelIndex)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(Subdiv)) { Bits = 4, Flags = PropFlags.Unsigned }, + new(nameof(TextureScale)) { Bits = 10, Low = 0.1f, High = 10.0f }, + new(nameof(Width)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ScrollSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Origin)) { Encoding = NetEncoding.Vector, Bits = 0, Flags = PropFlags.Coord }, + new(nameof(MoveParent)) { Encoding = NetEncoding.EHandle }, + new(nameof(ParentAttachment)) { Encoding = NetEncoding.Int, Bits = 8, Flags = PropFlags.Unsigned }, + ]; + + public RopeKeyframe() { + StartPoint = new(); + EndPoint = new(); + } + + [NetworkVar("m_hStartPoint")] + public partial EHANDLE StartPoint { get; set; } + [NetworkVar("m_hEndPoint")] + public partial EHANDLE EndPoint { get; set; } + [NetworkVar("m_iStartAttachment")] + public partial int StartAttachment { get; set; } + [NetworkVar("m_iEndAttachment")] + public partial int EndAttachment { get; set; } + [NetworkVar("m_iStartBone")] + public partial int StartBone { get; set; } + [NetworkVar("m_iEndBone")] + public partial int EndBone { get; set; } + [NetworkVar("m_vecStartOffset")] + public partial Vector3 StartOffset { get; set; } + [NetworkVar("m_vecEndOffset")] + public partial Vector3 EndOffset { get; set; } + [NetworkVar("m_clrRender")] + public partial Color RenderColor { get; set; } + [NetworkVar("m_Slack")] + public partial int Slack { get; set; } + [NetworkVar("m_RopeLength")] + public partial int RopeLength { get; set; } + [NetworkVar("m_fLockedPoints")] + public partial int LockedPoints { get; set; } + [NetworkVar("m_RopeFlags")] + public partial int RopeFlags { get; set; } + [NetworkVar("m_nSegments")] + public partial int Segments { get; set; } + [NetworkVar("m_bConstrainBetweenEndpoints")] + public partial bool ConstrainBetweenEndpoints { get; set; } + [NetworkVar("m_iRopeMaterialModelIndex")] + public partial int RopeMaterialModelIndex { get; set; } + [NetworkVar("m_Subdiv")] + public partial int Subdiv { get; set; } + [NetworkVar("m_TextureScale")] + public partial float TextureScale { get; set; } + [NetworkVar("m_Width")] + public partial float Width { get; set; } + [NetworkVar("m_flScrollSpeed")] + public partial float ScrollSpeed { get; set; } } diff --git a/Game.Server/RotorWashEmitter.cs b/Game.Server/RotorWashEmitter.cs index 416d3a8a..498f8659 100644 --- a/Game.Server/RotorWashEmitter.cs +++ b/Game.Server/RotorWashEmitter.cs @@ -3,16 +3,15 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_rotorwash_emitter")] [NetworkName("CRotorWashEmitter")] -public class RotorWashEmitter : BaseEntity +public partial class RotorWashEmitter : BaseEntity { - public static readonly SendTable DT_RotorWashEmitter = new(DT_BaseEntity, [ - SendPropFloat(FIELD.OF(nameof(Altitude)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_RotorWashEmitter); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Altitude)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flAltitude")] - public float Altitude; + [NetworkVar("m_flAltitude")] + public partial float Altitude { get; set; } } diff --git a/Game.Server/RpgRocket.cs b/Game.Server/RpgRocket.cs index 63883f85..25f9bdb6 100644 --- a/Game.Server/RpgRocket.cs +++ b/Game.Server/RpgRocket.cs @@ -4,11 +4,12 @@ using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("rpg_rocket")] [NetworkName("CRpgRocket")] -public class RpgRocket : BaseGrenade +public partial class RpgRocket : BaseGrenade { - public static readonly SendTable DT_RpgRocket = new(DT_BaseGrenade, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_RpgRocket); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Server/SceneEntity.cs b/Game.Server/SceneEntity.cs index f63687da..89435a59 100644 --- a/Game.Server/SceneEntity.cs +++ b/Game.Server/SceneEntity.cs @@ -15,7 +15,6 @@ namespace Game.Server; -using FIELD = FIELD; using DEFINE = Source.DEFINE; using EventType = Game.Shared.ChoreoEvent.EventType; @@ -448,28 +447,28 @@ public struct SpeakEventSound public const int MAX_ACTORS_IN_SCENE = 16; - [NetworkName("m_nSceneStringIndex")] - public int SceneStringIndex; - [NetworkName("m_bIsPlayingBack")] - public bool IsPlayingBack; - [NetworkName("m_bPaused")] - public bool Paused; - [NetworkName("m_bMultiplayer")] - public bool Multiplayer; - [NetworkName("m_flForceClientTime")] - public float ForceClientTime; - [NetworkName("m_hActorList")] + [NetworkVar("m_nSceneStringIndex")] + public partial int SceneStringIndex { get; set; } + [NetworkVar("m_bIsPlayingBack")] + public partial bool IsPlayingBack { get; set; } + [NetworkVar("m_bPaused")] + public partial bool Paused { get; set; } + [NetworkVar("m_bMultiplayer")] + public partial bool Multiplayer { get; set; } + [NetworkVar("m_flForceClientTime")] + public partial float ForceClientTime { get; set; } + [NetworkVar("m_hActorList")] readonly List ActorList = []; - public static readonly SendTable DT_SceneEntity = new([ - SendPropInt(FIELD.OF(nameof(SceneStringIndex)), 12, PropFlags.Unsigned), - SendPropBool(FIELD.OF(nameof(IsPlayingBack))), - SendPropBool(FIELD.OF(nameof(Paused))), - SendPropBool(FIELD.OF(nameof(Multiplayer))), - SendPropFloat(FIELD.OF(nameof(ForceClientTime)), 0, PropFlags.NoScale), - SendPropList(FIELD.OF(nameof(ActorList)), MAX_ACTORS_IN_SCENE, SendPropEHandle()), - ]); - public static new readonly ServerClass ServerClass = new ServerClass(DT_SceneEntity); + [NetworkTable(NoBase = true)] + public static readonly new NetworkProp[] Props = [ + new(nameof(SceneStringIndex)) { Bits = 12, Flags = PropFlags.Unsigned }, + nameof(IsPlayingBack), + nameof(Paused), + nameof(Multiplayer), + new(nameof(ForceClientTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ActorList)) { Encoding = NetEncoding.List, Count = MAX_ACTORS_IN_SCENE }, + ]; public static readonly new DataMap DataDesc = new(typeof(SceneEntity), BaseEntity.DataDesc, [ DEFINE.KEYFIELD(nameof(SceneFile), FieldType.String, "SceneFile"), diff --git a/Game.Server/ScriptIntro.cs b/Game.Server/ScriptIntro.cs index 734acab1..4cb3be61 100644 --- a/Game.Server/ScriptIntro.cs +++ b/Game.Server/ScriptIntro.cs @@ -8,77 +8,79 @@ namespace Game.Server; -using FIELD = FIELD; using DEFINE = Source.DEFINE; [LinkEntityToClass("script_intro")] [NetworkName("CScriptIntro")] -public class ScriptIntro : BaseEntity +public partial class ScriptIntro : BaseEntity { + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(CameraView)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(CameraViewAngles)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(BlendMode)) { Bits = 5 }, + new(nameof(NextBlendMode)) { Bits = 5 }, + new(nameof(NextBlendTime)) { Encoding = NetEncoding.Time64 }, + new(nameof(BlendStartTime)) { Encoding = NetEncoding.Time64 }, + nameof(Active), + new(nameof(FOV)) { Bits = 9 }, + new(nameof(NextFOV)) { Bits = 9 }, + new(nameof(StartFOV)) { Bits = 9 }, + new(nameof(NextFOVBlendTime)) { Encoding = NetEncoding.Time64 }, + new(nameof(FOVBlendStartTime)) { Encoding = NetEncoding.Time64 }, + nameof(AlternateFOV), + new(nameof(FadeAlpha)) { Bits = 10 }, + new(nameof(FadeColor)) { Encoding = NetEncoding.Array2, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeDuration)) { Bits = 10, Flags = PropFlags.RoundDown, Low = 0.0f, High = 255.0f }, + nameof(CameraEntity), + ]; + + public ScriptIntro() { + CameraEntity = new(); + } + public static Handle g_hIntroScript = new(); static readonly ConVar cl_spewscriptintro = new("cl_spewscriptintro", "0"); - [NetworkName("m_vecCameraView")] - public Vector3 CameraView; - [NetworkName("m_vecCameraViewAngles")] - public Vector3 CameraViewAngles; - [NetworkName("m_iBlendMode")] - public int BlendMode; - [NetworkName("m_iNextBlendMode")] - public int NextBlendMode; - [NetworkName("m_flNextBlendTime")] - public TimeUnit_t NextBlendTime; - [NetworkName("m_flBlendStartTime")] - public TimeUnit_t BlendStartTime; - [NetworkName("m_bActive")] - public bool Active; - [NetworkName("m_iFOV")] - public int FOV; - [NetworkName("m_iNextFOV")] - public int NextFOV; - [NetworkName("m_iStartFOV")] - public int StartFOV; - [NetworkName("m_flNextFOVBlendTime")] - public TimeUnit_t NextFOVBlendTime; - [NetworkName("m_flFOVBlendStartTime")] - public TimeUnit_t FOVBlendStartTime; - [NetworkName("m_bAlternateFOV")] - public bool AlternateFOV; - [NetworkName("m_flFadeAlpha")] - public float FadeAlpha; - [NetworkName("m_flFadeColor")] - public InlineArray3 FadeColor; - [NetworkName("m_flFadeDuration")] - public float FadeDuration; - [NetworkName("m_hCameraEntity")] - public EHANDLE CameraEntity = new(); + [NetworkVar("m_vecCameraView")] + public partial Vector3 CameraView { get; set; } + [NetworkVar("m_vecCameraViewAngles")] + public partial Vector3 CameraViewAngles { get; set; } + [NetworkVar("m_iBlendMode")] + public partial int BlendMode { get; set; } + [NetworkVar("m_iNextBlendMode")] + public partial int NextBlendMode { get; set; } + [NetworkVar("m_flNextBlendTime")] + public partial TimeUnit_t NextBlendTime { get; set; } + [NetworkVar("m_flBlendStartTime")] + public partial TimeUnit_t BlendStartTime { get; set; } + [NetworkVar("m_bActive")] + public partial bool Active { get; set; } + [NetworkVar("m_iFOV")] + public partial int FOV { get; set; } + [NetworkVar("m_iNextFOV")] + public partial int NextFOV { get; set; } + [NetworkVar("m_iStartFOV")] + public partial int StartFOV { get; set; } + [NetworkVar("m_flNextFOVBlendTime")] + public partial TimeUnit_t NextFOVBlendTime { get; set; } + [NetworkVar("m_flFOVBlendStartTime")] + public partial TimeUnit_t FOVBlendStartTime { get; set; } + [NetworkVar("m_bAlternateFOV")] + public partial bool AlternateFOV { get; set; } + [NetworkVar("m_flFadeAlpha")] + public partial float FadeAlpha { get; set; } + [NetworkVar("m_flFadeColor")] + public partial ref readonly InlineArray3 FadeColor { get; } + [NetworkVar("m_flFadeDuration")] + public partial float FadeDuration { get; set; } + [NetworkVar("m_hCameraEntity")] + public partial EHANDLE CameraEntity { get; set; } int QueuedBlendMode; int QueuedNextBlendMode; - public static readonly SendTable DT_ScriptIntro = new(DT_BaseEntity, [ - SendPropVector(FIELD.OF(nameof(CameraView)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(CameraViewAngles)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(BlendMode)), 5), - SendPropInt(FIELD.OF(nameof(NextBlendMode)), 5), - SendPropTime64(FIELD.OF(nameof(NextBlendTime))), - SendPropTime64(FIELD.OF(nameof(BlendStartTime))), - SendPropBool(FIELD.OF(nameof(Active))), - SendPropInt(FIELD.OF(nameof(FOV)), 9), - SendPropInt(FIELD.OF(nameof(NextFOV)), 9), - SendPropInt(FIELD.OF(nameof(StartFOV)), 9), - SendPropTime64(FIELD.OF(nameof(NextFOVBlendTime))), - SendPropTime64(FIELD.OF(nameof(FOVBlendStartTime))), - SendPropBool(FIELD.OF(nameof(AlternateFOV))), - SendPropFloat(FIELD.OF(nameof(FadeAlpha)), 10), - SendPropFloat(FIELD.OF_SENDINFO_ARRAY(nameof(FadeColor)), 0, PropFlags.NoScale), - SendPropArray(FIELD.OF_ARRAY(nameof(FadeColor))), - SendPropFloat(FIELD.OF(nameof(FadeDuration)), 10, PropFlags.RoundDown, 0.0f, 255.0f), - SendPropEHandle(FIELD.OF(nameof(CameraEntity))), - ]); - public static new readonly ServerClass ServerClass = new ServerClass(DT_ScriptIntro); - public static readonly new DataMap DataDesc = new(typeof(ScriptIntro), BaseEntity.DataDesc, [ DEFINE.FIELD(nameof(CameraView), FieldType.Vector), DEFINE.FIELD(nameof(CameraViewAngles), FieldType.Vector), @@ -153,7 +155,7 @@ public void InputSetCameraViewEntity(InputData inputdata) { return; } - CameraEntity.Set(entity); + CameraEntity = EHANDLE.FromEntity(entity); CameraView = entity.GetAbsOrigin(); QAngle angles = entity.GetAbsAngles(); CameraViewAngles = new(angles.X, angles.Y, angles.Z); @@ -285,9 +287,10 @@ public void InputSetFadeColor(InputData inputdata) { return; } - FadeColor[0] = (float)atof(parameters[0]); - FadeColor[1] = (float)atof(parameters[1]); - FadeColor[2] = (float)atof(parameters[2]); + ref var fadeColor = ref FadeColorForModify(); + fadeColor[0] = (float)atof(parameters[0]); + fadeColor[1] = (float)atof(parameters[1]); + fadeColor[2] = (float)atof(parameters[2]); NetworkStateChanged(); } } diff --git a/Game.Server/ServerNetworkProperty.cs b/Game.Server/ServerNetworkProperty.cs index 84067813..4c697e97 100644 --- a/Game.Server/ServerNetworkProperty.cs +++ b/Game.Server/ServerNetworkProperty.cs @@ -39,7 +39,7 @@ public void FireEvent() { } public ServerClass GetServerClass() { - ServerClass ??= ServerClassRetriever.GetOrError(Outer.GetType()); + ServerClass ??= Outer!.GetServerClass(); return ServerClass; } diff --git a/Game.Server/ShadowControl.cs b/Game.Server/ShadowControl.cs index f2b3511d..6f3ece35 100644 --- a/Game.Server/ShadowControl.cs +++ b/Game.Server/ShadowControl.cs @@ -6,29 +6,28 @@ using System.Numerics; namespace Game.Server; -using FIELD = Source.FIELD; [LinkEntityToClass("shadow_control")] -[NetworkName("CShadowControl")] -public class ShadowControl : BaseEntity +[NetworkName("CShadowControl", NoBase = true)] +public partial class ShadowControl : BaseEntity { - public static readonly SendTable DT_ShadowControl = new([ - SendPropVector(FIELD.OF(nameof(ShadowDirection)), -1, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(ShadowColor)), 32, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(ShadowMaxDist)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(DisableShadows))), - SendPropBool(FIELD.OF(nameof(EnableLocalLightShadows))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_ShadowControl); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ShadowDirection)) { Bits = -1, Flags = PropFlags.NoScale }, + new(nameof(ShadowColor)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(ShadowMaxDist)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(DisableShadows), + nameof(EnableLocalLightShadows), + ]; - [NetworkName("m_shadowDirection")] - public Vector3 ShadowDirection; - [NetworkName("m_shadowColor")] - public Color ShadowColor; - [NetworkName("m_flShadowMaxDist")] - public float ShadowMaxDist; - [NetworkName("m_bDisableShadows")] - public bool DisableShadows; - [NetworkName("m_bEnableLocalLightShadows")] - public bool EnableLocalLightShadows; + [NetworkVar("m_shadowDirection")] + public partial Vector3 ShadowDirection { get; set; } + [NetworkVar("m_shadowColor")] + public partial Color ShadowColor { get; set; } + [NetworkVar("m_flShadowMaxDist")] + public partial float ShadowMaxDist { get; set; } + [NetworkVar("m_bDisableShadows")] + public partial bool DisableShadows { get; set; } + [NetworkVar("m_bEnableLocalLightShadows")] + public partial bool EnableLocalLightShadows { get; set; } } \ No newline at end of file diff --git a/Game.Server/SlideshowDisplay.cs b/Game.Server/SlideshowDisplay.cs index 5eb52fc6..60d39a3a 100644 --- a/Game.Server/SlideshowDisplay.cs +++ b/Game.Server/SlideshowDisplay.cs @@ -3,37 +3,36 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("vgui_slideshow_display")] [NetworkName("CSlideshowDisplay")] -public class SlideshowDisplay : BaseEntity +public partial class SlideshowDisplay : BaseEntity { - public static readonly SendTable DT_SlideshowDisplay = new(DT_BaseEntity, [ - SendPropBool(FIELD.OF(nameof(Enabled))), - SendPropString(FIELD.OF(nameof(DisplayText))), - SendPropString(FIELD.OF(nameof(SlideshowDirectory))), - SendPropArray3(FIELD.OF_ARRAY(nameof(ChCurrentSlideLists)), SendPropInt(FIELD.OF_ARRAYINDEX(nameof(ChCurrentSlideLists), 0), 8, PropFlags.Unsigned)), - SendPropFloat(FIELD.OF(nameof(MinSlideTime)), 11, 0, 0.0f, 20.0f), - SendPropFloat(FIELD.OF(nameof(MaxSlideTime)), 11, 0, 0.0f, 20.0f), - SendPropInt(FIELD.OF(nameof(CycleType)), 2, PropFlags.Unsigned), - SendPropBool(FIELD.OF(nameof(NoListRepeats))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_SlideshowDisplay); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Enabled), + new(nameof(DisplayText)) { Encoding = NetEncoding.String }, + new(nameof(SlideshowDirectory)) { Encoding = NetEncoding.String }, + new(nameof(ChCurrentSlideLists)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(MinSlideTime)) { Bits = 11, Low = 0.0f, High = 20.0f }, + new(nameof(MaxSlideTime)) { Bits = 11, Low = 0.0f, High = 20.0f }, + new(nameof(CycleType)) { Bits = 2, Flags = PropFlags.Unsigned }, + nameof(NoListRepeats), + ]; - [NetworkName("m_bEnabled")] - public bool Enabled; - [NetworkName("m_szDisplayText")] - public InlineArray128 DisplayText; - [NetworkName("m_szSlideshowDirectory")] - public InlineArray128 SlideshowDirectory; - [NetworkName("m_chCurrentSlideLists")] - public InlineArray16 ChCurrentSlideLists; - [NetworkName("m_fMinSlideTime")] - public float MinSlideTime; - [NetworkName("m_fMaxSlideTime")] - public float MaxSlideTime; - [NetworkName("m_iCycleType")] - public int CycleType; - [NetworkName("m_bNoListRepeats")] - public bool NoListRepeats; + [NetworkVar("m_bEnabled")] + public partial bool Enabled { get; set; } + [NetworkVar("m_szDisplayText")] + public partial ref readonly InlineArray128 DisplayText { get; } + [NetworkVar("m_szSlideshowDirectory")] + public partial ref readonly InlineArray128 SlideshowDirectory { get; } + [NetworkVar("m_chCurrentSlideLists")] + public partial ref readonly InlineArray16 ChCurrentSlideLists { get; } + [NetworkVar("m_fMinSlideTime")] + public partial float MinSlideTime { get; set; } + [NetworkVar("m_fMaxSlideTime")] + public partial float MaxSlideTime { get; set; } + [NetworkVar("m_iCycleType")] + public partial int CycleType { get; set; } + [NetworkVar("m_bNoListRepeats")] + public partial bool NoListRepeats { get; set; } } diff --git a/Game.Server/SmokeStack.cs b/Game.Server/SmokeStack.cs index 7510a3d9..9ac90635 100644 --- a/Game.Server/SmokeStack.cs +++ b/Game.Server/SmokeStack.cs @@ -3,71 +3,70 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; public struct SmokeStackLightInfo{ - [NetworkName("m_vPos")] + [NetworkVar("m_vPos")] public Vector3 Pos; - [NetworkName("m_vColor")] + [NetworkVar("m_vColor")] public Vector3 Color; - [NetworkName("m_flIntensity")] + [NetworkVar("m_flIntensity")] public float Intensity; } [LinkEntityToClass("env_smokestack")] [NetworkName("CSmokeStack")] -public class SmokeStack : BaseParticleEntity +public partial class SmokeStack : BaseParticleEntity { - public static readonly SendTable DT_SmokeStack = new(DT_BaseParticleEntity, [ - SendPropFloat(FIELD.OF(nameof(SpreadSpeed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(Speed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(StartSize)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(EndSize)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(Rate)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(JetLength)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(Emit))), - SendPropFloat(FIELD.OF(nameof(BaseSpread)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(RollSpeed)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF("DirLight.Pos"), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF("DirLight.Color"), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF("DirLight.Intensity"), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF("AmbientLight.Pos"), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF("AmbientLight.Color"), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF("AmbientLight.Intensity"), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(Wind)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(Twist)), 0, PropFlags.NoScale), - SendPropIntWithMinusOneFlag(FIELD.OF(nameof(MaterialModel)), 16), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_SmokeStack); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SpreadSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Speed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EndSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Rate)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(JetLength)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Emit), + new(nameof(BaseSpread)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(RollSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DirLight.Pos)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DirLight.Color)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DirLight.Intensity)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(AmbientLight.Pos)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(AmbientLight.Color)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(AmbientLight.Intensity)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Wind)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Twist)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaterialModel)) { Bits = 16, Encoding = NetEncoding.IntWithMinusOneFlag }, + ]; - [NetworkName("m_SpreadSpeed")] - public float SpreadSpeed; - [NetworkName("m_Speed")] - public new float Speed; - [NetworkName("m_StartSize")] - public float StartSize; - [NetworkName("m_EndSize")] - public float EndSize; - [NetworkName("m_Rate")] - public float Rate; - [NetworkName("m_JetLength")] - public float JetLength; - [NetworkName("m_bEmit")] - public bool Emit; - [NetworkName("m_flBaseSpread")] - public float BaseSpread; - [NetworkName("m_flRollSpeed")] - public float RollSpeed; + [NetworkVar("m_SpreadSpeed")] + public partial float SpreadSpeed { get; set; } + [NetworkVar("m_Speed")] + public new partial float Speed { get; set; } + [NetworkVar("m_StartSize")] + public partial float StartSize { get; set; } + [NetworkVar("m_EndSize")] + public partial float EndSize { get; set; } + [NetworkVar("m_Rate")] + public partial float Rate { get; set; } + [NetworkVar("m_JetLength")] + public partial float JetLength { get; set; } + [NetworkVar("m_bEmit")] + public partial bool Emit { get; set; } + [NetworkVar("m_flBaseSpread")] + public partial float BaseSpread { get; set; } + [NetworkVar("m_flRollSpeed")] + public partial float RollSpeed { get; set; } - [NetworkName("m_AmbientLight")] - public SmokeStackLightInfo AmbientLight; - [NetworkName("m_DirLight")] - public SmokeStackLightInfo DirLight; + [NetworkVar("m_AmbientLight")] + public partial ref readonly SmokeStackLightInfo AmbientLight { get; } + [NetworkVar("m_DirLight")] + public partial ref readonly SmokeStackLightInfo DirLight { get; } - [NetworkName("m_vWind")] - public Vector3 Wind; - [NetworkName("m_flTwist")] - public float Twist; - [NetworkName("m_iMaterialModel")] - public int MaterialModel; + [NetworkVar("m_vWind")] + public partial Vector3 Wind { get; set; } + [NetworkVar("m_flTwist")] + public partial float Twist { get; set; } + [NetworkVar("m_iMaterialModel")] + public partial int MaterialModel { get; set; } } diff --git a/Game.Server/SmokeTrail.cs b/Game.Server/SmokeTrail.cs index 5c9a1f6d..aee148f6 100644 --- a/Game.Server/SmokeTrail.cs +++ b/Game.Server/SmokeTrail.cs @@ -3,58 +3,57 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_smoketrail")] -[NetworkName("SmokeTrail")] -public class SmokeTrail : BaseParticleEntity +[NetworkName("SmokeTrail", Table = "DT_SmokeTrail")] +public partial class SmokeTrail : BaseParticleEntity { - public static readonly SendTable DT_SmokeTrail = new(DT_BaseParticleEntity, [ - SendPropFloat(FIELD.OF(nameof(SpawnRate)), 8, 0, 1, 1024), - SendPropVector(FIELD.OF(nameof(StartColor)), 8, 0, 0, 1), - SendPropVector(FIELD.OF(nameof(EndColor)), 8, 0, 0, 1), - SendPropFloat(FIELD.OF(nameof(ParticleLifetime)), 16, PropFlags.RoundUp, 0.1f, 100), - SendPropFloat(FIELD.OF(nameof(StopEmitTime)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MinSpeed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MaxSpeed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MinDirectedSpeed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MaxDirectedSpeed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(StartSize)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(EndSize)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(SpawnRadius)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(Emit))), - SendPropInt(FIELD.OF(nameof(Attachment)), 12, 0), - SendPropFloat(FIELD.OF(nameof(Opacity)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_SmokeTrail); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SpawnRate)) { Bits = 8, Low = 1.0f, High = 1024.0f }, + new(nameof(StartColor)) { Bits = 8, Low = 0.0f, High = 1.0f }, + new(nameof(EndColor)) { Bits = 8, Low = 0.0f, High = 1.0f }, + new(nameof(ParticleLifetime)) { Bits = 16, Flags = PropFlags.RoundUp, Low = 0.1f, High = 100.0f }, + new(nameof(StopEmitTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MinSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MinDirectedSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxDirectedSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EndSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpawnRadius)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Emit), + new(nameof(Attachment)) { Bits = 12 }, + new(nameof(Opacity)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_SpawnRate")] - public float SpawnRate; - [NetworkName("m_StartColor")] - public Vector3 StartColor; - [NetworkName("m_EndColor")] - public Vector3 EndColor; - [NetworkName("m_ParticleLifetime")] - public float ParticleLifetime; - [NetworkName("m_StopEmitTime")] - public float StopEmitTime; - [NetworkName("m_MinSpeed")] - public float MinSpeed; - [NetworkName("m_MaxSpeed")] - public float MaxSpeed; - [NetworkName("m_MinDirectedSpeed")] - public float MinDirectedSpeed; - [NetworkName("m_MaxDirectedSpeed")] - public float MaxDirectedSpeed; - [NetworkName("m_StartSize")] - public float StartSize; - [NetworkName("m_EndSize")] - public float EndSize; - [NetworkName("m_SpawnRadius")] - public float SpawnRadius; - [NetworkName("m_bEmit")] - public bool Emit; - [NetworkName("m_nAttachment")] - public int Attachment; - [NetworkName("m_Opacity")] - public float Opacity; + [NetworkVar("m_SpawnRate")] + public partial float SpawnRate { get; set; } + [NetworkVar("m_StartColor")] + public partial Vector3 StartColor { get; set; } + [NetworkVar("m_EndColor")] + public partial Vector3 EndColor { get; set; } + [NetworkVar("m_ParticleLifetime")] + public partial float ParticleLifetime { get; set; } + [NetworkVar("m_StopEmitTime")] + public partial float StopEmitTime { get; set; } + [NetworkVar("m_MinSpeed")] + public partial float MinSpeed { get; set; } + [NetworkVar("m_MaxSpeed")] + public partial float MaxSpeed { get; set; } + [NetworkVar("m_MinDirectedSpeed")] + public partial float MinDirectedSpeed { get; set; } + [NetworkVar("m_MaxDirectedSpeed")] + public partial float MaxDirectedSpeed { get; set; } + [NetworkVar("m_StartSize")] + public partial float StartSize { get; set; } + [NetworkVar("m_EndSize")] + public partial float EndSize { get; set; } + [NetworkVar("m_SpawnRadius")] + public partial float SpawnRadius { get; set; } + [NetworkVar("m_bEmit")] + public partial bool Emit { get; set; } + [NetworkVar("m_nAttachment")] + public partial int Attachment { get; set; } + [NetworkVar("m_Opacity")] + public partial float Opacity { get; set; } } diff --git a/Game.Server/Soundscape.cs b/Game.Server/Soundscape.cs index 9c7ec7e6..d7671528 100644 --- a/Game.Server/Soundscape.cs +++ b/Game.Server/Soundscape.cs @@ -211,7 +211,7 @@ public void UpdateForPlayer(ref SoundscapeUpdate update) { Util.TraceLine(target, update.PlayerPosition, Mask.SolidBrushOnly | Mask.Water, update.Player, Source.CollisionGroup.None, out Trace tr); if (tr.Fraction == 1 && !tr.StartSolid) { - ref AudioParams audio = ref update.Player!.GetAudioParams(); + ref AudioParams audio = ref update.Player!.GetAudioParamsForModify(); WriteAudioParamsTo(ref audio); update.CurrentSoundscape = this; update.InRange = true; @@ -227,7 +227,7 @@ public void UpdateForPlayer(ref SoundscapeUpdate update) { DebugOverlay.Box(GetAbsOrigin(), new(-10, -10, -10), new(10, 10, 10), 255, 0, 255, 64, persist); if (update.Player != null) { - ref AudioParams audio = ref update.Player.GetAudioParams(); + ref readonly AudioParams audio = ref update.Player.GetAudioParams(); if (audio.Ent.Get() != this) { if (InRangeOfPlayer(update.Player)) DebugOverlay.Line(GetAbsOrigin(), update.Player.WorldSpaceCenter(), 255, 255, 255, true, persist); @@ -346,7 +346,7 @@ public void DelegateStartTouch(BaseEntity ent) { // Add us to the player's list of soundscapes and player.TriggerSoundscapeList.Insert(0, GetRefEHandle()); - WriteAudioParamsTo(ref player.GetAudioParams()); + WriteAudioParamsTo(ref player.GetAudioParamsForModify()); } public void DelegateEndTouch(BaseEntity ent) { @@ -358,7 +358,7 @@ public void DelegateEndTouch(BaseEntity ent) { while (player.TriggerSoundscapeList.Count > 0) { if (player.TriggerSoundscapeList[0].Get() is EnvSoundscapeTriggerable ss) { // Make this one current. - ss.WriteAudioParamsTo(ref player.GetAudioParams()); + ss.WriteAudioParamsTo(ref player.GetAudioParamsForModify()); return; } else @@ -366,7 +366,7 @@ public void DelegateEndTouch(BaseEntity ent) { } // No soundscapes left. - player.GetAudioParams().Ent.Set(null); + player.GetAudioParamsForModify().Ent.Set(null); } // Overrides the base class's think and prevents it from running at all. diff --git a/Game.Server/SoundscapeSystem.cs b/Game.Server/SoundscapeSystem.cs index 9075c678..b712c62b 100644 --- a/Game.Server/SoundscapeSystem.cs +++ b/Game.Server/SoundscapeSystem.cs @@ -315,7 +315,7 @@ public override void FrameUpdatePostEntityThink() { if (player != null && player.IsNetClient()) { // check to see if this is the sound entity that is // currently affecting this player - ref AudioParams audio = ref player.GetAudioParams(); + ref readonly AudioParams audio = ref player.GetAudioParams(); // if we got this far, we're looking at an entity that is contending // for current player sound. the closest entity to player wins. diff --git a/Game.Server/SpatialEntity.cs b/Game.Server/SpatialEntity.cs index ffdb3271..ee1f496b 100644 --- a/Game.Server/SpatialEntity.cs +++ b/Game.Server/SpatialEntity.cs @@ -3,25 +3,24 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; -[NetworkName("CSpatialEntity")] -public class SpatialEntity : BaseEntity +[NetworkName("CSpatialEntity", NoBase = true)] +public partial class SpatialEntity : BaseEntity { - public static readonly SendTable DT_SpatialEntity = new([ - SendPropVector(NetworkVarFields.Origin, 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MinFalloff)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MaxFalloff)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(CurWeight)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(Enabled))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_SpatialEntity); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Origin)) { Encoding = NetEncoding.Vector, Bits = 0, Flags = PropFlags.NoScale, Proxy = typeof(OriginProxy) }, + new(nameof(MinFalloff)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxFalloff)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(CurWeight)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Enabled), + ]; - [NetworkName("m_MinFalloff")] - public float MinFalloff; - [NetworkName("m_MaxFalloff")] - public float MaxFalloff; - [NetworkName("m_flCurWeight")] - public float CurWeight; - [NetworkName("m_bEnabled")] - public bool Enabled; + [NetworkVar("m_MinFalloff")] + public partial float MinFalloff { get; set; } + [NetworkVar("m_MaxFalloff")] + public partial float MaxFalloff { get; set; } + [NetworkVar("m_flCurWeight")] + public partial float CurWeight { get; set; } + [NetworkVar("m_bEnabled")] + public partial bool Enabled { get; set; } } diff --git a/Game.Server/SporeExplosion.cs b/Game.Server/SporeExplosion.cs index ead6e0cc..8ea7720e 100644 --- a/Game.Server/SporeExplosion.cs +++ b/Game.Server/SporeExplosion.cs @@ -3,34 +3,33 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_sporeexplosion")] -[NetworkName("SporeExplosion")] -public class SporeExplosion : BaseParticleEntity +[NetworkName("SporeExplosion", Table = "DT_SporeExplosion")] +public partial class SporeExplosion : BaseParticleEntity { - public static readonly SendTable DT_SporeExplosion = new(DT_BaseParticleEntity, [ - SendPropFloat(FIELD.OF(nameof(SpawnRate)), 8, 0, 1, 1024), - SendPropFloat(FIELD.OF(nameof(ParticleLifetime)), 16, PropFlags.RoundUp, 0.1f, 100), - SendPropFloat(FIELD.OF(nameof(StartSize)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(EndSize)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(SpawnRadius)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(Emit))), - SendPropBool(FIELD.OF(nameof(DontRemove))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_SporeExplosion); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SpawnRate)) { Bits = 8, Low = 1.0f, High = 1024.0f }, + new(nameof(ParticleLifetime)) { Bits = 16, Flags = PropFlags.RoundUp, Low = 0.1f, High = 100.0f }, + new(nameof(StartSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EndSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpawnRadius)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Emit), + nameof(DontRemove), + ]; - [NetworkName("m_flSpawnRate")] - public float SpawnRate; - [NetworkName("m_flParticleLifetime")] - public float ParticleLifetime; - [NetworkName("m_flStartSize")] - public float StartSize; - [NetworkName("m_flEndSize")] - public float EndSize; - [NetworkName("m_flSpawnRadius")] - public float SpawnRadius; - [NetworkName("m_bEmit")] - public bool Emit; - [NetworkName("m_bDontRemove")] - public bool DontRemove; + [NetworkVar("m_flSpawnRate")] + public partial float SpawnRate { get; set; } + [NetworkVar("m_flParticleLifetime")] + public partial float ParticleLifetime { get; set; } + [NetworkVar("m_flStartSize")] + public partial float StartSize { get; set; } + [NetworkVar("m_flEndSize")] + public partial float EndSize { get; set; } + [NetworkVar("m_flSpawnRadius")] + public partial float SpawnRadius { get; set; } + [NetworkVar("m_bEmit")] + public partial bool Emit { get; set; } + [NetworkVar("m_bDontRemove")] + public partial bool DontRemove { get; set; } } diff --git a/Game.Server/SporeTrail.cs b/Game.Server/SporeTrail.cs index cd321332..bbf72184 100644 --- a/Game.Server/SporeTrail.cs +++ b/Game.Server/SporeTrail.cs @@ -3,34 +3,33 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_sporetrail")] -[NetworkName("SporeTrail")] -public class SporeTrail : BaseParticleEntity +[NetworkName("SporeTrail", Table = "DT_SporeTrail")] +public partial class SporeTrail : BaseParticleEntity { - public static readonly SendTable DT_SporeTrail = new(DT_BaseParticleEntity, [ - SendPropFloat(FIELD.OF(nameof(SpawnRate)), 8, 0, 1, 1024), - SendPropVector(FIELD.OF(nameof(EndColor)), 8, 0, 0, 1), - SendPropFloat(FIELD.OF(nameof(ParticleLifetime)), 16, PropFlags.RoundUp, 0.1f, 100), - SendPropFloat(FIELD.OF(nameof(StartSize)), -1, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(EndSize)), -1, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(SpawnRadius)), -1, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(Emit))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_SporeTrail); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SpawnRate)) { Bits = 8, Low = 1.0f, High = 1024.0f }, + new(nameof(EndColor)) { Bits = 8, Low = 0.0f, High = 1.0f }, + new(nameof(ParticleLifetime)) { Bits = 16, Flags = PropFlags.RoundUp, Low = 0.1f, High = 100.0f }, + new(nameof(StartSize)) { Bits = -1, Flags = PropFlags.NoScale }, + new(nameof(EndSize)) { Bits = -1, Flags = PropFlags.NoScale }, + new(nameof(SpawnRadius)) { Bits = -1, Flags = PropFlags.NoScale }, + nameof(Emit), + ]; - [NetworkName("m_flSpawnRate")] - public float SpawnRate; - [NetworkName("m_vecEndColor")] - public Vector3 EndColor; - [NetworkName("m_flParticleLifetime")] - public float ParticleLifetime; - [NetworkName("m_flStartSize")] - public float StartSize; - [NetworkName("m_flEndSize")] - public float EndSize; - [NetworkName("m_flSpawnRadius")] - public float SpawnRadius; - [NetworkName("m_bEmit")] - public bool Emit; + [NetworkVar("m_flSpawnRate")] + public partial float SpawnRate { get; set; } + [NetworkVar("m_vecEndColor")] + public partial Vector3 EndColor { get; set; } + [NetworkVar("m_flParticleLifetime")] + public partial float ParticleLifetime { get; set; } + [NetworkVar("m_flStartSize")] + public partial float StartSize { get; set; } + [NetworkVar("m_flEndSize")] + public partial float EndSize { get; set; } + [NetworkVar("m_flSpawnRadius")] + public partial float SpawnRadius { get; set; } + [NetworkVar("m_bEmit")] + public partial bool Emit { get; set; } } diff --git a/Game.Server/SpotlightEnd.cs b/Game.Server/SpotlightEnd.cs index f483c168..4bff5b8d 100644 --- a/Game.Server/SpotlightEnd.cs +++ b/Game.Server/SpotlightEnd.cs @@ -6,20 +6,19 @@ namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("spotlight_end")] [NetworkName("CSpotlightEnd")] -public class SpotlightEnd : BaseEntity +public partial class SpotlightEnd : BaseEntity { - public static readonly SendTable DT_SpotlightEnd = new(DT_BaseEntity, [ - SendPropFloat(FIELD.OF(nameof(LightScale)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(Radius)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_SpotlightEnd); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(LightScale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Radius)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flLightScale")] - public float LightScale; - [NetworkName("m_Radius")] - public float Radius; + [NetworkVar("m_flLightScale")] + public partial float LightScale { get; set; } + [NetworkVar("m_Radius")] + public partial float Radius { get; set; } } diff --git a/Game.Server/SteamJet.cs b/Game.Server/SteamJet.cs index 0ef93e9d..d57917df 100644 --- a/Game.Server/SteamJet.cs +++ b/Game.Server/SteamJet.cs @@ -3,47 +3,46 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("env_steam")] [LinkEntityToClass("env_steamjet")] [NetworkName("CSteamJet")] -public class SteamJet : BaseParticleEntity +public partial class SteamJet : BaseParticleEntity { - public static readonly SendTable DT_SteamJet = new(DT_BaseParticleEntity, [ - SendPropFloat(FIELD.OF(nameof(SpreadSpeed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(Speed)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(StartSize)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(EndSize)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(Rate)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(JetLength)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(Emit))), - SendPropBool(FIELD.OF(nameof(FaceLeft))), - SendPropInt(FIELD.OF(nameof(Type)), 2, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Spawnflags)), 8, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(RollSpeed)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_SteamJet); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SpreadSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Speed)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EndSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Rate)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(JetLength)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(Emit), + nameof(FaceLeft), + new(nameof(Type)) { Bits = 2, Flags = PropFlags.Unsigned }, + new(nameof(Spawnflags)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(RollSpeed)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_SpreadSpeed")] - public float SpreadSpeed; - [NetworkName("m_Speed")] - public new float Speed; - [NetworkName("m_StartSize")] - public float StartSize; - [NetworkName("m_EndSize")] - public float EndSize; - [NetworkName("m_Rate")] - public float Rate; - [NetworkName("m_JetLength")] - public float JetLength; - [NetworkName("m_bEmit")] - public bool Emit; - [NetworkName("m_bFaceLeft")] - public bool FaceLeft; - [NetworkName("m_nType")] - public int Type; - [NetworkName("m_spawnflags")] - public int Spawnflags; - [NetworkName("m_flRollSpeed")] - public float RollSpeed; + [NetworkVar("m_SpreadSpeed")] + public partial float SpreadSpeed { get; set; } + [NetworkVar("m_Speed")] + public new partial float Speed { get; set; } + [NetworkVar("m_StartSize")] + public partial float StartSize { get; set; } + [NetworkVar("m_EndSize")] + public partial float EndSize { get; set; } + [NetworkVar("m_Rate")] + public partial float Rate { get; set; } + [NetworkVar("m_JetLength")] + public partial float JetLength { get; set; } + [NetworkVar("m_bEmit")] + public partial bool Emit { get; set; } + [NetworkVar("m_bFaceLeft")] + public partial bool FaceLeft { get; set; } + [NetworkVar("m_nType")] + public partial int Type { get; set; } + [NetworkVar("m_spawnflags")] + public partial int Spawnflags { get; set; } + [NetworkVar("m_flRollSpeed")] + public partial float RollSpeed { get; set; } } diff --git a/Game.Server/Sun.cs b/Game.Server/Sun.cs index 93a27593..07ffac06 100644 --- a/Game.Server/Sun.cs +++ b/Game.Server/Sun.cs @@ -6,40 +6,40 @@ using System.Numerics; namespace Game.Server; -using FIELD = Source.FIELD; [LinkEntityToClass("env_sun")] -[NetworkName("CSun")] -public class Sun : BaseEntity +[NetworkName("CSun", NoBase = true)] +public partial class Sun : BaseEntity { - public static readonly SendTable DT_Sun = new([ - SendPropInt(FIELD.OF(nameof(Render)), 32, PropFlags.Unsigned, SendProxy_Color32ToInt), - SendPropInt(FIELD.OF(nameof(Overlay)), 32, PropFlags.Unsigned, SendProxy_Color32ToInt), - SendPropVector(FIELD.OF(nameof(Direction)), 0, PropFlags.Normal), - SendPropInt(FIELD.OF(nameof(On)), 1, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Size)), 10, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(OverlaySize)), 10, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Material)), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(OverlayMaterial)), 32, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(HDRColorScale)), 0, PropFlags.NoScale, 0.0f, 100.0f), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_Sun); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Render)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned, Proxy = typeof(Color32Proxy) }, + new(nameof(Overlay)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned, Proxy = typeof(Color32Proxy) }, + new(nameof(Direction)) { Bits = 0, Flags = PropFlags.Normal }, + new(nameof(On)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(Size)) { Bits = 10, Flags = PropFlags.Unsigned }, + new(nameof(OverlaySize)) { Bits = 10, Flags = PropFlags.Unsigned }, + new(nameof(Material)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(OverlayMaterial)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(HDRColorScale)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale, Low = 0.0f, High = 100.0f }, + ]; - [NetworkName("m_clrRender")] - public Color Render; - [NetworkName("m_clrOverlay")] - public Color Overlay; - [NetworkName("m_vDirection")] - public Vector3 Direction; - [NetworkName("m_bOn")] - public bool On; - [NetworkName("m_nSize")] - public int Size; - [NetworkName("m_nOverlaySize")] - public int OverlaySize; - [NetworkName("m_nMaterial")] - public int Material; - [NetworkName("m_nOverlayMaterial")] - public int OverlayMaterial; - public int HDRColorScale; + [NetworkVar("m_clrRender")] + public partial Color Render { get; set; } + [NetworkVar("m_clrOverlay")] + public partial Color Overlay { get; set; } + [NetworkVar("m_vDirection")] + public partial Vector3 Direction { get; set; } + [NetworkVar("m_bOn")] + public partial bool On { get; set; } + [NetworkVar("m_nSize")] + public partial int Size { get; set; } + [NetworkVar("m_nOverlaySize")] + public partial int OverlaySize { get; set; } + [NetworkVar("m_nMaterial")] + public partial int Material { get; set; } + [NetworkVar("m_nOverlayMaterial")] + public partial int OverlayMaterial { get; set; } + [NetworkVar("HDRColorScale")] + public partial int HDRColorScale { get; set; } } diff --git a/Game.Server/TEAntlionDust.cs b/Game.Server/TEAntlionDust.cs index 34765318..1412c451 100644 --- a/Game.Server/TEAntlionDust.cs +++ b/Game.Server/TEAntlionDust.cs @@ -3,19 +3,18 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEAntlionDust")] -public class TEAntlionDust(ReadOnlySpan name) : TEParticleSystem(name) +public partial class TEAntlionDust(ReadOnlySpan name) : TEParticleSystem(name) { - public static readonly SendTable DT_TEAntlionDust = new(DT_TEParticleSystem, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(Angles)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(BlockedSpawner))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEAntlionDust); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Origin)) { Encoding = NetEncoding.Vector, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Angles)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(BlockedSpawner), + ]; - [NetworkName("m_vecAngles")] + [NetworkVar("m_vecAngles")] public Vector3 Angles; - [NetworkName("m_bBlockedSpawner")] + [NetworkVar("m_bBlockedSpawner")] public bool BlockedSpawner; } diff --git a/Game.Server/TEArmorRicochet.cs b/Game.Server/TEArmorRicochet.cs index 35e50798..1e502dd3 100644 --- a/Game.Server/TEArmorRicochet.cs +++ b/Game.Server/TEArmorRicochet.cs @@ -3,11 +3,11 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEArmorRicochet")] -public class TEArmorRicochet(ReadOnlySpan name) : TEMetalSparks(name) +public partial class TEArmorRicochet(ReadOnlySpan name) : TEMetalSparks(name) { - public static readonly SendTable DT_TEArmorRicochet = new(DT_TEMetalSparks, [ - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEArmorRicochet); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Server/TEBSPDecal.cs b/Game.Server/TEBSPDecal.cs index ee1cefca..e3d3f9a3 100644 --- a/Game.Server/TEBSPDecal.cs +++ b/Game.Server/TEBSPDecal.cs @@ -3,21 +3,20 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEBSPDecal")] -public class TEBSPDecal(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEBSPDecal(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEBSPDecal = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(Entity)), 13, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Index)), 9, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEBSPDecal); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Entity)) { Bits = 13, Flags = PropFlags.Unsigned }, + new(nameof(Index)) { Bits = 9, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_nEntity")] + [NetworkVar("m_nEntity")] public int Entity; - [NetworkName("m_nIndex")] + [NetworkVar("m_nIndex")] public int Index; } diff --git a/Game.Server/TEBeamEntPoint.cs b/Game.Server/TEBeamEntPoint.cs index 271fc2c5..e486d0f0 100644 --- a/Game.Server/TEBeamEntPoint.cs +++ b/Game.Server/TEBeamEntPoint.cs @@ -3,24 +3,23 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEBeamEntPoint")] -public class TEBeamEntPoint(ReadOnlySpan name) : BaseBeam(name) +public partial class TEBeamEntPoint(ReadOnlySpan name) : BaseBeam(name) { - public static readonly SendTable DT_TEBeamEntPoint = new(DT_BaseBeam, [ - SendPropInt(FIELD.OF(nameof(StartEntity)), 24, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(EndEntity)), 24, PropFlags.Unsigned), - SendPropVector(FIELD.OF(nameof(StartPoint)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(EndPoint)), 0, PropFlags.Coord), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEBeamEntPoint); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartEntity)) { Bits = 24, Flags = PropFlags.Unsigned }, + new(nameof(EndEntity)) { Bits = 24, Flags = PropFlags.Unsigned }, + new(nameof(StartPoint)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(EndPoint)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_nStartEntity")] + [NetworkVar("m_nStartEntity")] public int StartEntity; - [NetworkName("m_nEndEntity")] + [NetworkVar("m_nEndEntity")] public int EndEntity; - [NetworkName("m_vecStartPoint")] + [NetworkVar("m_vecStartPoint")] public Vector3 StartPoint; - [NetworkName("m_vecEndPoint")] + [NetworkVar("m_vecEndPoint")] public Vector3 EndPoint; } diff --git a/Game.Server/TEBeamEnts.cs b/Game.Server/TEBeamEnts.cs index 20b16487..878a1703 100644 --- a/Game.Server/TEBeamEnts.cs +++ b/Game.Server/TEBeamEnts.cs @@ -3,18 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEBeamEnts")] -public class TEBeamEnts(ReadOnlySpan name) : BaseBeam(name) +public partial class TEBeamEnts(ReadOnlySpan name) : BaseBeam(name) { - public static readonly SendTable DT_TEBeamEnts = new(DT_BaseBeam, [ - SendPropInt(FIELD.OF(nameof(StartEntity)), 24, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(EndEntity)), 24, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEBeamEnts); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartEntity)) { Bits = 24, Flags = PropFlags.Unsigned }, + new(nameof(EndEntity)) { Bits = 24, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nStartEntity")] + [NetworkVar("m_nStartEntity")] public int StartEntity; - [NetworkName("m_nEndEntity")] + [NetworkVar("m_nEndEntity")] public int EndEntity; } diff --git a/Game.Server/TEBeamFollow.cs b/Game.Server/TEBeamFollow.cs index 997a6ead..eede823a 100644 --- a/Game.Server/TEBeamFollow.cs +++ b/Game.Server/TEBeamFollow.cs @@ -3,15 +3,14 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEBeamFollow")] -public class TEBeamFollow(ReadOnlySpan name) : BaseBeam(name) +public partial class TEBeamFollow(ReadOnlySpan name) : BaseBeam(name) { - public static readonly SendTable DT_TEBeamFollow = new(DT_BaseBeam, [ - SendPropInt(FIELD.OF(nameof(EntIndex)), 24, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEBeamFollow); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(EntIndex)) { Bits = 24, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_iEntIndex")] + [NetworkVar("m_iEntIndex")] public int EntIndex; } diff --git a/Game.Server/TEBeamLaser.cs b/Game.Server/TEBeamLaser.cs index c5a4bdaa..fd6b930b 100644 --- a/Game.Server/TEBeamLaser.cs +++ b/Game.Server/TEBeamLaser.cs @@ -3,18 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEBeamLaser")] -public class TEBeamLaser(ReadOnlySpan name) : BaseBeam(name) +public partial class TEBeamLaser(ReadOnlySpan name) : BaseBeam(name) { - public static readonly SendTable DT_TEBeamLaser = new(DT_BaseBeam, [ - SendPropInt(FIELD.OF(nameof(StartEntity)), 24, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(EndEntity)), 24, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEBeamLaser); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartEntity)) { Bits = 24, Flags = PropFlags.Unsigned }, + new(nameof(EndEntity)) { Bits = 24, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nStartEntity")] + [NetworkVar("m_nStartEntity")] public int StartEntity; - [NetworkName("m_nEndEntity")] + [NetworkVar("m_nEndEntity")] public int EndEntity; } diff --git a/Game.Server/TEBeamPoints.cs b/Game.Server/TEBeamPoints.cs index d9a7e7b3..63dd72c1 100644 --- a/Game.Server/TEBeamPoints.cs +++ b/Game.Server/TEBeamPoints.cs @@ -3,18 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEBeamPoints")] -public class TEBeamPoints(ReadOnlySpan name) : BaseBeam(name) +public partial class TEBeamPoints(ReadOnlySpan name) : BaseBeam(name) { - public static readonly SendTable DT_TEBeamPoints = new(DT_BaseBeam, [ - SendPropVector(FIELD.OF(nameof(StartPoint)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(EndPoint)), 0, PropFlags.Coord), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEBeamPoints); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartPoint)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(EndPoint)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_vecStartPoint")] + [NetworkVar("m_vecStartPoint")] public Vector3 StartPoint; - [NetworkName("m_vecEndPoint")] + [NetworkVar("m_vecEndPoint")] public Vector3 EndPoint; } diff --git a/Game.Server/TEBeamRing.cs b/Game.Server/TEBeamRing.cs index 8db269c9..a766bdad 100644 --- a/Game.Server/TEBeamRing.cs +++ b/Game.Server/TEBeamRing.cs @@ -3,18 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEBeamRing")] -public class TEBeamRing(ReadOnlySpan name) : BaseBeam(name) +public partial class TEBeamRing(ReadOnlySpan name) : BaseBeam(name) { - public static readonly SendTable DT_TEBeamRing = new(DT_BaseBeam, [ - SendPropInt(FIELD.OF(nameof(StartEntity)), 13, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(EndEntity)), 13, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEBeamRing); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartEntity)) { Bits = 13, Flags = PropFlags.Unsigned }, + new(nameof(EndEntity)) { Bits = 13, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nStartEntity")] + [NetworkVar("m_nStartEntity")] public int StartEntity; - [NetworkName("m_nEndEntity")] + [NetworkVar("m_nEndEntity")] public int EndEntity; } diff --git a/Game.Server/TEBeamRingPoint.cs b/Game.Server/TEBeamRingPoint.cs index 62fa27b3..5ccb69d6 100644 --- a/Game.Server/TEBeamRingPoint.cs +++ b/Game.Server/TEBeamRingPoint.cs @@ -3,21 +3,20 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEBeamRingPoint")] -public class TEBeamRingPoint(ReadOnlySpan name) : BaseBeam(name) +public partial class TEBeamRingPoint(ReadOnlySpan name) : BaseBeam(name) { - public static readonly SendTable DT_TEBeamRingPoint = new(DT_BaseBeam, [ - SendPropVector(FIELD.OF(nameof(Center)), 0, PropFlags.Coord), - SendPropFloat(FIELD.OF(nameof(LStartRadius)), 16, PropFlags.RoundUp, 0.0f, 4096.0f), - SendPropFloat(FIELD.OF(nameof(LEndRadius)), 16, PropFlags.RoundUp, 0.0f, 4096.0f), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEBeamRingPoint); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Center)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(LStartRadius)) { Bits = 16, Flags = PropFlags.RoundUp, Low = 0.0f, High = 4096.0f }, + new(nameof(LEndRadius)) { Bits = 16, Flags = PropFlags.RoundUp, Low = 0.0f, High = 4096.0f }, + ]; - [NetworkName("m_vecCenter")] + [NetworkVar("m_vecCenter")] public Vector3 Center; - [NetworkName("m_flStartRadius")] + [NetworkVar("m_flStartRadius")] public float LStartRadius; - [NetworkName("m_flEndRadius")] + [NetworkVar("m_flEndRadius")] public float LEndRadius; } diff --git a/Game.Server/TEBeamSpline.cs b/Game.Server/TEBeamSpline.cs index 5508cce1..f720020a 100644 --- a/Game.Server/TEBeamSpline.cs +++ b/Game.Server/TEBeamSpline.cs @@ -3,19 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; -[NetworkName("CTEBeamSpline")] -public class TEBeamSpline(ReadOnlySpan name) : BaseTempEntity(name) +[NetworkName("CTEBeamSpline", NoBase = true)] +public partial class TEBeamSpline(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEBeamSpline = new([ - SendPropInt(FIELD.OF(nameof(NumPoints)), 5, PropFlags.Unsigned), - SendPropVector(FIELD.OF_SENDINFO_ARRAY(nameof(Points)), -1, PropFlags.Coord), - SendPropArray(FIELD.OF_ARRAY(nameof(Points))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEBeamSpline); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(NumPoints)) { Bits = 5, Flags = PropFlags.Unsigned }, + new(nameof(Points)) { Encoding = NetEncoding.Array, Bits = -1, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_nPoints")] + [NetworkVar("m_nPoints")] public int NumPoints; - [NetworkName("m_vecPoints")] + [NetworkVar("m_vecPoints")] public InlineArrayMaxSplinePoints Points; } diff --git a/Game.Server/TEBloodSprite.cs b/Game.Server/TEBloodSprite.cs index 88e935f2..54e85fe9 100644 --- a/Game.Server/TEBloodSprite.cs +++ b/Game.Server/TEBloodSprite.cs @@ -3,35 +3,34 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; -[NetworkName("CTEBloodSprite")] -public class TEBloodSprite +[NetworkName("CTEBloodSprite", NoBase = true)] +public partial class TEBloodSprite(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEBloodSprite = new([ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(Direction)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(R)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(G)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(B)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(A)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Size)), 8, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEBloodSprite); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Direction)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(R)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(G)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(B)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(A)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Size)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_vecDirection")] + [NetworkVar("m_vecDirection")] public Vector3 Direction; - [NetworkName("r")] + [NetworkVar("r")] public int R; - [NetworkName("g")] + [NetworkVar("g")] public int G; - [NetworkName("b")] + [NetworkVar("b")] public int B; - [NetworkName("a")] + [NetworkVar("a")] public int A; public int SprayModel; public int DropModel; - [NetworkName("m_nSize")] + [NetworkVar("m_nSize")] public int Size; } diff --git a/Game.Server/TEBloodStream.cs b/Game.Server/TEBloodStream.cs index 0e57ead8..e0a6a797 100644 --- a/Game.Server/TEBloodStream.cs +++ b/Game.Server/TEBloodStream.cs @@ -3,30 +3,29 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEBloodStream")] -public class TEBloodStream(ReadOnlySpan name) : TEParticleSystem(name) +public partial class TEBloodStream(ReadOnlySpan name) : TEParticleSystem(name) { - public static readonly SendTable DT_TEBloodStream = new(DT_TEParticleSystem, [ - SendPropVector(FIELD.OF(nameof(Direction)), 11, 0, -10.0f, 10.0f), - SendPropInt(FIELD.OF(nameof(R)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(G)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(B)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(A)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Amount)), 8, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEBloodStream); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Direction)) { Bits = 11, Low = -10.0f, High = 10.0f }, + new(nameof(R)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(G)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(B)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(A)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Amount)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecDirection")] + [NetworkVar("m_vecDirection")] public Vector3 Direction; - [NetworkName("r")] + [NetworkVar("r")] public int R; - [NetworkName("g")] + [NetworkVar("g")] public int G; - [NetworkName("b")] + [NetworkVar("b")] public int B; - [NetworkName("a")] + [NetworkVar("a")] public int A; - [NetworkName("m_nAmount")] + [NetworkVar("m_nAmount")] public int Amount; } diff --git a/Game.Server/TEBreakModel.cs b/Game.Server/TEBreakModel.cs index c5e97b41..58b91383 100644 --- a/Game.Server/TEBreakModel.cs +++ b/Game.Server/TEBreakModel.cs @@ -6,41 +6,38 @@ using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEBreakModel")] -public class TEBreakModel(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEBreakModel(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEBreakModel = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropAngle(FIELD.OF_VECTORELEM(nameof(Rotation), 0), 13, PropFlags.RoundDown), - SendPropAngle(FIELD.OF_VECTORELEM(nameof(Rotation), 1), 13, PropFlags.RoundDown), - SendPropAngle(FIELD.OF_VECTORELEM(nameof(Rotation), 2), 13, PropFlags.RoundDown), - SendPropVector(FIELD.OF(nameof(Size)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(Velocity)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(ModelIndex)), 14, 0), - SendPropInt(FIELD.OF(nameof(Randomization)), 9, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Count)), 8, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(Time)), 10, 0, 0, 102.4f), - SendPropInt(FIELD.OF(nameof(Flags)), 8, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEBreakModel); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Rotation)) { Encoding = NetEncoding.VectorElements, Bits = 13, Flags = PropFlags.RoundDown }, + new(nameof(Size)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Velocity)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(Randomization)) { Bits = 9, Flags = PropFlags.Unsigned }, + new(nameof(Count)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Time)) { Bits = 10, Low = 0.0f, High = 102.4f }, + new(nameof(Flags)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_angRotation")] + [NetworkVar("m_angRotation")] public QAngle Rotation; - [NetworkName("m_vecSize")] + [NetworkVar("m_vecSize")] public Vector3 Size; - [NetworkName("m_vecVelocity")] + [NetworkVar("m_vecVelocity")] public Vector3 Velocity; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_nRandomization")] + [NetworkVar("m_nRandomization")] public int Randomization; - [NetworkName("m_nCount")] + [NetworkVar("m_nCount")] public int Count; - [NetworkName("m_fTime")] + [NetworkVar("m_fTime")] public float Time; - [NetworkName("m_nFlags")] + [NetworkVar("m_nFlags")] public int Flags; } diff --git a/Game.Server/TEBubbleTrail.cs b/Game.Server/TEBubbleTrail.cs index 5988f3ec..7d6b7626 100644 --- a/Game.Server/TEBubbleTrail.cs +++ b/Game.Server/TEBubbleTrail.cs @@ -3,30 +3,29 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEBubbleTrail")] -public class TEBubbleTrail(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEBubbleTrail(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEBubbleTrail = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Mins)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(Maxs)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(ModelIndex)), 14, 0), - SendPropFloat(FIELD.OF(nameof(LWaterZ)), 17, 0, MIN_COORD_INTEGER, MAX_COORD_INTEGER), - SendPropInt(FIELD.OF(nameof(Count)), 8, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(Speed)), 17, 0, MIN_COORD_INTEGER, MAX_COORD_INTEGER), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEBubbleTrail); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Mins)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Maxs)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(LWaterZ)) { Bits = 17, Low = MIN_COORD_INTEGER, High = MAX_COORD_INTEGER }, + new(nameof(Count)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Speed)) { Bits = 17, Low = MIN_COORD_INTEGER, High = MAX_COORD_INTEGER }, + ]; - [NetworkName("m_vecMins")] + [NetworkVar("m_vecMins")] public Vector3 Mins; - [NetworkName("m_vecMaxs")] + [NetworkVar("m_vecMaxs")] public Vector3 Maxs; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_flWaterZ")] + [NetworkVar("m_flWaterZ")] public float LWaterZ; - [NetworkName("m_nCount")] + [NetworkVar("m_nCount")] public int Count; - [NetworkName("m_fSpeed")] + [NetworkVar("m_fSpeed")] public float Speed; } diff --git a/Game.Server/TEBubbles.cs b/Game.Server/TEBubbles.cs index d1906de4..84d4bc0f 100644 --- a/Game.Server/TEBubbles.cs +++ b/Game.Server/TEBubbles.cs @@ -3,30 +3,29 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEBubbles")] -public class TEBubbles(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEBubbles(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEBubbles = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Mins)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(Maxs)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(ModelIndex)), 14, 0), - SendPropFloat(FIELD.OF(nameof(Height)), 17, 0, MIN_COORD_INTEGER, MAX_COORD_INTEGER), - SendPropInt(FIELD.OF(nameof(Count)), 8, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(Speed)), 17, 0, MIN_COORD_INTEGER, MAX_COORD_INTEGER), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEBubbles); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Mins)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Maxs)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(Height)) { Bits = 17, Low = MIN_COORD_INTEGER, High = MAX_COORD_INTEGER }, + new(nameof(Count)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Speed)) { Bits = 17, Low = MIN_COORD_INTEGER, High = MAX_COORD_INTEGER }, + ]; - [NetworkName("m_vecMins")] + [NetworkVar("m_vecMins")] public Vector3 Mins; - [NetworkName("m_vecMaxs")] + [NetworkVar("m_vecMaxs")] public Vector3 Maxs; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_fHeight")] + [NetworkVar("m_fHeight")] public float Height; - [NetworkName("m_nCount")] + [NetworkVar("m_nCount")] public int Count; - [NetworkName("m_fSpeed")] + [NetworkVar("m_fSpeed")] public float Speed; } diff --git a/Game.Server/TEClientProjectile.cs b/Game.Server/TEClientProjectile.cs index 7854d4aa..1512bb69 100644 --- a/Game.Server/TEClientProjectile.cs +++ b/Game.Server/TEClientProjectile.cs @@ -3,27 +3,26 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEClientProjectile")] -public class TEClientProjectile(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEClientProjectile(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEClientProjectile = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(Velocity)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(ModelIndex)), 14, 0), - SendPropInt(FIELD.OF(nameof(LifeTime)), 6, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(HOwner)), 23, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEClientProjectile); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Velocity)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(LifeTime)) { Bits = 6, Flags = PropFlags.Unsigned }, + new(nameof(HOwner)) { Bits = 23, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_vecVelocity")] + [NetworkVar("m_vecVelocity")] public Vector3 Velocity; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_nLifeTime")] + [NetworkVar("m_nLifeTime")] public int LifeTime; - [NetworkName("m_hOwner")] + [NetworkVar("m_hOwner")] public int HOwner; } diff --git a/Game.Server/TEConcussiveExplosion.cs b/Game.Server/TEConcussiveExplosion.cs index 6e80d86f..7d881bb7 100644 --- a/Game.Server/TEConcussiveExplosion.cs +++ b/Game.Server/TEConcussiveExplosion.cs @@ -3,24 +3,23 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEConcussiveExplosion")] -public class TEConcussiveExplosion(ReadOnlySpan name) : TEParticleSystem(name) +public partial class TEConcussiveExplosion(ReadOnlySpan name) : TEParticleSystem(name) { - public static readonly SendTable DT_TEConcussiveExplosion = new(DT_TEParticleSystem, [ - SendPropVector(FIELD.OF(nameof(Normal)), 0, PropFlags.Coord), - SendPropFloat(FIELD.OF(nameof(Scale)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(Radius)), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Magnitude)), 32, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEConcussiveExplosion); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Normal)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Scale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Radius)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(Magnitude)) { Bits = 32, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecNormal")] + [NetworkVar("m_vecNormal")] public Vector3 Normal; - [NetworkName("m_flScale")] + [NetworkVar("m_flScale")] public float Scale; - [NetworkName("m_nRadius")] + [NetworkVar("m_nRadius")] public int Radius; - [NetworkName("m_nMagnitude")] + [NetworkVar("m_nMagnitude")] public int Magnitude; } diff --git a/Game.Server/TEDecal.cs b/Game.Server/TEDecal.cs index 98efc923..559968ea 100644 --- a/Game.Server/TEDecal.cs +++ b/Game.Server/TEDecal.cs @@ -3,27 +3,26 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEDecal")] -public class TEDecal(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEDecal(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEDecal = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(Start)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(Entity)), 13, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Hitbox)), 12, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Index)), 9, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEDecal); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Start)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Entity)) { Bits = 13, Flags = PropFlags.Unsigned }, + new(nameof(Hitbox)) { Bits = 12, Flags = PropFlags.Unsigned }, + new(nameof(Index)) { Bits = 9, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_vecStart")] + [NetworkVar("m_vecStart")] public Vector3 Start; - [NetworkName("m_nEntity")] + [NetworkVar("m_nEntity")] public int Entity; - [NetworkName("m_nHitbox")] + [NetworkVar("m_nHitbox")] public int Hitbox; - [NetworkName("m_nIndex")] + [NetworkVar("m_nIndex")] public int Index; } diff --git a/Game.Server/TEDust.cs b/Game.Server/TEDust.cs index bf628abd..3a55d7ca 100644 --- a/Game.Server/TEDust.cs +++ b/Game.Server/TEDust.cs @@ -3,22 +3,21 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEDust")] -public class TEDust(ReadOnlySpan name) : TEParticleSystem(name) +public partial class TEDust(ReadOnlySpan name) : TEParticleSystem(name) { - public static readonly SendTable DT_TEDust = new(DT_TEParticleSystem, [ - SendPropFloat(FIELD.OF(nameof(LSize)), 0, PropFlags.Coord | PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(LSpeed)), 0, PropFlags.Coord | PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(Direction)), 4, 0, -1.0f, 1.0f), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEDust); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(LSize)) { Bits = 0, Flags = PropFlags.Coord | PropFlags.NoScale }, + new(nameof(LSpeed)) { Bits = 0, Flags = PropFlags.Coord | PropFlags.NoScale }, + new(nameof(Direction)) { Bits = 4, Low = -1.0f, High = 1.0f }, + ]; - [NetworkName("m_flSize")] + [NetworkVar("m_flSize")] public float LSize; - [NetworkName("m_flSpeed")] + [NetworkVar("m_flSpeed")] public float LSpeed; - [NetworkName("m_vecDirection")] + [NetworkVar("m_vecDirection")] public Vector3 Direction; } diff --git a/Game.Server/TEDynamicLight.cs b/Game.Server/TEDynamicLight.cs index 95d5a9cf..050733cd 100644 --- a/Game.Server/TEDynamicLight.cs +++ b/Game.Server/TEDynamicLight.cs @@ -3,36 +3,35 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEDynamicLight")] -public class TEDynamicLight(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEDynamicLight(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEDynamicLight = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(R)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(G)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(B)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Exponent)), 8, 0), - SendPropFloat(FIELD.OF(nameof(Radius)), 8, PropFlags.RoundUp, 0, 2560.0f), - SendPropFloat(FIELD.OF(nameof(Time)), 8, PropFlags.RoundDown, 0, 25.6f), - SendPropFloat(FIELD.OF(nameof(Decay)), 8, PropFlags.RoundDown, 0, 2560.0f), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEDynamicLight); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(R)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(G)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(B)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Exponent)) { Bits = 8 }, + new(nameof(Radius)) { Bits = 8, Flags = PropFlags.RoundUp, Low = 0, High = 2560.0f }, + new(nameof(Time)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0, High = 25.6f }, + new(nameof(Decay)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0, High = 2560.0f }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("r")] + [NetworkVar("r")] public int R; - [NetworkName("g")] + [NetworkVar("g")] public int G; - [NetworkName("b")] + [NetworkVar("b")] public int B; - [NetworkName("exponent")] + [NetworkVar("exponent")] public int Exponent; - [NetworkName("m_fRadius")] + [NetworkVar("m_fRadius")] public float Radius; - [NetworkName("m_fTime")] + [NetworkVar("m_fTime")] public float Time; - [NetworkName("m_fDecay")] + [NetworkVar("m_fDecay")] public float Decay; } diff --git a/Game.Server/TEEffectDispatch.cs b/Game.Server/TEEffectDispatch.cs index f8002001..50be8b4e 100644 --- a/Game.Server/TEEffectDispatch.cs +++ b/Game.Server/TEEffectDispatch.cs @@ -5,17 +5,16 @@ using System.Numerics; namespace Game.Server; -using FIELD = Source.FIELD; [NetworkName("CTEEffectDispatch")] -public class TEEffectDispatch(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEEffectDispatch(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEEffectDispatch = new(DT_BaseTempEntity, [ - SendPropDataTable("m_EffectData", FIELD.OF(nameof(EffectData)), EffectData.DT_EffectData), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEEffectDispatch); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(EffectData)) { Encoding = NetEncoding.DataTable, DataTable = "DT_EffectData" }, + ]; - [NetworkName("m_EffectData")] + [NetworkVar("m_EffectData")] public EffectData EffectData = new(); } diff --git a/Game.Server/TEEnergySplash.cs b/Game.Server/TEEnergySplash.cs index 7d2ce8da..41fd93b2 100644 --- a/Game.Server/TEEnergySplash.cs +++ b/Game.Server/TEEnergySplash.cs @@ -3,21 +3,20 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; -[NetworkName("CTEEnergySplash")] -public class TEEnergySplash(ReadOnlySpan name) : BaseTempEntity(name) +[NetworkName("CTEEnergySplash", NoBase = true)] +public partial class TEEnergySplash(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEEnergySplash = new([ - SendPropVector(FIELD.OF(nameof(Pos)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(Dir)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(Explosive)), 1, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEEnergySplash); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Pos)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Dir)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Explosive)) { Bits = 1, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecPos")] + [NetworkVar("m_vecPos")] public Vector3 Pos; - [NetworkName("m_vecDir")] + [NetworkVar("m_vecDir")] public Vector3 Dir; - [NetworkName("m_bExplosive")] + [NetworkVar("m_bExplosive")] public int Explosive; } diff --git a/Game.Server/TEExplosion.cs b/Game.Server/TEExplosion.cs index e3c9fa23..73b2af81 100644 --- a/Game.Server/TEExplosion.cs +++ b/Game.Server/TEExplosion.cs @@ -3,28 +3,27 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEExplosion")] -public class TEExplosion(ReadOnlySpan name) : TEParticleSystem(name) +public partial class TEExplosion(ReadOnlySpan name) : TEParticleSystem(name) { - public static readonly SendTable DT_TEExplosion = new(DT_TEParticleSystem, [ - SendPropFloat(FIELD.OF(nameof(Scale)), 9, 0, 0.0f, 51.2f), - SendPropInt(FIELD.OF(nameof(Flags)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Radius)), 16, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Magnitude)), 16, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEExplosion); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Scale)) { Bits = 9, Low = 0.0f, High = 51.2f }, + new(nameof(Flags)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Radius)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(Magnitude)) { Bits = 16, Flags = PropFlags.Unsigned }, + ]; public int ModelIndex; - [NetworkName("m_fScale")] + [NetworkVar("m_fScale")] public float Scale; public int FrameRate; - [NetworkName("m_nFlags")] + [NetworkVar("m_nFlags")] public int Flags; public Vector3 Normal; public int ChMaterialType; - [NetworkName("m_nRadius")] + [NetworkVar("m_nRadius")] public int Radius; - [NetworkName("m_nMagnitude")] + [NetworkVar("m_nMagnitude")] public int Magnitude; } diff --git a/Game.Server/TEFizz.cs b/Game.Server/TEFizz.cs index 9369a842..cccf951d 100644 --- a/Game.Server/TEFizz.cs +++ b/Game.Server/TEFizz.cs @@ -3,24 +3,23 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEFizz")] -public class TEFizz(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEFizz(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEFizz = new(DT_BaseTempEntity, [ - SendPropInt(FIELD.OF(nameof(Entity)), 13, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(ModelIndex)), 14, 0), - SendPropInt(FIELD.OF(nameof(Density)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Current)), 16, 0), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEFizz); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Entity)) { Bits = 13, Flags = PropFlags.Unsigned }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(Density)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Current)) { Bits = 16 }, + ]; - [NetworkName("m_nEntity")] + [NetworkVar("m_nEntity")] public int Entity; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_nDensity")] + [NetworkVar("m_nDensity")] public int Density; - [NetworkName("m_nCurrent")] + [NetworkVar("m_nCurrent")] public int Current; } diff --git a/Game.Server/TEFootprintDecal.cs b/Game.Server/TEFootprintDecal.cs index 24573531..dcad87ed 100644 --- a/Game.Server/TEFootprintDecal.cs +++ b/Game.Server/TEFootprintDecal.cs @@ -3,25 +3,24 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEFootprintDecal")] -public class TEFootprintDecal(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEFootprintDecal(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEFootprintDecal = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(Direction)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(Entity)), 11, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Index)), 8, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEFootprintDecal); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Direction)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Entity)) { Bits = 11, Flags = PropFlags.Unsigned }, + new(nameof(Index)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_vecDirection")] + [NetworkVar("m_vecDirection")] public Vector3 Direction; - [NetworkName("m_nEntity")] + [NetworkVar("m_nEntity")] public int Entity; - [NetworkName("m_nIndex")] + [NetworkVar("m_nIndex")] public int Index; public int ChMaterialType; } diff --git a/Game.Server/TEGaussExplosion.cs b/Game.Server/TEGaussExplosion.cs index 98ca4604..0d0da739 100644 --- a/Game.Server/TEGaussExplosion.cs +++ b/Game.Server/TEGaussExplosion.cs @@ -3,18 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEGaussExplosion")] -public class TEGaussExplosion(ReadOnlySpan name) : TEParticleSystem(name) +public partial class TEGaussExplosion(ReadOnlySpan name) : TEParticleSystem(name) { - public static readonly SendTable DT_TEGaussExplosion = new(DT_TEParticleSystem, [ - SendPropInt(FIELD.OF(nameof(Type)), 2, PropFlags.Unsigned), - SendPropVector(FIELD.OF(nameof(Direction)), 0, PropFlags.Coord), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEGaussExplosion); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Type)) { Bits = 2, Flags = PropFlags.Unsigned }, + new(nameof(Direction)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_nType")] + [NetworkVar("m_nType")] public int Type; - [NetworkName("m_vecDirection")] + [NetworkVar("m_vecDirection")] public Vector3 Direction; } diff --git a/Game.Server/TEGlowSprite.cs b/Game.Server/TEGlowSprite.cs index 3d45185f..a3f4cca7 100644 --- a/Game.Server/TEGlowSprite.cs +++ b/Game.Server/TEGlowSprite.cs @@ -3,27 +3,26 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEGlowSprite")] -public class TEGlowSprite(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEGlowSprite(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEGlowSprite = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(ModelIndex)), 14, 0), - SendPropFloat(FIELD.OF(nameof(Scale)), 8, PropFlags.RoundDown, 0.0f, 25.6f), - SendPropFloat(FIELD.OF(nameof(Life)), 8, PropFlags.RoundDown, 0.0f, 25.6f), - SendPropInt(FIELD.OF(nameof(Brightness)), 8, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEGlowSprite); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(Scale)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0.0f, High = 25.6f }, + new(nameof(Life)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0.0f, High = 25.6f }, + new(nameof(Brightness)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_fScale")] + [NetworkVar("m_fScale")] public float Scale; - [NetworkName("m_fLife")] + [NetworkVar("m_fLife")] public float Life; - [NetworkName("m_nBrightness")] + [NetworkVar("m_nBrightness")] public int Brightness; } diff --git a/Game.Server/TEHL2MPFireBullets.cs b/Game.Server/TEHL2MPFireBullets.cs index 04aa0318..3a9933b5 100644 --- a/Game.Server/TEHL2MPFireBullets.cs +++ b/Game.Server/TEHL2MPFireBullets.cs @@ -3,45 +3,44 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; -[NetworkName("CTEHL2MPFireBullets")] -public class TEHL2MPFireBullets(ReadOnlySpan name) : BaseTempEntity(name) +[NetworkName("CTEHL2MPFireBullets", NoBase = true)] +public partial class TEHL2MPFireBullets(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEHL2MPFireBullets = new([ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(Dir)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(AmmoID)), 5, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Seed)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Shots)), 5, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Player)), 6, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(Spread)), 10, 0, 0, 1), - SendPropInt(FIELD.OF(nameof(DoImpacts)), 1, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(DoTracers)), 1, PropFlags.Unsigned), - SendPropString(FIELD.OF(nameof(TracerType)), 10, 0), - SendPropFloat(FIELD.OF(nameof(SpreadY)), 10, 0, 0, 1), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEHL2MPFireBullets); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Dir)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(AmmoID)) { Bits = 5, Flags = PropFlags.Unsigned }, + new(nameof(Seed)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Shots)) { Bits = 5, Flags = PropFlags.Unsigned }, + new(nameof(Player)) { Bits = 6, Flags = PropFlags.Unsigned }, + new(nameof(Spread)) { Bits = 10, Low = 0, High = 1 }, + new(nameof(DoImpacts)) { Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(DoTracers)) { Bits = 1, Flags = PropFlags.Unsigned }, + new(nameof(TracerType)) { Encoding = NetEncoding.String }, + new(nameof(SpreadY)) { Bits = 10, Low = 0, High = 1 }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_vecDir")] + [NetworkVar("m_vecDir")] public Vector3 Dir; - [NetworkName("m_iAmmoID")] + [NetworkVar("m_iAmmoID")] public int AmmoID; - [NetworkName("m_iSeed")] + [NetworkVar("m_iSeed")] public int Seed; - [NetworkName("m_iShots")] + [NetworkVar("m_iShots")] public int Shots; - [NetworkName("m_iPlayer")] + [NetworkVar("m_iPlayer")] public int Player; - [NetworkName("m_flSpread")] + [NetworkVar("m_flSpread")] public float Spread; - [NetworkName("m_bDoImpacts")] + [NetworkVar("m_bDoImpacts")] public int DoImpacts; - [NetworkName("m_bDoTracers")] + [NetworkVar("m_bDoTracers")] public int DoTracers; - [NetworkName("m_TracerType")] + [NetworkVar("m_TracerType")] public InlineArray256 TracerType; - [NetworkName("m_flSpreadY")] + [NetworkVar("m_flSpreadY")] public float SpreadY; } diff --git a/Game.Server/TEKillPlayerAttachments.cs b/Game.Server/TEKillPlayerAttachments.cs index 60997eb0..9d61a7e7 100644 --- a/Game.Server/TEKillPlayerAttachments.cs +++ b/Game.Server/TEKillPlayerAttachments.cs @@ -3,15 +3,14 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEKillPlayerAttachments")] -public class TEKillPlayerAttachments(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEKillPlayerAttachments(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEKillPlayerAttachments = new(DT_BaseTempEntity, [ - SendPropInt(FIELD.OF(nameof(Player)), 5, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEKillPlayerAttachments); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Player)) { Bits = 5, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_nPlayer")] + [NetworkVar("m_nPlayer")] public int Player; } diff --git a/Game.Server/TELargeFunnel.cs b/Game.Server/TELargeFunnel.cs index b98e97a8..4154209c 100644 --- a/Game.Server/TELargeFunnel.cs +++ b/Game.Server/TELargeFunnel.cs @@ -3,16 +3,15 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTELargeFunnel")] -public class TELargeFunnel(ReadOnlySpan name) : TEParticleSystem(name) +public partial class TELargeFunnel(ReadOnlySpan name) : TEParticleSystem(name) { - public static readonly SendTable DT_TELargeFunnel = new(DT_TEParticleSystem, [ - SendPropInt(FIELD.OF(nameof(Reversed)), 2, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TELargeFunnel); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Reversed)) { Bits = 2, Flags = PropFlags.Unsigned }, + ]; public int ModelIndex; - [NetworkName("m_nReversed")] + [NetworkVar("m_nReversed")] public int Reversed; } diff --git a/Game.Server/TEMetalSparks.cs b/Game.Server/TEMetalSparks.cs index 54ff7b51..42bc1502 100644 --- a/Game.Server/TEMetalSparks.cs +++ b/Game.Server/TEMetalSparks.cs @@ -3,19 +3,18 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; -[NetworkName("CTEMetalSparks")] -public class TEMetalSparks(ReadOnlySpan name) : BaseTempEntity(name) +[NetworkName("CTEMetalSparks", NoBase = true)] +public partial class TEMetalSparks(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEMetalSparks = new([ - SendPropVector(FIELD.OF(nameof(Pos)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(Dir)), 0, PropFlags.Coord), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEMetalSparks); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Pos)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Dir)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_vecPos")] + [NetworkVar("m_vecPos")] public Vector3 Pos; - [NetworkName("m_vecDir")] + [NetworkVar("m_vecDir")] public Vector3 Dir; } diff --git a/Game.Server/TEMuzzleFlash.cs b/Game.Server/TEMuzzleFlash.cs index 4dc7627b..5ef7c324 100644 --- a/Game.Server/TEMuzzleFlash.cs +++ b/Game.Server/TEMuzzleFlash.cs @@ -3,24 +3,23 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEMuzzleFlash")] -public class TEMuzzleFlash(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEMuzzleFlash(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEMuzzleFlash = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(Angles)), 0, PropFlags.Coord), - SendPropFloat(FIELD.OF(nameof(Scale)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(Type)), 4, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEMuzzleFlash); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Angles)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Scale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Type)) { Bits = 4, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_vecAngles")] + [NetworkVar("m_vecAngles")] public Vector3 Angles; - [NetworkName("m_flScale")] + [NetworkVar("m_flScale")] public float Scale; - [NetworkName("m_nType")] + [NetworkVar("m_nType")] public int Type; } diff --git a/Game.Server/TEParticleSystem.cs b/Game.Server/TEParticleSystem.cs index 9c4d41e2..a9c6f171 100644 --- a/Game.Server/TEParticleSystem.cs +++ b/Game.Server/TEParticleSystem.cs @@ -4,17 +4,14 @@ using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEParticleSystem")] -public class TEParticleSystem(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEParticleSystem(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEParticleSystem = new(DT_BaseTempEntity, [ - SendPropFloat(FIELD.OF_VECTORELEM(nameof(Origin), 0), 0, PropFlags.Coord | PropFlags.NoScale | PropFlags.IsAVectorElem), - SendPropFloat(FIELD.OF_VECTORELEM(nameof(Origin), 1), 0, PropFlags.Coord | PropFlags.NoScale | PropFlags.IsAVectorElem), - SendPropFloat(FIELD.OF_VECTORELEM(nameof(Origin), 2), 0, PropFlags.Coord | PropFlags.NoScale | PropFlags.IsAVectorElem), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEParticleSystem); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Encoding = NetEncoding.VectorElements, Bits = 0, Flags = PropFlags.Coord | PropFlags.NoScale | PropFlags.IsAVectorElem }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; } diff --git a/Game.Server/TEPhysicsProp.cs b/Game.Server/TEPhysicsProp.cs index 91fe5f5d..d5baa61f 100644 --- a/Game.Server/TEPhysicsProp.cs +++ b/Game.Server/TEPhysicsProp.cs @@ -4,41 +4,38 @@ using System.Numerics; using Source.Common.Mathematics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEPhysicsProp")] -public class TEPhysicsProp(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEPhysicsProp(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEPhysicsProp = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropAngle(FIELD.OF_VECTORELEM(nameof(Rotation), 0), 13, PropFlags.RoundDown | PropFlags.IsAVectorElem), - SendPropAngle(FIELD.OF_VECTORELEM(nameof(Rotation), 1), 13, PropFlags.RoundDown | PropFlags.IsAVectorElem), - SendPropAngle(FIELD.OF_VECTORELEM(nameof(Rotation), 2), 13, PropFlags.RoundDown | PropFlags.IsAVectorElem), - SendPropVector(FIELD.OF(nameof(Velocity)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(ModelIndex)), 14, 0), - SendPropInt(FIELD.OF(nameof(Skin)), 10, 0), - SendPropInt(FIELD.OF(nameof(Flags)), 2, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Effects)), 16, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(ClrRender)), 32, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(ModelScale)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEPhysicsProp); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Rotation)) { Encoding = NetEncoding.VectorElements, Bits = 13, Flags = PropFlags.RoundDown | PropFlags.IsAVectorElem }, + new(nameof(Velocity)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(Skin)) { Bits = 10 }, + new(nameof(Flags)) { Bits = 2, Flags = PropFlags.Unsigned }, + new(nameof(Effects)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(ClrRender)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(ModelScale)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_angRotation")] + [NetworkVar("m_angRotation")] public QAngle Rotation; - [NetworkName("m_vecVelocity")] + [NetworkVar("m_vecVelocity")] public Vector3 Velocity; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_nSkin")] + [NetworkVar("m_nSkin")] public int Skin; - [NetworkName("m_nFlags")] + [NetworkVar("m_nFlags")] public int Flags; - [NetworkName("m_nEffects")] + [NetworkVar("m_nEffects")] public int Effects; - [NetworkName("m_clrRender")] + [NetworkVar("m_clrRender")] public int ClrRender; - [NetworkName("m_fModelScale")] + [NetworkVar("m_fModelScale")] public float ModelScale; } diff --git a/Game.Server/TEPlayerAnimEvent.cs b/Game.Server/TEPlayerAnimEvent.cs index 78350def..bed54087 100644 --- a/Game.Server/TEPlayerAnimEvent.cs +++ b/Game.Server/TEPlayerAnimEvent.cs @@ -3,23 +3,22 @@ using Source.Common; namespace Game.Server; -using FIELD = Source.FIELD; -[NetworkName("CTEPlayerAnimEvent")] -public class TEPlayerAnimEvent(ReadOnlySpan name) : BaseTempEntity(name) +[NetworkName("CTEPlayerAnimEvent", NoBase = true)] +public partial class TEPlayerAnimEvent(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEPlayerAnimEvent = new([ - SendPropEHandle(FIELD.OF(nameof(Player))), - SendPropInt(FIELD.OF(nameof(Event)), 6, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Data)), 32) - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEPlayerAnimEvent); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + nameof(Player), + new(nameof(Event)) { Bits = 6, Flags = PropFlags.Unsigned }, + new(nameof(Data)) { Bits = 32 }, + ]; - [NetworkName("m_hPlayer")] + [NetworkVar("m_hPlayer")] public EHANDLE Player = new(); - [NetworkName("m_iEvent")] + [NetworkVar("m_iEvent")] public int Event; - [NetworkName("m_nData")] + [NetworkVar("m_nData")] public int Data; public static readonly TEPlayerAnimEvent g_TEPlayerAnimEvent = new("PlayerAnimEvent"); diff --git a/Game.Server/TEPlayerDecal.cs b/Game.Server/TEPlayerDecal.cs index caae29b7..dd5d633b 100644 --- a/Game.Server/TEPlayerDecal.cs +++ b/Game.Server/TEPlayerDecal.cs @@ -3,21 +3,20 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEPlayerDecal")] -public class TEPlayerDecal(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEPlayerDecal(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEPlayerDecal = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(Entity)), 13, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Player)), 7, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEPlayerDecal); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Entity)) { Bits = 13, Flags = PropFlags.Unsigned }, + new(nameof(Player)) { Bits = 7, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_nEntity")] + [NetworkVar("m_nEntity")] public int Entity; - [NetworkName("m_nPlayer")] + [NetworkVar("m_nPlayer")] public int Player; } diff --git a/Game.Server/TEProjectedDecal.cs b/Game.Server/TEProjectedDecal.cs index 6765e6ef..5c3639fe 100644 --- a/Game.Server/TEProjectedDecal.cs +++ b/Game.Server/TEProjectedDecal.cs @@ -3,24 +3,23 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEProjectedDecal")] -public class TEProjectedDecal(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEProjectedDecal(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEProjectedDecal = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropQAngles(FIELD.OF(nameof(Rotation)), 10, PropFlags.RoundDown), - SendPropFloat(FIELD.OF(nameof(LDistance)), 10, PropFlags.RoundUp), - SendPropInt(FIELD.OF(nameof(Index)), 9, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEProjectedDecal); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Rotation)) { Encoding = NetEncoding.QAngles, Bits = 10, Flags = PropFlags.RoundDown }, + new(nameof(LDistance)) { Bits = 10, Flags = PropFlags.RoundUp }, + new(nameof(Index)) { Bits = 9, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_angRotation")] + [NetworkVar("m_angRotation")] public Vector3 Rotation; - [NetworkName("m_flDistance")] + [NetworkVar("m_flDistance")] public float LDistance; - [NetworkName("m_nIndex")] + [NetworkVar("m_nIndex")] public int Index; } diff --git a/Game.Server/TEShatterSurface.cs b/Game.Server/TEShatterSurface.cs index d9a715dc..2a64d390 100644 --- a/Game.Server/TEShatterSurface.cs +++ b/Game.Server/TEShatterSurface.cs @@ -4,46 +4,41 @@ using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEShatterSurface")] -public class TEShatterSurface(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEShatterSurface(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEShatterSurface = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(Angles)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(Force)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(ForcePos)), 0, PropFlags.Coord), - SendPropFloat(FIELD.OF(nameof(Width)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(Height)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(ShardSize)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(SurfaceType)), 2, PropFlags.Unsigned), - SendPropInt(FIELD.OF_ARRAYINDEX(nameof(UchFrontColor), 0), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF_ARRAYINDEX(nameof(UchFrontColor), 1), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF_ARRAYINDEX(nameof(UchFrontColor), 2), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF_ARRAYINDEX(nameof(UchBackColor), 0), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF_ARRAYINDEX(nameof(UchBackColor), 1), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF_ARRAYINDEX(nameof(UchBackColor), 2), 8, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEShatterSurface); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Angles)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Force)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ForcePos)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Width)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Height)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ShardSize)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SurfaceType)) { Bits = 2, Flags = PropFlags.Unsigned }, + new(nameof(UchFrontColor)) { Encoding = NetEncoding.Elements, Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(UchBackColor)) { Encoding = NetEncoding.Elements, Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_vecAngles")] + [NetworkVar("m_vecAngles")] public Vector3 Angles; - [NetworkName("m_vecForce")] + [NetworkVar("m_vecForce")] public Vector3 Force; - [NetworkName("m_vecForcePos")] + [NetworkVar("m_vecForcePos")] public Vector3 ForcePos; - [NetworkName("m_flWidth")] + [NetworkVar("m_flWidth")] public float Width; - [NetworkName("m_flHeight")] + [NetworkVar("m_flHeight")] public float Height; - [NetworkName("m_flShardSize")] + [NetworkVar("m_flShardSize")] public float ShardSize; - [NetworkName("m_nSurfaceType")] + [NetworkVar("m_nSurfaceType")] public int SurfaceType; - [NetworkName("m_uchFrontColor")] + [NetworkVar("m_uchFrontColor")] public InlineArray3 UchFrontColor; - [NetworkName("m_uchBackColor")] + [NetworkVar("m_uchBackColor")] public InlineArray3 UchBackColor; } diff --git a/Game.Server/TEShowLine.cs b/Game.Server/TEShowLine.cs index ec700bb4..86202a7e 100644 --- a/Game.Server/TEShowLine.cs +++ b/Game.Server/TEShowLine.cs @@ -3,15 +3,14 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEShowLine")] -public class TEShowLine(ReadOnlySpan name) : TEParticleSystem(name) +public partial class TEShowLine(ReadOnlySpan name) : TEParticleSystem(name) { - public static readonly SendTable DT_TEShowLine = new(DT_TEParticleSystem, [ - SendPropVector(FIELD.OF(nameof(End)), 0, PropFlags.Coord), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEShowLine); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(End)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_vecEnd")] + [NetworkVar("m_vecEnd")] public Vector3 End; } diff --git a/Game.Server/TESmoke.cs b/Game.Server/TESmoke.cs index 89884eaf..8f50aaf1 100644 --- a/Game.Server/TESmoke.cs +++ b/Game.Server/TESmoke.cs @@ -3,24 +3,23 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTESmoke")] -public class TESmoke(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TESmoke(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TESmoke = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(ModelIndex)), 14, 0), - SendPropFloat(FIELD.OF(nameof(Scale)), 8, PropFlags.RoundDown, 0.0f, 25.6f), - SendPropInt(FIELD.OF(nameof(FrameRate)), 8, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TESmoke); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(Scale)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0.0f, High = 25.6f }, + new(nameof(FrameRate)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_fScale")] + [NetworkVar("m_fScale")] public float Scale; - [NetworkName("m_nFrameRate")] + [NetworkVar("m_nFrameRate")] public int FrameRate; } diff --git a/Game.Server/TESparks.cs b/Game.Server/TESparks.cs index be19e1cb..d6543fe6 100644 --- a/Game.Server/TESparks.cs +++ b/Game.Server/TESparks.cs @@ -3,21 +3,20 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTESparks")] -public class TESparks(ReadOnlySpan name) : TEParticleSystem(name) +public partial class TESparks(ReadOnlySpan name) : TEParticleSystem(name) { - public static readonly SendTable DT_TESparks = new(DT_TEParticleSystem, [ - SendPropInt(FIELD.OF(nameof(Magnitude)), 4, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(TrailLength)), 4, PropFlags.Unsigned), - SendPropVector(FIELD.OF(nameof(Dir)), 0, PropFlags.Coord), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TESparks); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Magnitude)) { Bits = 4, Flags = PropFlags.Unsigned }, + new(nameof(TrailLength)) { Bits = 4, Flags = PropFlags.Unsigned }, + new(nameof(Dir)) { Bits = 0, Flags = PropFlags.Coord }, + ]; - [NetworkName("m_nMagnitude")] + [NetworkVar("m_nMagnitude")] public int Magnitude; - [NetworkName("m_nTrailLength")] + [NetworkVar("m_nTrailLength")] public int TrailLength; - [NetworkName("m_vecDir")] + [NetworkVar("m_vecDir")] public Vector3 Dir; } diff --git a/Game.Server/TESprite.cs b/Game.Server/TESprite.cs index 6498d970..5af4ddce 100644 --- a/Game.Server/TESprite.cs +++ b/Game.Server/TESprite.cs @@ -3,24 +3,23 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTESprite")] -public class TESprite(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TESprite(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TESprite = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(ModelIndex)), 14, 0), - SendPropFloat(FIELD.OF(nameof(Scale)), 8, PropFlags.RoundDown, 0.0f, 25.6f), - SendPropInt(FIELD.OF(nameof(Brightness)), 8, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TESprite); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(Scale)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0.0f, High = 25.6f }, + new(nameof(Brightness)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_fScale")] + [NetworkVar("m_fScale")] public float Scale; - [NetworkName("m_nBrightness")] + [NetworkVar("m_nBrightness")] public int Brightness; } diff --git a/Game.Server/TESpriteSpray.cs b/Game.Server/TESpriteSpray.cs index b6298610..effb39cd 100644 --- a/Game.Server/TESpriteSpray.cs +++ b/Game.Server/TESpriteSpray.cs @@ -3,30 +3,29 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTESpriteSpray")] -public class TESpriteSpray(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TESpriteSpray(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TESpriteSpray = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(Direction)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(ModelIndex)), 14, 0), - SendPropFloat(FIELD.OF(nameof(Noise)), 8, PropFlags.RoundDown, 0.0f, 2.56f), - SendPropInt(FIELD.OF(nameof(Speed)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Count)), 8, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TESpriteSpray); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Direction)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(ModelIndex)) { Bits = 14 }, + new(nameof(Noise)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0.0f, High = 2.56f }, + new(nameof(Speed)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Count)) { Bits = 8, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_vecDirection")] + [NetworkVar("m_vecDirection")] public Vector3 Direction; - [NetworkName("m_nModelIndex")] + [NetworkVar("m_nModelIndex")] public int ModelIndex; - [NetworkName("m_fNoise")] + [NetworkVar("m_fNoise")] public float Noise; - [NetworkName("m_nSpeed")] + [NetworkVar("m_nSpeed")] public int Speed; - [NetworkName("m_nCount")] + [NetworkVar("m_nCount")] public int Count; } diff --git a/Game.Server/TEWorldDecal.cs b/Game.Server/TEWorldDecal.cs index 67c03f93..8f22f028 100644 --- a/Game.Server/TEWorldDecal.cs +++ b/Game.Server/TEWorldDecal.cs @@ -3,18 +3,17 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [NetworkName("CTEWorldDecal")] -public class TEWorldDecal(ReadOnlySpan name) : BaseTempEntity(name) +public partial class TEWorldDecal(ReadOnlySpan name) : BaseTempEntity(name) { - public static readonly SendTable DT_TEWorldDecal = new(DT_BaseTempEntity, [ - SendPropVector(FIELD.OF(nameof(Origin)), 0, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(Index)), 9, PropFlags.Unsigned), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TEWorldDecal); + [NetworkTable] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(Index)) { Bits = 9, Flags = PropFlags.Unsigned }, + ]; - [NetworkName("m_vecOrigin")] + [NetworkVar("m_vecOrigin")] public Vector3 Origin; - [NetworkName("m_nIndex")] + [NetworkVar("m_nIndex")] public int Index; } diff --git a/Game.Server/Team.cs b/Game.Server/Team.cs index c30bd8df..a90d9700 100644 --- a/Game.Server/Team.cs +++ b/Game.Server/Team.cs @@ -7,8 +7,6 @@ namespace Game.Server; -using FIELD = Source.FIELD; - public static class TeamGlobals { public static readonly List g_Teams = []; @@ -23,33 +21,39 @@ public static class TeamGlobals [LinkEntityToClass("team_manager")] [NetworkName("CTeam")] -public class Team : BaseEntity +public partial class Team : BaseEntity { - public static readonly SendTable DT_Team = new([ - SendPropInt(FIELD.OF(nameof(TeamNum)), 5), - SendPropInt(FIELD.OF(nameof(Score)), 0), - SendPropInt(FIELD.OF(nameof(RoundsWon)), 8), - SendPropString(FIELD.OF(nameof(Teamname))), - - SendPropInt("player_array_element", 10, PropFlags.Unsigned, SendProxy_PlayerList, 4), - SendPropArray2(SendProxyArrayLength_PlayerArray, Constants.MAX_PLAYERS, "\"player_array\"") - ]); + [NetworkTable(NoBase = true)] + public static readonly new NetworkProp[] Props = [ + new(nameof(TeamNum)) { Bits = 5 }, + new(nameof(Score)) { Bits = 0 }, + new(nameof(RoundsWon)) { Bits = 8 }, + nameof(Teamname), + + new("player_array_element") { Encoding = NetEncoding.Int, Bits = 10, Flags = PropFlags.Unsigned, Proxy = typeof(PlayerListProxy) }, + new("\"player_array\"") { Encoding = NetEncoding.Array2, Count = Constants.MAX_PLAYERS, Proxy = typeof(PlayerArrayLengthProxy) }, + ]; + + public static class PlayerArrayLengthProxy + { + public static int Send(object instance, int objectID) => ((Team)instance).Players.Count; + } - private static int SendProxyArrayLength_PlayerArray(object instance, int objectID) => ((Team)instance).Players.Count; - private static void SendProxy_PlayerList(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) { - Team team = (Team)instance; - Assert(element < team.Players.Count); + public static class PlayerListProxy + { + public static void Send(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) { + Team team = (Team)instance; + Assert(element < team.Players.Count); - BasePlayer player = team.Players[element]; - outData.Int = player.EntIndex(); + BasePlayer player = team.Players[element]; + outData.Int = player.EntIndex(); + } } internal ReadOnlySpan GetName() { throw new NotImplementedException(); } - public static readonly new ServerClass ServerClass = new ServerClass(DT_Team); - public void AddPlayer(BasePlayer player) { Players.Add(player); NetworkStateChanged(); @@ -63,14 +67,14 @@ public void RemovePlayer(BasePlayer player) { public int GetNumPlayers() => Players.Count; public readonly List Players = []; - [NetworkName("m_szTeamname")] - public InlineArray32 Teamname; - [NetworkName("m_iScore")] - public int Score; - [NetworkName("m_iRoundsWon")] - public int RoundsWon; + [NetworkVar("m_szTeamname")] + public partial ref readonly InlineArray32 Teamname { get; } + [NetworkVar("m_iScore")] + public partial int Score { get; set; } + [NetworkVar("m_iRoundsWon")] + public partial int RoundsWon { get; set; } public int Deaths; public int LastSpawn; - [NetworkName("m_iTeamNum")] - public new int TeamNum; + [NetworkVar("m_iTeamNum")] + public new partial int TeamNum { get; set; } } diff --git a/Game.Server/Tesla.cs b/Game.Server/Tesla.cs index 21a9d2e2..62601dcf 100644 --- a/Game.Server/Tesla.cs +++ b/Game.Server/Tesla.cs @@ -3,19 +3,18 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("point_tesla")] [NetworkName("CTesla")] -public class Tesla : BaseEntity +public partial class Tesla : BaseEntity { - public static readonly SendTable DT_Tesla = new(DT_BaseEntity, [ - SendPropString(FIELD.OF(nameof(SoundName))), - SendPropString(FIELD.OF(nameof(SpriteName))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_Tesla); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SoundName)) { Encoding = NetEncoding.String }, + new(nameof(SpriteName)) { Encoding = NetEncoding.String }, + ]; - [NetworkName("m_SoundName")] - public InlineArray64 SoundName; - [NetworkName("m_iszSpriteName")] - public InlineArray256 SpriteName; + [NetworkVar("m_SoundName")] + public partial ref readonly InlineArray64 SoundName { get; } + [NetworkVar("m_iszSpriteName")] + public partial ref readonly InlineArray256 SpriteName { get; } } diff --git a/Game.Server/TriggerPlayerMovement.cs b/Game.Server/TriggerPlayerMovement.cs index 4689872e..ebd71e63 100644 --- a/Game.Server/TriggerPlayerMovement.cs +++ b/Game.Server/TriggerPlayerMovement.cs @@ -4,13 +4,13 @@ using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("trigger_playermovement")] [NetworkName("CTriggerPlayerMovement")] -public class TriggerPlayerMovement : BaseTrigger +public partial class TriggerPlayerMovement : BaseTrigger { - public static readonly SendTable DT_TriggerPlayerMovement = new(DT_BaseTrigger, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_TriggerPlayerMovement); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; [Flags] public enum SF diff --git a/Game.Server/Triggers.cs b/Game.Server/Triggers.cs index f0203a8b..8f302a34 100644 --- a/Game.Server/Triggers.cs +++ b/Game.Server/Triggers.cs @@ -12,8 +12,6 @@ namespace Game.Server; -using FIELD_BT = FIELD; - public static class TriggerGlobals { public static readonly ConVar showtriggers = new("showtriggers", "0", FCvar.Cheat, "Shows trigger brushes"); @@ -74,8 +72,14 @@ public static bool IsTakingTriggerHurtDamageAtPoint(in Vector3 vecPoint) { [LinkEntityToClass("trigger")] [NetworkName("CBaseTrigger")] -public class BaseTrigger : BaseToggle +public partial class BaseTrigger : BaseToggle { + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(ClientSidePredicted), + new(nameof(SpawnFlags)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.NoScale }, + ]; + [Flags] public enum SF { @@ -94,13 +98,8 @@ public enum SF DisallowBots = 0x1000, // Bots are not allowed to fire this trigger } - public static readonly SendTable DT_BaseTrigger = new(DT_BaseToggle, [ - SendPropBool(FIELD_BT.OF(nameof(ClientSidePredicted))), - SendPropInt(FIELD_BT.OF(nameof(SpawnFlags)), 32, PropFlags.NoScale) - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_BaseTrigger); - [NetworkName("m_bClientSidePredicted")] - public bool ClientSidePredicted; + [NetworkVar("m_bClientSidePredicted")] + public partial bool ClientSidePredicted { get; set; } public bool Disabled; public string? FilterName; diff --git a/Game.Server/VGuiScreen.cs b/Game.Server/VGuiScreen.cs index 9fc76a18..09b84efb 100644 --- a/Game.Server/VGuiScreen.cs +++ b/Game.Server/VGuiScreen.cs @@ -3,35 +3,39 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("vgui_screen")] [LinkEntityToClass("vgui_screen_team")] [NetworkName("CVGuiScreen")] -public class VGuiScreen : BaseEntity +public partial class VGuiScreen : BaseEntity { - public static readonly SendTable DT_VGuiScreen = new(DT_BaseEntity, [ - SendPropFloat(FIELD.OF(nameof(Width)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(Height)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(AttachmentIndex)), 5, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(PanelName)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(ScreenFlags)), 5, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(OverlayMaterial)), 10, PropFlags.Unsigned), - SendPropEHandle(FIELD.OF(nameof(HPlayerOwner))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_VGuiScreen); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Width)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Height)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(AttachmentIndex)) { Bits = 5, Flags = PropFlags.Unsigned }, + new(nameof(PanelName)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(ScreenFlags)) { Bits = 5, Flags = PropFlags.Unsigned }, + new(nameof(OverlayMaterial)) { Bits = 10, Flags = PropFlags.Unsigned }, + nameof(HPlayerOwner), + ]; - [NetworkName("m_flWidth")] - public float Width; - [NetworkName("m_flHeight")] - public float Height; - [NetworkName("m_nAttachmentIndex")] - public int AttachmentIndex; - [NetworkName("m_nPanelName")] - public int PanelName; - [NetworkName("m_fScreenFlags")] - public int ScreenFlags; - [NetworkName("m_nOverlayMaterial")] - public int OverlayMaterial; - [NetworkName("m_hPlayerOwner")] - public EHANDLE HPlayerOwner = new(); + public VGuiScreen() { + HPlayerOwner = new(); + } + + + [NetworkVar("m_flWidth")] + public partial float Width { get; set; } + [NetworkVar("m_flHeight")] + public partial float Height { get; set; } + [NetworkVar("m_nAttachmentIndex")] + public partial int AttachmentIndex { get; set; } + [NetworkVar("m_nPanelName")] + public partial int PanelName { get; set; } + [NetworkVar("m_fScreenFlags")] + public partial int ScreenFlags { get; set; } + [NetworkVar("m_nOverlayMaterial")] + public partial int OverlayMaterial { get; set; } + [NetworkVar("m_hPlayerOwner")] + public partial EHANDLE HPlayerOwner { get; set; } } diff --git a/Game.Server/VortigauntChargeToken.cs b/Game.Server/VortigauntChargeToken.cs index c08dbab9..39fa8f89 100644 --- a/Game.Server/VortigauntChargeToken.cs +++ b/Game.Server/VortigauntChargeToken.cs @@ -3,16 +3,15 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("vort_charge_token")] [NetworkName("CVortigauntChargeToken")] -public class VortigauntChargeToken : BaseEntity +public partial class VortigauntChargeToken : BaseEntity { - public static readonly SendTable DT_VortigauntChargeToken = new(DT_BaseEntity, [ - SendPropBool(FIELD.OF(nameof(FadeOut))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_VortigauntChargeToken); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(FadeOut), + ]; - [NetworkName("m_bFadeOut")] - public bool FadeOut; + [NetworkVar("m_bFadeOut")] + public partial bool FadeOut { get; set; } } diff --git a/Game.Server/VortigauntEffectDispel.cs b/Game.Server/VortigauntEffectDispel.cs index ee5fa8e1..ee2180a1 100644 --- a/Game.Server/VortigauntEffectDispel.cs +++ b/Game.Server/VortigauntEffectDispel.cs @@ -3,16 +3,15 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("vort_effect_dispel")] [NetworkName("CVortigauntEffectDispel")] -public class VortigauntEffectDispel : BaseEntity +public partial class VortigauntEffectDispel : BaseEntity { - public static readonly SendTable DT_VortigauntEffectDispel = new(DT_BaseEntity, [ - SendPropBool(FIELD.OF(nameof(FadeOut))), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_VortigauntEffectDispel); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(FadeOut), + ]; - [NetworkName("m_bFadeOut")] - public bool FadeOut; + [NetworkVar("m_bFadeOut")] + public partial bool FadeOut { get; set; } } diff --git a/Game.Server/WaterBullet.cs b/Game.Server/WaterBullet.cs index da440e8f..61832a24 100644 --- a/Game.Server/WaterBullet.cs +++ b/Game.Server/WaterBullet.cs @@ -3,11 +3,12 @@ using Game.Shared; using System.Numerics; namespace Game.Server; -using FIELD = FIELD; [LinkEntityToClass("waterbullet")] [NetworkName("CWaterBullet")] -public class WaterBullet : BaseAnimating +public partial class WaterBullet : BaseAnimating { - public static readonly SendTable DT_WaterBullet = new(DT_BaseAnimating, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_WaterBullet); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } diff --git a/Game.Server/WaterLODControl.cs b/Game.Server/WaterLODControl.cs index 770a1a68..1ed4df07 100644 --- a/Game.Server/WaterLODControl.cs +++ b/Game.Server/WaterLODControl.cs @@ -5,20 +5,18 @@ namespace Game.Server; -using FIELD = FIELD; - [LinkEntityToClass("water_lod_control")] -[NetworkName("CWaterLODControl")] -public class WaterLODControl : BaseEntity +[NetworkName("CWaterLODControl", NoBase = true)] +public partial class WaterLODControl : BaseEntity { - public static readonly SendTable DT_WaterLODControl = new([ - SendPropFloat(FIELD.OF(nameof(CheapWaterStartDistance)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(CheapWaterEndDistance)), 0, PropFlags.NoScale), - ]); - public static readonly new ServerClass ServerClass = new ServerClass(DT_WaterLODControl); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(CheapWaterStartDistance)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(CheapWaterEndDistance)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flCheapWaterStartDistance")] - public float CheapWaterStartDistance; - [NetworkName("m_flCheapWaterEndDistance")] - public float CheapWaterEndDistance; + [NetworkVar("m_flCheapWaterStartDistance")] + public partial float CheapWaterStartDistance { get; set; } + [NetworkVar("m_flCheapWaterEndDistance")] + public partial float CheapWaterEndDistance { get; set; } } diff --git a/Game.Server/World.cs b/Game.Server/World.cs index 7d2dfa7a..23fc9027 100644 --- a/Game.Server/World.cs +++ b/Game.Server/World.cs @@ -11,8 +11,6 @@ namespace Game.Server; -using FIELD = Source.FIELD; - public static class WorldGlobals { @@ -20,23 +18,23 @@ public static class WorldGlobals } [LinkEntityToClass("worldspawn")] -[NetworkName("CWorld")] -public class World : BaseEntity +[NetworkName("CWorld", Table = "DT_WORLD")] +public partial class World : BaseEntity { public static World? g_WorldEntity { get; private set; } public override int RequiredEdictIndex() => 0; - public static SendTable DT_WORLD = new([ - SendPropDataTable("baseclass", DT_BaseEntity), - - SendPropVector(FIELD.OF(nameof(WorldMins)), -1, PropFlags.Coord), - SendPropVector(FIELD.OF(nameof(WorldMaxs)), -1, PropFlags.Coord), - SendPropInt(FIELD.OF(nameof(StartDark)), 1, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(MaxOccludeeArea)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MinOccluderArea)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MaxPropScreenSpaceWidth)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(MinPropScreenSpaceWidth)), 0, PropFlags.NoScale), - SendPropStringT(FIELD.OF(nameof(DetailSpriteMaterial))), - ]); + + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(WorldMins)) { Bits = -1, Flags = PropFlags.Coord }, + new(nameof(WorldMaxs)) { Bits = -1, Flags = PropFlags.Coord }, + nameof(StartDark), + new(nameof(MaxOccludeeArea)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MinOccluderArea)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MaxPropScreenSpaceWidth)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MinPropScreenSpaceWidth)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(DetailSpriteMaterial)) { Encoding = NetEncoding.String }, + ]; public World() { AddEFlags(EFL.NoAutoEdictAttach | EFL.KeepOnRecreateEntities); @@ -175,23 +173,22 @@ public override void Spawn() { GlobalEntity.Add("is_pc", gpGlobals.MapName, GlobalEState.On); } - public static readonly new ServerClass ServerClass = new ServerClass(DT_WORLD); float WaveHeight; - [NetworkName("m_WorldMins")] - Vector3 WorldMins; - [NetworkName("m_WorldMaxs")] - Vector3 WorldMaxs; - [NetworkName("m_bStartDark")] - bool StartDark; - [NetworkName("m_flMaxOccludeeArea")] - float MaxOccludeeArea; - [NetworkName("m_flMinOccluderArea")] - float MinOccluderArea; - [NetworkName("m_flMaxPropScreenSpaceWidth")] - float MaxPropScreenSpaceWidth; - [NetworkName("m_flMinPropScreenSpaceWidth")] - float MinPropScreenSpaceWidth; - [NetworkName("m_iszDetailSpriteMaterial")] - string? DetailSpriteMaterial; + [NetworkVar("m_WorldMins")] + private partial Vector3 WorldMins { get; set; } + [NetworkVar("m_WorldMaxs")] + private partial Vector3 WorldMaxs { get; set; } + [NetworkVar("m_bStartDark")] + private partial bool StartDark { get; set; } + [NetworkVar("m_flMaxOccludeeArea")] + private partial float MaxOccludeeArea { get; set; } + [NetworkVar("m_flMinOccluderArea")] + private partial float MinOccluderArea { get; set; } + [NetworkVar("m_flMaxPropScreenSpaceWidth")] + private partial float MaxPropScreenSpaceWidth { get; set; } + [NetworkVar("m_flMinPropScreenSpaceWidth")] + private partial float MinPropScreenSpaceWidth { get; set; } + [NetworkVar("m_iszDetailSpriteMaterial")] + private partial string? DetailSpriteMaterial { get; set; } bool ColdWorld; } diff --git a/Game.Shared/AnimationLayer.cs b/Game.Shared/AnimationLayer.cs index 7fb8c51b..7ffdb6f0 100644 --- a/Game.Shared/AnimationLayer.cs +++ b/Game.Shared/AnimationLayer.cs @@ -14,9 +14,6 @@ using System.Runtime.CompilerServices; using System.Text; -#if CLIENT_DLL || GAME_DLL -using FIELD = Source.FIELD; -#endif namespace Game.Shared; #if CLIENT_DLL || GAME_DLL @@ -38,15 +35,15 @@ public record struct AnimationLayer public bool SequenceFinished; public bool Looping; - [NetworkName("m_nSequence")] + [NetworkVar("m_nSequence")] public int Sequence; - [NetworkName("m_flCycle")] + [NetworkVar("m_flCycle")] public TimeUnit_t Cycle; - [NetworkName("m_flPrevCycle")] + [NetworkVar("m_flPrevCycle")] public float PrevCycle; - [NetworkName("m_flWeight")] + [NetworkVar("m_flWeight")] public float Weight; - [NetworkName("m_nOrder")] + [NetworkVar("m_nOrder")] public int Order; public TimeUnit_t PlaybackRate; @@ -267,9 +264,18 @@ public void BlendWeight() { /// /// Because of FieldILAccess, these must be class instances. So this is basically just a wrapper around the AnimationLayer struct. /// -public class AnimationLayerRef +public partial class AnimationLayerRef { - [NetworkName("")] + [NetworkTable("DT_Animationlayer")] + public static readonly NetworkProp[] Props = [ + new(nameof(Struct.Sequence)) { Bits = SharedDefs.ANIMATION_SEQUENCE_BITS, Flags = PropFlags.Unsigned }, + new(nameof(Struct.Cycle)) { Encoding = NetEncoding.Float, Bits = SharedDefs.ANIMATION_CYCLE_BITS, Flags = PropFlags.RoundDown, Low = 0.0f, High = 1.0f }, + new(nameof(Struct.PrevCycle)) { Bits = SharedDefs.ANIMATION_CYCLE_BITS, Flags = PropFlags.RoundDown, Low = 0.0f, High = 1.0f }, + new(nameof(Struct.Weight)) { Bits = AnimationLayerRef.WEIGHT_BITS, Low = 0.0f, High = 1.0f }, + new(nameof(Struct.Order)) { Bits = AnimationLayerRef.ORDER_BITS, Flags = PropFlags.Unsigned }, + ]; + + [NetworkVar("")] public AnimationLayer Struct; public static DynamicAccessor Accessor = Source.FIELD.OF(nameof(Struct)); @@ -318,25 +324,6 @@ public class AnimationLayerRef public const int ORDER_BITS = 4; public const int WEIGHT_BITS = 8; - - const string PREFIX_PROPS = $"{nameof(Struct)}."; -#if CLIENT_DLL - public static readonly RecvTable DT_Animationlayer = new(nameof(DT_Animationlayer), [ - RecvPropInt(FIELD.OF(PREFIX_PROPS + nameof(AnimationLayer.Sequence))), - RecvPropFloat(FIELD.OF(PREFIX_PROPS + nameof(AnimationLayer.Cycle))), - RecvPropFloat(FIELD.OF(PREFIX_PROPS + nameof(AnimationLayer.PrevCycle))), - RecvPropFloat(FIELD.OF(PREFIX_PROPS + nameof(AnimationLayer.Weight))), - RecvPropInt(FIELD.OF(PREFIX_PROPS + nameof(AnimationLayer.Order))), - ]); -#else - public static readonly SendTable DT_Animationlayer = new(nameof(DT_Animationlayer), [ - SendPropInt(FIELD.OF(PREFIX_PROPS + nameof(AnimationLayer.Sequence)), ANIMATION_SEQUENCE_BITS, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(PREFIX_PROPS + nameof(AnimationLayer.Cycle)), ANIMATION_CYCLE_BITS, PropFlags.RoundDown, 0.0f, 1.0f), - SendPropFloat(FIELD.OF(PREFIX_PROPS + nameof(AnimationLayer.PrevCycle)), ANIMATION_CYCLE_BITS, PropFlags.RoundDown, 0.0f, 1.0f), - SendPropFloat(FIELD.OF(PREFIX_PROPS + nameof(AnimationLayer.Weight)), WEIGHT_BITS, 0, 0.0f, 1.0f), - SendPropInt(FIELD.OF(PREFIX_PROPS + nameof(AnimationLayer.Order)), ORDER_BITS, PropFlags.Unsigned), - ]); -#endif } #endif diff --git a/Game.Shared/BaseCombatCharacterShared.cs b/Game.Shared/BaseCombatCharacterShared.cs index 1cc48366..05c321d7 100644 --- a/Game.Shared/BaseCombatCharacterShared.cs +++ b/Game.Shared/BaseCombatCharacterShared.cs @@ -60,7 +60,7 @@ public virtual bool Weapon_Switch(BaseCombatWeapon? weapon, int viewmodelindex = if (!ActiveWeapon.Get()!.Holster(weapon)) return false; - ActiveWeapon.Set(weapon); + ActiveWeapon = Handle.FromEntity(weapon); return weapon.Deploy(); } @@ -113,7 +113,7 @@ public void RemoveAmmo(int count, int ammoIndex) { return; // Ammo pickup sound - Ammo.Set(ammoIndex, Math.Max(Ammo[ammoIndex] - count, 0)); + AmmoForModify()[ammoIndex] = Math.Max(Ammo[ammoIndex] - count, 0); } public void RemoveAmmo(int count, ReadOnlySpan name) => RemoveAmmo(count, GetAmmoDef().Index(name)); @@ -132,7 +132,7 @@ public void RemoveAllAmmo() { for (int i = 0; i < MAX_AMMO_SLOTS; i++) { int old = Ammo[i]; if (Ammo[i] != 0) - Ammo.Set(i, 0); + AmmoForModify()[i] = 0; OnAmmoChanged(this, i, old, 0); } } diff --git a/Game.Shared/BaseCombatWeaponShared.cs b/Game.Shared/BaseCombatWeaponShared.cs index a446694a..cadff561 100644 --- a/Game.Shared/BaseCombatWeaponShared.cs +++ b/Game.Shared/BaseCombatWeaponShared.cs @@ -45,23 +45,7 @@ namespace Game.Server; using Source.Common.Audio; -using Table = -#if CLIENT_DLL - RecvTable; -#else - SendTable; -#endif - -using Class = -#if CLIENT_DLL - ClientClass; -#else - ServerClass; -#endif #if CLIENT_DLL || GAME_DLL -using FIELD = Source.FIELD; -using DEFINE = Source.DEFINE; - using Microsoft.VisualBasic; using System.Reflection; @@ -130,133 +114,115 @@ public partial class SHUT_UP_ABOUT_GAME_SHARED_INTELLISENSE #endif { -#if CLIENT_DLL - public static readonly new DataMap PredMap = new(typeof(C_BaseCombatWeapon), C_BaseAnimating.PredMap, [ - DEFINE.PRED_FIELD(nameof(NextThinkTick), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(Owner), FieldType.EHandle, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(State), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(iViewModelIndex), FieldType.Integer, FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.ModelIndex ), - DEFINE.PRED_FIELD(nameof(WorldModelIndex), FieldType.Integer, FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.ModelIndex ), - DEFINE.PRED_FIELD_TOL(nameof(NextPrimaryAttack), FieldType.Double, FieldTypeDescFlags.InSendTable, TD_MSECTOLERANCE ), - DEFINE.PRED_FIELD_TOL(nameof(NextSecondaryAttack), FieldType.Double, FieldTypeDescFlags.InSendTable, TD_MSECTOLERANCE ), - DEFINE.PRED_FIELD_TOL(nameof(TimeWeaponIdle), FieldType.Double, FieldTypeDescFlags.InSendTable, TD_MSECTOLERANCE ), - DEFINE.PRED_FIELD(nameof(PrimaryAmmoType), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(SecondaryAmmoType), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(iClip1), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(iClip2), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(nViewModelIndex), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.FIELD(nameof(InReload), FieldType.Boolean ), - DEFINE.FIELD(nameof(FireOnEmpty), FieldType.Boolean ), - DEFINE.FIELD(nameof(FiringWholeClip), FieldType.Boolean ), - DEFINE.FIELD(nameof(NextEmptySoundTime), FieldType.Float ), - DEFINE.FIELD(nameof(Activity), FieldType.Integer ), - DEFINE.FIELD(nameof(FireDuration), FieldType.Float ), - DEFINE.FIELD(nameof(FiresUnderwater), FieldType.Boolean ), - DEFINE.FIELD(nameof(AltFiresUnderwater), FieldType.Boolean ), - DEFINE.FIELD(nameof(MinRange1), FieldType.Float ), - DEFINE.FIELD(nameof(MinRange2), FieldType.Float ), - DEFINE.FIELD(nameof(MaxRange1), FieldType.Float ), - DEFINE.FIELD(nameof(MaxRange2), FieldType.Float ), - DEFINE.FIELD(nameof(ReloadsSingly), FieldType.Boolean ), - DEFINE.FIELD(nameof(Removable), FieldType.Boolean ), - DEFINE.FIELD(nameof(PrimaryAmmoCount), FieldType.Integer ), - DEFINE.FIELD(nameof(SecondaryAmmoCount), FieldType.Integer ), -]); public override DataMap? GetPredDescMap() => PredMap; -#endif -#if !CLIENT_DLL && !GAME_DLL // God intellisense is annoying me. Fixme when we can get Intellisense to shut up about Game.Shared (it never gets built) - public static readonly Table DT_BaseAnimating = new(); -#endif - public static readonly Table DT_LocalWeaponData = new(nameof(DT_LocalWeaponData), [ -#if CLIENT_DLL - RecvPropIntWithMinusOneFlag(FIELD.OF(nameof(iClip1))), - RecvPropIntWithMinusOneFlag(FIELD.OF(nameof(iClip2))), - RecvPropInt(FIELD.OF(nameof(PrimaryAmmoType))), - RecvPropInt(FIELD.OF(nameof(SecondaryAmmoType))), - RecvPropInt(FIELD.OF(nameof(nViewModelIndex))), - RecvPropBool(FIELD.OF(nameof(FlipViewModel))), -#elif GAME_DLL - SendPropIntWithMinusOneFlag(FIELD.OF(nameof(iClip1)), 16), - SendPropIntWithMinusOneFlag(FIELD.OF(nameof(iClip2)), 16), - SendPropInt(FIELD.OF(nameof(PrimaryAmmoType)), 9), - SendPropInt(FIELD.OF(nameof(SecondaryAmmoType)), 9), - SendPropInt(FIELD.OF(nameof(nViewModelIndex)), BaseViewModel.VIEWMODEL_INDEX_BITS, PropFlags.Unsigned), - SendPropBool(FIELD.OF(nameof(FlipViewModel))), -#endif - ]); - - public static readonly Table DT_LocalActiveWeaponData = new(nameof(DT_LocalActiveWeaponData), [ -#if CLIENT_DLL - RecvPropTime64(FIELD.OF(nameof(NextPrimaryAttack))), - RecvPropTime64(FIELD.OF(nameof(NextSecondaryAttack))), - RecvPropInt(FIELD.OF(nameof(NextThinkTick))), - RecvPropTime64(FIELD.OF(nameof(TimeWeaponIdle))), -#elif GAME_DLL - SendPropTime64(FIELD.OF(nameof(NextPrimaryAttack))), - SendPropTime64(FIELD.OF(nameof(NextSecondaryAttack))), - SendPropInt(FIELD.OF(nameof(NextThinkTick))), - SendPropTime64(FIELD.OF(nameof(TimeWeaponIdle))), -#endif - ]); + [NetworkTable("DT_LocalWeaponData")] + public static readonly NetworkProp[] LocalWeaponDataProps = [ + new(nameof(iClip1)) { Encoding = NetEncoding.IntWithMinusOneFlag, Bits = 16 }, + new(nameof(iClip2)) { Encoding = NetEncoding.IntWithMinusOneFlag, Bits = 16 }, + new(nameof(PrimaryAmmoType)) { Bits = 9 }, + new(nameof(SecondaryAmmoType)) { Bits = 9 }, + new(nameof(nViewModelIndex)) { Bits = BaseViewModel.VIEWMODEL_INDEX_BITS, Flags = PropFlags.Unsigned }, + nameof(FlipViewModel), + ]; + + [NetworkTable("DT_LocalActiveWeaponData")] + public static readonly NetworkProp[] LocalActiveWeaponDataProps = [ + nameof(NextPrimaryAttack), + nameof(NextSecondaryAttack), + nameof(NextThinkTick), + nameof(TimeWeaponIdle), + ]; + + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(LocalWeaponDataProps)) { Proxy = typeof(BaseCombatWeapon.LocalWeaponDataProxy) }, + new(nameof(LocalActiveWeaponDataProps)) { Proxy = typeof(BaseCombatWeapon.LocalActiveWeaponDataProxy) }, + new(nameof(iViewModelIndex)) { Encoding = NetEncoding.ModelIndex }, + new(nameof(WorldModelIndex)) { Encoding = NetEncoding.ModelIndex }, + new(nameof(State)) { Bits = 4, Flags = PropFlags.Unsigned, Proxy = typeof(WeaponStateProxy) }, + nameof(Owner), + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(iClip1), + nameof(iClip2), + nameof(PrimaryAmmoType), + nameof(SecondaryAmmoType), + nameof(nViewModelIndex), + new(nameof(NextPrimaryAttack)) { Tolerance = TD_MSECTOLERANCE }, + new(nameof(NextSecondaryAttack)) { Tolerance = TD_MSECTOLERANCE }, + new(nameof(TimeWeaponIdle)) { Tolerance = TD_MSECTOLERANCE }, + new(nameof(iViewModelIndex)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.ModelIndex }, + new(nameof(WorldModelIndex)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.ModelIndex }, + nameof(State), + nameof(Owner), + nameof(Activity), + nameof(Removable), + nameof(PrimaryAmmoCount), + nameof(SecondaryAmmoCount), + nameof(FiresUnderwater), + nameof(AltFiresUnderwater), + nameof(MinRange1), + nameof(MinRange2), + nameof(MaxRange1), + nameof(MaxRange2), + nameof(ReloadsSingly), + nameof(FireDuration), + nameof(InReload), + nameof(FireOnEmpty), + nameof(FiringWholeClip), + nameof(NextEmptySoundTime), + nameof(NextThinkTick), + ]; - public static readonly Table DT_BaseCombatWeapon = new(DT_BaseAnimating, [ +#if CLIENT_DLL || GAME_DLL + public static class WeaponStateProxy + { #if CLIENT_DLL - RecvPropDataTable("LocalWeaponData", DT_LocalWeaponData), - RecvPropDataTable("LocalActiveWeaponData", DT_LocalActiveWeaponData), - RecvPropInt(FIELD.OF(nameof(iViewModelIndex))), - RecvPropInt(FIELD.OF(nameof(WorldModelIndex))), - RecvPropInt(FIELD.OF(nameof(State)), 0, RecvProxy_WeaponState), - RecvPropEHandle(FIELD.OF(nameof(Owner))), -#elif GAME_DLL - SendPropDataTable("LocalWeaponData", DT_LocalWeaponData, SendProxy_SendLocalWeaponDataTable), - SendPropDataTable("LocalActiveWeaponData", DT_LocalActiveWeaponData, SendProxy_SendActiveLocalWeaponDataTable ), - SendPropModelIndex(FIELD.OF(nameof(iViewModelIndex))), - SendPropModelIndex(FIELD.OF(nameof(WorldModelIndex))), - SendPropInt(FIELD.OF(nameof(State)), 4, PropFlags.Unsigned), - SendPropEHandle(FIELD.OF(nameof(Owner))), + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) { + BaseCombatWeapon weapon = (BaseCombatWeapon)instance; + weapon.State = data.Value.Int; + weapon.UpdateVisibility(); + } #endif - ]); - -#if CLIENT_DLL - private static void RecvProxy_WeaponState(ref readonly RecvProxyData data, object instance, IFieldAccessor field) { - BaseCombatWeapon weapon = (BaseCombatWeapon)instance; - weapon.State = data.Value.Int; - weapon.UpdateVisibility(); } -#else - private static object? SendProxy_SendLocalWeaponDataTable(SendProp prop, object instance, IFieldAccessor data, SendProxyRecipients recipients, int objectID) { - BaseCombatWeapon weapon = (BaseCombatWeapon)instance; - if (weapon != null) { - BasePlayer? player = ToBasePlayer(weapon.GetOwner()); - if (player != null) { - recipients.SetOnly(player.EntIndex() - 1); - return instance; + public static class LocalWeaponDataProxy + { +#if GAME_DLL + public static object? Send(SendProp prop, object instance, IFieldAccessor data, SendProxyRecipients recipients, int objectID) { + BaseCombatWeapon weapon = (BaseCombatWeapon)instance; + if (weapon != null) { + BasePlayer? player = ToBasePlayer(weapon.GetOwner()); + if (player != null) { + recipients.SetOnly(player.EntIndex() - 1); + return instance; + } } - } - return null; + return null; + } +#endif } - private static object? SendProxy_SendActiveLocalWeaponDataTable(SendProp prop, object instance, IFieldAccessor data, SendProxyRecipients recipients, int objectID) { - BaseCombatWeapon weapon = (BaseCombatWeapon)instance; - if (weapon != null) { - BasePlayer? player = ToBasePlayer(weapon.GetOwner()); - if (player != null) { - recipients.SetOnly(player.EntIndex() - 1); - return instance; + + public static class LocalActiveWeaponDataProxy + { +#if GAME_DLL + public static object? Send(SendProp prop, object instance, IFieldAccessor data, SendProxyRecipients recipients, int objectID) { + BaseCombatWeapon weapon = (BaseCombatWeapon)instance; + if (weapon != null) { + BasePlayer? player = ToBasePlayer(weapon.GetOwner()); + if (player != null) { + recipients.SetOnly(player.EntIndex() - 1); + return instance; + } } - } - return null; - } + return null; + } #endif - public static readonly new Class -#if CLIENT_DLL - ClientClass -#else - ServerClass + } #endif - = new Class(DT_BaseCombatWeapon); - public virtual bool CanBePickedUpByNPCs() => true; @@ -327,92 +293,40 @@ public struct PoseParamTable public float Value; } - [NetworkName("m_iClip1")] -#if CLIENT_DLL - public int iClip1; -#else - [NetworkVar] public partial int iClip1 { get; set; } -#endif - [NetworkName("m_iClip2")] -#if CLIENT_DLL - public int iClip2; -#else - [NetworkVar] public partial int iClip2 { get; set; } -#endif - [NetworkName("m_iPrimaryAmmoType")] -#if CLIENT_DLL - public int PrimaryAmmoType; -#else - [NetworkVar] public partial int PrimaryAmmoType { get; set; } -#endif - [NetworkName("m_iSecondaryAmmoType")] -#if CLIENT_DLL - public int SecondaryAmmoType; -#else - [NetworkVar] public partial int SecondaryAmmoType { get; set; } -#endif + [NetworkVar("m_iClip1")] + public partial int iClip1 { get; set; } + [NetworkVar("m_iClip2")] + public partial int iClip2 { get; set; } + [NetworkVar("m_iPrimaryAmmoType")] + public partial int PrimaryAmmoType { get; set; } + [NetworkVar("m_iSecondaryAmmoType")] + public partial int SecondaryAmmoType { get; set; } /// /// View model index (entity offset) /// - [NetworkName("m_nViewModelIndex")] -#if CLIENT_DLL - public int nViewModelIndex; -#else - [NetworkVar] public partial int nViewModelIndex { get; set; } -#endif + [NetworkVar("m_nViewModelIndex")] + public partial int nViewModelIndex { get; set; } + [NetworkVar("m_bFlipViewModel")] + public partial bool FlipViewModel { get; set; } + + [NetworkVar("m_flNextPrimaryAttack")] + public partial TimeUnit_t NextPrimaryAttack { get; set; } + [NetworkVar("m_flNextSecondaryAttack")] + public partial TimeUnit_t NextSecondaryAttack { get; set; } + [NetworkVar("m_flTimeWeaponIdle")] + public partial TimeUnit_t TimeWeaponIdle { get; set; } + /// /// View model index (art) /// - [NetworkName("m_iViewModelIndex")] -#if CLIENT_DLL - public int iViewModelIndex; -#else - [NetworkVar] public partial int iViewModelIndex { get; set; } -#endif - [NetworkName("m_iWorldModelIndex")] -#if CLIENT_DLL - public int WorldModelIndex; -#else - [NetworkVar] public partial int WorldModelIndex { get; set; } -#endif - [NetworkName("m_bFlipViewModel")] -#if CLIENT_DLL - public bool FlipViewModel; -#else - [NetworkVar] public partial bool FlipViewModel { get; set; } -#endif - - [NetworkName("m_flNextPrimaryAttack")] -#if CLIENT_DLL - public TimeUnit_t NextPrimaryAttack; -#else - [NetworkVar] public partial TimeUnit_t NextPrimaryAttack { get; set; } -#endif - [NetworkName("m_flNextSecondaryAttack")] -#if CLIENT_DLL - public TimeUnit_t NextSecondaryAttack; -#else - [NetworkVar] public partial TimeUnit_t NextSecondaryAttack { get; set; } -#endif - [NetworkName("m_flTimeWeaponIdle")] -#if CLIENT_DLL - public TimeUnit_t TimeWeaponIdle; -#else - [NetworkVar] public partial TimeUnit_t TimeWeaponIdle { get; set; } -#endif - - [NetworkName("m_iState")] -#if CLIENT_DLL - public int State; -#else - [NetworkVar] public partial int State { get; set; } -#endif - [NetworkName("m_hOwner")] -#if CLIENT_DLL - public EHANDLE Owner = new(); -#else - [NetworkVar] public partial EHANDLE Owner { get; set; } -#endif + [NetworkVar("m_iViewModelIndex")] + public partial int iViewModelIndex { get; set; } + [NetworkVar("m_iWorldModelIndex")] + public partial int WorldModelIndex { get; set; } + [NetworkVar("m_iState")] + public partial int State { get; set; } + [NetworkVar("m_hOwner")] + public partial EHANDLE Owner { get; set; } Activity Activity; int IdealSequence; diff --git a/Game.Shared/BaseDoor.cs b/Game.Shared/BaseDoor.cs index 871a5e12..ae6e5dc7 100644 --- a/Game.Shared/BaseDoor.cs +++ b/Game.Shared/BaseDoor.cs @@ -1,7 +1,6 @@ #if CLIENT_DLL || GAME_DLL using Source.Common; namespace Game.Shared; -using FIELD = Source.FIELD; #if !CLIENT_DLL [LinkEntityToClass("func_door")] [LinkEntityToClass("func_water")] @@ -9,22 +8,10 @@ namespace Game.Shared; [NetworkName("CBaseDoor")] public partial class BaseDoor : BaseToggle { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_BaseDoor = new(DT_BaseToggle, [ -#if CLIENT_DLL -#else -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseDoor); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_BaseDoor); -#endif + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + public float WaveHeight; } #endif diff --git a/Game.Shared/BaseEntityShared.cs b/Game.Shared/BaseEntityShared.cs index 82de77ac..336ee6ee 100644 --- a/Game.Shared/BaseEntityShared.cs +++ b/Game.Shared/BaseEntityShared.cs @@ -183,8 +183,8 @@ public void InvalidatePhysicsRecursive(InvalidatePhysicsBits changeFlags) { public bool IsAlive() => LifeState == (int)Source.LifeState.Alive; - [NetworkName("m_bIsPlayerSimulated")] - protected bool b_IsPlayerSimulated; + [NetworkVar("m_bIsPlayerSimulated")] + protected partial bool b_IsPlayerSimulated { get; set; } public bool IsPlayerSimulated() => b_IsPlayerSimulated; public void AddFlag(EntityFlags flag) => flags |= (int)flag; diff --git a/Game.Shared/BaseGrenade.cs b/Game.Shared/BaseGrenade.cs index 27d54254..450ddca8 100644 --- a/Game.Shared/BaseGrenade.cs +++ b/Game.Shared/BaseGrenade.cs @@ -8,48 +8,33 @@ namespace Game.Shared; -using FIELD = Source.FIELD; [LinkEntityToClass("grenade")] [NetworkName("CBaseGrenade")] public partial class BaseGrenade : BaseProjectile { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_BaseGrenade = new(DT_BaseAnimating, [ -#if CLIENT_DLL - RecvPropFloat(FIELD.OF(nameof(Damage))), - RecvPropFloat(FIELD.OF(nameof(DmgRadius))), - RecvPropBool(FIELD.OF(nameof(IsLive))), - RecvPropEHandle(FIELD.OF(nameof(Thrower))), - RecvPropVector(FIELD.OF(nameof(Velocity))), - RecvPropInt(FIELD.OF(nameof(Flags))) -#else - SendPropFloat(FIELD.OF(nameof(Damage)), 10, PropFlags.RoundDown, 0, 256), - SendPropFloat(FIELD.OF(nameof(DmgRadius)), 10, PropFlags.RoundDown, 0, 1024), - SendPropBool(FIELD.OF(nameof(IsLive))), - SendPropEHandle(FIELD.OF(nameof(Thrower))), - SendPropVector(FIELD.OF(nameof(Velocity)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(Flags)), 16, PropFlags.Unsigned) -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseGrenade); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_BaseGrenade); -#endif - [NetworkName("m_flDamage")] - public float Damage; - [NetworkName("m_DmgRadius")] - public float DmgRadius; - [NetworkName("m_bIsLive")] - public bool IsLive; - [NetworkName("m_hThrower")] - public EHANDLE Thrower = new(); - [NetworkName("m_fFlags")] - public int Flags; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(Damage)) { Bits = 10, Flags = PropFlags.RoundDown, Low = 0, High = 256 }, + new(nameof(DmgRadius)) { Bits = 10, Flags = PropFlags.RoundDown, Low = 0, High = 1024 }, + nameof(IsLive), + nameof(Thrower), + new(nameof(Velocity)) { Encoding = NetEncoding.Vector, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Flags)) { Bits = 16, Flags = PropFlags.Unsigned }, + ]; + + public BaseGrenade() { + Thrower = new(); + } + + [NetworkVar("m_flDamage")] + public partial float Damage { get; set; } + [NetworkVar("m_DmgRadius")] + public partial float DmgRadius { get; set; } + [NetworkVar("m_bIsLive")] + public partial bool IsLive { get; set; } + [NetworkVar("m_hThrower")] + public partial EHANDLE Thrower { get; set; } + [NetworkVar("m_fFlags")] + public partial int Flags { get; set; } } #endif diff --git a/Game.Shared/BaseParticleEntity.cs b/Game.Shared/BaseParticleEntity.cs index f6b60139..871f70b2 100644 --- a/Game.Shared/BaseParticleEntity.cs +++ b/Game.Shared/BaseParticleEntity.cs @@ -13,22 +13,6 @@ namespace Game.Client; namespace Game.Server; #endif -using Table = -#if CLIENT_DLL - RecvTable; -#else - SendTable; -#endif - -using Class = -#if CLIENT_DLL - ClientClass; -#else - ServerClass; -#endif - -using FIELD = Source.FIELD; - [NetworkName("CBaseParticleEntity")] public partial class #if CLIENT_DLL @@ -37,8 +21,10 @@ public partial class BaseParticleEntity : BaseEntity #endif { - public static Table DT_BaseParticleEntity = new(DT_BaseEntity, []); - public static readonly Class Class = new Class(DT_BaseParticleEntity); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } #endif diff --git a/Game.Shared/BasePlayerShared.cs b/Game.Shared/BasePlayerShared.cs index fc442dde..32433c15 100644 --- a/Game.Shared/BasePlayerShared.cs +++ b/Game.Shared/BasePlayerShared.cs @@ -174,7 +174,7 @@ public override Vector3 EyePosition() { } public void ResetObserverMode() { - ObserverTarget.Set(null); + ObserverTarget = EHANDLE.FromEntity(null); ObserverMode = (int)Shared.ObserverMode.None; #if !CLIENT_DLL @@ -306,7 +306,7 @@ public int GetDefaultFOV() { public BaseEntity? GetFOVOwner() => ZoomOwner.Get(); - public void ClearZoomOwner() => ZoomOwner.Set(null); + public void ClearZoomOwner() => ZoomOwner = EHANDLE.FromEntity(null); public bool SetFOV(BaseEntity requester, int fov, float zoomRate = 0, int zoomStart = 0) { Assert(requester != null); @@ -323,9 +323,9 @@ public bool SetFOV(BaseEntity requester, int fov, float zoomRate = 0, int zoomSt else { //FIXME: Maybe do this is as an accessor instead if (fov == 0) - ZoomOwner.Set(null); + ZoomOwner = EHANDLE.FromEntity(null); else - ZoomOwner.Set(requester); + ZoomOwner = EHANDLE.FromEntity(requester); } // Setup our FOV and our scaling time @@ -1067,7 +1067,7 @@ public void ViewPunchReset(float tolerance = 0) { } void Weapon_SetLast(BaseCombatWeapon? pWeapon) { - LastWeapon.Set(pWeapon); + LastWeapon = Handle.FromEntity(pWeapon); } public void SetAnimationExtension(ReadOnlySpan extension) { diff --git a/Game.Shared/BaseToggle.cs b/Game.Shared/BaseToggle.cs index c351116a..53a732d7 100644 --- a/Game.Shared/BaseToggle.cs +++ b/Game.Shared/BaseToggle.cs @@ -5,38 +5,22 @@ using System.Numerics; namespace Game.Shared; -using FIELD = Source.FIELD; [NetworkName("CBaseToggle")] -public class BaseToggle : BaseEntity +public partial class BaseToggle : BaseEntity { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_BaseToggle = new(DT_BaseEntity, [ -#if CLIENT_DLL - RecvPropVector(FIELD.OF(nameof(FinalDest))), - RecvPropInt(FIELD.OF(nameof(MovementType))), - RecvPropFloat(FIELD.OF(nameof(MoveTargetTime))) -#else - SendPropVector(FIELD.OF(nameof(FinalDest)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(MovementType)), 4), - SendPropFloat(FIELD.OF(nameof(MoveTargetTime)), 0, PropFlags.NoScale) -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseToggle); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_BaseToggle); -#endif - [NetworkName("m_vecFinalDest")] - public Vector3 FinalDest; - [NetworkName("m_movementType")] - public int MovementType; - [NetworkName("m_flMoveTargetTime")] - public TimeUnit_t MoveTargetTime; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(FinalDest)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(MovementType)) { Bits = 4 }, + new(nameof(MoveTargetTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + ]; + + [NetworkVar("m_vecFinalDest")] + public partial Vector3 FinalDest { get; set; } + [NetworkVar("m_movementType")] + public partial int MovementType { get; set; } + [NetworkVar("m_flMoveTargetTime")] + public partial TimeUnit_t MoveTargetTime { get; set; } #if GAME_DLL public ToggleState ToggleState; diff --git a/Game.Shared/BaseViewModel.cs b/Game.Shared/BaseViewModel.cs index 3b92ef1b..14aa477e 100644 --- a/Game.Shared/BaseViewModel.cs +++ b/Game.Shared/BaseViewModel.cs @@ -18,7 +18,6 @@ namespace Game.Server; using System.Numerics; using DEFINE = Source.DEFINE; -using FIELD = Source.FIELD; [LinkEntityToClass("viewmodel")] [NetworkName("CBaseViewModel")] @@ -40,51 +39,40 @@ public partial class public const int VIEWMODEL_INDEX_BITS = 4; - public static readonly + [NetworkTable(NoBase = true)] + public static readonly new NetworkProp[] Props = [ + new(nameof(ModelIndex)) { Encoding = NetEncoding.ModelIndex }, + new(nameof(Body)) { Bits = 32, Side = NetworkSide.Server }, + new(nameof(Skin)) { Bits = 10 }, + new(nameof(Body)) { Side = NetworkSide.Client }, + new(nameof(Sequence)) { Bits = 12, Flags = PropFlags.Unsigned, Proxy = typeof(ViewModelSequenceProxy) }, + new(nameof(_ViewModelIndex)) { Bits = VIEWMODEL_INDEX_BITS, Flags = PropFlags.Unsigned }, + new(nameof(PlaybackRate)) { Encoding = NetEncoding.Float, Bits = 8, Flags = PropFlags.RoundUp, Low = -4.0f, High = 12.0f }, + new(nameof(Effects)) { Bits = 10, Flags = PropFlags.Unsigned }, + new(nameof(AnimationParity)) { Bits = 3, Flags = PropFlags.Unsigned }, + new(nameof(Weapon)) { Proxy = typeof(ViewModelWeaponProxy) }, + nameof(Owner), + + new(nameof(NewSequenceParity)) { Bits = (int)EntityEffects.ParityBits, Flags = PropFlags.Unsigned }, + new(nameof(ResetEventsParity)) { Bits = (int)EntityEffects.ParityBits, Flags = PropFlags.Unsigned }, + new(nameof(MuzzleFlashParity)) { Bits = (int)EntityEffects.MuzzleflashBits, Flags = PropFlags.Unsigned }, + + new(nameof(PoseParameter)) { Encoding = NetEncoding.Array, Bits = 8, Flags = 0, Low = 0.0f, High = 1.0f }, + ]; + + public static class ViewModelSequenceProxy + { #if CLIENT_DLL - RecvTable -#else - SendTable + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_SequenceNum(in data, instance, field); #endif - DT_BaseViewModel = new([ + } + + public static class ViewModelWeaponProxy + { #if CLIENT_DLL - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - RecvPropInt(FIELD.OF(nameof(Body))), - RecvPropInt(FIELD.OF(nameof(Skin))), - RecvPropInt(FIELD.OF(nameof(Sequence)), 0, RecvProxy_SequenceNum), - RecvPropInt(FIELD.OF(nameof(_ViewModelIndex))), - RecvPropFloat(FIELD.OF(nameof(PlaybackRate))), - RecvPropInt(FIELD.OF(nameof(Effects))), - RecvPropInt(FIELD.OF(nameof(AnimationParity))), - RecvPropEHandle(FIELD.OF(nameof(Weapon)), RecvProxy_Weapon), - RecvPropEHandle(FIELD.OF(nameof(Owner))), - - RecvPropInt(FIELD.OF(nameof(NewSequenceParity))), - RecvPropInt(FIELD.OF(nameof(ResetEventsParity))), - RecvPropInt(FIELD.OF(nameof(MuzzleFlashParity))), - - RecvPropFloat(FIELD.OF_ARRAYINDEX(nameof(PoseParameter), 0)), - RecvPropArray(FIELD.OF_ARRAY(nameof(PoseParameter))), -#else - SendPropModelIndex(FIELD.OF(nameof(ModelIndex))), - SendPropInt(FIELD.OF(nameof(Body)), 32), - SendPropInt(FIELD.OF(nameof(Skin)), 10), - SendPropInt(FIELD.OF(nameof(Sequence)), 12, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(_ViewModelIndex)), VIEWMODEL_INDEX_BITS, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(PlaybackRate)), 8, PropFlags.RoundUp, -4.0f, 12.0f), - SendPropInt(FIELD.OF(nameof(Effects)), 10, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(AnimationParity)), 3, PropFlags.Unsigned), - SendPropEHandle(FIELD.OF(nameof(Weapon))), - SendPropEHandle(FIELD.OF(nameof(Owner))), - - SendPropInt(FIELD.OF(nameof(NewSequenceParity)), (int)EntityEffects.ParityBits, PropFlags.Unsigned ), - SendPropInt(FIELD.OF(nameof(ResetEventsParity)), (int)EntityEffects.ParityBits, PropFlags.Unsigned ), - SendPropInt(FIELD.OF(nameof(MuzzleFlashParity)), (int)EntityEffects.MuzzleflashBits, PropFlags.Unsigned ), - - SendPropFloat(FIELD.OF_SENDINFO_ARRAY(nameof(PoseParameter)), 8, 0, 0.0f, 1.0f), - SendPropArray(FIELD.OF_ARRAY(nameof(PoseParameter))), + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_Weapon(in data, instance, field); #endif - ]); + } TimeUnit_t TimeWeaponIdle; Activity Activity; @@ -111,24 +99,14 @@ private static void RecvProxy_SequenceNum(ref readonly RecvProxyData data, objec model.SetCycle(0); } } - public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseViewModel); -#else -#pragma warning disable CS0109 // Member does not hide an inherited member; new keyword is not required - public static readonly new ServerClass ServerClass = new ServerClass(DT_BaseViewModel); -#pragma warning restore CS0109 // Member does not hide an inherited member; new keyword is not required -#endif - [NetworkName("m_nViewModelIndex")] - public int _ViewModelIndex; - [NetworkName("m_hOwner")] - public EHANDLE Owner = new(); - [NetworkName("m_hWeapon")] - public Handle Weapon = new(); - [NetworkName("m_nAnimationParity")] -#if CLIENT_DLL - public int AnimationParity; -#else - [NetworkVar] public partial int AnimationParity { get; set; } #endif + [NetworkVar("m_nViewModelIndex")] + public partial int _ViewModelIndex { get; set; } + [NetworkVar("m_hOwner")] + public partial EHANDLE Owner { get; set; } + [NetworkVar("m_hWeapon")] + public partial Handle Weapon { get; set; } + [NetworkVar("m_nAnimationParity")] public partial int AnimationParity { get; set; } public BaseCombatWeapon? GetOwningWeapon() => Weapon.Get(); @@ -140,7 +118,7 @@ public override void Spawn() { SetSolid(SolidType.None); } - public void SetOwner(BaseEntity? entity) => Owner.Set(entity); + public void SetOwner(BaseEntity? entity) => Owner = EHANDLE.FromEntity(entity); public void SetIndex(int index) { _ViewModelIndex = index; @@ -248,6 +226,8 @@ public void CalcViewModelView(BasePlayer owner, in Vector3 eyePosition, in QAngl BaseViewModel #endif () { + Owner = new(); + Weapon = new(); #if CLIENT_DLL OldAnimationParity = 0; EntClientFlags |= EntClientFlags.AlwaysInterpolate; @@ -270,7 +250,7 @@ public override void RemoveEffects(EntityEffects effects) { public void SetWeaponModel(ReadOnlySpan modelname, BaseCombatWeapon? weapon = null) { - Weapon.Set(weapon); + Weapon = Handle.FromEntity(weapon); #if CLIENT_DLL SetModel(modelname); diff --git a/Game.Shared/Beam.cs b/Game.Shared/Beam.cs index ab344807..e1969e6e 100644 --- a/Game.Shared/Beam.cs +++ b/Game.Shared/Beam.cs @@ -6,11 +6,6 @@ using System.Numerics; namespace Game.Shared; -#if CLIENT_DLL -using FIELD = Source.FIELD; -#else -using FIELD = Source.FIELD; -#endif public enum BeamTypes { @@ -26,7 +21,7 @@ public enum BeamTypes [LinkEntityToClass("beam")] [NetworkName("CBeam")] -public class +public partial class #if CLIENT_DLL C_Beam #else @@ -39,150 +34,116 @@ public class public const float MAX_BEAM_SCROLLSPEED = 100f; public const float MAX_BEAM_NOISEAMPLITUDE = 64; - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_BeamPredictableId = new(nameof(DT_BeamPredictableId), [ + [NetworkTable("DT_BeamPredictableId")] + public static readonly NetworkProp[] BeamPredictableIdProps = [ #if CLIENT_DLL - RecvPropPredictableId(FIELD.OF(nameof(PredictableID))), - RecvPropBool(FIELD.OF(nameof(b_IsPlayerSimulated))) + new(nameof(PredictableID)) { Encoding = NetEncoding.PredictableId }, #else - SendPropPredictableId(FIELD.OF(nameof(PredictableId))), - SendPropBool(FIELD.OF(nameof(b_IsPlayerSimulated))) + new(nameof(PredictableId)) { Encoding = NetEncoding.PredictableId }, #endif - ]); - public static readonly + new(nameof(b_IsPlayerSimulated)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, + ]; + + [NetworkTable(NoBase = true)] + public static readonly new NetworkProp[] Props = [ + new(nameof(BeamType)) { Bits = 3, Flags = PropFlags.Unsigned }, + new(nameof(BeamFlags)) { Bits = (int)Shared.BeamFlags.NumFlags, Flags = PropFlags.Unsigned }, + new(nameof(NumBeamEnts)) { Bits = 5, Flags = PropFlags.Unsigned }, + nameof(AttachEntity), + new(nameof(AttachIndex)) { Bits = ATTACHMENT_INDEX_BITS, Flags = PropFlags.Unsigned }, + new(nameof(HaloIndex)) { Bits = 16, Flags = PropFlags.Unsigned }, + new(nameof(HaloScale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Width)) { Bits = 10, Flags = PropFlags.RoundUp, Low = 0.0f, High = MAX_BEAM_WIDTH }, + new(nameof(EndWidth)) { Bits = 10, Flags = PropFlags.RoundUp, Low = 0.0f, High = MAX_BEAM_WIDTH }, + new(nameof(FadeLength)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Amplitude)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0.0f, High = MAX_BEAM_NOISEAMPLITUDE }, + new(nameof(StartFrame)) { Bits = 8, Flags = PropFlags.RoundDown, Low = 0.0f, High = 256.0f }, + new(nameof(Speed)) { Bits = 8, Flags = PropFlags.NoScale, Low = 0.0f, High = MAX_BEAM_SCROLLSPEED, Proxy = typeof(BeamScrollSpeedProxy) }, + new(nameof(RenderFX)) { Bits = 8, Flags = PropFlags.Unsigned, Side = NetworkSide.Server }, + new(nameof(RenderMode)) { Bits = 8, Flags = PropFlags.Unsigned, Side = NetworkSide.Server }, + new(nameof(FrameRate)) { Bits = 10, Flags = PropFlags.RoundUp, Low = -25.0f, High = 25.0f }, + new(nameof(HDRColorScale)) { Bits = 0, Flags = PropFlags.NoScale, Low = 0.0f, High = 0.0f }, + new(nameof(RenderColor)) { Encoding = NetEncoding.Int, Side = NetworkSide.Client }, + new(nameof(RenderFX)) { Side = NetworkSide.Client }, + new(nameof(RenderMode)) { Side = NetworkSide.Client }, + new(nameof(Frame)) { Bits = 20, Flags = PropFlags.RoundDown | PropFlags.ChangesOften, Low = 0.0f, High = 256.0f }, + new(nameof(RenderColor)) { Encoding = NetEncoding.Int, Bits = 32, Flags = PropFlags.Unsigned | PropFlags.ChangesOften, Side = NetworkSide.Server }, + new(nameof(EndPos)) { Bits = -1, Flags = PropFlags.Coord }, + + new(nameof(ModelIndex)) { Encoding = NetEncoding.ModelIndex }, + new(nameof(MinDXLevel)) { Side = NetworkSide.Client }, + new(nameof(Origin)) { Bits = 19, Flags = PropFlags.ChangesOften, Low = WorldSize.MIN_COORD_INTEGER, High = WorldSize.MAX_COORD_INTEGER }, #if CLIENT_DLL - RecvTable + new(nameof(NetworkMoveParent)) { Encoding = NetEncoding.Int, Proxy = typeof(MoveParentProxy) }, #else - SendTable + nameof(MoveParent), #endif - DT_Beam = new([ -#if CLIENT_DLL - RecvPropInt(FIELD.OF(nameof(BeamType))), - RecvPropInt(FIELD.OF(nameof(BeamFlags))), - RecvPropInt(FIELD.OF(nameof(NumBeamEnts))), - RecvPropArray3( - FIELD.OF_ARRAY(nameof(AttachEntity)), - RecvPropEHandle(FIELD.OF_ARRAYINDEX(nameof(AttachEntity), 0)) - ), - RecvPropArray3 - ( - FIELD.OF_ARRAY(nameof(AttachIndex)), - RecvPropInt(FIELD.OF_ARRAYINDEX(nameof(AttachIndex), 0)) - ), - RecvPropInt(FIELD.OF(nameof(HaloIndex))), - RecvPropFloat(FIELD.OF(nameof(HaloScale))), - RecvPropFloat(FIELD.OF(nameof(Width))), - RecvPropFloat(FIELD.OF(nameof(EndWidth))), - RecvPropFloat(FIELD.OF(nameof(FadeLength))), - RecvPropFloat(FIELD.OF(nameof(Amplitude))), - RecvPropFloat(FIELD.OF(nameof(StartFrame))), - RecvPropFloat(FIELD.OF(nameof(Speed)), 0, RecvProxy_Beam_ScrollSpeed), - RecvPropInt(FIELD.OF(nameof(RenderFX))), - RecvPropInt(FIELD.OF(nameof(RenderMode))), - RecvPropFloat(FIELD.OF(nameof(FrameRate))), - RecvPropFloat(FIELD.OF(nameof(HDRColorScale))), - RecvPropFloat(FIELD.OF(nameof(Frame))), - RecvPropInt(FIELD.OF(nameof(RenderColor))), - RecvPropVector(FIELD.OF(nameof(EndPos))), - - RecvPropInt(FIELD.OF(nameof(ModelIndex))), - RecvPropVector(FIELD.OF(nameof(Origin))), - RecvPropInt(FIELD.OF(nameof(MoveParent)), 0, RecvProxy_IntToMoveParent), - RecvPropInt(FIELD.OF(nameof(MinDXLevel))), + new(nameof(MinDXLevel)) { Bits = 8, Flags = PropFlags.Unsigned, Side = NetworkSide.Server }, - RecvPropDataTable( "beampredictable_id", DT_BeamPredictableId) +#if CLIENT_DLL + new(nameof(BeamPredictableIdProps)) { Name = "beampredictable_id" }, #else - SendPropInt(FIELD.OF(nameof(BeamType)), (int)Math.Log2((int)BeamTypes.NumTypes)+1, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(BeamFlags)), (int)Shared.BeamFlags.NumFlags, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(NumBeamEnts)), 5, PropFlags.Unsigned), - SendPropArray3( - FIELD.OF_ARRAY(nameof(AttachEntity)), - SendPropEHandle(FIELD.OF_ARRAYINDEX(nameof(AttachEntity), 0)) - ), - SendPropArray3 - ( - FIELD.OF_ARRAY(nameof(AttachIndex)), - SendPropInt(FIELD.OF_ARRAYINDEX(nameof(AttachIndex), 0), ATTACHMENT_INDEX_BITS, PropFlags.Unsigned) - ), - SendPropInt(FIELD.OF(nameof(HaloIndex)), 16, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(HaloScale)),0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(Width)), 10, PropFlags.RoundUp, 0.0f, MAX_BEAM_WIDTH), - SendPropFloat(FIELD.OF(nameof(EndWidth)), 10, PropFlags.RoundUp, 0.0f, MAX_BEAM_WIDTH), - SendPropFloat(FIELD.OF(nameof(FadeLength)),0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(Amplitude)), 8, PropFlags.RoundDown, 0.0f, MAX_BEAM_NOISEAMPLITUDE), - SendPropFloat(FIELD.OF(nameof(StartFrame)), 8, PropFlags.RoundDown, 0.0f, 256.0f), - SendPropFloat(FIELD.OF(nameof(Speed)), 8, PropFlags.NoScale, 0.0f, MAX_BEAM_SCROLLSPEED), - SendPropInt(FIELD.OF(nameof(RenderFX)), 8, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(RenderMode)), 8, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(FrameRate)), 10, PropFlags.RoundUp, -25.0f, 25.0f), - SendPropFloat(FIELD.OF(nameof(HDRColorScale)), 0, PropFlags.NoScale, 0.0f, 0.0f), - SendPropFloat(FIELD.OF(nameof(Frame)), 20, PropFlags.RoundDown | PropFlags.ChangesOften, 0.0f, 256.0f), - SendPropInt(FIELD.OF(nameof(RenderColor)), 32, PropFlags.Unsigned | PropFlags.ChangesOften), - SendPropVector(FIELD.OF(nameof(EndPos)), -1, PropFlags.Coord), - - SendPropModelIndex(FIELD.OF(nameof(ModelIndex))), - SendPropVector(NetworkVarFields.Origin, 19, PropFlags.ChangesOften, WorldSize.MIN_COORD_INTEGER, WorldSize.MAX_COORD_INTEGER), - SendPropEHandle(FIELD.OF(nameof(MoveParent))), - SendPropInt(FIELD.OF(nameof(MinDXLevel)), 8, PropFlags.Unsigned), - - SendPropDataTable( "beampredictable_id", DT_BeamPredictableId, SendProxy_SendPredictableId) + new(nameof(BeamPredictableIdProps)) { Name = "beampredictable_id", Proxy = typeof(BaseEntity.PredictableIdProxy) }, #endif - ]); + ]; + public static class BeamScrollSpeedProxy + { #if CLIENT_DLL - private static void RecvProxy_Beam_ScrollSpeed(ref readonly RecvProxyData data, object instance, IFieldAccessor field) { - C_Beam beam = (C_Beam)instance; - float val = data.Value.Float * 0.1f; - beam.Speed = val; + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) { + C_Beam beam = (C_Beam)instance; + float val = data.Value.Float * 0.1f; + beam.Speed = val; + } +#endif } - public static readonly new ClientClass ClientClass = new ClientClass(DT_Beam); + [NetworkVar("m_hAttachEntity")] + public partial ref readonly InlineArrayNewMaxBeamEnts AttachEntity { get; } + [NetworkVar("m_nAttachIndex")] + public partial ref readonly InlineArrayNewMaxBeamEnts AttachIndex { get; } +#if CLIENT_DLL + public C_Beam() { #else - public static readonly new ServerClass ServerClass = new ServerClass(DT_Beam); + public Beam() { #endif - [NetworkName("m_hAttachEntity")] - public InlineArrayNewMaxBeamEnts AttachEntity = new(); - [NetworkName("m_nAttachIndex")] - public InlineArrayNewMaxBeamEnts AttachIndex = new(); - [NetworkName("m_nBeamType")] - public int BeamType; - [NetworkName("m_nBeamFlags")] - public int BeamFlags; - [NetworkName("m_nNumBeamEnts")] - public int NumBeamEnts; - [NetworkName("m_nMinDXLevel")] - public int MinDXLevel; - [NetworkName("m_nHaloIndex")] - public int HaloIndex; - [NetworkName("m_fHaloScale")] - public float HaloScale; - [NetworkName("m_fWidth")] - public float Width; - [NetworkName("m_fEndWidth")] - public float EndWidth; - [NetworkName("m_fFadeLength")] - public float FadeLength; - [NetworkName("m_fAmplitude")] - public float Amplitude; - [NetworkName("m_fStartFrame")] - public float StartFrame; - [NetworkName("m_fSpeed")] - public new float Speed; - [NetworkName("m_flFrameRate")] - public float FrameRate; - [NetworkName("m_flHDRColorScale")] - public float HDRColorScale; - [NetworkName("m_flFrame")] - public float Frame; - [NetworkName("m_clrRender")] - public Color RenderColor; - [NetworkName("m_vecEndPos")] - public Vector3 EndPos; + AttachEntityForModify() = new(); + AttachIndexForModify() = new(); + } + [NetworkVar("m_nBeamType")] + public partial int BeamType { get; set; } + [NetworkVar("m_nBeamFlags")] + public partial int BeamFlags { get; set; } + [NetworkVar("m_nNumBeamEnts")] + public partial int NumBeamEnts { get; set; } + [NetworkVar("m_nMinDXLevel")] + public partial int MinDXLevel { get; set; } + [NetworkVar("m_nHaloIndex")] + public partial int HaloIndex { get; set; } + [NetworkVar("m_fHaloScale")] + public partial float HaloScale { get; set; } + [NetworkVar("m_fWidth")] + public partial float Width { get; set; } + [NetworkVar("m_fEndWidth")] + public partial float EndWidth { get; set; } + [NetworkVar("m_fFadeLength")] + public partial float FadeLength { get; set; } + [NetworkVar("m_fAmplitude")] + public partial float Amplitude { get; set; } + [NetworkVar("m_fStartFrame")] + public partial float StartFrame { get; set; } + [NetworkVar("m_fSpeed")] + public new partial float Speed { get; set; } + [NetworkVar("m_flFrameRate")] + public partial float FrameRate { get; set; } + [NetworkVar("m_flHDRColorScale")] + public partial float HDRColorScale { get; set; } + [NetworkVar("m_flFrame")] + public partial float Frame { get; set; } + [NetworkVar("m_clrRender")] + public partial Color RenderColor { get; set; } + [NetworkVar("m_vecEndPos")] + public partial Vector3 EndPos { get; set; } } public static class BeamEnt diff --git a/Game.Shared/CollisionProperty.cs b/Game.Shared/CollisionProperty.cs index ae53ff1d..9910c90d 100644 --- a/Game.Shared/CollisionProperty.cs +++ b/Game.Shared/CollisionProperty.cs @@ -161,18 +161,82 @@ public void UnlockPartitionForRead() { readonly ThreadLocal ReadLockCount = new(); } -public class CollisionProperty : ICollideable +public partial class CollisionProperty : ICollideable { + [NetworkTable("DT_CollisionProperty")] + public static readonly NetworkProp[] Props = [ + new(nameof(MinsPreScaled)) { Bits = 0, Flags = PropFlags.NoScale, Proxy = typeof(OBBMinsPreScaledProxy) }, + new(nameof(MaxsPreScaled)) { Bits = 0, Flags = PropFlags.NoScale, Proxy = typeof(OBBMaxPreScaledProxy) }, + new(nameof(Mins)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Maxs)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SolidType)) { Bits = 3, Flags = PropFlags.Unsigned, Proxy = typeof(SolidTypeProxy) }, + new(nameof(SolidFlags)) { Bits = (int)Source.SolidFlags.MaxBits, Flags = PropFlags.Unsigned, Proxy = typeof(SolidFlagsProxy) }, + new(nameof(SurroundType)) { Bits = (int)SurroundingBoundsType.BitCount, Flags = PropFlags.Unsigned, Proxy = typeof(IntDirtySurroundProxy) }, + new(nameof(TriggerBloat)) { Bits = 0, Flags = PropFlags.Unsigned, Proxy = typeof(IntDirtySurroundProxy) }, + new(nameof(SpecifiedSurroundingMinsPreScaled)) { Bits = 0, Flags = PropFlags.NoScale, Proxy = typeof(VectorDirtySurroundProxy) }, + new(nameof(SpecifiedSurroundingMaxsPreScaled)) { Bits = 0, Flags = PropFlags.NoScale, Proxy = typeof(VectorDirtySurroundProxy) }, + new(nameof(SpecifiedSurroundingMins)) { Bits = 0, Flags = PropFlags.NoScale, Proxy = typeof(VectorDirtySurroundProxy) }, + new(nameof(SpecifiedSurroundingMaxs)) { Bits = 0, Flags = PropFlags.NoScale, Proxy = typeof(VectorDirtySurroundProxy) }, + ]; + + [PredictionTable] + public static readonly PredictionField[] Prediction = [ + nameof(MinsPreScaled), + nameof(MaxsPreScaled), + nameof(Mins), + nameof(Maxs), + nameof(SolidType), + nameof(SolidFlags), + nameof(TriggerBloat), + ]; + + public static class OBBMinsPreScaledProxy + { +#if CLIENT_DLL + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_OBBMinsPreScaled(in data, instance, field); +#endif + } + + public static class OBBMaxPreScaledProxy + { +#if CLIENT_DLL + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_OBBMaxPreScaled(in data, instance, field); +#endif + } + + public static class SolidTypeProxy + { +#if CLIENT_DLL + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_Solid(in data, instance, field); +#else + public static void Send(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) => SendProxy_Solid(prop, instance, field, ref outData, element, objectID); +#endif + } + + public static class SolidFlagsProxy + { +#if CLIENT_DLL + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_SolidFlags(in data, instance, field); +#else + public static void Send(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) => SendProxy_SolidFlags(prop, instance, field, ref outData, element, objectID); +#endif + } + + public static class IntDirtySurroundProxy + { +#if CLIENT_DLL + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_IntDirtySurround(in data, instance, field); +#endif + } + + public static class VectorDirtySurroundProxy + { +#if CLIENT_DLL + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) => RecvProxy_VectorDirtySurround(in data, instance, field); +#endif + } + #if CLIENT_DLL - public static readonly DataMap PredMap = new(typeof(CollisionProperty), [ - DEFINE.PRED_FIELD(nameof(MinsPreScaled), FieldType.Vector, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(MaxsPreScaled), FieldType.Vector, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(Mins), FieldType.Vector, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(Maxs), FieldType.Vector, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(SolidType), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(SolidFlags), FieldType.Short, FieldTypeDescFlags.InSendTable ), - DEFINE.PRED_FIELD(nameof(TriggerBloat), FieldType.Integer, FieldTypeDescFlags.InSendTable ), - ]); private static void RecvProxy_VectorDirtySurround(ref readonly RecvProxyData data, object instance, IFieldAccessor field) { Vector3 vecold = field.GetValue(instance); Vector3 vecnew = data.Value.Vector; @@ -240,36 +304,41 @@ private static void SendProxy_Solid(SendProp prop, object instance, IFieldAccess } #endif - [NetworkName("m_vecMinsPreScaled")] - public Vector3 MinsPreScaled; - [NetworkName("m_vecMaxsPreScaled")] - public Vector3 MaxsPreScaled; - [NetworkName("m_vecMins")] - public Vector3 Mins; - [NetworkName("m_vecMaxs")] - public Vector3 Maxs; +#if !CLIENT_DLL + public void NetworkStateChanged() => Outer?.NetworkStateChanged(); + public void NetworkStateChanged(IFieldAccessor field) => Outer?.NetworkStateChanged(); +#endif + + [NetworkVar("m_vecMinsPreScaled")] + public partial ref readonly Vector3 MinsPreScaled { get; } + [NetworkVar("m_vecMaxsPreScaled")] + public partial ref readonly Vector3 MaxsPreScaled { get; } + [NetworkVar("m_vecMins")] + public partial ref readonly Vector3 Mins { get; } + [NetworkVar("m_vecMaxs")] + public partial ref readonly Vector3 Maxs { get; } public Vector3 Size; float Radius; - [NetworkName("m_usSolidFlags")] - public ushort SolidFlags; + [NetworkVar("m_nSolidType")] + public partial byte SolidType { get; set; } + [NetworkVar("m_usSolidFlags")] + public partial ushort SolidFlags { get; set; } SpatialPartitionHandle_t Partition = PARTITION_INVALID_HANDLE; - [NetworkName("m_nSurroundType")] - byte SurroundType; - [NetworkName("m_nSolidType")] - public byte SolidType; + [NetworkVar("m_nSurroundType")] + partial byte SurroundType { get; set; } - [NetworkName("m_triggerBloat")] - public byte TriggerBloat; + [NetworkVar("m_triggerBloat")] + public partial byte TriggerBloat { get; set; } Vector3 SurroundingMins; Vector3 SurroundingMaxs; - [NetworkName("m_vecSpecifiedSurroundingMinsPreScaled")] - Vector3 SpecifiedSurroundingMinsPreScaled; - [NetworkName("m_vecSpecifiedSurroundingMaxsPreScaled")] - Vector3 SpecifiedSurroundingMaxsPreScaled; - [NetworkName("m_vecSpecifiedSurroundingMins")] - Vector3 SpecifiedSurroundingMins; - [NetworkName("m_vecSpecifiedSurroundingMaxs")] - Vector3 SpecifiedSurroundingMaxs; + [NetworkVar("m_vecSpecifiedSurroundingMinsPreScaled")] + partial ref readonly Vector3 SpecifiedSurroundingMinsPreScaled { get; } + [NetworkVar("m_vecSpecifiedSurroundingMaxsPreScaled")] + partial ref readonly Vector3 SpecifiedSurroundingMaxsPreScaled { get; } + [NetworkVar("m_vecSpecifiedSurroundingMins")] + partial ref readonly Vector3 SpecifiedSurroundingMins { get; } + [NetworkVar("m_vecSpecifiedSurroundingMaxs")] + partial ref readonly Vector3 SpecifiedSurroundingMaxs { get; } public void UseTriggerBounds(bool enable, float bloat) { Assert(bloat <= 127.0f); @@ -534,8 +603,8 @@ public ref readonly Vector3 OBBSize(){ public void SetCollisionBounds(in Vector3 mins, in Vector3 maxs) { if (MinsPreScaled != mins || MaxsPreScaled != maxs) { - MinsPreScaled = mins; - MaxsPreScaled = maxs; + MinsPreScaledForModify() = mins; + MaxsPreScaledForModify() = maxs; } bool dirty = false; @@ -545,15 +614,15 @@ public void SetCollisionBounds(in Vector3 mins, in Vector3 maxs) { Vector3 newMins = mins * scale; Vector3 newMaxs = maxs * scale; if (Mins != newMins || Maxs != newMaxs) { - Mins = newMins; - Maxs = newMaxs; + MinsForModify() = newMins; + MaxsForModify() = newMaxs; dirty = true; } } else { if (Mins != mins || Maxs != maxs) { - Mins = mins; - Maxs = maxs; + MinsForModify() = mins; + MaxsForModify() = maxs; dirty = true; } } @@ -879,10 +948,10 @@ internal void UpdatePartition() { public void Init(BaseEntity entity) { Outer = entity; - MinsPreScaled.Init(); - MaxsPreScaled.Init(); - Mins.Init(); - Maxs.Init(); + MinsPreScaledForModify() = default; + MaxsPreScaledForModify() = default; + MinsForModify() = default; + MaxsForModify() = default; Radius = 0.0f; TriggerBloat = 0; SolidFlags = 0; @@ -891,48 +960,13 @@ public void Init(BaseEntity entity) { SurroundType = (int)SurroundingBoundsType.UseOBBCollisionBounds; SurroundingMins = vec3_origin; SurroundingMaxs = vec3_origin; - SpecifiedSurroundingMinsPreScaled.Init(); - SpecifiedSurroundingMaxsPreScaled.Init(); - SpecifiedSurroundingMins.Init(); - SpecifiedSurroundingMaxs.Init(); + SpecifiedSurroundingMinsPreScaledForModify() = default; + SpecifiedSurroundingMaxsPreScaledForModify() = default; + SpecifiedSurroundingMinsForModify() = default; + SpecifiedSurroundingMaxsForModify() = default; } BaseEntity Outer = null!; public BaseEntity GetOuter() => Outer; - -#if CLIENT_DLL - public static RecvTable DT_CollisionProperty = new(nameof(DT_CollisionProperty), [ - RecvPropVector(FIELD.OF(nameof(MinsPreScaled)), 0, RecvProxy_OBBMinsPreScaled), - RecvPropVector(FIELD.OF(nameof(MaxsPreScaled)), 0, RecvProxy_OBBMaxPreScaled), - RecvPropVector(FIELD.OF(nameof(Mins)), 0), - RecvPropVector(FIELD.OF(nameof(Maxs)), 0), - RecvPropInt(FIELD.OF(nameof(SolidType)), 0, RecvProxy_Solid), - RecvPropInt(FIELD.OF(nameof(SolidFlags)), 0, RecvProxy_SolidFlags), - RecvPropInt(FIELD.OF(nameof(SurroundType)), 0, RecvProxy_IntDirtySurround), - RecvPropInt(FIELD.OF(nameof(TriggerBloat)), 0, RecvProxy_IntDirtySurround), - RecvPropVector(FIELD.OF(nameof(SpecifiedSurroundingMinsPreScaled)), 0, RecvProxy_VectorDirtySurround), - RecvPropVector(FIELD.OF(nameof(SpecifiedSurroundingMaxsPreScaled)), 0, RecvProxy_VectorDirtySurround), - RecvPropVector(FIELD.OF(nameof(SpecifiedSurroundingMins)), 0, RecvProxy_VectorDirtySurround), - RecvPropVector(FIELD.OF(nameof(SpecifiedSurroundingMaxs)), 0, RecvProxy_VectorDirtySurround), - ]); - -#else - public static SendTable DT_CollisionProperty = new(nameof(DT_CollisionProperty), [ - SendPropVector(FIELD.OF(nameof(MinsPreScaled)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(MaxsPreScaled)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(Mins)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(Maxs)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(SolidType)), 3, PropFlags.Unsigned, SendProxy_Solid), - SendPropInt(FIELD.OF(nameof(SolidFlags)), (int)Source.SolidFlags.MaxBits, PropFlags.Unsigned, SendProxy_SolidFlags), - SendPropInt(FIELD.OF(nameof(SurroundType)), (int)SurroundingBoundsType.BitCount, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(TriggerBloat)), 0, PropFlags.Unsigned), - SendPropVector(FIELD.OF(nameof(SpecifiedSurroundingMinsPreScaled)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(SpecifiedSurroundingMaxsPreScaled)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(SpecifiedSurroundingMins)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(SpecifiedSurroundingMaxs)), 0, PropFlags.NoScale), - ]); - - -#endif } #endif diff --git a/Game.Shared/Color32Proxy.cs b/Game.Shared/Color32Proxy.cs new file mode 100644 index 00000000..dd28bc3e --- /dev/null +++ b/Game.Shared/Color32Proxy.cs @@ -0,0 +1,16 @@ +#if CLIENT_DLL || GAME_DLL +using Source.Common; + +namespace Game.Shared; + +public static class Color32Proxy +{ +#if GAME_DLL + public static void Send(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) + => Game.Server.SendProxy.SendProxy_Color32ToInt(prop, instance, field, ref outData, element, objectID); +#else + public static void Recv(ref readonly RecvProxyData data, object instance, IFieldAccessor field) + => Game.Client.RecvProxy.RecvProxy_IntToColor32(in data, instance, field); +#endif +} +#endif diff --git a/Game.Shared/EffectData.cs b/Game.Shared/EffectData.cs index ecbd45c0..0fdba776 100644 --- a/Game.Shared/EffectData.cs +++ b/Game.Shared/EffectData.cs @@ -15,10 +15,42 @@ namespace Game.Shared; -using FIELD = Source.FIELD; - -public class EffectData +public partial class EffectData { + [NetworkTable("DT_EffectData")] + public static readonly NetworkProp[] Props = [ + new(nameof(Origin)) { Encoding = NetEncoding.VectorElements, Bits = (int)CoordSize.COORD_INTEGER_BITS + SUBINCH_PRECISION, Low = WorldSize.MIN_COORD_INTEGER, High = WorldSize.MAX_COORD_INTEGER }, + new(nameof(Start)) { Encoding = NetEncoding.VectorElements, Bits = (int)CoordSize.COORD_INTEGER_BITS + SUBINCH_PRECISION, Low = WorldSize.MIN_COORD_INTEGER, High = WorldSize.MAX_COORD_INTEGER }, + new(nameof(Angles)) { Bits = 7, Flags = PropFlags.RoundDown }, + new(nameof(Normal)) { Bits = 0, Flags = PropFlags.Normal | PropFlags.VarInt }, + new(nameof(Flags)) { Bits = MAX_EFFECT_FLAG_BITS, Flags = PropFlags.Unsigned }, + new(nameof(Magnitude)) { Bits = 12, Flags = PropFlags.RoundDown, Low = 0.0f, High = 1023.0f }, + new(nameof(Scale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(AttachmentIndex)) { Bits = 5, Flags = PropFlags.Unsigned }, + new(nameof(SurfaceProp)) { Encoding = NetEncoding.IntWithMinusOneFlag, Bits = 8, Proxy = typeof(SurfacePropProxy) }, + new(nameof(EffectName)) { Bits = MAX_EFFECT_DISPATCH_STRING_BITS, Flags = PropFlags.Unsigned }, + new(nameof(Material)) { Bits = 13, Flags = PropFlags.Unsigned }, + new(nameof(DamageType)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(HitBox)) { Bits = 12, Flags = PropFlags.Unsigned }, + new(nameof(EntIndex)) { Bits = Constants.MAX_EDICT_BITS, Flags = PropFlags.Unsigned }, + new(nameof(Color)) { Bits = 8, Flags = PropFlags.Unsigned }, + new(nameof(Radius)) { Bits = 10, Flags = PropFlags.RoundDown, Low = 0.0f, High = 1023.0f }, + nameof(HasCustomColors), + new(nameof(CustomColors.Color1)) { Bits = 8, Low = 0, High = 1 }, + new(nameof(CustomColors.Color2)) { Bits = 8, Low = 0, High = 1 }, + nameof(HasControlPoint1), + new(nameof(ControlPoint1.ParticleAttachment)) { Bits = 5, Flags = PropFlags.Unsigned }, + new(nameof(ControlPoint1.Offset)) { Encoding = NetEncoding.VectorElements, Bits = 0, Flags = PropFlags.Coord | PropFlags.NoScale }, + nameof(AllowOverride), + ]; + + public static class SurfacePropProxy + { +#if GAME_DLL + public static void Send(SendProp prop, object instance, IFieldAccessor field, ref DVariant outData, int element, int objectID) => Game.Server.SendProxy.SendProxy_ShortAddOne(prop, instance, field, ref outData, element, objectID); +#endif + } + public const int SUBINCH_PRECISION = 3; public const int MAX_EFFECT_FLAG_BITS = 8; public const int CUSTOM_COLOR_CP1 = 9; @@ -26,129 +58,55 @@ public class EffectData public const int MAX_EFFECT_DISPATCH_STRING_BITS = 10; public const int MAX_EFFECT_DISPATCH_STRINGS = 1 << MAX_EFFECT_DISPATCH_STRING_BITS; - [NetworkName("m_vOrigin")] + [NetworkVar("m_vOrigin")] public Vector3 Origin; - [NetworkName("m_vStart")] + [NetworkVar("m_vStart")] public Vector3 Start; - [NetworkName("m_vNormal")] - public Vector3 Normal; - [NetworkName("m_vAngles")] + [NetworkVar("m_vAngles")] public QAngle Angles; - [NetworkName("m_fFlags")] + [NetworkVar("m_vNormal")] + public Vector3 Normal; + [NetworkVar("m_fFlags")] public int Flags; -#if CLIENT_DLL - public BaseHandle Entity = new(); -#else -#endif - [NetworkName("entindex")] - public int EntIndex; - - [NetworkName("m_flScale")] - public float Scale; - [NetworkName("m_flMagnitude")] + [NetworkVar("m_flMagnitude")] public float Magnitude; - [NetworkName("m_flRadius")] - public float Radius; - [NetworkName("m_nAttachmentIndex")] + [NetworkVar("m_flScale")] + public float Scale; + [NetworkVar("m_nAttachmentIndex")] public int AttachmentIndex; - [NetworkName("m_nSurfaceProp")] + [NetworkVar("m_nSurfaceProp")] public short SurfaceProp; - [NetworkName("m_iEffectName")] + [NetworkVar("m_iEffectName")] public int EffectName; - [NetworkName("m_nMaterial")] + [NetworkVar("m_nMaterial")] public int Material; - [NetworkName("m_nDamageType")] + [NetworkVar("m_nDamageType")] public int DamageType; - [NetworkName("m_nHitBox")] + [NetworkVar("m_nHitBox")] public int HitBox; - [NetworkName("m_nColor")] +#if CLIENT_DLL + public BaseHandle Entity = new(); +#else +#endif + [NetworkVar("entindex")] + public int EntIndex; + [NetworkVar("m_nColor")] public byte Color; - [NetworkName("m_bCustomColors")] + [NetworkVar("m_flRadius")] + public float Radius; + + [NetworkVar("m_bCustomColors")] public bool HasCustomColors; - [NetworkName("m_CustomColors")] + [NetworkVar("m_CustomColors")] public ParticleEffectsColors CustomColors; - [NetworkName("m_bControlPoint1")] + [NetworkVar("m_bControlPoint1")] public bool HasControlPoint1; - [NetworkName("m_ControlPoint1")] + [NetworkVar("m_ControlPoint1")] public ParticleEffectsControlPoint ControlPoint1; - [NetworkName("m_bAllowOverride")] + [NetworkVar("m_bAllowOverride")] public bool AllowOverride; public EffectData Copy() => (EffectData)MemberwiseClone(); - -#if CLIENT_DLL - public static readonly RecvTable DT_EffectData = new(nameof(DT_EffectData), [ - RecvPropFloat(FIELD.OF($"{nameof(Origin)}[0]")), - RecvPropFloat(FIELD.OF($"{nameof(Origin)}[1]")), - RecvPropFloat(FIELD.OF($"{nameof(Origin)}[2]")), - RecvPropFloat(FIELD.OF($"{nameof(Start)}[0]")), - RecvPropFloat(FIELD.OF($"{nameof(Start)}[1]")), - RecvPropFloat(FIELD.OF($"{nameof(Start)}[2]")), - RecvPropQAngles(FIELD.OF(nameof(Angles))), - RecvPropVector(FIELD.OF(nameof(Normal))), - RecvPropInt(FIELD.OF(nameof(Flags))), - RecvPropFloat(FIELD.OF(nameof(Magnitude))), - RecvPropFloat(FIELD.OF(nameof(Scale))), - RecvPropInt(FIELD.OF(nameof(AttachmentIndex))), - RecvPropIntWithMinusOneFlag(FIELD.OF(nameof(SurfaceProp))), - RecvPropInt(FIELD.OF(nameof(EffectName))), - RecvPropInt(FIELD.OF(nameof(Material))), - RecvPropInt(FIELD.OF(nameof(DamageType))), - RecvPropInt(FIELD.OF(nameof(HitBox))), - RecvPropInt(FIELD.OF(nameof(EntIndex))), // << TODO: SIZEOF_IGNORE to force this and then we dont need the field on our end - RecvPropInt(FIELD.OF(nameof(Color))), - - RecvPropFloat(FIELD.OF(nameof(Radius))), - - RecvPropBool(FIELD.OF(nameof(HasCustomColors))), - RecvPropVector(FIELD.OF("CustomColors.Color1")), - RecvPropVector(FIELD.OF("CustomColors.Color2")), - - RecvPropBool(FIELD.OF(nameof(HasControlPoint1))), - RecvPropInt(FIELD.OF("ControlPoint1.ParticleAttachment")), - RecvPropFloat(FIELD.OF("ControlPoint1.Offset[0]")), - RecvPropFloat(FIELD.OF("ControlPoint1.Offset[1]")), - RecvPropFloat(FIELD.OF("ControlPoint1.Offset[2]")), - RecvPropBool(FIELD.OF(nameof(AllowOverride))) - ]); - -#else - public static readonly SendTable DT_EffectData = new(nameof(DT_EffectData), [ - SendPropFloat(FIELD.OF($"{nameof(Origin)}[0]"), (int)COORD_INTEGER_BITS + SUBINCH_PRECISION, 0, WorldSize.MIN_COORD_INTEGER, WorldSize.MAX_COORD_INTEGER), - SendPropFloat(FIELD.OF($"{nameof(Origin)}[1]"), (int)COORD_INTEGER_BITS + SUBINCH_PRECISION, 0, WorldSize.MIN_COORD_INTEGER, WorldSize.MAX_COORD_INTEGER), - SendPropFloat(FIELD.OF($"{nameof(Origin)}[2]"), (int)COORD_INTEGER_BITS + SUBINCH_PRECISION, 0, WorldSize.MIN_COORD_INTEGER, WorldSize.MAX_COORD_INTEGER), - SendPropFloat(FIELD.OF($"{nameof(Start)}[0]"), (int)COORD_INTEGER_BITS + SUBINCH_PRECISION, 0, WorldSize.MIN_COORD_INTEGER, WorldSize.MAX_COORD_INTEGER), - SendPropFloat(FIELD.OF($"{nameof(Start)}[1]"), (int)COORD_INTEGER_BITS + SUBINCH_PRECISION, 0, WorldSize.MIN_COORD_INTEGER, WorldSize.MAX_COORD_INTEGER), - SendPropFloat(FIELD.OF($"{nameof(Start)}[2]"), (int)COORD_INTEGER_BITS + SUBINCH_PRECISION, 0, WorldSize.MIN_COORD_INTEGER, WorldSize.MAX_COORD_INTEGER), - SendPropQAngles(FIELD.OF(nameof(Angles)), 7, PropFlags.RoundDown), - SendPropVector(FIELD.OF(nameof(Normal)), 0, PropFlags.Normal | PropFlags.VarInt), - SendPropInt(FIELD.OF(nameof(Flags)), MAX_EFFECT_FLAG_BITS, PropFlags.Unsigned), - SendPropFloat(FIELD.OF(nameof(Magnitude)), 12, PropFlags.RoundDown, 0.0f, 1023.0f), - SendPropFloat(FIELD.OF(nameof(Scale)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(AttachmentIndex)), 5, PropFlags.Unsigned), - SendPropIntWithMinusOneFlag(FIELD.OF(nameof(SurfaceProp)), 8, SendProxy_ShortAddOne), - SendPropInt(FIELD.OF(nameof(EffectName)), MAX_EFFECT_DISPATCH_STRING_BITS, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Material)), 13, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(DamageType)), 32, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(HitBox)), 12, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(EntIndex)), Constants.MAX_EDICT_BITS, PropFlags.Unsigned), - SendPropInt(FIELD.OF(nameof(Color)), 8, PropFlags.Unsigned), - - SendPropFloat(FIELD.OF(nameof(Radius)), 10, PropFlags.RoundDown, 0.0f, 1023.0f), - - SendPropBool(FIELD.OF(nameof(HasCustomColors))), - SendPropVector(FIELD.OF("CustomColors.Color1"), 8, 0, 0, 1), - SendPropVector(FIELD.OF("CustomColors.Color2"), 8, 0, 0, 1), - - SendPropBool(FIELD.OF(nameof(HasControlPoint1))), - SendPropInt(FIELD.OF("ControlPoint1.ParticleAttachment"), 5, PropFlags.Unsigned), - SendPropFloat(FIELD.OF("ControlPoint1.Offset[0]"), 0, PropFlags.Coord | PropFlags.NoScale), - SendPropFloat(FIELD.OF("ControlPoint1.Offset[1]"), 0, PropFlags.Coord | PropFlags.NoScale), - SendPropFloat(FIELD.OF("ControlPoint1.Offset[2]"), 0, PropFlags.Coord | PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(AllowOverride))) - ]); - -#endif } #endif diff --git a/Game.Shared/EnvWindShared.cs b/Game.Shared/EnvWindShared.cs index c948ede6..659a5c23 100644 --- a/Game.Shared/EnvWindShared.cs +++ b/Game.Shared/EnvWindShared.cs @@ -1,41 +1,67 @@ using Source.Common; +#if GAME_DLL +using Game.Server; +#endif using System; using System.Collections.Generic; using System.Text; namespace Game.Shared; -public class EnvWindShared +public partial class EnvWindShared { - [NetworkName("m_flStartTime")] - public float StartTime; - [NetworkName("m_iWindSeed")] - public int WindSeed; - [NetworkName("m_iMinWind")] - public int MinWind; - [NetworkName("m_iMaxWind")] - public int MaxWind; - [NetworkName("m_iMinGust")] - public int MinGust; - [NetworkName("m_iMaxGust")] - public int MaxGust; - [NetworkName("m_flMinGustDelay")] - public float MinGustDelay; - [NetworkName("m_flMaxGustDelay")] - public float MaxGustDelay; - [NetworkName("m_flGustDuration")] - public float GustDuration; - [NetworkName("m_iGustDirChange")] - public int GustDirChange; + [NetworkTable("DT_EnvWindShared")] + public static readonly NetworkProp[] Props = [ + new(nameof(MinWind)) { Bits = 10, Flags = PropFlags.Unsigned }, + new(nameof(MaxWind)) { Bits = 10, Flags = PropFlags.Unsigned }, + new(nameof(MinGust)) { Bits = 10, Flags = PropFlags.Unsigned }, + new(nameof(MaxGust)) { Bits = 10, Flags = PropFlags.Unsigned }, + nameof(MinGustDelay), + nameof(MaxGustDelay), + new(nameof(GustDirChange)) { Bits = 9, Flags = PropFlags.Unsigned }, + new(nameof(WindSeed)) { Bits = 32, Flags = PropFlags.Unsigned }, + new(nameof(InitialWindDir)) { Bits = 9, Flags = PropFlags.Unsigned }, + nameof(InitialWindSpeed), + nameof(StartTime), + nameof(GustDuration), + new(nameof(WindRadius)) { Bits = 32, Flags = PropFlags.NoScale }, + ]; + +#if GAME_DLL + public BaseEntity? Outer; + public void NetworkStateChanged() => Outer?.NetworkStateChanged(); + public void NetworkStateChanged(IFieldAccessor field) => Outer?.NetworkStateChanged(); +#endif + + [NetworkVar("m_iMinWind")] + public partial int MinWind { get; set; } + [NetworkVar("m_iMaxWind")] + public partial int MaxWind { get; set; } + [NetworkVar("m_iMinGust")] + public partial int MinGust { get; set; } + [NetworkVar("m_iMaxGust")] + public partial int MaxGust { get; set; } + [NetworkVar("m_flMinGustDelay")] + public partial float MinGustDelay { get; set; } + [NetworkVar("m_flMaxGustDelay")] + public partial float MaxGustDelay { get; set; } + [NetworkVar("m_iGustDirChange")] + public partial int GustDirChange { get; set; } + [NetworkVar("m_iWindSeed")] + public partial int WindSeed { get; set; } public int GustSound; public int WindDir; public float WindSpeed; - [NetworkName("m_iInitialWindDir")] - public int InitialWindDir; - [NetworkName("m_flInitialWindSpeed")] - public float InitialWindSpeed; - [NetworkName("m_windRadius")] - public int WindRadius; + [NetworkVar("m_iInitialWindDir")] + public partial int InitialWindDir { get; set; } + [NetworkVar("m_flInitialWindSpeed")] + public partial float InitialWindSpeed { get; set; } + [NetworkVar("m_flStartTime")] + public partial float StartTime { get; set; } + [NetworkVar("m_flGustDuration")] + public partial float GustDuration { get; set; } + [NetworkVar("m_windRadius")] + public partial int WindRadius { get; set; } #if !CLIENT_DLL // todo: onguststart/ongustend diff --git a/Game.Shared/FuncLadder.cs b/Game.Shared/FuncLadder.cs index 4b0c721a..3d45a001 100644 --- a/Game.Shared/FuncLadder.cs +++ b/Game.Shared/FuncLadder.cs @@ -15,11 +15,18 @@ namespace Game.Shared; -using FIELD = Source.FIELD; [LinkEntityToClass("func_useableladder")] [NetworkName("CFuncLadder")] public partial class FuncLadder : BaseEntity { + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(PlayerMountPositionTop)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(PlayerMountPositionBottom)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(LadderDir)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(FakeLadder), + ]; + static readonly List s_Ladders = []; public FuncLadder() { @@ -33,40 +40,15 @@ public override void Term() { public static int GetLadderCount() => s_Ladders.Count; public static FuncLadder? GetLadder(int index) => (index < 0 || index >= s_Ladders.Count) ? null : s_Ladders[index]; - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_FuncLadder = new(DT_BaseEntity, [ -#if CLIENT_DLL - RecvPropVector(FIELD.OF(nameof(PlayerMountPositionTop))), - RecvPropVector(FIELD.OF(nameof(PlayerMountPositionBottom))), - RecvPropVector(FIELD.OF(nameof(LadderDir))), - RecvPropBool(FIELD.OF(nameof(FakeLadder))), -#else - SendPropVector(FIELD.OF(nameof(PlayerMountPositionTop)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(PlayerMountPositionBottom)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(LadderDir)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(FakeLadder))), -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_FuncLadder); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_FuncLadder); -#endif - - [NetworkName("m_vecPlayerMountPositionTop")] - public Vector3 PlayerMountPositionTop; - [NetworkName("m_vecPlayerMountPositionBottom")] - public Vector3 PlayerMountPositionBottom; - [NetworkName("m_vecLadderDir")] - public Vector3 LadderDir; + [NetworkVar("m_vecPlayerMountPositionTop")] + public partial Vector3 PlayerMountPositionTop { get; set; } + [NetworkVar("m_vecPlayerMountPositionBottom")] + public partial Vector3 PlayerMountPositionBottom { get; set; } + [NetworkVar("m_vecLadderDir")] + public partial Vector3 LadderDir { get; set; } readonly List Dismounts = []; - [NetworkName("m_bFakeLadder")] - public bool FakeLadder; + [NetworkVar("m_bFakeLadder")] + public partial bool FakeLadder { get; set; } public bool Disabled; public void InputEnable(ref InputData inputdata) { diff --git a/Game.Shared/GameMovement.cs b/Game.Shared/GameMovement.cs index f19bd6c9..6e35a23c 100644 --- a/Game.Shared/GameMovement.cs +++ b/Game.Shared/GameMovement.cs @@ -260,14 +260,14 @@ protected virtual void DecayPunchAngle() { Player.Local.PunchAngleVel -= Player.Local.PunchAngle * springForceMagnitude; // don't wrap around - Player.Local.PunchAngle.Init( + Player.Local.PunchAngle = new QAngle( Math.Clamp(Player.Local.PunchAngle.X, -89f, 89f), Math.Clamp(Player.Local.PunchAngle.Y, -179f, 179f), Math.Clamp(Player.Local.PunchAngle.Z, -89f, 89f)); } else { - Player.Local.PunchAngle.Init(0, 0, 0); - Player.Local.PunchAngleVel.Init(0, 0, 0); + Player.Local.PunchAngle = new QAngle(0, 0, 0); + Player.Local.PunchAngleVel = new QAngle(0, 0, 0); } } @@ -2415,10 +2415,12 @@ protected virtual void PlayerRoughLandingEffects(float fvol) { Player.PlayStepSound(mv!.GetAbsOrigin(), Player.SurfaceData, fvol, true); // Knock the screen around a little bit, temporary effect. - Player.Local.PunchAngle[ROLL] = Player.Local.FallVelocity * 0.013f; + QAngle punchAngle = Player.Local.PunchAngle; + punchAngle[ROLL] = Player.Local.FallVelocity * 0.013f; - if (Player.Local.PunchAngle[PITCH] > 8) - Player.Local.PunchAngle[PITCH] = 8; + if (punchAngle[PITCH] > 8) + punchAngle[PITCH] = 8; + Player.Local.PunchAngle = punchAngle; } } protected void ResetGetPointContentsCache() { diff --git a/Game.Shared/GameRules.cs b/Game.Shared/GameRules.cs index 7a657a07..f24e0d7b 100644 --- a/Game.Shared/GameRules.cs +++ b/Game.Shared/GameRules.cs @@ -59,8 +59,8 @@ public enum GameRulesPlayerRelationship Neutral } -[NetworkName("CGameRulesProxy")] -public class +[NetworkName("CGameRulesProxy", NoBase = true)] +public partial class #if CLIENT_DLL C_GameRulesProxy #else @@ -68,28 +68,16 @@ public class #endif : BaseEntity { + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + public virtual GameRules GameRules => gameRules!; GameRules? gameRules = null; public static GameRulesProxy? s_GameRulesProxy; public static void NotifyNetworkStateChanged() => s_GameRulesProxy?.NetworkStateChanged(); - - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_GameRulesProxy = new([]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_GameRulesProxy); -#else -#pragma warning disable CS0109 // Member does not hide an inherited member; new keyword is not required - public static readonly new ServerClass ServerClass = new ServerClass(DT_GameRulesProxy); -#pragma warning restore CS0109 // Member does not hide an inherited member; new keyword is not required -#endif - } public abstract class diff --git a/Game.Shared/GarrysMod/BaseHL2MPBludgeonWeapon.cs b/Game.Shared/GarrysMod/BaseHL2MPBludgeonWeapon.cs index 213b88de..47c962b1 100644 --- a/Game.Shared/GarrysMod/BaseHL2MPBludgeonWeapon.cs +++ b/Game.Shared/GarrysMod/BaseHL2MPBludgeonWeapon.cs @@ -6,28 +6,12 @@ using System.Numerics; namespace Game.Shared.GarrysMod; -using FIELD = Source.FIELD; [NetworkName("CBaseHL2MPBludgeonWeapon")] -public class BaseHL2MPBludgeonWeapon : BaseHL2MPCombatWeapon +public partial class BaseHL2MPBludgeonWeapon : BaseHL2MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_BaseHL2MPBludgeonWeapon = new(DT_BaseHL2MPCombatWeapon, [ -#if CLIENT_DLL - -#else - -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseHL2MPBludgeonWeapon); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_BaseHL2MPBludgeonWeapon); -#endif + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; const int BLUDGEON_HULL_DIM = 16; diff --git a/Game.Shared/GarrysMod/GMODGameRules.cs b/Game.Shared/GarrysMod/GMODGameRules.cs index 61c95d0a..7cd7dd36 100644 --- a/Game.Shared/GarrysMod/GMODGameRules.cs +++ b/Game.Shared/GarrysMod/GMODGameRules.cs @@ -18,8 +18,6 @@ namespace Game.Server.GarrysMod; using Source.Common.Engine; using Source; -using FIELD = Source.FIELD; - using Game.Shared; using Source.GUI.Controls; @@ -32,7 +30,7 @@ public static class GMOD_GameRules_Globals [LinkEntityToClass("gmod_gamerules")] [NetworkName("CGMODGameRulesProxy")] -public class +public partial class #if CLIENT_DLL C_GMODGameRulesProxy #else @@ -40,22 +38,20 @@ public class #endif : GameRulesProxy { + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(GMODGameRules.Props)) { Name = "gmod_gamerules_data", Proxy = typeof(GMODGameRulesProxy.RulesProxy) }, + ]; + public override GameRules GameRules => GMODRules(); - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_GMODRules = new(nameof(DT_GMODRules), [ + public static class RulesProxy + { #if CLIENT_DLL - RecvPropFloat(FIELD.OF("TimeScale")), - RecvPropInt(FIELD.OF("SkillLevel")) + public static void Recv(RecvProp prop, out object? outInstance, object? instance, IFieldAccessor fieldInfo, int objectID) => RecvProxy_GMODRules(prop, out outInstance, instance, fieldInfo, objectID); #else - SendPropFloat(FIELD.OF("TimeScale"), 0, PropFlags.NoScale, 0, 0), - SendPropInt(FIELD.OF("SkillLevel"), 4, PropFlags.Unsigned) + public static object? Send(SendProp prop, object instance, IFieldAccessor data, SendProxyRecipients recipients, int objectID) => SendProxy_GMODRules(prop, instance, data, recipients, objectID); #endif - ]); + } #if CLIENT_DLL public static void RecvProxy_GMODRules(RecvProp prop, out object? outInstance, object? instance, IFieldAccessor fieldInfo, int objectID) { @@ -63,29 +59,16 @@ public static void RecvProxy_GMODRules(RecvProp prop, out object? outInstance, o Assert(rules != null); outInstance = rules; } - - public static readonly RecvTable DT_GMODGameRulesProxy = new(DT_GameRulesProxy, [ - RecvPropDataTable("gmod_gamerules_data", DT_GMODRules, 0, RecvProxy_GMODRules) - ]); #else public static object SendProxy_GMODRules(SendProp prop, object instance, IFieldAccessor data, SendProxyRecipients recipients, int objectID) { GMODGameRules rules = GMODRules(); Assert(rules != null); return rules; } - - public static readonly SendTable DT_GMODGameRulesProxy = new(DT_GameRulesProxy, [ - SendPropDataTable("gmod_gamerules_data", DT_GMODRules, SendProxy_GMODRules) - ]); -#endif -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_GMODGameRulesProxy); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_GMODGameRulesProxy); #endif } -public class +public partial class #if CLIENT_DLL C_GMODGameRules #else @@ -94,12 +77,18 @@ public class : HL2MPGameRules // TODO: AutoGameSystemPerFrame { + [NetworkTable("DT_GMODRules")] + public static readonly new NetworkProp[] Props = [ + new(nameof(TimeScale)) { Bits = 0, Flags = PropFlags.NoScale, Low = 0.0f, High = 0.0f }, + new(nameof(SkillLevel)) { Bits = 4, Flags = PropFlags.Unsigned }, + ]; + public override ReadOnlySpan Name() => "GMODGameRules"; - [NetworkName("m_fTimeScale")] - public float TimeScale; - [NetworkName("m_iSkillLevel")] - public int SkillLevel; + [NetworkVar("m_fTimeScale")] + public partial float TimeScale { get; set; } + [NetworkVar("m_iSkillLevel")] + public partial int SkillLevel { get; set; } #if GAME_DLL public override bool FlPlayerFallDeathDoesScreenFade(BasePlayer player) { diff --git a/Game.Shared/GarrysMod/HL2MPMachineGun.cs b/Game.Shared/GarrysMod/HL2MPMachineGun.cs index fca29055..f639eb53 100644 --- a/Game.Shared/GarrysMod/HL2MPMachineGun.cs +++ b/Game.Shared/GarrysMod/HL2MPMachineGun.cs @@ -5,30 +5,21 @@ using System.Numerics; namespace Game.Shared.GarrysMod; -using FIELD = Source.FIELD; [NetworkName("CHL2MPMachineGun")] -public class HL2MPMachineGun : BaseHL2MPCombatWeapon +public partial class HL2MPMachineGun : BaseHL2MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_HL2MPMachineGun = new(DT_BaseHL2MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropInt(FIELD.OF(nameof(ShotsFired))), -#else - SendPropInt(FIELD.OF(nameof(ShotsFired)), 16), -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_HL2MPMachineGun); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_HL2MPMachineGun); -#endif - [NetworkName("m_nShotsFired")] - public int ShotsFired; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ShotsFired)) { Bits = 16 }, + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(ShotsFired), + ]; + + [NetworkVar("m_nShotsFired")] + public partial int ShotsFired { get; set; } public void DoMachineGunKick(BasePlayer player, float dampEasy, float maxVerticleKickAngle, TimeUnit_t fireDurationTime, TimeUnit_t slideLimitTime) { const float KICK_MIN_X = 0.2f;//Degrees diff --git a/Game.Shared/GarrysMod/LuaEntity.cs b/Game.Shared/GarrysMod/LuaEntity.cs index f1c2385b..19d5a5ba 100644 --- a/Game.Shared/GarrysMod/LuaEntity.cs +++ b/Game.Shared/GarrysMod/LuaEntity.cs @@ -423,7 +423,7 @@ static int Entity__SetDTBool(ILuaInterface lua) { #if GAME_DLL ent.NetworkStateChanged(); #endif - ent.GMOD_bool[index] = value; + ent.GMOD_boolForModify()[index] = value; } return 0; } @@ -445,7 +445,7 @@ static int Entity__SetDTFloat(ILuaInterface lua) { #if GAME_DLL ent.NetworkStateChanged(); #endif - ent.GMOD_float[index] = value; + ent.GMOD_floatForModify()[index] = value; } return 0; } @@ -467,7 +467,7 @@ static int Entity__SetDTInt(ILuaInterface lua) { #if GAME_DLL ent.NetworkStateChanged(); #endif - ent.GMOD_int[index] = value; + ent.GMOD_intForModify()[index] = value; } return 0; } @@ -489,7 +489,7 @@ static int Entity__SetDTVector(ILuaInterface lua) { #if GAME_DLL ent.NetworkStateChanged(); #endif - ent.GMOD_Vector[index] = value; + ent.GMOD_VectorForModify()[index] = value; } return 0; } @@ -511,7 +511,7 @@ static int Entity__SetDTAngle(ILuaInterface lua) { #if GAME_DLL ent.NetworkStateChanged(); #endif - ent.GMOD_QAngle[index] = value; + ent.GMOD_QAngleForModify()[index] = value; } return 0; } @@ -536,7 +536,7 @@ static int Entity__SetDTEntity(ILuaInterface lua) { #if GAME_DLL ent.NetworkStateChanged(); #endif - ent.GMOD_EHANDLE[index].Set(value); + ent.GMOD_EHANDLEForModify()[index].Set(value); } return 0; } @@ -558,25 +558,25 @@ static int Entity__SetDTString(ILuaInterface lua) { #if GAME_DLL ent.NetworkStateChanged(); #endif - strcpy(ent.GMOD_String0, value); + strcpy(ent.GMOD_String0ForModify(), value); break; case 1: #if GAME_DLL ent.NetworkStateChanged(); #endif - strcpy(ent.GMOD_String1, value); + strcpy(ent.GMOD_String1ForModify(), value); break; case 2: #if GAME_DLL ent.NetworkStateChanged(); #endif - strcpy(ent.GMOD_String2, value); + strcpy(ent.GMOD_String2ForModify(), value); break; case 3: #if GAME_DLL ent.NetworkStateChanged(); #endif - strcpy(ent.GMOD_String3, value); + strcpy(ent.GMOD_String3ForModify(), value); break; } return 0; diff --git a/Game.Shared/GarrysMod/LuaPlayer.cs b/Game.Shared/GarrysMod/LuaPlayer.cs index 7af90600..f17335a3 100644 --- a/Game.Shared/GarrysMod/LuaPlayer.cs +++ b/Game.Shared/GarrysMod/LuaPlayer.cs @@ -695,7 +695,7 @@ static int Player__SetHands(ILuaInterface lua) { if (player.Hands.Get() != hands) player.NetworkStateChanged(); #endif - player.Hands.Set(hands); + player.Hands = EHANDLE.FromEntity(hands); return 0; } diff --git a/Game.Shared/GarrysMod/PhysBeam.cs b/Game.Shared/GarrysMod/PhysBeam.cs index 1e3682d0..dd0d3ab7 100644 --- a/Game.Shared/GarrysMod/PhysBeam.cs +++ b/Game.Shared/GarrysMod/PhysBeam.cs @@ -6,24 +6,8 @@ #if CLIENT_DLL namespace Game.Client; -using FIELD = Source.FIELD; #else namespace Game.Server; -using FIELD = Source.FIELD; -#endif - -using Table = -#if CLIENT_DLL - RecvTable; -#else - SendTable; -#endif - -using Class = -#if CLIENT_DLL - ClientClass; -#else - ServerClass; #endif [LinkEntityToClass("physgun_beam")] @@ -36,35 +20,31 @@ public partial class #endif : BaseEntity { - public static readonly Table DT_PhysBeam = new(DT_BaseEntity, [ -#if CLIENT_DLL - RecvPropEHandle(FIELD.OF(nameof(TargetEnt))), - RecvPropVector(FIELD.OF(nameof(HoldPos))), - RecvPropBool(FIELD.OF(nameof(IsOn))), - RecvPropInt(FIELD.OF(nameof(PhysBone))), -#elif GAME_DLL - SendPropEHandle(FIELD.OF(nameof(TargetEnt))), - SendPropVector(FIELD.OF(nameof(HoldPos)), 0, PropFlags.NoScale), - SendPropBool(FIELD.OF(nameof(IsOn))), - SendPropInt(FIELD.OF(nameof(PhysBone)), 12, 0), -#endif - ]); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(TargetEnt), + new(nameof(HoldPos)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(IsOn), + new(nameof(PhysBone)) { Bits = 12 }, + ]; - public static readonly new Class #if CLIENT_DLL - ClientClass + public C_PhysBeam() { + TargetEnt = new(); + } #else - ServerClass + public PhysBeam() { + TargetEnt = new(); + } #endif - = new Class(DT_PhysBeam); - [NetworkName("m_hTargetEnt")] - public EHANDLE TargetEnt = new(); - [NetworkName("m_HoldPos")] - public Vector3 HoldPos; - [NetworkName("m_bIsOn")] - public bool IsOn; - [NetworkName("m_iPhysBone")] - public int PhysBone; + [NetworkVar("m_hTargetEnt")] + public partial EHANDLE TargetEnt { get; set; } + [NetworkVar("m_HoldPos")] + public partial Vector3 HoldPos { get; set; } + [NetworkVar("m_bIsOn")] + public partial bool IsOn { get; set; } + [NetworkVar("m_iPhysBone")] + public partial int PhysBone { get; set; } } #endif diff --git a/Game.Shared/GarrysMod/SENT_AI.cs b/Game.Shared/GarrysMod/SENT_AI.cs index a46c0c35..bcd0604c 100644 --- a/Game.Shared/GarrysMod/SENT_AI.cs +++ b/Game.Shared/GarrysMod/SENT_AI.cs @@ -6,25 +6,9 @@ #if CLIENT_DLL namespace Game.Client; using Game.Client.GarrysMod; -using FIELD = Source.FIELD; #else namespace Game.Server; using Game.Server.GarrysMod; -using FIELD = Source.FIELD; -#endif - -using Table = -#if CLIENT_DLL - RecvTable; -#else - SendTable; -#endif - -using Class = -#if CLIENT_DLL - ClientClass; -#else - ServerClass; #endif [LinkEntityToClass("sent_ai")] @@ -36,22 +20,12 @@ public partial class SENT_AI : AI_BaseNPC #endif { - public static readonly Table DT_SENT_AI = new(DT_AI_BaseNPC, [ -#if CLIENT_DLL - RecvPropDataTable("m_ScriptedEntity", FIELD.OF(nameof(ScriptedEntity)), ScriptedEntity.DT_ScriptedEntity, 0, RECV_GET_OBJECT_AT_FIELD(FIELD.OF(nameof(ScriptedEntity)))) -#elif GAME_DLL - SendPropDataTable("m_ScriptedEntity", FIELD.OF(nameof(ScriptedEntity)), ScriptedEntity.DT_ScriptedEntity) -#endif - ]); - - public static readonly new Class -#if CLIENT_DLL - ClientClass -#else - ServerClass -#endif - = new Class(DT_SENT_AI); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ScriptedEntity)) { Encoding = NetEncoding.DataTable, DataTable = "DT_ScriptedEntity" }, + ]; + [NetworkVar("m_ScriptedEntity")] public readonly ScriptedEntity ScriptedEntity = new(); #if CLIENT_DLL diff --git a/Game.Shared/GarrysMod/SENT_Anim.cs b/Game.Shared/GarrysMod/SENT_Anim.cs index 7ca226bd..c64a0714 100644 --- a/Game.Shared/GarrysMod/SENT_Anim.cs +++ b/Game.Shared/GarrysMod/SENT_Anim.cs @@ -7,27 +7,11 @@ namespace Game.Client; using Game.Client.GarrysMod; using Source.Common.Engine; -using FIELD = Source.FIELD; #else namespace Game.Server; using Game.Server.GarrysMod; -using FIELD = Source.FIELD; -#endif - -using Table = -#if CLIENT_DLL - RecvTable; -#else - SendTable; -#endif - -using Class = -#if CLIENT_DLL - ClientClass; -#else - ServerClass; #endif [LinkEntityToClass("sent_anim")] @@ -39,22 +23,12 @@ public partial class SENT_Anim : BaseAnimatingOverlay #endif { - public static readonly Table DT_SENT_anim = new(DT_BaseAnimatingOverlay, [ -#if CLIENT_DLL - RecvPropDataTable("m_ScriptedEntity", FIELD.OF(nameof(ScriptedEntity)), ScriptedEntity.DT_ScriptedEntity, 0, RECV_GET_OBJECT_AT_FIELD(FIELD.OF(nameof(ScriptedEntity)))) -#elif GAME_DLL - SendPropDataTable("m_ScriptedEntity", FIELD.OF(nameof(ScriptedEntity)), ScriptedEntity.DT_ScriptedEntity) -#endif - ]); - - public static readonly new Class -#if CLIENT_DLL - ClientClass -#else - ServerClass -#endif - = new Class(DT_SENT_anim); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ScriptedEntity)) { Encoding = NetEncoding.DataTable, DataTable = "DT_ScriptedEntity" }, + ]; + [NetworkVar("m_ScriptedEntity")] public readonly ScriptedEntity ScriptedEntity = new(); #if CLIENT_DLL diff --git a/Game.Shared/GarrysMod/SENT_Point.cs b/Game.Shared/GarrysMod/SENT_Point.cs index 8727e988..5ebdefb3 100644 --- a/Game.Shared/GarrysMod/SENT_Point.cs +++ b/Game.Shared/GarrysMod/SENT_Point.cs @@ -7,25 +7,9 @@ #if CLIENT_DLL namespace Game.Client; using Game.Client.GarrysMod; -using FIELD = Source.FIELD; #else namespace Game.Server; using Game.Server.GarrysMod; -using FIELD = Source.FIELD; -#endif - -using Table = -#if CLIENT_DLL - RecvTable; -#else - SendTable; -#endif - -using Class = -#if CLIENT_DLL - ClientClass; -#else - ServerClass; #endif [LinkEntityToClass("sent_point")] @@ -38,22 +22,12 @@ public partial class #endif : BaseEntity { - public static readonly Table DT_SENT_point = new(DT_BaseEntity, [ -#if CLIENT_DLL - RecvPropDataTable("m_ScriptedEntity", FIELD.OF(nameof(ScriptedEntity)), ScriptedEntity.DT_ScriptedEntity, 0, RECV_GET_OBJECT_AT_FIELD(FIELD.OF(nameof(ScriptedEntity)))) -#elif GAME_DLL - SendPropDataTable("m_ScriptedEntity", FIELD.OF(nameof(ScriptedEntity)), ScriptedEntity.DT_ScriptedEntity) -#endif - ]); - - public static readonly new Class -#if CLIENT_DLL - ClientClass -#else - ServerClass -#endif - = new Class(DT_SENT_point); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ScriptedEntity)) { Encoding = NetEncoding.DataTable, DataTable = "DT_ScriptedEntity" }, + ]; + [NetworkVar("m_ScriptedEntity")] public readonly ScriptedEntity ScriptedEntity = new(); #if CLIENT_DLL diff --git a/Game.Shared/GarrysMod/ScriptedEntity.cs b/Game.Shared/GarrysMod/ScriptedEntity.cs index f297c1bd..c5a03c02 100644 --- a/Game.Shared/GarrysMod/ScriptedEntity.cs +++ b/Game.Shared/GarrysMod/ScriptedEntity.cs @@ -7,29 +7,21 @@ #if CLIENT_DLL namespace Game.Client.GarrysMod; -using FIELD = Source.FIELD; #else namespace Game.Server.GarrysMod; - -using FIELD = Source.FIELD; #endif -public class ScriptedEntity +public partial class ScriptedEntity { -#if CLIENT_DLL - public static readonly RecvTable DT_ScriptedEntity = new(nameof(DT_ScriptedEntity), [ - RecvPropString(FIELD.OF(nameof(ScriptName))) - ]); -#else - public static readonly SendTable DT_ScriptedEntity = new(nameof(DT_ScriptedEntity), [ - SendPropString(FIELD.OF(nameof(ScriptName))) - ]); -#endif + [NetworkTable("DT_ScriptedEntity")] + public static readonly NetworkProp[] Props = [ + new(nameof(ScriptName)) { Encoding = NetEncoding.String }, + ]; public bool Started; public int EntityType; public BaseEntity? ParentEntity; - [NetworkName("m_strScriptName")] + [NetworkVar("m_strScriptName")] public InlineArray64 ScriptName; #if GAME_DLL public string? ScriptNamePooled; diff --git a/Game.Shared/GarrysMod/Weapon357.cs b/Game.Shared/GarrysMod/Weapon357.cs index 59d8638d..477df047 100644 --- a/Game.Shared/GarrysMod/Weapon357.cs +++ b/Game.Shared/GarrysMod/Weapon357.cs @@ -5,33 +5,15 @@ using System.Numerics; namespace Game.Shared.GarrysMod; -using DEFINE = Source.DEFINE; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_357")] [PrecacheWeaponRegister("weapon_357")] [NetworkName("CWeapon357")] -public class Weapon357 : BaseHL2MPCombatWeapon +public partial class Weapon357 : BaseHL2MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_Weapon357 = new(DT_BaseHL2MPCombatWeapon, [ -#if CLIENT_DLL - -#else - -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_Weapon357); - public static readonly new DataMap PredMap = new([], typeof(Weapon357), BaseHL2MPCombatWeapon.PredMap); public override DataMap? GetPredDescMap() => PredMap; -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_Weapon357); -#endif + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; public override void PrimaryAttack() { BasePlayer? player = ToBasePlayer(GetOwner()); diff --git a/Game.Shared/GarrysMod/WeaponAR2.cs b/Game.Shared/GarrysMod/WeaponAR2.cs index 09169f94..5eaa520f 100644 --- a/Game.Shared/GarrysMod/WeaponAR2.cs +++ b/Game.Shared/GarrysMod/WeaponAR2.cs @@ -1,32 +1,16 @@ #if (CLIENT_DLL || GAME_DLL) && GMOD_DLL using Source.Common; namespace Game.Shared.GarrysMod; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_ar2")] [PrecacheWeaponRegister("weapon_ar2")] [NetworkName("CWeaponAR2")] -public class WeaponAR2 : HL2MPMachineGun +public partial class WeaponAR2 : HL2MPMachineGun { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponAR2 = new(DT_HL2MPMachineGun, [ -#if CLIENT_DLL - -#else + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponAR2); - public static readonly new DataMap PredMap = new([], typeof(WeaponAR2), HL2MPMachineGun.PredMap); public override DataMap? GetPredDescMap() => PredMap; -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponAR2); -#endif public override float GetFireRate() => 0.1f; } #endif diff --git a/Game.Shared/GarrysMod/WeaponBugBait.cs b/Game.Shared/GarrysMod/WeaponBugBait.cs index 542034f3..5c0d24e5 100644 --- a/Game.Shared/GarrysMod/WeaponBugBait.cs +++ b/Game.Shared/GarrysMod/WeaponBugBait.cs @@ -1,38 +1,27 @@ #if (CLIENT_DLL || GAME_DLL) && GMOD_DLL using Source.Common; namespace Game.Shared.GarrysMod; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_bugbait")] [PrecacheWeaponRegister("weapon_bugbait")] [NetworkName("CWeaponBugBait")] -public class WeaponBugBait : BaseHL2MPCombatWeapon +public partial class WeaponBugBait : BaseHL2MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponBugBait = new(DT_BaseHL2MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropBool(FIELD.OF(nameof(Redraw))), - RecvPropBool(FIELD.OF(nameof(DrawbackFinished))) -#else - SendPropBool(FIELD.OF(nameof(Redraw))), - SendPropBool(FIELD.OF(nameof(DrawbackFinished))) -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponBugBait); - public static readonly new DataMap PredMap = new([], typeof(WeaponBugBait), BaseHL2MPCombatWeapon.PredMap); public override DataMap? GetPredDescMap() => PredMap; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Redraw), + nameof(DrawbackFinished), + ]; -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponBugBait); -#endif - [NetworkName("m_bRedraw")] - public bool Redraw; - [NetworkName("m_bDrawBackFinished")] - public bool DrawbackFinished; + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(Redraw), + nameof(DrawbackFinished), + ]; + + [NetworkVar("m_bRedraw")] + public partial bool Redraw { get; set; } + [NetworkVar("m_bDrawBackFinished")] + public partial bool DrawbackFinished { get; set; } } #endif diff --git a/Game.Shared/GarrysMod/WeaponCrossbow.cs b/Game.Shared/GarrysMod/WeaponCrossbow.cs index f22c5794..690f25ef 100644 --- a/Game.Shared/GarrysMod/WeaponCrossbow.cs +++ b/Game.Shared/GarrysMod/WeaponCrossbow.cs @@ -3,47 +3,39 @@ using Source.Common; namespace Game.Shared.GarrysMod; -using FIELD = Source.FIELD; #if !CLIENT_DLL [LinkEntityToClass("crossbow_bolt")] [NetworkName("CCrossbowBolt")] -public class CrossbowBolt : BaseCombatCharacter { - public static readonly SendTable DT_CrossbowBolt = new(DT_BaseCombatCharacter, []); - public static readonly new ServerClass ServerClass = new ServerClass(DT_CrossbowBolt); +public partial class CrossbowBolt : BaseCombatCharacter { + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } #endif [LinkEntityToClass("weapon_crossbow")] [PrecacheWeaponRegister("weapon_crossbow")] [NetworkName("CWeaponCrossbow")] -public class WeaponCrossbow : BaseHL2MPCombatWeapon +public partial class WeaponCrossbow : BaseHL2MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponCrossbow = new(DT_BaseHL2MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropBool(FIELD.OF(nameof(InZoom))), - RecvPropBool(FIELD.OF(nameof(MustReload))) -#else - SendPropBool(FIELD.OF(nameof(InZoom))), - SendPropBool(FIELD.OF(nameof(MustReload))) -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponCrossbow); - public static readonly new DataMap PredMap = new([], typeof(WeaponCrossbow), BaseHL2MPCombatWeapon.PredMap); public override DataMap? GetPredDescMap() => PredMap; -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponCrossbow); -#endif - [NetworkName("m_bInZoom")] - public bool InZoom; - [NetworkName("m_bMustReload")] - public bool MustReload; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(InZoom), + nameof(MustReload), + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(InZoom), + nameof(MustReload), + ]; + + [NetworkVar("m_bInZoom")] + public partial bool InZoom { get; set; } + [NetworkVar("m_bMustReload")] + public partial bool MustReload { get; set; } } #endif diff --git a/Game.Shared/GarrysMod/WeaponCrowbar.cs b/Game.Shared/GarrysMod/WeaponCrowbar.cs index e31100cc..d555275b 100644 --- a/Game.Shared/GarrysMod/WeaponCrowbar.cs +++ b/Game.Shared/GarrysMod/WeaponCrowbar.cs @@ -10,33 +10,15 @@ using System.Numerics; namespace Game.Shared.GarrysMod; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_crowbar")] [PrecacheWeaponRegister("weapon_crowbar")] [NetworkName("CWeaponCrowbar")] -public class WeaponCrowbar : BaseHL2MPBludgeonWeapon +public partial class WeaponCrowbar : BaseHL2MPBludgeonWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponCrowbar = new(DT_BaseHL2MPBludgeonWeapon, [ -#if CLIENT_DLL - -#else - -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponCrowbar); - public static readonly new DataMap PredMap = new([], typeof(WeaponCrowbar), BaseHL2MPBludgeonWeapon.PredMap); public override DataMap? GetPredDescMap() => PredMap; - -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponCrowbar); -#endif + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; public const float CROWBAR_RANGE = 75.0f; public const float CROWBAR_REFIRE = 0.4f; diff --git a/Game.Shared/GarrysMod/WeaponFrag.cs b/Game.Shared/GarrysMod/WeaponFrag.cs index 7bf27e07..038ba854 100644 --- a/Game.Shared/GarrysMod/WeaponFrag.cs +++ b/Game.Shared/GarrysMod/WeaponFrag.cs @@ -1,42 +1,31 @@ #if (CLIENT_DLL || GAME_DLL) && GMOD_DLL using Source.Common; namespace Game.Shared.GarrysMod; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_frag")] [PrecacheWeaponRegister("weapon_frag")] [NetworkName("CWeaponFrag")] -public class WeaponFrag : BaseHL2MPCombatWeapon +public partial class WeaponFrag : BaseHL2MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponFrag = new(DT_BaseHL2MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropBool(FIELD.OF(nameof(Redraw))), - RecvPropBool(FIELD.OF(nameof(DrawbackFinished))), - RecvPropInt(FIELD.OF(nameof(AttackPaused))) -#else - SendPropBool(FIELD.OF(nameof(Redraw))), - SendPropBool(FIELD.OF(nameof(DrawbackFinished))), - SendPropInt(FIELD.OF(nameof(AttackPaused)), 4) -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponFrag); - public static readonly new DataMap PredMap = new([], typeof(WeaponFrag), BaseHL2MPCombatWeapon.PredMap); public override DataMap? GetPredDescMap() => PredMap; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Redraw), + nameof(DrawbackFinished), + new(nameof(AttackPaused)) { Bits = 4 }, + ]; -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponFrag); -#endif - [NetworkName("m_bRedraw")] - public bool Redraw; - [NetworkName("m_fDrawbackFinished")] - public bool DrawbackFinished; - [NetworkName("m_AttackPaused")] - public int AttackPaused; + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(Redraw), + nameof(DrawbackFinished), + nameof(AttackPaused), + ]; + + [NetworkVar("m_bRedraw")] + public partial bool Redraw { get; set; } + [NetworkVar("m_fDrawbackFinished")] + public partial bool DrawbackFinished { get; set; } + [NetworkVar("m_AttackPaused")] + public partial int AttackPaused { get; set; } } #endif diff --git a/Game.Shared/GarrysMod/WeaponGModBase.cs b/Game.Shared/GarrysMod/WeaponGModBase.cs index a25c2909..7994018f 100644 --- a/Game.Shared/GarrysMod/WeaponGModBase.cs +++ b/Game.Shared/GarrysMod/WeaponGModBase.cs @@ -5,21 +5,6 @@ using Source.Common; using Source.Common.Mathematics; - -using Table = -#if CLIENT_DLL - Source.Common.RecvTable; -#else - Source.Common.SendTable; -#endif - -using Class = -#if CLIENT_DLL - Source.Common.ClientClass; -#else - Source.Common.ServerClass; -#endif - // ====================================================================================================== // // WeaponHL2MPBase // ====================================================================================================== // @@ -63,18 +48,11 @@ public partial class #endif : BaseCombatWeapon { - public static readonly Table DT_WeaponHL2MPBase = new(DT_BaseCombatWeapon, []); - - public static readonly new Class -#if CLIENT_DLL - ClientClass -#else - ServerClass -#endif - = new Class(DT_WeaponHL2MPBase); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; #if CLIENT_DLL - public static readonly new DataMap PredMap = new([], typeof(WeaponHL2MPBase), BaseCombatWeapon.PredMap); public override DataMap? GetPredDescMap() => PredMap; public override bool ShouldPredict() { if (GetOwner() != null && GetOwner() == C_BasePlayer.GetLocalPlayer()) return true; @@ -130,15 +108,9 @@ public partial class #endif : WeaponHL2MPBase { - public static readonly Table DT_BaseHL2MPCombatWeapon = new(DT_WeaponHL2MPBase, []); - - public static readonly new Class -#if CLIENT_DLL - ClientClass -#else - ServerClass -#endif - = new Class(DT_BaseHL2MPCombatWeapon); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; protected bool Lowered; protected TimeUnit_t RaiseTime; @@ -153,10 +125,6 @@ public override bool Holster(BaseCombatWeapon switchingTo) { return false; } -#if CLIENT_DLL - public static readonly new DataMap PredMap = new([], typeof(BaseHL2MPCombatWeapon), BaseCombatWeapon.PredMap); public override DataMap? GetPredDescMap() => PredMap; -#endif - #if CLIENT_DLL public override void OnDataChanged(DataUpdateType updateType) { base.OnDataChanged(updateType); diff --git a/Game.Shared/GarrysMod/WeaponPhysCannon.cs b/Game.Shared/GarrysMod/WeaponPhysCannon.cs index 56c6006b..8f19a868 100644 --- a/Game.Shared/GarrysMod/WeaponPhysCannon.cs +++ b/Game.Shared/GarrysMod/WeaponPhysCannon.cs @@ -19,13 +19,16 @@ using System.Numerics; namespace Game.Shared.GarrysMod; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_physcannon")] [PrecacheWeaponRegister("weapon_physcannon")] [NetworkName("CWeaponPhysCannon")] -public class WeaponPhysCannon : BaseHL2MPCombatWeapon +public partial class WeaponPhysCannon : BaseHL2MPCombatWeapon { + public WeaponPhysCannon() { + AttachedObject = new(); + } + public static bool PlayerHasMegaPhysCannon() => false; @@ -163,56 +166,37 @@ public void SetVisible(bool state = true) { #endif - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponPhysCannon = new(DT_BaseHL2MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropBool(FIELD.OF(nameof(Active))), - RecvPropEHandle(FIELD.OF(nameof(AttachedObject))), - RecvPropVector(FIELD.OF(nameof(AttachedPositionObjectSpace))), - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(AttachedAnglesPlayerSpace), 0)), - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(AttachedAnglesPlayerSpace), 1)), - RecvPropFloat(FIELD.OF_VECTORELEM(nameof(AttachedAnglesPlayerSpace), 2)), - RecvPropInt(FIELD.OF(nameof(EffectState))), - RecvPropBool(FIELD.OF(nameof(Open))), - RecvPropBool(FIELD.OF(nameof(PhyscannonState))), -#else - SendPropBool(FIELD.OF(nameof(Active))), - SendPropEHandle(FIELD.OF(nameof(AttachedObject))), - SendPropVector(FIELD.OF(nameof(AttachedPositionObjectSpace)), 0, PropFlags.Coord), - SendPropAngle(FIELD.OF_VECTORELEM(nameof(AttachedAnglesPlayerSpace), 0), 11, PropFlags.RoundDown), - SendPropAngle(FIELD.OF_VECTORELEM(nameof(AttachedAnglesPlayerSpace), 1), 11, PropFlags.RoundDown), - SendPropAngle(FIELD.OF_VECTORELEM(nameof(AttachedAnglesPlayerSpace), 2), 11, PropFlags.RoundDown), - SendPropInt(FIELD.OF(nameof(EffectState)), 4), - SendPropBool(FIELD.OF(nameof(Open))), - SendPropBool(FIELD.OF(nameof(PhyscannonState))), -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponPhysCannon); - public static readonly new DataMap PredMap = new([], typeof(WeaponPhysCannon), BaseHL2MPCombatWeapon.PredMap); public override DataMap? GetPredDescMap() => PredMap; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Active), + nameof(AttachedObject), + new(nameof(AttachedPositionObjectSpace)) { Bits = 0, Flags = PropFlags.Coord }, + new(nameof(AttachedAnglesPlayerSpace)) { Encoding = NetEncoding.VectorElements, Bits = 11, Flags = PropFlags.RoundDown }, + new(nameof(EffectState)) { Bits = 4 }, + nameof(Open), + nameof(PhyscannonState), + ]; -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponPhysCannon); -#endif - [NetworkName("m_bActive")] - public bool Active; - [NetworkName("m_hAttachedObject")] - public EHANDLE AttachedObject = new(); - [NetworkName("m_attachedPositionObjectSpace")] - public Vector3 AttachedPositionObjectSpace; - [NetworkName("m_attachedAnglesPlayerSpace")] - public QAngle AttachedAnglesPlayerSpace; - [NetworkName("m_EffectState")] - public int EffectState; - [NetworkName("m_bOpen")] - public bool Open; - [NetworkName("m_bPhyscannonState")] - public bool PhyscannonState; + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(EffectState), + nameof(Open), + ]; + + [NetworkVar("m_bActive")] + public partial bool Active { get; set; } + [NetworkVar("m_hAttachedObject")] + public partial EHANDLE AttachedObject { get; set; } + [NetworkVar("m_attachedPositionObjectSpace")] + public partial Vector3 AttachedPositionObjectSpace { get; set; } + [NetworkVar("m_attachedAnglesPlayerSpace")] + public partial QAngle AttachedAnglesPlayerSpace { get; set; } + [NetworkVar("m_EffectState")] + public partial int EffectState { get; set; } + [NetworkVar("m_bOpen")] + public partial bool Open { get; set; } + [NetworkVar("m_bPhyscannonState")] + public partial bool PhyscannonState { get; set; } #if CLIENT_DLL public bool OldOpen; public int OldEffectState; diff --git a/Game.Shared/GarrysMod/WeaponPhysGun.cs b/Game.Shared/GarrysMod/WeaponPhysGun.cs index 1a837072..7103e7fd 100644 --- a/Game.Shared/GarrysMod/WeaponPhysGun.cs +++ b/Game.Shared/GarrysMod/WeaponPhysGun.cs @@ -14,25 +14,8 @@ #if CLIENT_DLL namespace Game.Client; - -using FIELD = Source.FIELD; #else namespace Game.Server; -using FIELD = Source.FIELD; -#endif - -using Table = -#if CLIENT_DLL - RecvTable; -#else - SendTable; -#endif - -using Class = -#if CLIENT_DLL - ClientClass; -#else - ServerClass; #endif @@ -47,36 +30,25 @@ public partial class WeaponPhysGun : BaseHL2MPCombatWeapon #endif { - public static readonly Table DT_WeaponPhysGun = new(DT_BaseHL2MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropEHandle(FIELD.OF(nameof(PhysBeam))), - RecvPropVector(FIELD.OF(nameof(HitPosLocal))), - RecvPropEHandle(FIELD.OF(nameof(GrabbedEntity))) -#elif GAME_DLL - SendPropEHandle(FIELD.OF(nameof(PhysBeam))), - SendPropVector(FIELD.OF(nameof(HitPosLocal)), 0, PropFlags.NoScale), - SendPropEHandle(FIELD.OF(nameof(GrabbedEntity))) -#endif - ]); - - public static readonly new Class -#if CLIENT_DLL - ClientClass -#else - ServerClass -#endif - = new Class(DT_WeaponPhysGun); - -#if CLIENT_DLL - public static readonly new DataMap PredMap = new([], typeof(C_WeaponPhysGun), BaseHL2MPCombatWeapon.PredMap); public override DataMap? GetPredDescMap() => PredMap; -#endif - - [NetworkName("m_hPhysBeam")] - public EHANDLE PhysBeam = new(); - [NetworkName("m_vHitPosLocal")] - public Vector3 HitPosLocal; - [NetworkName("m_hGrabbedEntity")] - public EHANDLE GrabbedEntity = new(); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(PhysBeam), + new(nameof(HitPosLocal)) { Bits = 0, Flags = PropFlags.NoScale }, + nameof(GrabbedEntity), + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(HitPosLocal), + nameof(GrabbedEntity), + ]; + + [NetworkVar("m_hPhysBeam")] + public partial EHANDLE PhysBeam { get; set; } + [NetworkVar("m_vHitPosLocal")] + public partial Vector3 HitPosLocal { get; set; } + [NetworkVar("m_hGrabbedEntity")] + public partial EHANDLE GrabbedEntity { get; set; } public override void Activate() { base.Activate(); @@ -91,7 +63,8 @@ public override void Activate() { WeaponPhysGun #endif () { - + PhysBeam = new(); + GrabbedEntity = new(); } public override bool CanBePickedUpByNPCs() => false; public EHANDLE CreatePhysBeam() { diff --git a/Game.Shared/GarrysMod/WeaponPistol.cs b/Game.Shared/GarrysMod/WeaponPistol.cs index f063e5db..9c7ae2ac 100644 --- a/Game.Shared/GarrysMod/WeaponPistol.cs +++ b/Game.Shared/GarrysMod/WeaponPistol.cs @@ -1,48 +1,39 @@ #if (CLIENT_DLL || GAME_DLL) && GMOD_DLL using Source.Common; +using Source.Common.Mathematics; namespace Game.Shared.GarrysMod; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_pistol")] [PrecacheWeaponRegister("weapon_pistol")] [NetworkName("CWeaponPistol")] -public class WeaponPistol : HL2MPMachineGun +public partial class WeaponPistol : HL2MPMachineGun { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponPistol = new(DT_HL2MPMachineGun, [ -#if CLIENT_DLL - RecvPropTime64(FIELD.OF(nameof(SoonestPrimaryAttack))), - RecvPropTime64(FIELD.OF(nameof(LastAttackTime))), - RecvPropFloat(FIELD.OF(nameof(AccuracyPenalty))), - RecvPropInt(FIELD.OF(nameof(NumShotsFired))), -#else - SendPropTime64(FIELD.OF(nameof(SoonestPrimaryAttack))), - SendPropTime64(FIELD.OF(nameof(LastAttackTime))), - SendPropFloat(FIELD.OF(nameof(AccuracyPenalty)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(NumShotsFired)), 16), -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponPistol); - public static readonly new DataMap PredMap = new([], typeof(WeaponPistol), HL2MPMachineGun.PredMap); public override DataMap? GetPredDescMap() => PredMap; -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponPistol); -#endif - [NetworkName("m_flSoonestPrimaryAttack")] - public TimeUnit_t SoonestPrimaryAttack; - [NetworkName("m_flLastAttackTime")] - public TimeUnit_t LastAttackTime; - [NetworkName("m_flAccuracyPenalty")] - public TimeUnit_t AccuracyPenalty; - [NetworkName("m_nNumShotsFired")] - public int NumShotsFired; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(SoonestPrimaryAttack), + nameof(LastAttackTime), + new(nameof(AccuracyPenalty)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(NumShotsFired)) { Bits = 16 }, + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(SoonestPrimaryAttack), + nameof(LastAttackTime), + nameof(AccuracyPenalty), + nameof(NumShotsFired), + ]; + + [NetworkVar("m_flSoonestPrimaryAttack")] + public partial TimeUnit_t SoonestPrimaryAttack { get; set; } + [NetworkVar("m_flLastAttackTime")] + public partial TimeUnit_t LastAttackTime { get; set; } + [NetworkVar("m_flAccuracyPenalty")] + public partial float AccuracyPenalty { get; set; } + [NetworkVar("m_nNumShotsFired")] + public partial int NumShotsFired { get; set; } public override float GetFireRate() => 0.5f; public const TimeUnit_t PISTOL_FASTEST_REFIRE_TIME = 0.1; public const TimeUnit_t PISTOL_FASTEST_DRY_REFIRE_TIME = 0.2; @@ -103,7 +94,22 @@ public override void PrimaryAttack() { base.PrimaryAttack(); // Add an accuracy penalty which can move past our maximum penalty time if we're really spastic - AccuracyPenalty += PISTOL_ACCURACY_SHOT_PENALTY_TIME; + AccuracyPenalty += (float)PISTOL_ACCURACY_SHOT_PENALTY_TIME; + } + + public override void AddViewKick() { + BasePlayer? player = ToBasePlayer(GetOwner()); + + if (player == null) + return; + + QAngle viewPunch = default; + + viewPunch.X = SharedRandomFloat("pistolpax", 0.25f, 0.5f); + viewPunch.Y = SharedRandomFloat("pistolpay", -0.6f, 0.6f); + viewPunch.Z = 0.0f; + + player.ViewPunch(viewPunch); } } #endif diff --git a/Game.Shared/GarrysMod/WeaponRPG.cs b/Game.Shared/GarrysMod/WeaponRPG.cs index 36a3460f..de0defd6 100644 --- a/Game.Shared/GarrysMod/WeaponRPG.cs +++ b/Game.Shared/GarrysMod/WeaponRPG.cs @@ -4,51 +4,42 @@ using System.Numerics; namespace Game.Shared.GarrysMod; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_rpg")] [PrecacheWeaponRegister("weapon_rpg")] [NetworkName("CWeaponRPG")] -public class WeaponRPG : BaseHL2MPCombatWeapon +public partial class WeaponRPG : BaseHL2MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponRPG = new(DT_BaseHL2MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropBool(FIELD.OF(nameof(InitialStateUpdate))), - RecvPropBool(FIELD.OF(nameof(Guiding))), - RecvPropBool(FIELD.OF(nameof(HideGuiding))), - // todo: RecvProxy_MissileDied - RecvPropEHandle(FIELD.OF(nameof(Missile))), - RecvPropVector(FIELD.OF(nameof(LaserDot))), -#else - SendPropBool(FIELD.OF(nameof(InitialStateUpdate))), - SendPropBool(FIELD.OF(nameof(Guiding))), - SendPropBool(FIELD.OF(nameof(HideGuiding))), - SendPropEHandle(FIELD.OF(nameof(Missile))), - SendPropVector(FIELD.OF(nameof(LaserDot)), 0, PropFlags.NoScale), -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponRPG); - public static readonly new DataMap PredMap = new([], typeof(WeaponRPG), BaseHL2MPCombatWeapon.PredMap); public override DataMap? GetPredDescMap() => PredMap; -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponRPG); -#endif - [NetworkName("m_bInitialStateUpdate")] - public bool InitialStateUpdate; - [NetworkName("m_bGuiding")] - public bool Guiding; - [NetworkName("m_bHideGuiding")] - public bool HideGuiding; - [NetworkName("m_hMissile")] - public EHANDLE Missile = new(); - [NetworkName("m_vecLaserDot")] - public Vector3 LaserDot; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(InitialStateUpdate), + nameof(Guiding), + nameof(HideGuiding), + nameof(Missile), + new(nameof(LaserDot)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(Guiding), + nameof(HideGuiding), + ]; + + public WeaponRPG() { + Missile = new(); + } + + [NetworkVar("m_bInitialStateUpdate")] + public partial bool InitialStateUpdate { get; set; } + [NetworkVar("m_bGuiding")] + public partial bool Guiding { get; set; } + [NetworkVar("m_bHideGuiding")] + public partial bool HideGuiding { get; set; } + // todo: RecvProxy_MissileDied + [NetworkVar("m_hMissile")] + public partial EHANDLE Missile { get; set; } + [NetworkVar("m_vecLaserDot")] + public partial Vector3 LaserDot { get; set; } public override float GetFireRate() => 1f; } @@ -57,19 +48,11 @@ public static readonly [LinkEntityToClass("laser_spot")] #endif [NetworkName("CLaserDot")] -public class LaserDot : BaseEntity +public partial class LaserDot : BaseEntity { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_LaserDot = new(DT_BaseEntity, []); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_LaserDot); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_LaserDot); -#endif + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } #endif diff --git a/Game.Shared/GarrysMod/WeaponSLAM.cs b/Game.Shared/GarrysMod/WeaponSLAM.cs index 6433a81c..8dcbaf0f 100644 --- a/Game.Shared/GarrysMod/WeaponSLAM.cs +++ b/Game.Shared/GarrysMod/WeaponSLAM.cs @@ -1,65 +1,55 @@ #if (CLIENT_DLL || GAME_DLL) && GMOD_DLL using Source.Common; namespace Game.Shared.GarrysMod; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_slam")] [PrecacheWeaponRegister("weapon_slam")] [NetworkName("CWeapon_SLAM")] -public class WeaponSLAM : BaseHL2MPCombatWeapon +public partial class WeaponSLAM : BaseHL2MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_Weapon_SLAM = new(DT_BaseHL2MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropInt(FIELD.OF(nameof(SlamState))), - RecvPropBool(FIELD.OF(nameof(DetonatorArmed))), - RecvPropBool(FIELD.OF(nameof(NeedDetonatorDraw))), - RecvPropBool(FIELD.OF(nameof(NeedDetonatorHolster))), - RecvPropBool(FIELD.OF(nameof(NeedReload))), - RecvPropBool(FIELD.OF(nameof(ClearReload))), - RecvPropBool(FIELD.OF(nameof(ThrowSatchel))), - RecvPropBool(FIELD.OF(nameof(AttachSatchel))), - RecvPropBool(FIELD.OF(nameof(AttachTripmine))) -#else - SendPropInt(FIELD.OF(nameof(SlamState)), 4), - SendPropBool(FIELD.OF(nameof(DetonatorArmed))), - SendPropBool(FIELD.OF(nameof(NeedDetonatorDraw))), - SendPropBool(FIELD.OF(nameof(NeedDetonatorHolster))), - SendPropBool(FIELD.OF(nameof(NeedReload))), - SendPropBool(FIELD.OF(nameof(ClearReload))), - SendPropBool(FIELD.OF(nameof(ThrowSatchel))), - SendPropBool(FIELD.OF(nameof(AttachSatchel))), - SendPropBool(FIELD.OF(nameof(AttachTripmine))) -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_Weapon_SLAM); - public static readonly new DataMap PredMap = new([], typeof(WeaponSLAM), BaseHL2MPCombatWeapon.PredMap); public override DataMap? GetPredDescMap() => PredMap; -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_Weapon_SLAM); -#endif - [NetworkName("m_tSlamState")] - public int SlamState; - [NetworkName("m_bDetonatorArmed")] - public bool DetonatorArmed; - [NetworkName("m_bNeedDetonatorDraw")] - public bool NeedDetonatorDraw; - [NetworkName("m_bNeedDetonatorHolster")] - public bool NeedDetonatorHolster; - [NetworkName("m_bNeedReload")] - public bool NeedReload; - [NetworkName("m_bClearReload")] - public bool ClearReload; - [NetworkName("m_bThrowSatchel")] - public bool ThrowSatchel; - [NetworkName("m_bAttachSatchel")] - public bool AttachSatchel; - [NetworkName("m_bAttachTripmine")] - public bool AttachTripmine; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(SlamState)) { Bits = 4 }, + nameof(DetonatorArmed), + nameof(NeedDetonatorDraw), + nameof(NeedDetonatorHolster), + nameof(NeedReload), + nameof(ClearReload), + nameof(ThrowSatchel), + nameof(AttachSatchel), + nameof(AttachTripmine), + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(SlamState), + nameof(DetonatorArmed), + nameof(NeedDetonatorDraw), + nameof(NeedDetonatorHolster), + nameof(NeedReload), + nameof(ClearReload), + nameof(ThrowSatchel), + nameof(AttachSatchel), + nameof(AttachTripmine), + ]; + + [NetworkVar("m_tSlamState")] + public partial int SlamState { get; set; } + [NetworkVar("m_bDetonatorArmed")] + public partial bool DetonatorArmed { get; set; } + [NetworkVar("m_bNeedDetonatorDraw")] + public partial bool NeedDetonatorDraw { get; set; } + [NetworkVar("m_bNeedDetonatorHolster")] + public partial bool NeedDetonatorHolster { get; set; } + [NetworkVar("m_bNeedReload")] + public partial bool NeedReload { get; set; } + [NetworkVar("m_bClearReload")] + public partial bool ClearReload { get; set; } + [NetworkVar("m_bThrowSatchel")] + public partial bool ThrowSatchel { get; set; } + [NetworkVar("m_bAttachSatchel")] + public partial bool AttachSatchel { get; set; } + [NetworkVar("m_bAttachTripmine")] + public partial bool AttachTripmine { get; set; } } #endif diff --git a/Game.Shared/GarrysMod/WeaponSMG1.cs b/Game.Shared/GarrysMod/WeaponSMG1.cs index 0eaff102..bdc95002 100644 --- a/Game.Shared/GarrysMod/WeaponSMG1.cs +++ b/Game.Shared/GarrysMod/WeaponSMG1.cs @@ -2,32 +2,16 @@ using Source.Common; namespace Game.Shared.GarrysMod; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_smg1")] [PrecacheWeaponRegister("weapon_smg1")] [NetworkName("CWeaponSMG1")] -public class WeaponSMG1 : HL2MPMachineGun +public partial class WeaponSMG1 : HL2MPMachineGun { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponSMG1 = new(DT_HL2MPMachineGun, [ -#if CLIENT_DLL - -#else + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponSMG1); - public static readonly new DataMap PredMap = new([], typeof(WeaponSMG1), HL2MPMachineGun.PredMap); public override DataMap? GetPredDescMap() => PredMap; -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponSMG1); -#endif public override float GetFireRate() => 0.075f; public override Activity GetPrimaryAttackActivity() { if (ShotsFired < 2) diff --git a/Game.Shared/GarrysMod/WeaponSWEP.cs b/Game.Shared/GarrysMod/WeaponSWEP.cs index 45e01792..af436677 100644 --- a/Game.Shared/GarrysMod/WeaponSWEP.cs +++ b/Game.Shared/GarrysMod/WeaponSWEP.cs @@ -8,27 +8,11 @@ #if CLIENT_DLL namespace Game.Client; using Game.Client.GarrysMod; -using FIELD = Source.FIELD; #else namespace Game.Server; using Game.Server.GarrysMod; -using FIELD = Source.FIELD; -#endif - -using Table = -#if CLIENT_DLL - RecvTable; -#else - SendTable; -#endif - -using Class = -#if CLIENT_DLL - ClientClass; -#else - ServerClass; #endif [LinkEntityToClass("weapon_swep")] @@ -40,32 +24,16 @@ public partial class WeaponSWEP : BaseHL2MPCombatWeapon #endif { - public static readonly Table DT_WeaponSWEP = new(DT_BaseHL2MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropDataTable("m_ScriptedEntity", FIELD.OF(nameof(ScriptedEntity)), ScriptedEntity.DT_ScriptedEntity, 0, RECV_GET_OBJECT_AT_FIELD(FIELD.OF(nameof(ScriptedEntity)))), - RecvPropString(FIELD.OF(nameof(HoldType))) -#elif GAME_DLL - SendPropDataTable("m_ScriptedEntity", FIELD.OF(nameof(ScriptedEntity)), ScriptedEntity.DT_ScriptedEntity), - SendPropString(FIELD.OF(nameof(HoldType))) -#endif - ]); - - public static readonly new Class -#if CLIENT_DLL - ClientClass -#else - ServerClass -#endif - = new Class(DT_WeaponSWEP); - -#if CLIENT_DLL - public static readonly new DataMap PredMap = new([], typeof(C_WeaponSWEP), BaseHL2MPCombatWeapon.PredMap); public override DataMap? GetPredDescMap() => PredMap; -#endif - - [NetworkName("m_strHoldType")] - public InlineArray80 HoldType; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(ScriptedEntity)) { Encoding = NetEncoding.DataTable, DataTable = "DT_ScriptedEntity" }, + new(nameof(HoldType)) { Encoding = NetEncoding.String }, + ]; + [NetworkVar("m_ScriptedEntity")] public readonly ScriptedEntity ScriptedEntity = new(); + [NetworkVar("m_strHoldType")] + public partial ref readonly InlineArray80 HoldType { get; } #if CLIENT_DLL public C_WeaponSWEP() { @@ -243,7 +211,7 @@ public override void SetHoldType(ReadOnlySpan holdType) { #if GAME_DLL NetworkStateChanged(); #endif - strcpy(HoldType, holdType); + strcpy(HoldTypeForModify(), holdType); } #if CLIENT_DLL diff --git a/Game.Shared/GarrysMod/WeaponShotgun.cs b/Game.Shared/GarrysMod/WeaponShotgun.cs index 006120f6..a284dbaa 100644 --- a/Game.Shared/GarrysMod/WeaponShotgun.cs +++ b/Game.Shared/GarrysMod/WeaponShotgun.cs @@ -5,46 +5,35 @@ using System.Numerics; namespace Game.Shared.GarrysMod; -using FIELD = Source.FIELD; - [LinkEntityToClass("weapon_shotgun")] [PrecacheWeaponRegister("weapon_shotgun")] [NetworkName("CWeaponShotgun")] -public class WeaponShotgun : BaseHL2MPCombatWeapon +public partial class WeaponShotgun : BaseHL2MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponShotgun = new(DT_BaseHL2MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropBool(FIELD.OF(nameof(NeedPump))), - RecvPropBool(FIELD.OF(nameof(DelayedFire1))), - RecvPropBool(FIELD.OF(nameof(DelayedFire2))), - RecvPropBool(FIELD.OF(nameof(DelayedReload))), -#else - SendPropBool(FIELD.OF(nameof(NeedPump))), - SendPropBool(FIELD.OF(nameof(DelayedFire1))), - SendPropBool(FIELD.OF(nameof(DelayedFire2))), - SendPropBool(FIELD.OF(nameof(DelayedReload))), -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponShotgun); - public static readonly new DataMap PredMap = new([], typeof(WeaponShotgun), BaseHL2MPCombatWeapon.PredMap); public override DataMap? GetPredDescMap() => PredMap; -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponShotgun); -#endif - [NetworkName("m_bNeedPump")] - public bool NeedPump; - [NetworkName("m_bDelayedFire1")] - public bool DelayedFire1; - [NetworkName("m_bDelayedFire2")] - public bool DelayedFire2; - [NetworkName("m_bDelayedReload")] - public bool DelayedReload; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(NeedPump), + nameof(DelayedFire1), + nameof(DelayedFire2), + nameof(DelayedReload), + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(NeedPump), + nameof(DelayedFire1), + nameof(DelayedFire2), + nameof(DelayedReload), + ]; + + [NetworkVar("m_bNeedPump")] + public partial bool NeedPump { get; set; } + [NetworkVar("m_bDelayedFire1")] + public partial bool DelayedFire1 { get; set; } + [NetworkVar("m_bDelayedFire2")] + public partial bool DelayedFire2 { get; set; } + [NetworkVar("m_bDelayedReload")] + public partial bool DelayedReload { get; set; } public WeaponShotgun() { ReloadsSingly = true; diff --git a/Game.Shared/GarrysMod/WeaponStunStick.cs b/Game.Shared/GarrysMod/WeaponStunStick.cs index c41d68b7..da67d87d 100644 --- a/Game.Shared/GarrysMod/WeaponStunStick.cs +++ b/Game.Shared/GarrysMod/WeaponStunStick.cs @@ -8,38 +8,23 @@ using System.Numerics; namespace Game.Shared.GarrysMod; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_stunstick")] [PrecacheWeaponRegister("weapon_stunstick")] [NetworkName("CWeaponStunStick")] public partial class WeaponStunStick : BaseHL2MPBludgeonWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponStunStick = new(DT_BaseHL2MPBludgeonWeapon, [ -#if CLIENT_DLL - RecvPropBool(FIELD.OF(nameof(Active))) -#else - SendPropBool(FIELD.OF(nameof(Active))) -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponStunStick); - public static readonly new DataMap PredMap = new([], typeof(WeaponStunStick), BaseHL2MPBludgeonWeapon.PredMap); public override DataMap? GetPredDescMap() => PredMap; -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponStunStick); -#endif - [NetworkName("m_bActive")] -#if CLIENT_DLL - public bool Active; -#else - [NetworkVar] public partial bool Active { get; set; } -#endif + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(Active), + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(Active), + ]; + + [NetworkVar("m_bActive")] public partial bool Active { get; set; } public const float STUNSTICK_RANGE = 75.0f; public const float STUNSTICK_REFIRE = 0.8f; diff --git a/Game.Shared/HL1/Weapon357_HL1.cs b/Game.Shared/HL1/Weapon357_HL1.cs index 19fc9b7f..3c072da1 100644 --- a/Game.Shared/HL1/Weapon357_HL1.cs +++ b/Game.Shared/HL1/Weapon357_HL1.cs @@ -1,30 +1,21 @@ #if CLIENT_DLL || GAME_DLL using Source.Common; namespace Game.Shared.HL1; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_357_hl1")] [NetworkName("CWeapon357_HL1")] -public class Weapon357_HL1 : BaseHL1MPCombatWeapon +public partial class Weapon357_HL1 : BaseHL1MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_Weapon357_HL1 = new(DT_BaseHL1MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropFloat(FIELD.OF(nameof(InZoom))) -#else - SendPropFloat(FIELD.OF(nameof(InZoom)), 0, PropFlags.NoScale) -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_Weapon357_HL1); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_Weapon357_HL1); -#endif - [NetworkName("m_fInZoom")] - public float InZoom; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(InZoom)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(InZoom), + ]; + + [NetworkVar("m_fInZoom")] + public partial float InZoom { get; set; } } #endif diff --git a/Game.Shared/HL1/WeaponCrossbow_HL1.cs b/Game.Shared/HL1/WeaponCrossbow_HL1.cs index d92ec178..5d0bf411 100644 --- a/Game.Shared/HL1/WeaponCrossbow_HL1.cs +++ b/Game.Shared/HL1/WeaponCrossbow_HL1.cs @@ -1,30 +1,21 @@ #if CLIENT_DLL || GAME_DLL using Source.Common; namespace Game.Shared.HL1; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_crossbow_hl1")] [NetworkName("CWeaponCrossbow_HL1")] -public class WeaponCrossbow_HL1 : BaseHL1MPCombatWeapon +public partial class WeaponCrossbow_HL1 : BaseHL1MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponCrossbow_HL1 = new(DT_BaseHL1MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropBool(FIELD.OF(nameof(InZoom))) -#else - SendPropBool(FIELD.OF(nameof(InZoom))) -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponCrossbow_HL1); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponCrossbow_HL1); -#endif - [NetworkName("m_fInZoom")] - public bool InZoom; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(InZoom), + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(InZoom), + ]; + + [NetworkVar("m_fInZoom")] + public partial bool InZoom { get; set; } } #endif diff --git a/Game.Shared/HL1/WeaponCrowbar_HL1.cs b/Game.Shared/HL1/WeaponCrowbar_HL1.cs index 4f896ee4..9931db3e 100644 --- a/Game.Shared/HL1/WeaponCrowbar_HL1.cs +++ b/Game.Shared/HL1/WeaponCrowbar_HL1.cs @@ -1,23 +1,18 @@ #if CLIENT_DLL || GAME_DLL using Source.Common; namespace Game.Shared.HL1; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_crowbar_hl1")] [NetworkName("CWeaponCrowbar_HL1")] -public class WeaponCrowbar_HL1 : BaseHL1MPCombatWeapon +public partial class WeaponCrowbar_HL1 : BaseHL1MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponCrowbar_HL1 = new(DT_BaseHL1MPCombatWeapon, []); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponCrowbar_HL1); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponCrowbar_HL1); -#endif + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + ]; + public float InZoom; } #endif diff --git a/Game.Shared/HL1/WeaponEgon.cs b/Game.Shared/HL1/WeaponEgon.cs index cc0e6942..f4373d60 100644 --- a/Game.Shared/HL1/WeaponEgon.cs +++ b/Game.Shared/HL1/WeaponEgon.cs @@ -1,23 +1,18 @@ #if CLIENT_DLL || GAME_DLL using Source.Common; namespace Game.Shared.HL1; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_egon")] [NetworkName("CWeaponEgon")] -public class WeaponEgon : BaseHL1MPCombatWeapon +public partial class WeaponEgon : BaseHL1MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponEgon = new(DT_BaseHL1MPCombatWeapon, []); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponEgon); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponEgon); -#endif + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + ]; + public float InZoom; } #endif diff --git a/Game.Shared/HL1/WeaponGauss.cs b/Game.Shared/HL1/WeaponGauss.cs index 5b273deb..854f70ef 100644 --- a/Game.Shared/HL1/WeaponGauss.cs +++ b/Game.Shared/HL1/WeaponGauss.cs @@ -1,50 +1,41 @@ #if CLIENT_DLL || GAME_DLL using Source.Common; namespace Game.Shared.HL1; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_gauss")] [NetworkName("CWeaponGauss")] -public class WeaponGauss : BaseHL1MPCombatWeapon +public partial class WeaponGauss : BaseHL1MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponGauss = new(DT_BaseHL1MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropInt(FIELD.OF(nameof(AttackState))), - RecvPropBool(FIELD.OF(nameof(PrimaryFire))), - RecvPropFloat(FIELD.OF(nameof(StartCharge))), - RecvPropFloat(FIELD.OF(nameof(AmmoStartCharge))), - RecvPropTime64(FIELD.OF(nameof(PlayAftershock))), - RecvPropTime64(FIELD.OF(nameof(NextAmmoBurn))) -#else - SendPropInt(FIELD.OF(nameof(AttackState)), 2, PropFlags.Unsigned), - SendPropBool(FIELD.OF(nameof(PrimaryFire))), - SendPropFloat(FIELD.OF(nameof(StartCharge)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(AmmoStartCharge)), 0, PropFlags.NoScale), - SendPropTime64(FIELD.OF(nameof(PlayAftershock))), - SendPropTime64(FIELD.OF(nameof(NextAmmoBurn))) -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponGauss); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponGauss); -#endif - [NetworkName("m_nAttackState")] - public int AttackState; - [NetworkName("m_bPrimaryFire")] - public bool PrimaryFire; - [NetworkName("m_flStartCharge")] - public TimeUnit_t StartCharge; - [NetworkName("m_flAmmoStartCharge")] - public TimeUnit_t AmmoStartCharge; - [NetworkName("m_flPlayAftershock")] - public TimeUnit_t PlayAftershock; - [NetworkName("m_flNextAmmoBurn")] - public TimeUnit_t NextAmmoBurn; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(AttackState)) { Bits = 2, Flags = PropFlags.Unsigned }, + nameof(PrimaryFire), + new(nameof(StartCharge)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(AmmoStartCharge)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + nameof(PlayAftershock), + nameof(NextAmmoBurn), + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(AttackState), + nameof(PrimaryFire), + nameof(StartCharge), + nameof(AmmoStartCharge), + nameof(PlayAftershock), + nameof(NextAmmoBurn), + ]; + + [NetworkVar("m_nAttackState")] + public partial int AttackState { get; set; } + [NetworkVar("m_bPrimaryFire")] + public partial bool PrimaryFire { get; set; } + [NetworkVar("m_flStartCharge")] + public partial TimeUnit_t StartCharge { get; set; } + [NetworkVar("m_flAmmoStartCharge")] + public partial TimeUnit_t AmmoStartCharge { get; set; } + [NetworkVar("m_flPlayAftershock")] + public partial TimeUnit_t PlayAftershock { get; set; } + [NetworkVar("m_flNextAmmoBurn")] + public partial TimeUnit_t NextAmmoBurn { get; set; } } #endif diff --git a/Game.Shared/HL1/WeaponGlock.cs b/Game.Shared/HL1/WeaponGlock.cs index 0a4abc55..c530f198 100644 --- a/Game.Shared/HL1/WeaponGlock.cs +++ b/Game.Shared/HL1/WeaponGlock.cs @@ -1,23 +1,18 @@ #if CLIENT_DLL || GAME_DLL using Source.Common; namespace Game.Shared.HL1; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_glock_hl1")] [NetworkName("CWeaponGlock")] -public class WeaponGlock : BaseHL1MPCombatWeapon +public partial class WeaponGlock : BaseHL1MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponGlock = new(DT_BaseHL1MPCombatWeapon, []); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponGlock); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponGlock); -#endif + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + ]; + public float InZoom; } #endif diff --git a/Game.Shared/HL1/WeaponHandGrenade.cs b/Game.Shared/HL1/WeaponHandGrenade.cs index 95c8ebe6..1fa6c1e9 100644 --- a/Game.Shared/HL1/WeaponHandGrenade.cs +++ b/Game.Shared/HL1/WeaponHandGrenade.cs @@ -1,34 +1,25 @@ #if CLIENT_DLL || GAME_DLL using Source.Common; namespace Game.Shared.HL1; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_handgrenade")] [NetworkName("CWeaponHandGrenade")] -public class WeaponHandGrenade : BaseHL1MPCombatWeapon +public partial class WeaponHandGrenade : BaseHL1MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponHandGrenade = new(DT_BaseHL1MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropFloat(FIELD.OF(nameof(StartThrow))), - RecvPropFloat(FIELD.OF(nameof(ReleaseThrow))), -#else - SendPropFloat(FIELD.OF(nameof(StartThrow)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(ReleaseThrow)), 0, PropFlags.NoScale), -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponHandGrenade); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponHandGrenade); -#endif - [NetworkName("m_flStartThrow")] - public TimeUnit_t StartThrow; - [NetworkName("m_flReleaseThrow")] - public TimeUnit_t ReleaseThrow; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(StartThrow)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(ReleaseThrow)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(StartThrow), + nameof(ReleaseThrow), + ]; + + [NetworkVar("m_flStartThrow")] + public partial TimeUnit_t StartThrow { get; set; } + [NetworkVar("m_flReleaseThrow")] + public partial TimeUnit_t ReleaseThrow { get; set; } } #endif diff --git a/Game.Shared/HL1/WeaponHgun.cs b/Game.Shared/HL1/WeaponHgun.cs index 5fa20af4..135a8763 100644 --- a/Game.Shared/HL1/WeaponHgun.cs +++ b/Game.Shared/HL1/WeaponHgun.cs @@ -1,34 +1,25 @@ #if CLIENT_DLL || GAME_DLL using Source.Common; namespace Game.Shared.HL1; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_hornetgun")] [NetworkName("CWeaponHgun")] -public class WeaponHgun : BaseHL1MPCombatWeapon +public partial class WeaponHgun : BaseHL1MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponHgun = new(DT_BaseHL1MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropFloat(FIELD.OF(nameof(RechargeTime))), - RecvPropInt(FIELD.OF(nameof(FirePhase))), -#else - SendPropFloat(FIELD.OF(nameof(RechargeTime)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(FirePhase)), 4, PropFlags.Unsigned), -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponHgun); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponHgun); -#endif - [NetworkName("m_flRechargeTime")] - public TimeUnit_t RechargeTime; - [NetworkName("m_iFirePhase")] - public int FirePhase; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(RechargeTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FirePhase)) { Bits = 4, Flags = PropFlags.Unsigned }, + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(RechargeTime), + nameof(FirePhase), + ]; + + [NetworkVar("m_flRechargeTime")] + public partial TimeUnit_t RechargeTime { get; set; } + [NetworkVar("m_iFirePhase")] + public partial int FirePhase { get; set; } } #endif diff --git a/Game.Shared/HL1/WeaponMP5.cs b/Game.Shared/HL1/WeaponMP5.cs index 6939f7d8..00a2c62d 100644 --- a/Game.Shared/HL1/WeaponMP5.cs +++ b/Game.Shared/HL1/WeaponMP5.cs @@ -1,23 +1,18 @@ #if CLIENT_DLL || GAME_DLL using Source.Common; namespace Game.Shared.HL1; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_mp5_hl1")] [NetworkName("CWeaponMP5")] -public class WeaponMP5 : BaseHL1MPCombatWeapon +public partial class WeaponMP5 : BaseHL1MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponMP5 = new(DT_BaseHL1MPCombatWeapon, []); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponMP5); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponMP5); -#endif + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + ]; + public float InZoom; } #endif diff --git a/Game.Shared/HL1/WeaponRPG_HL1.cs b/Game.Shared/HL1/WeaponRPG_HL1.cs index 3385e6c4..ef4a5152 100644 --- a/Game.Shared/HL1/WeaponRPG_HL1.cs +++ b/Game.Shared/HL1/WeaponRPG_HL1.cs @@ -3,67 +3,44 @@ using System.Drawing; namespace Game.Shared.HL1; -using FIELD_RPG = Source.FIELD; -using FIELD_LASER = Source.FIELD; [LinkEntityToClass("weapon_rpg_hl1")] [NetworkName("CWeaponRPG_HL1")] -public class WeaponRPG_HL1 : BaseHL1MPCombatWeapon +public partial class WeaponRPG_HL1 : BaseHL1MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponRPG_HL1 = new(DT_BaseHL1MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropBool(FIELD_RPG.OF(nameof(InitialStateUpdate))), - RecvPropBool(FIELD_RPG.OF(nameof(Guiding))), - RecvPropBool(FIELD_RPG.OF(nameof(LaserDotSuspended))) -#else - SendPropBool(FIELD_RPG.OF(nameof(InitialStateUpdate))), - SendPropBool(FIELD_RPG.OF(nameof(Guiding))), - SendPropBool(FIELD_RPG.OF(nameof(LaserDotSuspended))) -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponRPG_HL1); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponRPG_HL1); -#endif - [NetworkName("m_bIntialStateUpdate")] - public bool InitialStateUpdate; - [NetworkName("m_bGuiding")] - public bool Guiding; - [NetworkName("m_bLaserDotSuspended")] - public bool LaserDotSuspended; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(InitialStateUpdate), + nameof(Guiding), + nameof(LaserDotSuspended), + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(InitialStateUpdate), + nameof(Guiding), + nameof(LaserDotSuspended), + ]; + + [NetworkVar("m_bIntialStateUpdate")] + public partial bool InitialStateUpdate { get; set; } + [NetworkVar("m_bGuiding")] + public partial bool Guiding { get; set; } + [NetworkVar("m_bLaserDotSuspended")] + public partial bool LaserDotSuspended { get; set; } } #if !CLIENT_DLL [LinkEntityToClass("laser_spot")] #endif [NetworkName("CLaserDot_HL1")] -public class LaserDot_HL1 : BaseEntity +public partial class LaserDot_HL1 : BaseEntity { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_LaserDot_HL1 = new(DT_BaseEntity, [ -#if CLIENT_DLL - RecvPropBool(FIELD_LASER.OF(nameof(IsOn))), -#else - SendPropBool(FIELD_LASER.OF(nameof(IsOn))), -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_LaserDot_HL1); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_LaserDot_HL1); -#endif - [NetworkName("m_bIsOn")] - public bool IsOn; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(IsOn), + ]; + + [NetworkVar("m_bIsOn")] + public partial bool IsOn { get; set; } } #endif diff --git a/Game.Shared/HL1/WeaponSatchel.cs b/Game.Shared/HL1/WeaponSatchel.cs index b4319e92..ff7c49ff 100644 --- a/Game.Shared/HL1/WeaponSatchel.cs +++ b/Game.Shared/HL1/WeaponSatchel.cs @@ -1,46 +1,37 @@ #if CLIENT_DLL || GAME_DLL using Source.Common; namespace Game.Shared.HL1; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_satchel")] [NetworkName("CWeaponSatchel")] -public class WeaponSatchel : BaseHL1MPCombatWeapon +public partial class WeaponSatchel : BaseHL1MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponSatchel = new(DT_BaseHL1MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropInt(FIELD.OF(nameof(RadioViewIndex))), - RecvPropInt(FIELD.OF(nameof(RadioWorldIndex))), - RecvPropInt(FIELD.OF(nameof(SatchelViewIndex))), - RecvPropInt(FIELD.OF(nameof(SatchelWorldIndex))), - RecvPropInt(FIELD.OF(nameof(ChargeReady))), -#else - SendPropInt(FIELD.OF(nameof(RadioViewIndex)), 14), - SendPropInt(FIELD.OF(nameof(RadioWorldIndex)), 14), - SendPropInt(FIELD.OF(nameof(SatchelViewIndex)), 14), - SendPropInt(FIELD.OF(nameof(SatchelWorldIndex)), 14), - SendPropInt(FIELD.OF(nameof(ChargeReady)), 3, PropFlags.Unsigned), -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponSatchel); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponSatchel); -#endif - [NetworkName("m_iRadioViewIndex")] - public int RadioViewIndex; - [NetworkName("m_iRadioWorldIndex")] - public float RadioWorldIndex; - [NetworkName("m_iSatchelViewIndex")] - public float SatchelViewIndex; - [NetworkName("m_iSatchelWorldIndex")] - public float SatchelWorldIndex; - [NetworkName("m_iChargeReady")] - public float ChargeReady; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(RadioViewIndex)) { Bits = 14 }, + new(nameof(RadioWorldIndex)) { Encoding = NetEncoding.Int, Bits = 14 }, + new(nameof(SatchelViewIndex)) { Encoding = NetEncoding.Int, Bits = 14 }, + new(nameof(SatchelWorldIndex)) { Encoding = NetEncoding.Int, Bits = 14 }, + new(nameof(ChargeReady)) { Encoding = NetEncoding.Int, Bits = 3, Flags = PropFlags.Unsigned }, + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + new(nameof(RadioViewIndex)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.ModelIndex }, + new(nameof(RadioWorldIndex)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.ModelIndex }, + new(nameof(SatchelViewIndex)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.ModelIndex }, + new(nameof(SatchelWorldIndex)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.ModelIndex }, + nameof(ChargeReady), + ]; + + [NetworkVar("m_iRadioViewIndex")] + public partial int RadioViewIndex { get; set; } + [NetworkVar("m_iRadioWorldIndex")] + public partial float RadioWorldIndex { get; set; } + [NetworkVar("m_iSatchelViewIndex")] + public partial float SatchelViewIndex { get; set; } + [NetworkVar("m_iSatchelWorldIndex")] + public partial float SatchelWorldIndex { get; set; } + [NetworkVar("m_iChargeReady")] + public partial float ChargeReady { get; set; } } #endif diff --git a/Game.Shared/HL1/WeaponShotgun_HL1.cs b/Game.Shared/HL1/WeaponShotgun_HL1.cs index a9d751eb..c5a8cf52 100644 --- a/Game.Shared/HL1/WeaponShotgun_HL1.cs +++ b/Game.Shared/HL1/WeaponShotgun_HL1.cs @@ -1,34 +1,25 @@ #if CLIENT_DLL || GAME_DLL using Source.Common; namespace Game.Shared.HL1; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_shotgun_hl1")] [NetworkName("CWeaponShotgun_HL1")] -public class WeaponShotgun_HL1 : BaseHL1MPCombatWeapon +public partial class WeaponShotgun_HL1 : BaseHL1MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponShotgun_HL1 = new(DT_BaseHL1MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropFloat(FIELD.OF(nameof(PumpTime))), - RecvPropInt(FIELD.OF(nameof(InSpecialReload))), -#else - SendPropFloat(FIELD.OF(nameof(PumpTime)), 0, PropFlags.NoScale), - SendPropInt(FIELD.OF(nameof(InSpecialReload)), 2, PropFlags.Unsigned), -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponShotgun_HL1); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponShotgun_HL1); -#endif - [NetworkName("m_flPumpTime")] - public float PumpTime; - [NetworkName("m_fInSpecialReload")] - public float InSpecialReload; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(PumpTime)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(InSpecialReload)) { Encoding = NetEncoding.Int, Bits = 2, Flags = PropFlags.Unsigned }, + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(PumpTime), + nameof(InSpecialReload), + ]; + + [NetworkVar("m_flPumpTime")] + public partial float PumpTime { get; set; } + [NetworkVar("m_fInSpecialReload")] + public partial float InSpecialReload { get; set; } } #endif diff --git a/Game.Shared/HL1/WeaponSnark.cs b/Game.Shared/HL1/WeaponSnark.cs index 9f3c0e1c..b9ffbb65 100644 --- a/Game.Shared/HL1/WeaponSnark.cs +++ b/Game.Shared/HL1/WeaponSnark.cs @@ -1,30 +1,21 @@ #if CLIENT_DLL || GAME_DLL using Source.Common; namespace Game.Shared.HL1; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_snark")] [NetworkName("CWeaponSnark")] -public class WeaponSnark : BaseHL1MPCombatWeapon +public partial class WeaponSnark : BaseHL1MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponSnark = new(DT_BaseHL1MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropBool(FIELD.OF(nameof(JustThrown))), -#else - SendPropBool(FIELD.OF(nameof(JustThrown))), -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponSnark); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponSnark); -#endif - [NetworkName("m_bJustThrown")] - public bool JustThrown; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + nameof(JustThrown), + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(JustThrown), + ]; + + [NetworkVar("m_bJustThrown")] + public partial bool JustThrown { get; set; } } #endif diff --git a/Game.Shared/HL1/WeaponTripMine.cs b/Game.Shared/HL1/WeaponTripMine.cs index c8782659..82eab55c 100644 --- a/Game.Shared/HL1/WeaponTripMine.cs +++ b/Game.Shared/HL1/WeaponTripMine.cs @@ -1,34 +1,25 @@ #if CLIENT_DLL || GAME_DLL using Source.Common; namespace Game.Shared.HL1; -using FIELD = Source.FIELD; [LinkEntityToClass("weapon_tripmine")] [NetworkName("CWeaponTripMine")] -public class WeaponTripMine : BaseHL1MPCombatWeapon +public partial class WeaponTripMine : BaseHL1MPCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_WeaponTripMine = new(DT_BaseHL1MPCombatWeapon, [ -#if CLIENT_DLL - RecvPropFloat(FIELD.OF(nameof(GroundIndex))), - RecvPropFloat(FIELD.OF(nameof(PickedUpIndex))), -#else - SendPropFloat(FIELD.OF(nameof(GroundIndex)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(PickedUpIndex)), 0, PropFlags.NoScale), -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_WeaponTripMine); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_WeaponTripMine); -#endif - [NetworkName("m_iGroundIndex")] - public float GroundIndex; - [NetworkName("m_iPickedUpIndex")] - public float PickedUpIndex; + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(GroundIndex)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(PickedUpIndex)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; + + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(GroundIndex), + nameof(PickedUpIndex), + ]; + + [NetworkVar("m_iGroundIndex")] + public partial float GroundIndex { get; set; } + [NetworkVar("m_iPickedUpIndex")] + public partial float PickedUpIndex { get; set; } } #endif diff --git a/Game.Shared/HL2/BaseHLCombatWeapon.cs b/Game.Shared/HL2/BaseHLCombatWeapon.cs index cbfae10c..77f6d85e 100644 --- a/Game.Shared/HL2/BaseHLCombatWeapon.cs +++ b/Game.Shared/HL2/BaseHLCombatWeapon.cs @@ -20,19 +20,11 @@ public static class HLCombatWeaponGlobals [LinkEntityToClass("basehlcombatweapon")] [NetworkName("CBaseHLCombatWeapon")] -public class BaseHLCombatWeapon : BaseCombatWeapon +public partial class BaseHLCombatWeapon : BaseCombatWeapon { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_BaseHLCombatWeapon = new(DT_BaseCombatWeapon, []); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_BaseHLCombatWeapon); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_BaseHLCombatWeapon); -#endif + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } #endif diff --git a/Game.Shared/HL2/HL_GameMovement.cs b/Game.Shared/HL2/HL_GameMovement.cs index 46e96fb2..0b7ddbfb 100644 --- a/Game.Shared/HL2/HL_GameMovement.cs +++ b/Game.Shared/HL2/HL_GameMovement.cs @@ -55,7 +55,9 @@ public void SetLadder(FuncLadder? ladder) { if (ladder == null && oldLadder != null) oldLadder.PlayerGotOff(GetHL2Player()); - GetHL2Player().HL2Local.Ladder.Set(ladder); + var ladderHandle = GetHL2Player().HL2Local.Ladder; + ladderHandle.Set(ladder); + GetHL2Player().HL2Local.Ladder = ladderHandle; } protected override int GetCheckInterval(IntervalType type) => type == IntervalType.Ladder ? 1 : base.GetCheckInterval(type); diff --git a/Game.Shared/HL2MP/HL2MPGameRules.cs b/Game.Shared/HL2MP/HL2MPGameRules.cs index 0750ee65..e498b720 100644 --- a/Game.Shared/HL2MP/HL2MPGameRules.cs +++ b/Game.Shared/HL2MP/HL2MPGameRules.cs @@ -17,14 +17,12 @@ namespace Game.Server.GarrysMod; using Source.Common; using Source; -using FIELD = Source.FIELD; - using Game.Shared; using Source.Common.Engine; [LinkEntityToClass("hl2mp_gamerules")] [NetworkName("CHL2MPGameRulesProxy")] -public class +public partial class #if CLIENT_DLL C_HL2MPGameRulesProxy #else @@ -32,35 +30,24 @@ public class #endif : GameRulesProxy { + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(HL2MPGameRules.Props)) { Name = "hl2mp_gamerules_data", Proxy = typeof(HL2MPGameRulesProxy.RulesProxy) }, + ]; + public override GameRules GameRules => hl2mp_gamerules_data; public HL2MPGameRules hl2mp_gamerules_data = new(); - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_HL2MPRules = new(nameof(DT_HL2MPRules), [ + public static class RulesProxy + { #if CLIENT_DLL - RecvPropBool(FIELD.OF("TeamPlayEnabled")), + public static void Recv(RecvProp prop, out object? outInstance, object? instance, IFieldAccessor fieldInfo, int objectID) { + outInstance = ((HL2MPGameRulesProxy)instance!).hl2mp_gamerules_data; + } #else - SendPropBool(FIELD.OF("TeamPlayEnabled")) + public static object? Send(SendProp prop, object instance, IFieldAccessor data, SendProxyRecipients recipients, int objectID) => SendProxy_HL2MPRules(prop, instance, data, recipients, objectID); #endif - ]); + } - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_HL2MPGameRulesProxy = new(DT_GameRulesProxy, [ -#if CLIENT_DLL - RecvPropDataTable(nameof(hl2mp_gamerules_data), FIELD.OF(nameof(hl2mp_gamerules_data)), DT_HL2MPRules, 0, DataTableRecvProxy_PointerDataTable) -#else - SendPropDataTable(nameof(hl2mp_gamerules_data), DT_HL2MPRules, SendProxy_HL2MPRules) -#endif - ]); #if !CLIENT_DLL public static object SendProxy_HL2MPRules(SendProp prop, object instance, IFieldAccessor data, SendProxyRecipients recipients, int objectID) { HL2MPGameRules rules = HL2MPRules(); @@ -68,14 +55,9 @@ public static object SendProxy_HL2MPRules(SendProp prop, object instance, IField return rules; } #endif -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_HL2MPGameRulesProxy); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_HL2MPGameRulesProxy); -#endif } -public class +public partial class #if CLIENT_DLL C_HL2MPGameRules #else @@ -84,6 +66,11 @@ public class : MultiplayRules // TODO: AutoGameSystemPerFrame { + [NetworkTable("DT_HL2MPRules")] + public static readonly NetworkProp[] Props = [ + nameof(TeamPlayEnabled), + ]; + public #if CLIENT_DLL C_HL2MPGameRules @@ -94,8 +81,8 @@ public class } public override ReadOnlySpan Name() => "HL2MPGameRules"; - [NetworkName("m_bTeamPlayEnabled")] - public bool TeamPlayEnabled; + [NetworkVar("m_bTeamPlayEnabled")] + public partial bool TeamPlayEnabled { get; set; } public override bool ShouldCollide(CollisionGroup collisionGroup0, CollisionGroup collisionGroup1) { if (collisionGroup0 > collisionGroup1) { diff --git a/Game.Shared/InfoLadderDismount.cs b/Game.Shared/InfoLadderDismount.cs index c0f5b87c..2cae5e8e 100644 --- a/Game.Shared/InfoLadderDismount.cs +++ b/Game.Shared/InfoLadderDismount.cs @@ -13,22 +13,6 @@ namespace Game.Client; namespace Game.Server; #endif -using Table = -#if CLIENT_DLL - RecvTable; -#else - SendTable; -#endif - -using Class = -#if CLIENT_DLL - ClientClass; -#else - ServerClass; -#endif - -using FIELD = Source.FIELD; - [LinkEntityToClass("info_ladder_dismount")] [NetworkName("CInfoLadderDismount")] public partial class @@ -38,8 +22,10 @@ public partial class InfoLadderDismount : BaseEntity #endif { - public static Table DT_InfoLadderDismount = new(DT_BaseEntity, []); - public static readonly Class Class = new Class(DT_InfoLadderDismount); + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; + } #endif diff --git a/Game.Shared/ParticleParse.cs b/Game.Shared/ParticleParse.cs index 59720726..a604c738 100644 --- a/Game.Shared/ParticleParse.cs +++ b/Game.Shared/ParticleParse.cs @@ -23,16 +23,16 @@ public enum ParticleAttachment : byte public struct ParticleEffectsColors { - [NetworkName("m_vecColor1")] + [NetworkVar("m_vecColor1")] public Vector3 Color1; - [NetworkName("m_vecColor2")] + [NetworkVar("m_vecColor2")] public Vector3 Color2; } public struct ParticleEffectsControlPoint { - [NetworkName("m_eParticleAttachment")] + [NetworkVar("m_eParticleAttachment")] public byte ParticleAttachment; - [NetworkName("m_vecOffset")] + [NetworkVar("m_vecOffset")] public Vector3 Offset; } diff --git a/Game.Shared/PhysicsMainShared.cs b/Game.Shared/PhysicsMainShared.cs index 43e86f5a..fe54e33d 100644 --- a/Game.Shared/PhysicsMainShared.cs +++ b/Game.Shared/PhysicsMainShared.cs @@ -538,7 +538,7 @@ public void SetGroundEntity(BaseEntity? ground) { #endif BaseEntity? oldGround = GroundEntity.Get(); - GroundEntity.Set(ground); + GroundEntity = EHANDLE.FromEntity(ground); // Just starting to touch if (oldGround == null && ground != null) diff --git a/Game.Shared/PlayerNetVars.cs b/Game.Shared/PlayerNetVars.cs index 839cff23..1ae3e319 100644 --- a/Game.Shared/PlayerNetVars.cs +++ b/Game.Shared/PlayerNetVars.cs @@ -12,45 +12,45 @@ public static class PlayerNetVars public struct FogParams() { - [NetworkName("dirPrimary")] + [NetworkVar("dirPrimary")] public Vector3 DirPrimary; - [NetworkName("colorPrimary")] + [NetworkVar("colorPrimary")] public Color ColorPrimary; - [NetworkName("colorSecondary")] + [NetworkVar("colorSecondary")] public Color ColorSecondary; - [NetworkName("colorPrimaryHDR")] + [NetworkVar("colorPrimaryHDR")] public Color ColorPrimaryHDR; - [NetworkName("colorSecondaryHDR")] + [NetworkVar("colorSecondaryHDR")] public Color ColorSecondaryHDR; - [NetworkName("colorPrimaryLerpTo")] + [NetworkVar("colorPrimaryLerpTo")] public Color ColorPrimaryLerpTo; - [NetworkName("colorSecondaryLerpTo")] + [NetworkVar("colorSecondaryLerpTo")] public Color ColorSecondaryLerpTo; - [NetworkName("start")] + [NetworkVar("start")] public float Start; - [NetworkName("end")] + [NetworkVar("end")] public float End; - [NetworkName("farz")] + [NetworkVar("farz")] public float FarZ; - [NetworkName("maxdensity")] + [NetworkVar("maxdensity")] public float MaxDensity; - [NetworkName("startLerpTo")] + [NetworkVar("startLerpTo")] public float StartLerpTo; - [NetworkName("endLerpTo")] + [NetworkVar("endLerpTo")] public float EndLerpTo; - [NetworkName("maxdensityLerpTo")] + [NetworkVar("maxdensityLerpTo")] public float MaxDensityLerpTo; - [NetworkName("lerptime")] + [NetworkVar("lerptime")] public TimeUnit_t LerpTime; - [NetworkName("duration")] + [NetworkVar("duration")] public TimeUnit_t Duration; - [NetworkName("enable")] + [NetworkVar("enable")] public bool Enable; - [NetworkName("blend")] + [NetworkVar("blend")] public bool Blend; - [NetworkName("radial")] + [NetworkVar("radial")] public bool Radial; - [NetworkName("HDRColorScale")] + [NetworkVar("HDRColorScale")] public float HDRColorScale; } @@ -58,7 +58,7 @@ public struct FogParams() public struct FogPlayerParams() { #if CLIENT_DLL || GAME_DLL - [NetworkName("m_hCtrl")] + [NetworkVar("m_hCtrl")] public Handle Ctrl = new(); #endif public TimeUnit_t TransitionTime = -1; @@ -76,25 +76,25 @@ public struct FogPlayerParams() public struct Sky3DParams() { - [NetworkName("scale")] + [NetworkVar("scale")] public int Scale; - [NetworkName("origin")] + [NetworkVar("origin")] public Vector3 Origin; - [NetworkName("area")] + [NetworkVar("area")] public int Area; - [NetworkName("fog")] + [NetworkVar("fog")] public FogParams Fog = new(); } public struct AudioParams() { - [NetworkName("localSound")] + [NetworkVar("localSound")] public InlineArrayNumLocalAudioSounds LocalSound; - [NetworkName("soundscapeIndex")] + [NetworkVar("soundscapeIndex")] public int SoundscapeIndex; - [NetworkName("localBits")] + [NetworkVar("localBits")] public int LocalBits; - [NetworkName("ent")] + [NetworkVar("ent")] public EHANDLE Ent = new(); } diff --git a/Game.Shared/PlayerState.cs b/Game.Shared/PlayerState.cs new file mode 100644 index 00000000..fa2337a1 --- /dev/null +++ b/Game.Shared/PlayerState.cs @@ -0,0 +1,26 @@ +#if CLIENT_DLL || GAME_DLL + +using Source.Common; + +namespace Game.Shared; + +public partial class PlayerState : PlayerEngineState +{ + [NetworkTable("DT_PlayerState")] + public static readonly NetworkProp[] Props = [ + nameof(DeadFlag), + ]; + + [PredictionTable] + public static readonly PredictionField[] Prediction = [ + nameof(DeadFlag), + ]; + + public Action? OnNetworkStateChanged; + + [NetworkVar("deadflag")] + public partial bool DeadFlag { get; set; } + + void NetworkStateChanged(IFieldAccessor field) => OnNetworkStateChanged?.Invoke(); +} +#endif diff --git a/Game.Shared/PredictedViewModel.cs b/Game.Shared/PredictedViewModel.cs index 6f1988c0..7b4596c6 100644 --- a/Game.Shared/PredictedViewModel.cs +++ b/Game.Shared/PredictedViewModel.cs @@ -12,7 +12,7 @@ namespace Game.Server; [LinkEntityToClass("predicted_viewmodel")] [NetworkName("CPredictedViewModel")] -public class +public partial class #if CLIENT_DLL C_PredictedViewModel #else @@ -21,21 +21,9 @@ public class : BaseViewModel { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_PredictedViewModel = new(DT_BaseViewModel, []); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_PredictedViewModel); -#else -#pragma warning disable CS0109 // Member does not hide an inherited member; new keyword is not required - public static readonly new ServerClass ServerClass = new ServerClass(DT_PredictedViewModel); -#pragma warning restore CS0109 // Member does not hide an inherited member; new keyword is not required -#endif - + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; #if CLIENT_DLL public override bool ShouldPredict() { diff --git a/Game.Shared/Sprite.cs b/Game.Shared/Sprite.cs index b36c3632..ba1ad27c 100644 --- a/Game.Shared/Sprite.cs +++ b/Game.Shared/Sprite.cs @@ -3,98 +3,79 @@ using System.Numerics; namespace Game.Shared; -using FIELD = Source.FIELD; [LinkEntityToClass("env_sprite")] #if !CLIENT_DLL [LinkEntityToClass("env_glow")] [LinkEntityToClass("env_sprite_clientside")] #endif [NetworkName("CSprite")] -public class Sprite : BaseEntity +public partial class Sprite : BaseEntity { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_Sprite = new(DT_BaseEntity, [ -#if CLIENT_DLL - RecvPropEHandle(FIELD.OF(nameof(AttachedToEntity))), - RecvPropInt(FIELD.OF(nameof(Attachment))), - RecvPropFloat(FIELD.OF(nameof(ScaleTime))), - // todo: RecvProxy_SpriteScale - RecvPropFloat(FIELD.OF(nameof(SpriteScale))), - RecvPropFloat(FIELD.OF(nameof(GlowProxySize))), - RecvPropFloat(FIELD.OF(nameof(HDRColorScale))), - RecvPropFloat(FIELD.OF(nameof(SpriteFramerate))), - RecvPropFloat(FIELD.OF(nameof(Frame))), - RecvPropFloat(FIELD.OF(nameof(BrightnessTime))), - RecvPropInt(FIELD.OF(nameof(Brightness))), - RecvPropBool(FIELD.OF(nameof(WorldSpaceScale))) -#else - SendPropEHandle(FIELD.OF(nameof(AttachedToEntity))), - SendPropInt(FIELD.OF(nameof(Attachment)), 8), - SendPropFloat(FIELD.OF(nameof(ScaleTime)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(SpriteScale)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(GlowProxySize)), 6, PropFlags.RoundUp, 0.0f, 64.0f), - SendPropFloat(FIELD.OF(nameof(HDRColorScale)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(SpriteFramerate)), 8, PropFlags.RoundUp, 0, 60.0f), - SendPropFloat(FIELD.OF(nameof(Frame)), 20, PropFlags.RoundDown, 0, 256), - SendPropFloat(FIELD.OF(nameof(BrightnessTime)), 0, PropFlags.NoScale, 0, 0), - SendPropInt(FIELD.OF(nameof(Brightness)), 8, PropFlags.Unsigned), - SendPropBool(FIELD.OF(nameof(WorldSpaceScale))) -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_Sprite); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_Sprite); -#endif - [NetworkName("m_hAttachedToEntity")] - public EHANDLE AttachedToEntity = new(); - [NetworkName("m_nAttachment")] - public int Attachment; - [NetworkName("m_flScaleTime")] - public TimeUnit_t ScaleTime; - [NetworkName("m_flSpriteScale")] - public float SpriteScale; - [NetworkName("m_flGlowProxySize")] - public float GlowProxySize; - [NetworkName("m_flHDRColorScale")] - public float HDRColorScale; - [NetworkName("m_flSpriteFramerate")] - public TimeUnit_t SpriteFramerate; - [NetworkName("m_flFrame")] - public TimeUnit_t Frame; - [NetworkName("m_flBrightnessTime")] - public TimeUnit_t BrightnessTime; - [NetworkName("m_nBrightness")] - public int Brightness; - [NetworkName("m_bWorldSpaceScale")] - public bool WorldSpaceScale; + [NetworkTable(Side = NetworkSide.Server)] + public static readonly NetworkProp[] ServerProps = [ + nameof(AttachedToEntity), + new(nameof(Attachment)) { Bits = 8 }, + new(nameof(ScaleTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpriteScale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(GlowProxySize)) { Bits = 6, Flags = PropFlags.RoundUp, Low = 0.0f, High = 64.0f }, + new(nameof(HDRColorScale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpriteFramerate)) { Encoding = NetEncoding.Float, Bits = 8, Flags = PropFlags.RoundUp, Low = 0, High = 60.0f }, + new(nameof(Frame)) { Encoding = NetEncoding.Float, Bits = 20, Flags = PropFlags.RoundDown, Low = 0, High = 256 }, + new(nameof(BrightnessTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale, Low = 0, High = 0 }, + new(nameof(Brightness)) { Bits = 8, Flags = PropFlags.Unsigned }, + nameof(WorldSpaceScale), + ]; + + [NetworkTable(Side = NetworkSide.Client)] + public static readonly NetworkProp[] ClientProps = [ + nameof(AttachedToEntity), + new(nameof(Attachment)) { Bits = 8 }, + new(nameof(ScaleTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpriteScale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SpriteFramerate)) { Encoding = NetEncoding.Float, Bits = 8, Flags = PropFlags.RoundUp, Low = 0, High = 60.0f }, + new(nameof(GlowProxySize)) { Bits = 6, Flags = PropFlags.RoundUp, Low = 0.0f, High = 64.0f }, + new(nameof(HDRColorScale)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(Frame)) { Encoding = NetEncoding.Float, Bits = 20, Flags = PropFlags.RoundDown, Low = 0, High = 256 }, + new(nameof(BrightnessTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale, Low = 0, High = 0 }, + new(nameof(Brightness)) { Bits = 8, Flags = PropFlags.Unsigned }, + nameof(WorldSpaceScale), + ]; + + public Sprite() { + AttachedToEntity = new(); + } + + [NetworkVar("m_hAttachedToEntity")] + public partial EHANDLE AttachedToEntity { get; set; } + [NetworkVar("m_nAttachment")] + public partial int Attachment { get; set; } + [NetworkVar("m_flScaleTime")] + public partial TimeUnit_t ScaleTime { get; set; } + // todo: RecvProxy_SpriteScale + [NetworkVar("m_flSpriteScale")] + public partial float SpriteScale { get; set; } + [NetworkVar("m_flSpriteFramerate")] + public partial TimeUnit_t SpriteFramerate { get; set; } + [NetworkVar("m_flGlowProxySize")] + public partial float GlowProxySize { get; set; } + [NetworkVar("m_flHDRColorScale")] + public partial float HDRColorScale { get; set; } + [NetworkVar("m_flFrame")] + public partial TimeUnit_t Frame { get; set; } + [NetworkVar("m_flBrightnessTime")] + public partial TimeUnit_t BrightnessTime { get; set; } + [NetworkVar("m_nBrightness")] + public partial int Brightness { get; set; } + [NetworkVar("m_bWorldSpaceScale")] + public partial bool WorldSpaceScale { get; set; } } [LinkEntityToClass("env_sprite_oriented")] [NetworkName("CSpriteOriented")] -public class SpriteOriented : Sprite +public partial class SpriteOriented : Sprite { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_SpriteOriented = new(DT_Sprite, [ -#if CLIENT_DLL - -#else + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + ]; -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_SpriteOriented); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_SpriteOriented); -#endif } #endif diff --git a/Game.Shared/SpriteTrail.cs b/Game.Shared/SpriteTrail.cs index ec5deed3..5138d3d3 100644 --- a/Game.Shared/SpriteTrail.cs +++ b/Game.Shared/SpriteTrail.cs @@ -3,59 +3,37 @@ using System.Numerics; namespace Game.Shared; -using FIELD = Source.FIELD; [LinkEntityToClass("env_spritetrail")] [NetworkName("CSpriteTrail")] -public class SpriteTrail : Sprite +public partial class SpriteTrail : Sprite { - public static readonly -#if CLIENT_DLL - RecvTable -#else - SendTable -#endif - DT_SpriteTrail = new(DT_Sprite, [ -#if CLIENT_DLL - RecvPropFloat(FIELD.OF(nameof(LifeTime))), - RecvPropFloat(FIELD.OF(nameof(StartWidth))), - RecvPropFloat(FIELD.OF(nameof(EndWidth))), - RecvPropFloat(FIELD.OF(nameof(StartWidthVariance))), - RecvPropFloat(FIELD.OF(nameof(TextureRes))), - RecvPropFloat(FIELD.OF(nameof(FadeLength))), - RecvPropVector(FIELD.OF(nameof(SkyboxOrigin))), - RecvPropFloat(FIELD.OF(nameof(SkyboxScale))), -#else - SendPropFloat(FIELD.OF(nameof(LifeTime)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(StartWidth)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(EndWidth)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(StartWidthVariance)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(TextureRes)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(FadeLength)), 0, PropFlags.NoScale), - SendPropVector(FIELD.OF(nameof(SkyboxOrigin)), 0, PropFlags.NoScale), - SendPropFloat(FIELD.OF(nameof(SkyboxScale)), 0, PropFlags.NoScale), -#endif - ]); -#if CLIENT_DLL - public static readonly new ClientClass ClientClass = new ClientClass(DT_SpriteTrail); -#else - public static readonly new ServerClass ServerClass = new ServerClass(DT_SpriteTrail); -#endif + [NetworkTable] + public static readonly new NetworkProp[] Props = [ + new(nameof(LifeTime)) { Encoding = NetEncoding.Float, Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartWidth)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(EndWidth)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(StartWidthVariance)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(TextureRes)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(FadeLength)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SkyboxOrigin)) { Bits = 0, Flags = PropFlags.NoScale }, + new(nameof(SkyboxScale)) { Bits = 0, Flags = PropFlags.NoScale }, + ]; - [NetworkName("m_flLifeTime")] - public TimeUnit_t LifeTime; - [NetworkName("m_flStartWidth")] - public float StartWidth; - [NetworkName("m_flEndWidth")] - public float EndWidth; - [NetworkName("m_flStartWidthVariance")] - public float StartWidthVariance; - [NetworkName("m_flTextureRes")] - public float TextureRes; - [NetworkName("m_flMinFadeLength")] - public float FadeLength; - [NetworkName("m_vecSkyboxOrigin")] - public Vector3 SkyboxOrigin; - [NetworkName("m_flSkyboxScale")] - public float SkyboxScale; + [NetworkVar("m_flLifeTime")] + public partial TimeUnit_t LifeTime { get; set; } + [NetworkVar("m_flStartWidth")] + public partial float StartWidth { get; set; } + [NetworkVar("m_flEndWidth")] + public partial float EndWidth { get; set; } + [NetworkVar("m_flStartWidthVariance")] + public partial float StartWidthVariance { get; set; } + [NetworkVar("m_flTextureRes")] + public partial float TextureRes { get; set; } + [NetworkVar("m_flMinFadeLength")] + public partial float FadeLength { get; set; } + [NetworkVar("m_vecSkyboxOrigin")] + public partial Vector3 SkyboxOrigin { get; set; } + [NetworkVar("m_flSkyboxScale")] + public partial float SkyboxScale { get; set; } } #endif diff --git a/Source.CodeAnalysis.NetworkClasses/NetworkClassRegistrationGenerator.cs b/Source.CodeAnalysis.NetworkClasses/NetworkClassRegistrationGenerator.cs deleted file mode 100644 index a204cf56..00000000 --- a/Source.CodeAnalysis.NetworkClasses/NetworkClassRegistrationGenerator.cs +++ /dev/null @@ -1,239 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Syntax; - -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Text; -using System.Threading; - -namespace Source.CodeAnalysis.NetworkClasses -{ - [Generator(LanguageNames.CSharp)] - public sealed class NetworkClassRegistrationGenerator : IIncrementalGenerator - { - const string ClientClassName = "Source.Common.ClientClass"; - const string ServerClassName = "Source.Common.ServerClass"; - const string NetworkNameAttributeName = "Source.Common.NetworkNameAttribute"; - const string FactoryAttributeName = "Source.Common.ImplementClientClassFactoryAttribute"; - const string ClientEntityName = "Source.Common.IClientEntity"; - - static readonly DiagnosticDescriptor DuplicateSite = new DiagnosticDescriptor( - "SDNNC001", "Duplicate network class site", - "Network class sites in {0} and {1} share the key {2}:{3}", - "NetworkClasses", DiagnosticSeverity.Error, true); - - static readonly DiagnosticDescriptor InaccessibleType = new DiagnosticDescriptor( - "SDNNC002", "Inaccessible network class type", - "{0} declares a network class but is not accessible from generated code", - "NetworkClasses", DiagnosticSeverity.Error, true); - - public void Initialize(IncrementalGeneratorInitializationContext context) { - IncrementalValuesProvider sites = context.SyntaxProvider.CreateSyntaxProvider( - static (node, _) => IsCandidate(node), - static (ctx, ct) => Transform(ctx, ct)) - .Where(static site => site != null) - .Select(static (site, _) => site!); - - context.RegisterSourceOutput(sites.Collect(), static (spc, items) => Emit(spc, items)); - } - - sealed class Site : System.IEquatable - { - public bool IsClient; - public string File = ""; - public int Line; - public string TypeName = ""; - public string FullyQualified = ""; - public string? NetworkName; - public string? Factory; - public bool Accessible; - - public bool Equals(Site? other) => other != null && IsClient == other.IsClient && File == other.File && Line == other.Line - && TypeName == other.TypeName && FullyQualified == other.FullyQualified && NetworkName == other.NetworkName - && Factory == other.Factory && Accessible == other.Accessible; - - public override bool Equals(object? obj) => Equals(obj as Site); - - public override int GetHashCode() => (FullyQualified.GetHashCode() * 397) ^ Line; - } - - static bool IsCandidate(SyntaxNode node) { - if (node is ImplicitObjectCreationExpressionSyntax) - return true; - - if (node is not ObjectCreationExpressionSyntax creation) - return false; - - string name = creation.Type switch { - IdentifierNameSyntax identifier => identifier.Identifier.ValueText, - QualifiedNameSyntax qualified => qualified.Right.Identifier.ValueText, - AliasQualifiedNameSyntax alias => alias.Name.Identifier.ValueText, - _ => "" - }; - - return IsNetworkClassName(name) || IsNetworkClassAlias(creation, name); - } - - static bool IsNetworkClassName(string name) => name == "ClientClass" || name == "ServerClass"; - - static bool IsNetworkClassAlias(SyntaxNode node, string name) { - if (name.Length == 0) - return false; - - foreach (SyntaxNode ancestor in node.Ancestors()) { - SyntaxList usings = ancestor switch { - CompilationUnitSyntax unit => unit.Usings, - BaseNamespaceDeclarationSyntax ns => ns.Usings, - _ => default - }; - - foreach (UsingDirectiveSyntax directive in usings) { - if (directive.Alias?.Name.Identifier.ValueText != name || directive.Name == null) - continue; - - string target = directive.Name switch { - QualifiedNameSyntax qualified => qualified.Right.Identifier.ValueText, - IdentifierNameSyntax identifier => identifier.Identifier.ValueText, - AliasQualifiedNameSyntax alias => alias.Name.Identifier.ValueText, - _ => "" - }; - return IsNetworkClassName(target); - } - } - return false; - } - - static string FileName(string path) { - int slash = path.LastIndexOfAny(new[] { '/', '\\' }); - return slash == -1 ? path : path.Substring(slash + 1); - } - - static Site? Transform(GeneratorSyntaxContext ctx, CancellationToken ct) { - BaseObjectCreationExpressionSyntax creation = (BaseObjectCreationExpressionSyntax)ctx.Node; - if (ctx.SemanticModel.GetSymbolInfo(creation, ct).Symbol is not IMethodSymbol constructor) - return null; - - string kind = constructor.ContainingType.ToDisplayString(); - bool isClient = kind == ClientClassName; - if (!isClient && kind != ServerClassName) - return null; - - ISymbol? enclosing = ctx.SemanticModel.GetEnclosingSymbol(creation.SpanStart, ct); - INamedTypeSymbol? owner = enclosing as INamedTypeSymbol ?? enclosing?.ContainingType; - if (owner == null) - return null; - - Compilation compilation = ctx.SemanticModel.Compilation; - - return new Site { - IsClient = isClient, - File = FileName(creation.SyntaxTree.FilePath), - Line = creation.GetLocation().GetLineSpan().StartLinePosition.Line + 1, - TypeName = owner.Name, - FullyQualified = owner.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), - NetworkName = GetNetworkName(owner), - Factory = isClient ? GetFactory(owner) : null, - Accessible = compilation.IsSymbolAccessibleWithin(owner, compilation.Assembly), - }; - } - - static string? GetNetworkName(INamedTypeSymbol owner) { - foreach (AttributeData attribute in owner.GetAttributes()) { - if (attribute.AttributeClass?.ToDisplayString() == NetworkNameAttributeName && attribute.ConstructorArguments.Length == 1) - return attribute.ConstructorArguments[0].Value as string; - } - return null; - } - - static string? GetFactory(INamedTypeSymbol owner) { - string fullyQualified = owner.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); - - foreach (IMethodSymbol method in owner.GetMembers().OfType()) { - if (method.IsStatic && method.GetAttributes().Any(a => a.AttributeClass?.ToDisplayString() == FactoryAttributeName)) - return $"{fullyQualified}.{method.Name}"; - } - - if (owner.IsAbstract || owner.IsGenericType) - return null; - - if (!owner.AllInterfaces.Any(i => i.ToDisplayString() == ClientEntityName)) - return null; - - if (!owner.InstanceConstructors.Any(c => c.DeclaredAccessibility == Accessibility.Public && c.Parameters.Length == 0)) - return null; - - if (!HasInit(owner)) - return null; - - return $"static (entNum, serialNum) => {{ {fullyQualified} entity = new {fullyQualified}(); return entity.Init(entNum, serialNum) ? entity : null!; }}"; - } - - static bool HasInit(INamedTypeSymbol owner) { - for (INamedTypeSymbol? type = owner; type != null; type = type.BaseType) { - foreach (IMethodSymbol method in type.GetMembers("Init").OfType()) { - if (!method.IsStatic && method.DeclaredAccessibility == Accessibility.Public - && method.ReturnType.SpecialType == SpecialType.System_Boolean && method.Parameters.Length == 2 - && method.Parameters[0].Type.SpecialType == SpecialType.System_Int32 - && method.Parameters[1].Type.SpecialType == SpecialType.System_Int32) - return true; - } - } - return false; - } - - static string Literal(string? value) => value == null ? "null" : SymbolDisplay.FormatLiteral(value, true); - - static void Emit(SourceProductionContext spc, ImmutableArray items) { - if (items.IsEmpty) - return; - - List sorted = items.OrderBy(s => s.IsClient ? 0 : 1).ThenBy(s => s.File, System.StringComparer.Ordinal).ThenBy(s => s.Line).ToList(); - - bool failed = false; - Dictionary<(bool, string, int), Site> seen = new Dictionary<(bool, string, int), Site>(); - foreach (Site site in sorted) { - if (!site.Accessible) { - spc.ReportDiagnostic(Diagnostic.Create(InaccessibleType, Location.None, site.FullyQualified)); - failed = true; - } - - if (seen.TryGetValue((site.IsClient, site.File, site.Line), out Site? existing)) { - spc.ReportDiagnostic(Diagnostic.Create(DuplicateSite, Location.None, existing.FullyQualified, site.FullyQualified, site.File, site.Line)); - failed = true; - } - else - seen.Add((site.IsClient, site.File, site.Line), site); - } - - if (failed) - return; - - StringBuilder sb = new StringBuilder(); - sb.AppendLine("// "); - sb.AppendLine("#nullable enable"); - sb.AppendLine("#pragma warning disable CA2255"); - sb.AppendLine("namespace Source.Generated"); - sb.AppendLine("{"); - sb.AppendLine("\tinternal static class NetworkClassRegistration"); - sb.AppendLine("\t{"); - sb.AppendLine("\t\t[global::System.Runtime.CompilerServices.ModuleInitializer]"); - sb.AppendLine("\t\tinternal static void Register()"); - sb.AppendLine("\t\t{"); - - foreach (Site site in sorted) { - if (site.IsClient) - sb.Append($"\t\t\tglobal::Source.Common.ClientClass.RegisterSite({Literal(site.File)}, {site.Line}, {Literal(site.TypeName)}, {Literal(site.NetworkName)}, {site.Factory ?? "null"});\n"); - else - sb.Append($"\t\t\tglobal::Source.Common.ServerClass.RegisterSite({Literal(site.File)}, {site.Line}, {Literal(site.TypeName)}, {Literal(site.NetworkName)});\n"); - } - - sb.AppendLine("\t\t}"); - sb.AppendLine("\t}"); - sb.AppendLine("}"); - - spc.AddSource("NetworkClassRegistration.g.cs", sb.ToString()); - } - } -} diff --git a/Source.CodeAnalysis.NetworkClasses/Source.CodeAnalysis.NetworkClasses.csproj b/Source.CodeAnalysis.NetworkClasses/Source.CodeAnalysis.NetworkClasses.csproj deleted file mode 100644 index 5fe2175b..00000000 --- a/Source.CodeAnalysis.NetworkClasses/Source.CodeAnalysis.NetworkClasses.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - netstandard2.0 - false - true - true - latest - enable - false - Debug;Release;Debug (Dedicated);Release (Dedicated) - - - - - - - - diff --git a/Source.CodeAnalysis.NetworkVars/NetworkVarGenerator.FieldAccessors.cs b/Source.CodeAnalysis.NetworkVars/NetworkVarGenerator.FieldAccessors.cs index e22287af..1edb83ab 100644 --- a/Source.CodeAnalysis.NetworkVars/NetworkVarGenerator.FieldAccessors.cs +++ b/Source.CodeAnalysis.NetworkVars/NetworkVarGenerator.FieldAccessors.cs @@ -37,7 +37,7 @@ private enum ContainerKind List } - private static void InitializeFieldAccessors(IncrementalGeneratorInitializationContext context, IncrementalValueProvider> properties) { + private static void InitializeFieldAccessors(IncrementalGeneratorInitializationContext context, IncrementalValueProvider> properties, IncrementalValueProvider> tables) { IncrementalValueProvider> accessors = context.SyntaxProvider .CreateSyntaxProvider( predicate: static (node, _) => IsInvocationNamed(node, FieldMethods), @@ -59,8 +59,8 @@ private static void InitializeFieldAccessors(IncrementalGeneratorInitializationC .Where(static m => m != null) .Collect(); - context.RegisterSourceOutput(accessors.Combine(conversions).Combine(properties).Combine(predictionMaps), - static (spc, data) => EmitFieldAccessors(spc, data.Left.Left.Left, data.Left.Left.Right, data.Left.Right, data.Right)); + context.RegisterSourceOutput(accessors.Combine(conversions).Combine(properties).Combine(predictionMaps).Combine(tables), + static (spc, data) => EmitFieldAccessors(spc, data.Left.Left.Left.Left, data.Left.Left.Left.Right, data.Left.Left.Right, data.Left.Right, data.Right)); } private static bool IsInvocationNamed(SyntaxNode node, HashSet names) { @@ -329,9 +329,8 @@ private static bool IsInvocationNamed(SyntaxNode node, HashSet names) { } private static IPropertySymbol? FindNetworkVarProperty(ITypeSymbol type, string backingName) { - if (!backingName.StartsWith("__nv_", StringComparison.Ordinal)) - return null; - return FindMember(type, backingName.Substring(5)) is IPropertySymbol prop && HasAttribute(prop, AttributeMetadataName) ? prop : null; + string name = backingName.StartsWith("__nv_", StringComparison.Ordinal) ? backingName.Substring(5) : backingName; + return FindMember(type, name) is IPropertySymbol prop && HasAttribute(prop, AttributeMetadataName) ? prop : null; } private static IFieldSymbol? FindDataMapField(ITypeSymbol type, string name) { @@ -533,6 +532,10 @@ private static bool HasAttribute(ISymbol symbol, string attributeName) => symbol.GetAttributes().Any(a => a.AttributeClass?.ToDisplayString() == attributeName); private static string? GetNetworkNameAttribute(ISymbol symbol) { + AttributeData? networkVar = symbol.GetAttributes().FirstOrDefault(a => a.AttributeClass?.ToDisplayString() == AttributeMetadataName); + if (networkVar != null && networkVar.ConstructorArguments.Length == 1 && networkVar.ConstructorArguments[0].Value is string networkVarName) + return networkVarName; + AttributeData? attribute = symbol.GetAttributes().FirstOrDefault(a => a.AttributeClass?.ToDisplayString() == NetworkNameAttributeName); if (attribute == null || attribute.ConstructorArguments.Length != 1) return null; @@ -550,7 +553,15 @@ private static string FieldKey(string kind, ResolvedPath path, INamedTypeSymbol private static string EscapeFormat(string value) => value.Replace("{", "{{").Replace("}", "}}"); - private static void EmitFieldAccessors(SourceProductionContext spc, ImmutableArray models, ImmutableArray valueConversions, ImmutableArray properties, ImmutableArray predictionMaps) { + private static void EmitFieldAccessors(SourceProductionContext spc, ImmutableArray models, ImmutableArray valueConversions, ImmutableArray properties, ImmutableArray predictionMaps, ImmutableArray tables) { + foreach (TableModel? table in tables) { + if (table == null) + continue; + models = models.AddRange(table.Accessors); + if (table.Map != null) + predictionMaps = predictionMaps.Add(table.Map); + } + var unique = new SortedDictionary(StringComparer.Ordinal); var conversions = new SortedSet(StringComparer.Ordinal); diff --git a/Source.CodeAnalysis.NetworkVars/NetworkVarGenerator.Tables.cs b/Source.CodeAnalysis.NetworkVars/NetworkVarGenerator.Tables.cs new file mode 100644 index 00000000..6ffb2222 --- /dev/null +++ b/Source.CodeAnalysis.NetworkVars/NetworkVarGenerator.Tables.cs @@ -0,0 +1,962 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Text; + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading; + +namespace Source.CodeAnalysis.NetworkVars +{ + public sealed partial class NetworkVarGenerator + { + private const string FactoryAttributeName = "Source.Common.ImplementClientClassFactoryAttribute"; + private const string TableAttributeName = "Source.Common.NetworkTableAttribute"; + private const string PredictionTableAttributeName = "Source.Common.PredictionTableAttribute"; + + private static readonly DiagnosticDescriptor MissingNetworkVar = new DiagnosticDescriptor( + id: "NETVAR013", + title: "Table references a variable without [NetworkVar]", + messageFormat: "'{0}' is referenced by a network table but has no [NetworkVar(\"m_name\")]", + category: "NetworkVars", + defaultSeverity: DiagnosticSeverity.Error, + isEnabledByDefault: true); + + private static readonly DiagnosticDescriptor InvalidListEntry = new DiagnosticDescriptor( + id: "NETVAR014", + title: "Invalid table entry", + messageFormat: "Entry '{0}' in '{1}' does not name a member, table or table list", + category: "NetworkVars", + defaultSeverity: DiagnosticSeverity.Error, + isEnabledByDefault: true); + + private static readonly DiagnosticDescriptor ProxyNotSupported = new DiagnosticDescriptor( + id: "NETVAR011", + title: "Encoding does not take a proxy", + messageFormat: "'{0}' uses encoding '{1}', which does not accept a custom proxy", + category: "NetworkVars", + defaultSeverity: DiagnosticSeverity.Error, + isEnabledByDefault: true); + + private static readonly DiagnosticDescriptor UnsupportedEncoding = new DiagnosticDescriptor( + id: "NETVAR006", + title: "Cannot infer the network encoding", + messageFormat: "'{0}' has type '{1}', which has no default network encoding; set Encoding on its table entry", + category: "NetworkVars", + defaultSeverity: DiagnosticSeverity.Error, + isEnabledByDefault: true); + + private static readonly DiagnosticDescriptor UnsupportedPredicted = new DiagnosticDescriptor( + id: "NETVAR007", + title: "Cannot infer the prediction field type", + messageFormat: "'{0}' has type '{1}', which has no default prediction field type; set Type on its prediction entry", + category: "NetworkVars", + defaultSeverity: DiagnosticSeverity.Error, + isEnabledByDefault: true); + + private static readonly DiagnosticDescriptor MissingBaseTable = new DiagnosticDescriptor( + id: "NETVAR008", + title: "Network class has no networked base class", + messageFormat: "'{0}' has no base class with [NetworkName], so its table has no parent", + category: "NetworkVars", + defaultSeverity: DiagnosticSeverity.Error, + isEnabledByDefault: true); + + private static IncrementalValueProvider> InitializeTables(IncrementalGeneratorInitializationContext context) { + IncrementalValueProvider> entityTables = context.SyntaxProvider + .ForAttributeWithMetadataName( + NetworkNameAttributeName, + predicate: static (node, _) => node is ClassDeclarationSyntax, + transform: static (ctx, ct) => GetTableModel(ctx, ct)) + .Where(static m => m != null) + .Collect(); + IncrementalValueProvider> plainTables = context.SyntaxProvider + .ForAttributeWithMetadataName( + TableAttributeName, + predicate: static (node, _) => node is VariableDeclaratorSyntax, + transform: static (ctx, ct) => GetListTableModel(ctx, ct)) + .Where(static m => m != null) + .Collect(); + IncrementalValueProvider> tables = entityTables.Combine(plainTables).Select(static (pair, _) => pair.Left.AddRange(pair.Right)); + + context.RegisterSourceOutput(tables, static (spc, models) => EmitTables(spc, models)); + return tables; + } + + private static void EmitTables(SourceProductionContext spc, ImmutableArray models) { + foreach (TableModel? model in models) { + if (model == null) + continue; + foreach (TableDiagnostic diagnostic in model.Diagnostics) + spc.ReportDiagnostic(Diagnostic.Create(diagnostic.Descriptor, diagnostic.Location, diagnostic.Args)); + if (model.Source.Length != 0) + spc.AddSource(model.HintName, SourceText.From(model.Source, Encoding.UTF8)); + } + } + + private static TableModel? GetTableModel(GeneratorAttributeSyntaxContext ctx, CancellationToken ct) { + if (!(ctx.TargetSymbol is INamedTypeSymbol type) || type.ContainingType != null || type.IsGenericType) + return null; + if (ctx.Attributes.Length == 0 || ctx.Attributes[0].ConstructorArguments.Length != 1 || !(ctx.Attributes[0].ConstructorArguments[0].Value is string networkName) || networkName.Length < 2) + return null; + + bool isClient = ctx.TargetNode.SyntaxTree.Options.PreprocessorSymbolNames.Contains("CLIENT_DLL"); + bool isEntity = type.AllInterfaces.Any(i => i.Name == (isClient ? "IClientEntity" : "IServerEntity") && i.ContainingNamespace.ToDisplayString() == "Source.Common"); + bool isTempEntity = !isEntity && InheritsFrom(type, isClient ? "Game.Client.C_BaseTempEntity" : "Game.Server.BaseTempEntity"); + if (!isEntity && !isTempEntity) + return null; + + string className = isClient ? "ClientClass" : "ServerClass"; + if (type.GetMembers(className).Any(m => !m.IsImplicitlyDeclared)) + return null; + + string tableName = NamedValue(ctx.Attributes[0], "Table") as string ?? "DT_" + networkName.Substring(1); + if (type.GetMembers(tableName).Any(m => !m.IsImplicitlyDeclared)) + return null; + + return BuildTable(ctx.SemanticModel.Compilation, type, isClient, networkName, tableName, isEntity, isTempEntity, false, + NamedValue(ctx.Attributes[0], "NoBase") is bool nb && nb, ct); + } + + private static TableModel? GetListTableModel(GeneratorAttributeSyntaxContext ctx, CancellationToken ct) { + if (!(ctx.TargetSymbol is IFieldSymbol field) || !(field.ContainingType is INamedTypeSymbol type) || type.ContainingType != null || type.IsGenericType) + return null; + if (GetClassTableName(type) != null) + return null; + List lists = ListFields(type, TableAttributeName); + if (lists.Count == 0 || !SymbolEqualityComparer.Default.Equals(lists[0], field)) + return null; + bool isClient = ctx.TargetNode.SyntaxTree.Options.PreprocessorSymbolNames.Contains("CLIENT_DLL"); + return BuildTable(ctx.SemanticModel.Compilation, type, isClient, null, ListTableName(field, field.Name), false, false, true, true, ct); + } + + private static TableModel? BuildTable(Compilation compilation, INamedTypeSymbol type, bool isClient, string? networkName, string tableName, + bool isEntity, bool isTempEntity, bool plain, bool noBase, CancellationToken ct) { + string typeDisplay = Display(type); + var diagnostics = new List(); + var accessors = new List(); + + List tableLists = ListFields(type, TableAttributeName); + List predictionLists = ListFields(type, PredictionTableAttributeName); + foreach (IFieldSymbol listField in tableLists) { + AttributeData? listAttr = listField.GetAttributes().FirstOrDefault(a => a.AttributeClass?.ToDisplayString() == TableAttributeName); + if (listAttr != null && SideMatches(listAttr, isClient) && ListTableName(listField, tableName) == tableName && NamedValue(listAttr, "NoBase") is bool listNoBase && listNoBase) + noBase = true; + } + INamedTypeSymbol? baseType = plain ? null : type.BaseType; + string? baseTableName = null; + for (; baseType != null; baseType = baseType.BaseType) { + baseTableName = GetClassTableName(baseType); + if (baseTableName != null) + break; + } + if (!noBase && (baseType == null || baseTableName == null)) { + diagnostics.Add(new TableDiagnostic(MissingBaseTable, type.Locations.FirstOrDefault(), type.Name)); + return new TableModel("", "", accessors, null, diagnostics); + } + string baseDisplay = baseType == null ? "" : Display(baseType); + + string indentProps = (type.ContainingNamespace.IsGlobalNamespace ? "" : "\t") + "\t\t"; + var subTables = new List(); + var props = new Dictionary>(StringComparer.Ordinal) { [""] = new List() }; + var predicted = new List(); + var entries = new List(); + var embeddedMaps = new List(); + + string? BuildNamedProp(string name, PropSettings settings) { + string? encoding = SettingEnum(settings, "Encoding"); + string? proxy = ProxyMethod(SettingValue(settings, "Proxy") as ITypeSymbol, isClient); + if (encoding == "Array2" && SettingValue(settings, "Count") is int arrayCount) + return (isClient ? "global::Source.Common.RecvPropHelpers.RecvPropArray2(" : "global::Source.Common.SendPropHelpers.SendPropArray2(") + + (proxy ?? "null") + ", " + arrayCount.ToString(CultureInfo.InvariantCulture) + ", " + Literal(name) + ")"; + if (encoding != "Int") + return null; + if (isClient) + return "global::Source.Common.RecvPropHelpers.RecvPropInt(" + Literal(name) + (proxy == null ? "" : ", proxyFn: " + proxy) + ")"; + string? flags = SettingFlags(settings, "Flags", "global::Source.Common.PropFlags"); + return "global::Source.Common.SendPropHelpers.SendPropInt(" + Literal(name) + + (SettingValue(settings, "Bits") is int bits ? ", bits: " + bits.ToString(CultureInfo.InvariantCulture) : "") + + (flags == null ? "" : ", flags: " + flags) + + (proxy == null ? "" : ", proxyFn: " + proxy) + ", sizeOfVar: 4)"; + } + + string? BuildMemberProp(string memberPath, ITypeSymbol memberType, PropSettings settings, Location location) { + string? encoding = SettingEnum(settings, "Encoding"); + ContainerKind container = GetContainer(compilation, memberType, out ITypeSymbol? element, out _); + string fieldExpression = SettingValue(settings, "Name") is string propNameOverride + ? "global::Source.FIELD<" + typeDisplay + ">.OF_NAMED(" + Literal(memberPath) + ", " + Literal(propNameOverride) + ")" + : "global::Source.FIELD<" + typeDisplay + ">.OF(" + Literal(memberPath) + ")"; + + if (encoding == "DataTable") { + FieldAccessorModel? dtAccessor = BuildScalar(compilation, type, memberPath, SettingValue(settings, "Name") as string, new AccessFailure()); + if (dtAccessor != null) + accessors.Add(dtAccessor); + string? tableMember = SettingValue(settings, "DataTable") as string; + string netName = SettingValue(settings, "Name") as string ?? GetNetworkNameAttribute(LastMember(type, memberPath) ?? type) ?? memberPath; + if (tableMember == null) { + diagnostics.Add(new TableDiagnostic(UnsupportedEncoding, location, memberPath, memberType.ToDisplayString())); + return null; + } + string table = Display(memberType) + "." + tableMember; + string? dtProxy = ProxyMethod(SettingValue(settings, "Proxy") as ITypeSymbol, isClient); + if (isClient) + return "global::Source.Common.RecvPropHelpers.RecvPropDataTable(" + Literal(netName) + ", " + fieldExpression + ", " + table + + ", proxyFn: " + (dtProxy ?? "global::Source.Common.RecvPropHelpers.DataTableRecvProxy_PointerDataTable") + ")"; + return "global::Source.Common.SendPropHelpers.SendPropDataTable(" + Literal(netName) + ", " + fieldExpression + ", " + table + (dtProxy == null ? "" : ", proxyFn: " + dtProxy) + ")"; + } + + if (encoding == "List") { + GetContainer(compilation, memberType, out ITypeSymbol? listElement, out _); + object? countValue = SettingValue(settings, "Count"); + if (listElement == null || !(countValue is int listCount)) { + diagnostics.Add(new TableDiagnostic(UnsupportedEncoding, location, memberPath, memberType.ToDisplayString())); + return null; + } + string listNetName = GetNetworkNameAttribute(LastMember(type, memberPath) ?? type) ?? memberPath; + string? elementTable = SettingValue(settings, "DataTable") as string; + string elementProp; + if (elementTable != null) + elementProp = (isClient ? "global::Source.Common.RecvPropHelpers.RecvPropDataTable(null!, " : "global::Source.Common.SendPropHelpers.SendPropDataTable(null, ") + + Display(listElement) + "." + elementTable + ")"; + else { + string? listElementProp = BuildProp(isClient, settings, listElement, "null!", out _, out _, InferEncoding(listElement)); + if (listElementProp == null) { + diagnostics.Add(new TableDiagnostic(UnsupportedEncoding, location, memberPath, listElement.ToDisplayString())); + return null; + } + elementProp = listElementProp; + } + string count = listCount.ToString(CultureInfo.InvariantCulture); + string elementDisplay = Display(listElement); + if (!isClient) { + FieldAccessorModel? listScalar = BuildScalar(compilation, type, memberPath, SettingValue(settings, "Name") as string, new AccessFailure()); + if (listScalar != null) + accessors.Add(listScalar); + return "global::Source.Common.SendPropHelpers.SendPropList<" + elementDisplay + ">(" + fieldExpression + ", " + count + ", " + elementProp + ")"; + } + FieldAccessorModel? listArray = BuildArray(compilation, type, memberPath, true, new AccessFailure()); + if (listArray != null) + accessors.Add(listArray); + string? resize = SettingValue(settings, "Proxy") is ITypeSymbol listProxy && listProxy.GetMembers("Resize").Any(m => m is IMethodSymbol { IsStatic: true }) + ? Display(listProxy) + ".Resize" : null; + if (resize == null) { + diagnostics.Add(new TableDiagnostic(UnsupportedEncoding, location, memberPath, memberType.ToDisplayString())); + return null; + } + return "global::Source.Common.RecvPropHelpers.RecvPropList<" + elementDisplay + ">(global::Source.FIELD<" + typeDisplay + ">.OF_LIST(" + Literal(memberPath) + ", " + count + "), " + + resize + ", " + elementProp + ")"; + } + + if (encoding == "PredictableId" || encoding == "GModTable") { + FieldAccessorModel? specialAccessor = BuildScalar(compilation, type, memberPath, SettingValue(settings, "Name") as string, new AccessFailure()); + if (specialAccessor != null) + accessors.Add(specialAccessor); + if (encoding == "PredictableId") + return isClient ? "global::Game.Client.RecvProxy.RecvPropPredictableId(" + fieldExpression + ")" : "global::Game.Server.SendProxy.SendPropPredictableId(" + fieldExpression + ")"; + return isClient ? "global::Source.Common.RecvPropHelpers.RecvPropGModTable(" + fieldExpression + ")" : "global::Source.Common.SendPropHelpers.SendPropGModTable(" + fieldExpression + ")"; + } + + if (encoding == "VectorElements" || encoding == "Array2" || encoding == "Elements" || encoding == "Array") { + FieldAccessorModel? elementsAccessor = BuildArray(compilation, type, memberPath, false, new AccessFailure()); + if (elementsAccessor != null) + accessors.Add(elementsAccessor); + GetContainer(compilation, memberType, out ITypeSymbol? elementType, out int length); + if (elementType == null) { + diagnostics.Add(new TableDiagnostic(UnsupportedEncoding, location, memberPath, memberType.ToDisplayString())); + return null; + } + string? elementEncoding = encoding == "VectorElements" && memberType.OriginalDefinition.ToDisplayString() == "Source.Common.Mathematics.QAngle" ? "Angle" : InferEncoding(elementType); + var parts = new List(); + int count = encoding == "VectorElements" ? (SettingValue(settings, "Count") is int vectorCount && vectorCount > 0 ? vectorCount : 3) : encoding == "Elements" ? (SettingValue(settings, "Count") is int elementCount && elementCount > 0 ? elementCount : length) : 1; + for (int i = 0; i < count; i++) { + string elementField = encoding == "VectorElements" + ? "global::Source.FIELD<" + typeDisplay + ">.OF_VECTORELEM(" + Literal(memberPath) + ", " + i.ToString(CultureInfo.InvariantCulture) + ")" + : encoding == "Elements" + ? "global::Source.FIELD<" + typeDisplay + ">.OF_ARRAYINDEX(" + Literal(memberPath) + ", " + i.ToString(CultureInfo.InvariantCulture) + ")" + : isClient + ? "global::Source.FIELD<" + typeDisplay + ">.OF_ARRAYINDEX(" + Literal(memberPath) + ", 0)" + : "global::Source.FIELD<" + typeDisplay + ">.OF_SENDINFO_ARRAY(" + Literal(memberPath) + ")"; + string? part = BuildProp(isClient, settings, elementType, elementField, out bool partProxyUnsupported, out string partEncoding, elementEncoding); + if (partProxyUnsupported) { + diagnostics.Add(new TableDiagnostic(ProxyNotSupported, location, memberPath, partEncoding)); + return null; + } + if (part == null) { + diagnostics.Add(new TableDiagnostic(UnsupportedEncoding, location, memberPath, elementType.ToDisplayString())); + return null; + } + parts.Add(part); + } + if (encoding == "Array") + parts.Add((isClient ? "global::Source.Common.RecvPropHelpers.RecvPropArray(" : "global::Source.Common.SendPropHelpers.SendPropArray(") + + "global::Source.FIELD<" + typeDisplay + ">.OF_ARRAY(" + Literal(memberPath) + "))"); + if (encoding == "Array2") { + string arrayName = GetNetworkNameAttribute(LastMember(type, memberPath) ?? type) ?? memberPath; + parts.Add((isClient ? "global::Source.Common.RecvPropHelpers.RecvPropArray2(" : "global::Source.Common.SendPropHelpers.SendPropArray2(") + + "null, " + length.ToString(CultureInfo.InvariantCulture) + ", " + Literal(arrayName) + ")"); + } + return string.Join(",\n" + indentProps, parts); + } + + bool isArray = (container == ContainerKind.InlineArray || container == ContainerKind.NetworkArray) && element != null && (encoding ?? InferEncoding(memberType)) != "String"; + if (isArray) { + FieldAccessorModel? arrayAccessor = BuildArray(compilation, type, memberPath, false, new AccessFailure()); + if (arrayAccessor != null) + accessors.Add(arrayAccessor); + string arrayExpression = "global::Source.FIELD<" + typeDisplay + ">.OF_ARRAY(" + Literal(memberPath) + ")"; + string elementExpression = "global::Source.FIELD<" + typeDisplay + ">.OF_ARRAYINDEX(" + Literal(memberPath) + ", 0)"; + string? elementProp = BuildProp(isClient, settings, element!, elementExpression, out bool elementProxyUnsupported, out string elementEncoding); + if (elementProxyUnsupported) { + diagnostics.Add(new TableDiagnostic(ProxyNotSupported, location, memberPath, elementEncoding)); + return null; + } + if (elementProp == null) { + diagnostics.Add(new TableDiagnostic(UnsupportedEncoding, location, memberPath, element!.ToDisplayString())); + return null; + } + return isClient + ? "global::Source.Common.RecvPropHelpers.RecvPropArray3(" + arrayExpression + ", " + elementProp + ")" + : "global::Source.Common.SendPropHelpers.SendPropArray3(" + arrayExpression + ", " + elementProp + ")"; + } + + FieldAccessorModel? accessor = BuildScalar(compilation, type, memberPath, SettingValue(settings, "Name") as string, new AccessFailure()); + if (accessor != null) + accessors.Add(accessor); + string? prop = BuildProp(isClient, settings, memberType, fieldExpression, out bool proxyUnsupported, out string encodingName); + if (proxyUnsupported) + diagnostics.Add(new TableDiagnostic(ProxyNotSupported, location, memberPath, encodingName)); + else if (prop == null) + diagnostics.Add(new TableDiagnostic(UnsupportedEncoding, location, memberPath, memberType.ToDisplayString())); + return prop; + } + + foreach (IFieldSymbol listField in tableLists) { + AttributeData? listAttr = listField.GetAttributes().FirstOrDefault(a => a.AttributeClass?.ToDisplayString() == TableAttributeName); + if (listAttr == null || !SideMatches(listAttr, isClient)) + continue; + string listTable = ListTableName(listField, tableName); + if (listTable == tableName) + listTable = ""; + if (!props.TryGetValue(listTable, out List? target)) { + target = new List(); + props[listTable] = target; + subTables.Add(listTable); + } + + foreach (ListEntry entry in ParseList(compilation, type, listField, ct)) { + if (!EntrySideMatches(entry.Settings, isClient)) + continue; + + if (SettingValue(entry.Settings, "Exclude") is bool exclude && exclude) { + string? excludeTable = SettingValue(entry.Settings, "DataTable") as string ?? (entry.Symbol == null ? null : GetClassTableName(entry.Symbol.ContainingType)); + string? excludeProp = SettingValue(entry.Settings, "Name") as string ?? (entry.Symbol == null ? entry.Path : GetNetworkNameAttribute(entry.Symbol)); + if (excludeTable == null || excludeProp == null) + diagnostics.Add(new TableDiagnostic(InvalidListEntry, entry.Location, entry.Path, listField.Name)); + else if (!isClient) + target.Add("global::Source.Common.SendPropHelpers.SendPropExclude(" + Literal(excludeTable) + ", " + Literal(excludeProp) + ")"); + continue; + } + + if (entry.Symbol == null) { + string? namedProp = BuildNamedProp(entry.Path, entry.Settings); + if (namedProp == null) + diagnostics.Add(new TableDiagnostic(InvalidListEntry, entry.Location, entry.Path, listField.Name)); + else + target.Add(namedProp); + continue; + } + + if (entry.Symbol is IFieldSymbol tableField && tableField.IsStatic && IsTableField(tableField)) { + string refTable = HasAttribute(tableField, TableAttributeName) + ? ListTableName(tableField, GetClassTableName(tableField.ContainingType) ?? tableField.Name) + : tableField.Name; + string tableExpression = SymbolEqualityComparer.Default.Equals(tableField.ContainingType, type) ? refTable : Display(tableField.ContainingType) + "." + refTable; + string propName = SettingValue(entry.Settings, "Name") as string ?? (refTable.StartsWith("DT_", StringComparison.Ordinal) ? refTable.Substring(3) : refTable); + string? dtProxy = ProxyMethod(SettingValue(entry.Settings, "Proxy") as ITypeSymbol, isClient); + target.Add((isClient ? "global::Source.Common.RecvPropHelpers.RecvPropDataTable(" : "global::Source.Common.SendPropHelpers.SendPropDataTable(") + + Literal(propName) + (isClient ? ", " : ", 0, ") + tableExpression + (dtProxy == null ? "" : ", proxyFn: " + dtProxy) + ")"); + continue; + } + + string? memberNetworkName = GetNetworkNameAttribute(entry.Symbol); + if (!HasAttribute(entry.Symbol, AttributeMetadataName) || memberNetworkName == null) { + diagnostics.Add(new TableDiagnostic(MissingNetworkVar, entry.Location, entry.Path)); + continue; + } + + ITypeSymbol entryType = entry.Symbol is IFieldSymbol ef ? ef.Type : ((IPropertySymbol)entry.Symbol).Type; + string? code = BuildMemberProp(entry.Path, entryType, entry.Settings, entry.Location); + if (code != null) + target.Add(code); + } + } + + if (isClient) { + var clientNetworked = new HashSet(SymbolEqualityComparer.Default); + if (predictionLists.Count > 0) { + for (INamedTypeSymbol? chain = type; chain != null; chain = chain.BaseType) { + foreach (IFieldSymbol chainList in ListFields(chain, TableAttributeName)) { + AttributeData? chainAttr = chainList.GetAttributes().FirstOrDefault(a => a.AttributeClass?.ToDisplayString() == TableAttributeName); + if (chainAttr == null || !SideMatches(chainAttr, true)) + continue; + foreach (ListEntry chainEntry in ParseList(compilation, chain, chainList, ct)) { + if (!EntrySideMatches(chainEntry.Settings, true) || (SettingValue(chainEntry.Settings, "Exclude") is bool chainExclude && chainExclude)) + continue; + if (chainEntry.Symbol is IPropertySymbol || (chainEntry.Symbol is IFieldSymbol chainField && !chainField.IsStatic)) + clientNetworked.Add(chainEntry.Symbol.OriginalDefinition); + } + } + if (HasNoBaseTable(chain)) + break; + } + } + + foreach (var (listField, entry) in predictionLists.SelectMany(list => ParseList(compilation, type, list, ct).Select(entry => (list, entry)))) { + if (!(entry.Symbol is IFieldSymbol) && !(entry.Symbol is IPropertySymbol)) { + diagnostics.Add(new TableDiagnostic(InvalidListEntry, entry.Location, entry.Path, listField.Name)); + continue; + } + ISymbol member = entry.Symbol!; + ITypeSymbol memberType = member is IFieldSymbol pf ? pf.Type : ((IPropertySymbol)member).Type; + if (SettingValue(entry.Settings, "Embedded") is bool embedded && embedded) { + FieldAccessorModel? embeddedAccessor = BuildScalar(compilation, member.ContainingType, member.Name, null, new AccessFailure()); + if (embeddedAccessor != null) + accessors.Add(embeddedAccessor); + predicted.Add(PredictionDescription("Embedded", member, "1", "global::Source.Common.FieldTypeDescFlags.Save", Display(memberType) + ".PredMap", "0")); + entries.Add("E"); + embeddedMaps.Add(memberType.ToDisplayString() + ".PredMap"); + continue; + } + + ContainerKind predContainer = GetContainer(compilation, memberType, out ITypeSymbol? predElement, out int predLength); + bool predArray = (predContainer == ContainerKind.InlineArray || predContainer == ContainerKind.NetworkArray) + && predElement != null && predElement.SpecialType != SpecialType.System_Char && predLength > 0; + string? fieldType = SettingEnum(entry.Settings, "Type") ?? InferFieldType(predArray ? predElement! : memberType); + if (fieldType == null) { + diagnostics.Add(new TableDiagnostic(UnsupportedPredicted, entry.Location, entry.Path, memberType.ToDisplayString())); + continue; + } + + INamedTypeSymbol declaring = member.ContainingType; + FieldAccessorModel? predAccessor = BuildScalar(compilation, declaring, member.Name, null, new AccessFailure()); + if (predAccessor != null) + accessors.Add(predAccessor); + + bool hasFlags = entry.Settings.Values.ContainsKey("Flags"); + object? tolerance = SettingValue(entry.Settings, "Tolerance"); + string? flagsText = SettingFlags(entry.Settings, "Flags", "global::Source.Common.FieldTypeDescFlags"); + if (!hasFlags && clientNetworked.Contains(member.OriginalDefinition)) { + hasFlags = true; + flagsText = "(global::Source.Common.FieldTypeDescFlags)256"; + } + string flags = flagsText ?? (predArray || tolerance is float ? "0" : "global::Source.Common.FieldTypeDescFlags.Save"); + predicted.Add(PredictionDescription(fieldType, member, (predArray ? predLength : 1).ToString(CultureInfo.InvariantCulture), flags, "null", + tolerance is float tol ? tol.ToString("R", CultureInfo.InvariantCulture) + "f" : "0")); + + string entryType = fieldType == "Byte" ? "Character" : fieldType; + ResolvedPath? path = Resolve(compilation, declaring, member.Name, new AccessFailure()); + if (IsNoOpFieldType(entryType)) + entries.Add("N"); + else if (predArray && path != null && PredictionElementType(entryType) != null) + entries.Add("F|" + entryType + "|S|" + Display(declaring) + "|" + member.Name + "|\0|" + Display(path.Type) + + (predContainer == ContainerKind.NetworkArray ? "|1|" + Display(predElement!) : "|0|")); + else if (path == null || PredictionElementType(entryType) == null || GetContainer(compilation, path.Type, out _, out _) != ContainerKind.None) + entries.Add("X"); + else + entries.Add("F|" + entryType + "|S|" + Display(declaring) + "|" + member.Name + "|\0|" + Display(path.Type) + "|0|"); + } + } + + var sb = new StringBuilder(); + sb.AppendLine("// "); + sb.AppendLine("#nullable enable"); + sb.AppendLine(); + bool hasNamespace = !type.ContainingNamespace.IsGlobalNamespace; + string indent = hasNamespace ? "\t" : ""; + if (hasNamespace) { + sb.Append("namespace ").AppendLine(type.ContainingNamespace.ToDisplayString()); + sb.AppendLine("{"); + } + sb.Append(indent).Append(type.IsRecord ? (type.TypeKind == TypeKind.Struct ? "partial record struct " : "partial record ") : type.TypeKind == TypeKind.Struct ? "partial struct " : "partial class ").AppendLine(type.Name); + sb.Append(indent).AppendLine("{"); + + string tableType = isClient ? "global::Source.Common.RecvTable" : "global::Source.Common.SendTable"; + string propType = isClient ? "global::Source.Common.RecvProp" : "global::Source.Common.SendProp"; + foreach (string sub in subTables) { + sb.Append(indent).Append("\tpublic static readonly ").Append(tableType).Append(' ').Append(sub).Append(" = new(").Append(Literal(sub)) + .Append(", new ").Append(propType).AppendLine("[] {"); + foreach (string prop in props[sub]) + sb.Append(indent).Append("\t\t").Append(prop).AppendLine(","); + sb.Append(indent).AppendLine("\t});"); + } + + sb.Append(indent).Append("\tpublic static readonly ").Append(tableType).Append(' ').Append(tableName).Append(" = new(") + .Append(plain ? Literal(tableName) + ", " : noBase ? "" : baseDisplay + "." + baseTableName + ", ").Append("new ").Append(propType).AppendLine("[] {"); + foreach (string prop in props[""]) + sb.Append(indent).Append("\t\t").Append(prop).AppendLine(","); + sb.Append(indent).AppendLine("\t});"); + + bool ownPredMap = !type.GetMembers("PredMap").Any(m => !m.IsImplicitlyDeclared); + if (plain) { + if (isClient && ownPredMap && predicted.Count > 0) { + sb.Append(indent).AppendLine("\tpublic static readonly global::Source.Common.DataMap PredMap = new(new global::Source.Common.TypeDescription[] {"); + foreach (string entry in predicted) + sb.Append(indent).Append("\t\t").Append(entry).AppendLine(","); + sb.Append(indent).Append("\t}, typeof(").Append(typeDisplay).AppendLine("), null);"); + } + } + else if (isClient) { + sb.Append(indent).Append(baseType == null ? "\tpublic static readonly global::Source.Common.ClientClass ClientClass = new global::Source.Common.ClientClass(" : "\tpublic static readonly new global::Source.Common.ClientClass ClientClass = new global::Source.Common.ClientClass(").Append(Literal(networkName!)).Append(", ") + .Append(tableName).Append(", ").Append(Literal(tableName)).Append(", ").Append(isTempEntity ? TempEntityFactory(type) : ClientFactory(type)).AppendLine(");"); + sb.Append(indent).Append(baseType == null ? "\tpublic virtual" : "\tpublic override").AppendLine(" global::Source.Common.ClientClass GetClientClass() => ClientClass;"); + + if (isEntity && !type.GetMembers("PredMap").Any(m => !m.IsImplicitlyDeclared)) { + sb.Append(indent).AppendLine(baseType == null ? "\tpublic static readonly global::Source.Common.DataMap PredMap = new(new global::Source.Common.TypeDescription[] {" : "\tpublic static readonly new global::Source.Common.DataMap PredMap = new(new global::Source.Common.TypeDescription[] {"); + foreach (string entry in predicted) + sb.Append(indent).Append("\t\t").Append(entry).AppendLine(","); + sb.Append(indent).Append("\t}, typeof(").Append(typeDisplay).Append("), ").Append(baseType == null ? "null" : baseDisplay + ".PredMap").AppendLine(");"); + sb.Append(indent).AppendLine(baseType == null ? "\tpublic virtual global::Source.Common.DataMap? GetPredDescMap() => PredMap;" : "\tpublic override global::Source.Common.DataMap? GetPredDescMap() => PredMap;"); + } + } + else { + sb.Append(indent).Append(baseType == null ? "\tpublic static readonly global::Source.Common.ServerClass ServerClass = new(" : "\tpublic static readonly new global::Source.Common.ServerClass ServerClass = new(").Append(Literal(networkName!)).Append(", ") + .Append(tableName).Append(", ").Append(Literal(tableName)).AppendLine(");"); + sb.Append(indent).Append(baseType == null ? "\tpublic virtual" : "\tpublic override").AppendLine(" global::Source.Common.ServerClass GetServerClass() => ServerClass;"); + } + + sb.Append(indent).AppendLine("}"); + if (hasNamespace) + sb.AppendLine("}"); + + PredictionMapModel? map = isClient && ownPredMap && (isEntity || (plain && predicted.Count > 0)) + ? new PredictionMapModel(type.ToDisplayString() + ".PredMap", "PredMap", typeDisplay, string.Join("\n", entries), string.Join("\n", embeddedMaps)) + : null; + + string hint = (hasNamespace ? type.ContainingNamespace.ToDisplayString() + "." : "") + type.Name + ".NetworkTable.g.cs"; + return new TableModel(hint, sb.ToString(), accessors, map, diagnostics); + } + + private static object? SettingValue(PropSettings settings, string name) + => settings.Values.TryGetValue(name, out var entry) ? entry.Value : null; + + private static string? SettingEnum(PropSettings settings, string name) { + if (!settings.Values.TryGetValue(name, out var entry) || entry.Value == null || !(entry.Type is INamedTypeSymbol enumType) || enumType.TypeKind != TypeKind.Enum) + return null; + foreach (IFieldSymbol field in enumType.GetMembers().OfType()) { + if (field.HasConstantValue && Equals(field.ConstantValue, entry.Value)) + return field.Name == "Auto" ? null : field.Name; + } + return null; + } + + private static string? SettingFlags(PropSettings settings, string name, string enumDisplay) + => settings.Values.TryGetValue(name, out var entry) && entry.Value != null ? "(" + enumDisplay + ")" + FormatConstant(entry.Value) : null; + + private static List ListFields(INamedTypeSymbol type, string attributeName) + => type.GetMembers().OfType() + .Where(f => f.IsStatic && HasAttribute(f, attributeName) && f.Locations.Length > 0 && f.Locations[0].IsInSource) + .OrderBy(f => f.Locations[0].SourceTree?.FilePath ?? "", StringComparer.Ordinal) + .ThenBy(f => f.Locations[0].SourceSpan.Start) + .ToList(); + + private static bool HasNoBaseTable(INamedTypeSymbol type) { + string? tableName = GetClassTableName(type); + if (tableName == null) + return true; + AttributeData? networkName = type.GetAttributes().FirstOrDefault(a => a.AttributeClass?.ToDisplayString() == NetworkNameAttributeName); + if (networkName != null && NamedValue(networkName, "NoBase") is bool noBase && noBase) + return true; + foreach (IFieldSymbol list in ListFields(type, TableAttributeName)) { + AttributeData? attribute = list.GetAttributes().FirstOrDefault(a => a.AttributeClass?.ToDisplayString() == TableAttributeName); + if (attribute != null && SideMatches(attribute, true) && ListTableName(list, tableName) == tableName && NamedValue(attribute, "NoBase") is bool listNoBase && listNoBase) + return true; + } + return false; + } + + private static bool IsTableField(IFieldSymbol field) + => HasAttribute(field, TableAttributeName) || field.Type.Name == "SendTable" || field.Type.Name == "RecvTable"; + + private static string ListTableName(IFieldSymbol field, string fallback) { + AttributeData? attribute = field.GetAttributes().FirstOrDefault(a => a.AttributeClass?.ToDisplayString() == TableAttributeName); + return attribute != null && attribute.ConstructorArguments.Length == 1 && attribute.ConstructorArguments[0].Value is string name ? name : fallback; + } + + private static bool SideMatches(AttributeData attribute, bool isClient) { + object? side = NamedValue(attribute, "Side"); + return side == null || (int)side == 0 || (int)side == (isClient ? 2 : 1); + } + + private static bool EntrySideMatches(PropSettings settings, bool isClient) { + object? side = SettingValue(settings, "Side"); + return side == null || (int)side == 0 || (int)side == (isClient ? 2 : 1); + } + + private sealed class ListEntry + { + public ListEntry(string path, ISymbol? symbol, PropSettings settings, Location location) { + Path = path; + Symbol = symbol; + Settings = settings; + Location = location; + } + + public string Path { get; } + public ISymbol? Symbol { get; } + public PropSettings Settings { get; } + public Location Location { get; } + } + + private static List ParseList(Compilation compilation, INamedTypeSymbol type, IFieldSymbol listField, CancellationToken ct) { + var result = new List(); + foreach (SyntaxReference reference in listField.DeclaringSyntaxReferences) { + if (!(reference.GetSyntax(ct) is VariableDeclaratorSyntax declarator) || declarator.Initializer == null) + continue; + SemanticModel model = compilation.GetSemanticModel(declarator.SyntaxTree); + IEnumerable elements = declarator.Initializer.Value switch { + CollectionExpressionSyntax collection => collection.Elements.OfType().Select(e => e.Expression), + ArrayCreationExpressionSyntax array when array.Initializer != null => array.Initializer.Expressions, + ImplicitArrayCreationExpressionSyntax implicitArray => implicitArray.Initializer.Expressions, + InitializerExpressionSyntax initializer => initializer.Expressions, + _ => Enumerable.Empty() + }; + foreach (ExpressionSyntax element in elements) { + ExpressionSyntax? reference2 = element; + InitializerExpressionSyntax? initializer = null; + if (element is BaseObjectCreationExpressionSyntax creation) { + reference2 = creation.ArgumentList?.Arguments.FirstOrDefault()?.Expression; + initializer = creation.Initializer; + } + if (reference2 == null) { + result.Add(new ListEntry(element.ToString(), null, new PropSettings(), element.GetLocation())); + continue; + } + (string path, ISymbol? symbol) = ResolveReference(model, type, reference2, ct); + result.Add(new ListEntry(path, symbol, PropSettings.From(model, initializer, ct), element.GetLocation())); + } + } + return result; + } + + private static (string Path, ISymbol? Symbol) ResolveReference(SemanticModel model, INamedTypeSymbol type, ExpressionSyntax expression, CancellationToken ct) { + if (expression is InvocationExpressionSyntax invocation && invocation.Expression is IdentifierNameSyntax { Identifier.ValueText: "nameof" } && invocation.ArgumentList.Arguments.Count == 1) { + ExpressionSyntax target = invocation.ArgumentList.Arguments[0].Expression; + var parts = new List(); + ExpressionSyntax current = target; + while (current is MemberAccessExpressionSyntax access) { + ISymbol? left = model.GetSymbolInfo(access.Expression, ct).Symbol ?? model.GetSymbolInfo(access.Expression, ct).CandidateSymbols.FirstOrDefault(); + parts.Insert(0, access.Name.Identifier.ValueText); + if (left is ITypeSymbol || left is INamespaceSymbol || left == null) + break; + current = access.Expression; + if (!(current is MemberAccessExpressionSyntax) && current is IdentifierNameSyntax identifier) + parts.Insert(0, identifier.Identifier.ValueText); + } + if (parts.Count == 0 && target is IdentifierNameSyntax simple) + parts.Add(simple.Identifier.ValueText); + ISymbol? symbol = model.GetSymbolInfo(target, ct).Symbol ?? model.GetSymbolInfo(target, ct).CandidateSymbols.FirstOrDefault(); + string path = string.Join(".", parts); + if (parts.Count > 1) + symbol = LastMember(type, path) ?? symbol; + return (path, symbol); + } + Optional constant = model.GetConstantValue(expression, ct); + if (constant.HasValue && constant.Value is string text) + return (text, LastMember(type, text)); + return (expression.ToString(), null); + } + + private sealed class PropSettings + { + public readonly Dictionary Values = new Dictionary(StringComparer.Ordinal); + + public static PropSettings From(SemanticModel model, InitializerExpressionSyntax? initializer, CancellationToken ct) { + var settings = new PropSettings(); + if (initializer == null) + return settings; + foreach (ExpressionSyntax expression in initializer.Expressions) { + if (!(expression is AssignmentExpressionSyntax assignment) || !(assignment.Left is IdentifierNameSyntax left)) + continue; + string key = left.Identifier.ValueText; + if (assignment.Right is TypeOfExpressionSyntax typeOf) { + settings.Values[key] = (model.GetTypeInfo(typeOf.Type, ct).Type, null); + continue; + } + Optional constant = model.GetConstantValue(assignment.Right, ct); + TypeInfo info = model.GetTypeInfo(assignment.Right, ct); + object? value = constant.HasValue ? constant.Value : null; + if (value != null && info.ConvertedType?.SpecialType == SpecialType.System_Single && !(value is float)) + value = Convert.ToSingle(value, CultureInfo.InvariantCulture); + else if (value != null && info.ConvertedType?.SpecialType == SpecialType.System_Int32 && !(value is int)) + value = Convert.ToInt32(value, CultureInfo.InvariantCulture); + settings.Values[key] = (value, info.ConvertedType ?? info.Type); + } + return settings; + } + } + + private static ISymbol? LastMember(INamedTypeSymbol type, string path) { + ITypeSymbol? current = type; + ISymbol? member = null; + foreach (string segment in path.Split('.')) { + if (current == null) + return null; + member = FindMember(current, segment); + current = member switch { + IFieldSymbol field => field.Type, + IPropertySymbol property => property.Type, + _ => null + }; + } + return member; + } + + private static bool InheritsFrom(INamedTypeSymbol type, string fullName) { + for (INamedTypeSymbol? t = type; t != null; t = t.BaseType) { + if (t.ToDisplayString() == fullName) + return true; + } + return false; + } + + private static string TempEntityFactory(INamedTypeSymbol type) { + string factory = "static (entNum, serialNum) => throw new global::System.NotImplementedException(" + Literal("Temp entity '" + type.Name + "' is created as an event") + ")"; + if (type.IsAbstract || !type.InstanceConstructors.Any(c => c.DeclaredAccessibility == Accessibility.Public && c.Parameters.Length == 0)) + return factory; + return factory + ").AsEvent<" + Display(type) + ">("; + } + + private static string? GetClassTableName(INamedTypeSymbol type) { + foreach (AttributeData attribute in type.GetAttributes()) { + if (attribute.AttributeClass?.ToDisplayString() == NetworkNameAttributeName && attribute.ConstructorArguments.Length == 1 && attribute.ConstructorArguments[0].Value is string name && name.Length > 1) + return NamedValue(attribute, "Table") as string ?? "DT_" + name.Substring(1); + } + return null; + } + + private static string? ProxyMethod(ITypeSymbol? proxyType, bool isClient) { + if (proxyType == null) + return null; + string name = isClient ? "Recv" : "Send"; + if (!proxyType.GetMembers(name).Any(m => m is IMethodSymbol method && method.IsStatic)) + return null; + return Display(proxyType) + "." + name; + } + + private static string? BuildProp(bool isClient, PropSettings attribute, ITypeSymbol type, string field, out bool proxyUnsupported, out string encodingName, string? forcedEncoding = null) { + bool[] unsupported = { false }; + string? result = BuildPropCore(isClient, attribute, type, field, unsupported, out encodingName, forcedEncoding); + proxyUnsupported = unsupported[0]; + return result; + } + + private static string? BuildPropCore(bool isClient, PropSettings attribute, ITypeSymbol type, string field, bool[] proxyUnsupported, out string encodingName, string? forcedEncoding) { + string? encoding = forcedEncoding ?? SettingEnum(attribute, "Encoding"); + if (encoding == null || encoding == "Auto") + encoding = InferEncoding(type); + encodingName = encoding ?? ""; + if (encoding == null) + return null; + + var args = new List { field }; + object? bits = SettingValue(attribute, "Bits"); + string? flags = SettingFlags(attribute, "Flags", "global::Source.Common.PropFlags"); + object? low = SettingValue(attribute, "Low"); + object? high = SettingValue(attribute, "High"); + string? proxy = ProxyMethod(SettingValue(attribute, "Proxy") as ITypeSymbol, isClient); + void Add(string name, object? value, string? text = null) { + if (value != null) + args.Add(name + ": " + (text ?? FormatConstant(value))); + } + string Call(string method) { + Add("proxyFn", proxy, proxy); + return method + "(" + string.Join(", ", args) + ")"; + } + string? NoProxy(string call) { + if (proxy == null) + return call; + proxyUnsupported[0] = true; + return null; + } + + if (isClient) { + string recv = "global::Source.Common.RecvPropHelpers."; + string recvProxy = "global::Game.Client.RecvProxy."; + switch (encoding) { + case "Int": case "ModelIndex": return Call(recv + "RecvPropInt"); + case "Bool": return proxy == null ? recvProxy + "RecvPropBool(" + field + ")" : Call(recv + "RecvPropInt"); + case "Float": case "Angle": return Call(recv + "RecvPropFloat"); + case "Time": return NoProxy(recvProxy + "RecvPropTime(" + field + ")"); + case "Time64": return NoProxy(recvProxy + "RecvPropTime64(" + field + ")"); + case "Vector": return Call(recv + "RecvPropVector"); + case "VectorXY": return Call(recv + "RecvPropVectorXY"); + case "QAngles": return Call(recv + "RecvPropQAngles"); + case "EHandle": return Call(recv + "RecvPropEHandle"); + case "String": + Add("bufferSize", StringBufferSize(type)); + return Call(recv + "RecvPropString"); + case "IntWithMinusOneFlag": return Call(recvProxy + "RecvPropIntWithMinusOneFlag"); + default: return null; + } + } + + string send = "global::Source.Common.SendPropHelpers."; + string sendProxy = "global::Game.Server.SendProxy."; + switch (encoding) { + case "Int": + Add("bits", bits); Add("flags", flags, flags); + return Call(send + "SendPropInt"); + case "Bool": + if (proxy == null) + return sendProxy + "SendPropBool(" + field + ")"; + args.Add("bits: 1"); + args.Add("flags: global::Source.Common.PropFlags.Unsigned"); + return Call(send + "SendPropInt"); + case "Float": case "Vector": case "VectorXY": case "Angle": + Add("bits", bits); Add("flags", flags, flags); Add("lowValue", low); Add("highValue", high); + return Call(send + "SendProp" + encoding); + case "QAngles": + Add("bits", bits); Add("flags", flags, flags); + return Call(send + "SendPropQAngles"); + case "Time": return NoProxy(sendProxy + "SendPropTime(" + field + ")"); + case "Time64": return NoProxy(sendProxy + "SendPropTime64(" + field + ")"); + case "EHandle": + Add("flags", flags, flags); + return Call(sendProxy + "SendPropEHandle"); + case "ModelIndex": return NoProxy(send + "SendPropModelIndex(" + field + ")"); + case "String": + Add("bufferSize", StringBufferSize(type)); Add("flags", flags, flags); + return Call(send + "SendPropString"); + case "IntWithMinusOneFlag": + args.Add("bits: " + FormatConstant(bits ?? 32)); + return Call(sendProxy + "SendPropIntWithMinusOneFlag"); + default: return null; + } + } + + private static string PredictionDescription(string fieldType, ISymbol member, string size, string flags, string embeddedMap, string tolerance) + => "new global::Source.Common.TypeDescription(global::Source.Common.FieldType." + fieldType + ", " + Literal(member.Name) + + ", global::Source.FIELD<" + Display(member.ContainingType) + ">.OF(" + Literal(member.Name) + "), " + size + + ", (global::Source.Common.FieldTypeDescFlags)(" + flags + "), " + embeddedMap + ", " + tolerance + ")"; + + private static object? StringBufferSize(ITypeSymbol type) { + if (!(type is INamedTypeSymbol named)) + return null; + AttributeData? inlineArray = named.OriginalDefinition.GetAttributes().FirstOrDefault(a => a.AttributeClass?.ToDisplayString() == InlineArrayAttributeName); + return inlineArray != null && inlineArray.ConstructorArguments.Length == 1 && inlineArray.ConstructorArguments[0].Value is int length ? length : (object?)null; + } + + private static string? InferEncoding(ITypeSymbol type) { + if (type is INamedTypeSymbol named && named.OriginalDefinition.GetAttributes().Any(a => a.AttributeClass?.ToDisplayString() == InlineArrayAttributeName) + && named.GetMembers().OfType().FirstOrDefault(f => !f.IsStatic)?.Type.SpecialType == SpecialType.System_Char) + return "String"; + if (type.TypeKind == TypeKind.Enum) + return "Int"; + switch (type.SpecialType) { + case SpecialType.System_Boolean: return "Bool"; + case SpecialType.System_Byte: case SpecialType.System_SByte: case SpecialType.System_Int16: case SpecialType.System_UInt16: + case SpecialType.System_Int32: case SpecialType.System_UInt32: case SpecialType.System_Int64: case SpecialType.System_UInt64: + return "Int"; + case SpecialType.System_Single: return "Float"; + case SpecialType.System_Double: return "Time64"; + } + string display = type.OriginalDefinition.ToDisplayString(); + switch (display) { + case "System.Numerics.Vector3": return "Vector"; + case "Source.Common.Mathematics.QAngle": return "QAngles"; + case "Source.Common.Handle": case "Source.Common.BaseHandle": return "EHandle"; + } + return null; + } + + private static string? InferFieldType(ITypeSymbol type) { + if (type.TypeKind == TypeKind.Enum) + return "Integer"; + switch (type.SpecialType) { + case SpecialType.System_Boolean: return "Boolean"; + case SpecialType.System_Byte: case SpecialType.System_SByte: return "Character"; + case SpecialType.System_Int16: case SpecialType.System_UInt16: return "Short"; + case SpecialType.System_Int32: case SpecialType.System_UInt32: return "Integer"; + case SpecialType.System_Single: return "Float"; + case SpecialType.System_Double: return "Double"; + } + switch (type.OriginalDefinition.ToDisplayString()) { + case "System.Numerics.Vector3": case "Source.Common.Mathematics.QAngle": return "Vector"; + case "Source.Common.Handle": case "Source.Common.BaseHandle": return "EHandle"; + case "Source.Color": return "Color32"; + } + return null; + } + + private static object? NamedValue(AttributeData attribute, string name) { + foreach (KeyValuePair arg in attribute.NamedArguments) { + if (arg.Key == name) + return arg.Value.Value; + } + return null; + } + + private static string FormatConstant(object value) => value switch { + float f => f.ToString("R", CultureInfo.InvariantCulture) + "f", + double d => d.ToString("R", CultureInfo.InvariantCulture), + IFormattable formattable => formattable.ToString(null, CultureInfo.InvariantCulture), + _ => value.ToString() ?? "" + }; + + private static string ClientFactory(INamedTypeSymbol type) { + string fullyQualified = Display(type); + foreach (IMethodSymbol method in type.GetMembers().OfType()) { + if (method.IsStatic && method.GetAttributes().Any(a => a.AttributeClass?.ToDisplayString() == FactoryAttributeName)) + return fullyQualified + "." + method.Name; + } + if (type.IsAbstract || !type.InstanceConstructors.Any(c => c.DeclaredAccessibility == Accessibility.Public && c.Parameters.Length == 0)) + return "static (entNum, serialNum) => throw new global::System.NotImplementedException(" + Literal("ClientClass did not define how to create type '" + type.Name + "'") + ")"; + return "static (entNum, serialNum) => { " + fullyQualified + " entity = new " + fullyQualified + "(); return entity.Init(entNum, serialNum) ? entity : null!; }"; + } + + private sealed class TableDiagnostic : IEquatable + { + public TableDiagnostic(DiagnosticDescriptor descriptor, Location? location, params object[] args) { + Descriptor = descriptor; + Location = location; + Args = args; + } + + public DiagnosticDescriptor Descriptor { get; } + public Location? Location { get; } + public object[] Args { get; } + + public bool Equals(TableDiagnostic? other) => other != null && Descriptor.Id == other.Descriptor.Id && Equals(Location, other.Location) && Args.SequenceEqual(other.Args); + public override bool Equals(object? obj) => Equals(obj as TableDiagnostic); + public override int GetHashCode() => Descriptor.Id.GetHashCode(); + } + + private sealed class TableModel : IEquatable + { + public TableModel(string hintName, string source, List accessors, PredictionMapModel? map, List diagnostics) { + HintName = hintName; + Source = source; + Accessors = accessors; + Map = map; + Diagnostics = diagnostics; + } + + public string HintName { get; } + public string Source { get; } + public List Accessors { get; } + public PredictionMapModel? Map { get; } + public List Diagnostics { get; } + + public bool Equals(TableModel? other) + => other != null && HintName == other.HintName && Source == other.Source && Equals(Map, other.Map) + && Accessors.SequenceEqual(other.Accessors) && Diagnostics.SequenceEqual(other.Diagnostics); + + public override bool Equals(object? obj) => Equals(obj as TableModel); + public override int GetHashCode() => HintName.GetHashCode() ^ Source.GetHashCode(); + } + } +} diff --git a/Source.CodeAnalysis.NetworkVars/NetworkVarGenerator.cs b/Source.CodeAnalysis.NetworkVars/NetworkVarGenerator.cs index cae8680d..2336aa3b 100644 --- a/Source.CodeAnalysis.NetworkVars/NetworkVarGenerator.cs +++ b/Source.CodeAnalysis.NetworkVars/NetworkVarGenerator.cs @@ -46,14 +46,19 @@ public sealed partial class NetworkVarGenerator : IIncrementalGenerator defaultSeverity: DiagnosticSeverity.Error, isEnabledByDefault: true); - public void Initialize(IncrementalGeneratorInitializationContext context) { - context.RegisterPostInitializationOutput(ctx => - ctx.AddSource("NetworkVarAttribute.g.cs", SourceText.From(AttributeSource, Encoding.UTF8))); + private static readonly DiagnosticDescriptor ServerField = new DiagnosticDescriptor( + id: "NETVAR005", + title: "Server [NetworkVar] members must be partial properties", + messageFormat: "'{0}' is a [NetworkVar] field in server code; make it a partial property so changes are tracked", + category: "NetworkVars", + defaultSeverity: DiagnosticSeverity.Error, + isEnabledByDefault: true); + public void Initialize(IncrementalGeneratorInitializationContext context) { IncrementalValuesProvider properties = context.SyntaxProvider .ForAttributeWithMetadataName( AttributeMetadataName, - predicate: static (node, _) => node is PropertyDeclarationSyntax, + predicate: static (node, _) => node is PropertyDeclarationSyntax || node is VariableDeclaratorSyntax, transform: static (ctx, _) => GetModel(ctx)) .Where(static m => m != null); @@ -61,10 +66,31 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterSourceOutput(collected, static (spc, models) => Emit(spc, models)); - InitializeFieldAccessors(context, collected); + InitializeFieldAccessors(context, collected, InitializeTables(context)); + } + + private static bool HasStateTracking(INamedTypeSymbol? type) { + for (INamedTypeSymbol? t = type; t != null; t = t.BaseType) { + foreach (ISymbol member in t.GetMembers("NetworkStateChanged")) { + if (member is IMethodSymbol method && method.Parameters.Length == 1 && method.Parameters[0].Type.Name == "IFieldAccessor") + return true; + } + } + return false; } + private static bool IsNetworkArray(ITypeSymbol type) + => type is INamedTypeSymbol named && named.IsGenericType && named.Name == "NetworkArray" && named.ContainingNamespace.ToDisplayString() == "Source.Common"; + private static PropertyModel? GetModel(GeneratorAttributeSyntaxContext ctx) { + bool isClient = ctx.TargetNode.SyntaxTree.Options.PreprocessorSymbolNames.Contains("CLIENT_DLL"); + + if (ctx.TargetSymbol is IFieldSymbol field) { + if (isClient || field.IsReadOnly || !HasStateTracking(field.ContainingType) || IsNetworkArray(field.Type)) + return null; + return PropertyModel.ServerFieldError(field.Name, field.ContainingType.Name, field.ContainingType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), ctx.TargetNode.GetLocation()); + } + if (!(ctx.TargetSymbol is IPropertySymbol prop)) return null; @@ -102,7 +128,28 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { propertyIsPartial: propertyIsPartial, typeIsPartial: typeIsPartial, unsupported: unsupported, - location: propSyntax.Identifier.GetLocation()); + isClient: isClient, + location: propSyntax.Identifier.GetLocation()) { + Accessibility = string.Join(" ", propSyntax.Modifiers + .Where(m => m.IsKind(Microsoft.CodeAnalysis.CSharp.SyntaxKind.PublicKeyword) || m.IsKind(Microsoft.CodeAnalysis.CSharp.SyntaxKind.ProtectedKeyword) || m.IsKind(Microsoft.CodeAnalysis.CSharp.SyntaxKind.InternalKeyword) || m.IsKind(Microsoft.CodeAnalysis.CSharp.SyntaxKind.PrivateKeyword) || m.IsKind(Microsoft.CodeAnalysis.CSharp.SyntaxKind.NewKeyword)) + .Select(m => m.Text)), + RefReadonly = prop.ReturnsByRefReadonly, + BaseHasFields = BaseHasNetworkVarFields(containingType.BaseType) + }; + } + + private static bool BaseHasNetworkVarFields(INamedTypeSymbol? type) { + for (INamedTypeSymbol? t = type; t != null; t = t.BaseType) { + if (t.ContainingType != null || t.IsGenericType) + continue; + foreach (IPropertySymbol property in t.GetMembers().OfType()) { + if (!property.GetAttributes().Any(a => a.AttributeClass?.ToDisplayString() == AttributeMetadataName)) + continue; + if (property.DeclaringSyntaxReferences.Any(r => r.GetSyntax() is PropertyDeclarationSyntax syntax && syntax.Modifiers.Any(m => m.IsKind(Microsoft.CodeAnalysis.CSharp.SyntaxKind.PartialKeyword)))) + return true; + } + } + return false; } private static void Emit(SourceProductionContext spc, ImmutableArray models) { @@ -115,6 +162,10 @@ private static void Emit(SourceProductionContext spc, ImmutableArray props) string backing = "__nv_" + name; sb.Append(indent).Append("private ").Append(t).Append(' ').Append(backing).AppendLine(";"); - sb.Append(indent).Append("public partial ").Append(t).Append(' ').Append(name).AppendLine(" {"); + string accessibility = p.Accessibility.Length == 0 ? "" : p.Accessibility + " "; + if (p.RefReadonly) { + sb.Append(indent).Append(accessibility).Append("partial ref readonly ").Append(t).Append(' ').Append(name).Append(" { get => ref ").Append(backing).AppendLine("; }"); + if (p.IsClient) + sb.Append(indent).Append("public ref ").Append(t).Append(' ').Append(name).Append("ForModify() => ref ").Append(backing).AppendLine(";"); + else { + sb.Append(indent).Append("public ref ").Append(t).Append(' ').Append(name).AppendLine("ForModify() {"); + sb.Append(indent).Append("\tNetworkStateChanged(NetworkVarFields.").Append(name).AppendLine(");"); + sb.Append(indent).Append("\treturn ref ").Append(backing).AppendLine(";"); + sb.Append(indent).AppendLine("}"); + } + sb.AppendLine(); + continue; + } + sb.Append(indent).Append(accessibility).Append("partial ").Append(t).Append(' ').Append(name).AppendLine(" {"); sb.Append(indent).Append("\tget => ").Append(backing).AppendLine(";"); + if (p.IsClient) { + sb.Append(indent).Append("\tset => ").Append(backing).AppendLine(" = value;"); + sb.Append(indent).AppendLine("}"); + sb.Append(indent).Append("public ref ").Append(t).Append(' ').Append(name).Append("ForModify() => ref ").Append(backing).AppendLine(";"); + sb.AppendLine(); + continue; + } sb.Append(indent).AppendLine("\tset {"); if (p.InlineArrayElement == null) sb.Append(indent).Append("\t\tif (!global::System.Collections.Generic.EqualityComparer<").Append(t).Append(">.Default.Equals(").Append(backing).AppendLine(", value)) {"); @@ -185,7 +257,7 @@ private static string BuildSource(PropertyModel type, List props) sb.AppendLine(); } - sb.Append(indent).AppendLine("internal static class NetworkVarFields"); + sb.Append(indent).AppendLine(props.Any(p => p.BaseHasFields) ? "internal static new class NetworkVarFields" : "internal static class NetworkVarFields"); sb.Append(indent).AppendLine("{"); foreach (PropertyModel p in props) { sb.Append(indent).Append("\tpublic static readonly global::Source.Common.IFieldAccessor ").Append(p.PropertyName) @@ -210,26 +282,10 @@ private static string BuildSource(PropertyModel type, List props) return sb.ToString(); } - private const string AttributeSource = -@"// -#nullable enable -namespace Source.Common -{ - /// - /// Marks a partial property as a networked var. The NetworkVar source generator emits the - /// backing field, a change-checked setter that calls NetworkStateChanged, and a shared - /// IFieldAccessor (exposed via the nested NetworkVarFields class) for the send table to use. - /// - [global::System.AttributeUsage(global::System.AttributeTargets.Property, AllowMultiple = false, Inherited = false)] - internal sealed class NetworkVarAttribute : global::System.Attribute - { - } -}"; - private sealed class PropertyModel { public PropertyModel(string propertyName, string networkName, string accessorBase, string conversions, string typeDisplay, string? inlineArrayElement, string? @namespace, string typeName, - string typeFullyQualified, bool propertyIsPartial, bool typeIsPartial, bool unsupported, Location location) { + string typeFullyQualified, bool propertyIsPartial, bool typeIsPartial, bool unsupported, bool isClient, Location location) { PropertyName = propertyName; NetworkName = networkName; AccessorBase = accessorBase; @@ -242,9 +298,16 @@ public PropertyModel(string propertyName, string networkName, string accessorBas PropertyIsPartial = propertyIsPartial; TypeIsPartial = typeIsPartial; Unsupported = unsupported; + IsClient = isClient; Location = location; } + public static PropertyModel ServerFieldError(string fieldName, string typeName, string typeFullyQualified, Location location) { + PropertyModel model = new PropertyModel(fieldName, fieldName, "", "", "", null, null, typeName, typeFullyQualified, true, true, false, false, location); + model.IsServerField = true; + return model; + } + public string PropertyName { get; } public string NetworkName { get; } public string AccessorBase { get; } @@ -257,6 +320,11 @@ public PropertyModel(string propertyName, string networkName, string accessorBas public bool PropertyIsPartial { get; } public bool TypeIsPartial { get; } public bool Unsupported { get; } + public bool IsClient { get; } + public bool IsServerField { get; private set; } + public string Accessibility { get; set; } = ""; + public bool RefReadonly { get; set; } + public bool BaseHasFields { get; set; } public Location Location { get; } } } diff --git a/Source.Common/BoneSetup.cs b/Source.Common/BoneSetup.cs index 58d92a48..bcf53947 100644 --- a/Source.Common/BoneSetup.cs +++ b/Source.Common/BoneSetup.cs @@ -166,11 +166,11 @@ public ref partial struct BoneSetup StudioHdr studioHdr; int boneMask; - Span poseParameter; + ReadOnlySpan poseParameter; public StudioHdr GetStudioHdr() => studioHdr; - public BoneSetup(StudioHdr studioHdr, int boneMask, Span poseParameter) { + public BoneSetup(StudioHdr studioHdr, int boneMask, ReadOnlySpan poseParameter) { this.studioHdr = studioHdr; this.boneMask = boneMask; this.poseParameter = poseParameter; @@ -241,7 +241,7 @@ private static bool PoseIsAllZeros(StudioHdr studioHdr, int sequence, MStudioSeq MStudioAnimDesc anim = studioHdr.Animdesc(baseanim); return (anim.Flags & StudioAnimSeqFlags.AllZeros) != 0; } - private static bool CalcPoseSingle(StudioHdr studioHdr, Span pos, Span q, MStudioSeqDesc seqdesc, int sequence, double cycle, Span poseParameter, int boneMask, double time) { + private static bool CalcPoseSingle(StudioHdr studioHdr, Span pos, Span q, MStudioSeqDesc seqdesc, int sequence, double cycle, ReadOnlySpan poseParameter, int boneMask, double time) { bool bResult = true; Vector3[] pos2 = VectorPool.Alloc(); diff --git a/Source.Common/ClientClass.cs b/Source.Common/ClientClass.cs index 692c7273..a752910a 100644 --- a/Source.Common/ClientClass.cs +++ b/Source.Common/ClientClass.cs @@ -1,28 +1,9 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - + namespace Source.Common; public delegate IClientNetworkable CreateClientClassFn(int entNum, int serialNum); public delegate IClientNetworkable CreateEventFn(); -public static class ClientClassRetriever -{ - static readonly Dictionary ClassList = []; - - public static ClientClass GetOrError(Type t) { - if (ClassList.TryGetValue(t, out ClientClass? c)) - return c; - - FieldInfo? field = t.GetField(nameof(ClientClass), BindingFlags.Static | BindingFlags.Public); - if (field == null) - throw new NullReferenceException(nameof(field)); - - c = ClassList[t] = (ClientClass)field.GetValue(null)!; - return c; - } -} - [AttributeUsage(AttributeTargets.Method)] public class ImplementClientClassFactoryAttribute : Attribute { @@ -39,33 +20,13 @@ public class ClientClass public ClientClass? Next; public int ClassID; - readonly record struct Site(string TypeName, string? NetworkName, CreateClientClassFn? CreateFn); - static readonly Dictionary<(string File, int Line), Site> Sites = []; - - public static void RegisterSite(string file, int line, string typeName, string? networkName, CreateClientClassFn? createFn) => Sites[(file, line)] = new(typeName, networkName, createFn); - - static Site TakeSite(string callerFile, int callerLine) { - if (!Sites.Remove((NetworkClassSite.FileName(callerFile), callerLine), out Site site)) - throw new NullReferenceException($"No generated ClientClass registration for {callerFile}:{callerLine}"); - return site; - } - - static CreateClientClassFn GetCreateFn(in Site site) { - string typeName = site.TypeName; - return site.CreateFn ?? ((_, _) => throw new NotImplementedException($"ClientClass did not define how to create type '{typeName}'")); - } - - static string GetNetworkName(in Site site) => site.NetworkName ?? throw new NullReferenceException($"{site.TypeName} is missing a {nameof(NetworkNameAttribute)}"); - - public ClientClass(RecvTable recvTable, [CallerArgumentExpression(nameof(recvTable))] string? nameOfTable = null, [CallerFilePath] string callerFile = "", [CallerLineNumber] int callerLine = 0) { - Site site = TakeSite(callerFile, callerLine); - CreateFn = GetCreateFn(in site); - - NetworkName = GetNetworkName(in site); + public ClientClass(string networkName, RecvTable recvTable, string? tableName, CreateClientClassFn createFn) { + CreateFn = createFn; + NetworkName = networkName; RecvTable = recvTable; - if (nameOfTable != null) - recvTable.NetTableName = nameOfTable; + if (tableName != null) + recvTable.NetTableName = tableName; Next = Head; Head = this; @@ -81,11 +42,3 @@ public ClientClass(RecvTable recvTable, [CallerArgumentExpression(nameof(recvTab public ReadOnlySpan GetName() => NetworkName; } - -[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] -public class ImplementClientClassAttribute : Attribute -{ - public required string ClientClassName; - public required string RecvTable; - public required string ServerClassName; -} diff --git a/Source.Common/DataMap.cs b/Source.Common/DataMap.cs index c46eb83a..458e783f 100644 --- a/Source.Common/DataMap.cs +++ b/Source.Common/DataMap.cs @@ -75,7 +75,9 @@ public class TypeDescription public readonly FieldType FieldType; public readonly string FieldName = ""; public readonly FieldInfo FieldInfo; - public DynamicAccessor Accessor => field ??= FieldAccessorRegistry.Create(FieldInfo.DeclaringType!, FieldInfo.Name, null); + DynamicAccessor? accessor; + public DynamicAccessor Accessor => accessor ??= FieldAccessorRegistry.TryCreate(FieldInfo.DeclaringType!, FieldInfo.Name, null) + ?? FieldAccessorRegistry.Create(FieldInfo.DeclaringType!, FieldInfo.Name.StartsWith("__nv_", StringComparison.Ordinal) ? FieldInfo.Name[5..] : FieldInfo.Name, null); public nuint PackedOffset = nuint.MaxValue; public readonly ushort FieldSize; public readonly FieldTypeDescFlags Flags; @@ -99,6 +101,17 @@ public TypeDescription(FieldType type, ReadOnlySpan fieldName, FieldInfo f FieldTolerance = fieldTolerance; InputFunc = inputFunc; } + + public TypeDescription(FieldType type, ReadOnlySpan fieldName, DynamicAccessor accessor, ushort fieldSize, FieldTypeDescFlags flags, DataMap? td, double fieldTolerance) { + FieldType = type; + FieldName = new(fieldName); + FieldInfo = null!; + this.accessor = accessor; + FieldSize = fieldSize; + Flags |= flags; + TD = td; + FieldTolerance = fieldTolerance; + } } public enum FieldTypeDescFlags : ushort @@ -757,7 +770,7 @@ static int SIZE_OF_ARRAY(ReadOnlySpan fieldName) { } public static FieldInfo GetField_R(Type t, string name){ - var f = t.GetField(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + var f = t.GetField(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) ?? t.GetField("__nv_" + name, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly); if (f != null) return f; diff --git a/Source.Common/DtRecv.cs b/Source.Common/DtRecv.cs index 54ff7abc..c6d913f1 100644 --- a/Source.Common/DtRecv.cs +++ b/Source.Common/DtRecv.cs @@ -171,12 +171,6 @@ private static RecvProp RecvPropVariableLengthArray(ArrayLengthRecvProxyFn? fn, public static RecvProp RecvPropString(IFieldAccessor field, int bufferSize = -1, PropFlags flags = 0, RecvVarProxyFn? proxyFn = null) { RecvProp ret = new(); proxyFn ??= RecvProxy_StringToString; - if (bufferSize == -1) { - // Try to see if this is inline. If it is then we can set the explicit size ourselves - var inlineArrayAttr = field.FieldType.GetCustomAttribute(); - if (inlineArrayAttr != null) - bufferSize = inlineArrayAttr.Length; - } ret.FieldInfo = field; ret.RecvType = SendPropType.String; diff --git a/Source.Common/DtSend.cs b/Source.Common/DtSend.cs index 12913443..d5fc550d 100644 --- a/Source.Common/DtSend.cs +++ b/Source.Common/DtSend.cs @@ -397,12 +397,6 @@ public static SendProp SendPropModelIndex(IFieldAccessor field) => SendPropInt(field, Constants.SP_MODEL_INDEX_BITS); public static SendProp SendPropString(IFieldAccessor field, int bufferSize = -1, PropFlags flags = 0, SendVarProxyFn? proxyFn = null) { SendProp ret = new(); - if (bufferSize == -1) { - // Try to see if this is inline. If it is then we can set the explicit size ourselves - var inlineArrayAttr = field.FieldType.GetCustomAttribute(); - if (inlineArrayAttr != null) - bufferSize = inlineArrayAttr.Length; - } ret.Type = SendPropType.String; ret.FieldInfo = field; ret.SetFlags(flags); diff --git a/Source.Common/FieldAccessors.cs b/Source.Common/FieldAccessors.cs index 7bda5330..1db955fc 100644 --- a/Source.Common/FieldAccessors.cs +++ b/Source.Common/FieldAccessors.cs @@ -20,10 +20,14 @@ public static void RegisterArray(Type owner, string expression, Func? factory; lock (RegistryLock) Scalars.TryGetValue((owner, expression, name), out factory); - return factory?.Invoke() ?? throw new KeyNotFoundException($"No generated field accessor for {owner.FullName}.{expression}"); + return factory?.Invoke(); } public static DynamicArrayAccessor CreateArray(Type owner, string expression, int listMax) { diff --git a/Source.Common/PlayerState.cs b/Source.Common/PlayerEngineState.cs similarity index 80% rename from Source.Common/PlayerState.cs rename to Source.Common/PlayerEngineState.cs index 4fff5c1f..6e0cace6 100644 --- a/Source.Common/PlayerState.cs +++ b/Source.Common/PlayerEngineState.cs @@ -2,10 +2,8 @@ namespace Source.Common; -public class PlayerState +public class PlayerEngineState { - [NetworkName("deadflag")] - public bool DeadFlag; public QAngle ViewingAngle; // We can't use CLIENT_DLL here in Common... w/e diff --git a/Source.Common/Server/IServerGameDLL.cs b/Source.Common/Server/IServerGameDLL.cs index 8eade5c6..5d317fd2 100644 --- a/Source.Common/Server/IServerGameDLL.cs +++ b/Source.Common/Server/IServerGameDLL.cs @@ -151,7 +151,7 @@ public interface IServerGameClients void ClientSettingsChanged(Edict edict); void ClientSetupVisibility(Edict? viewEntity, Edict client, byte[] pvs, int pvssize); TimeUnit_t ProcessUsercmds(Edict player, bf_read buf, int numCmds, int totalCmds, int droppedPackets, bool ignore, bool paused); - PlayerState GetPlayerState(Edict player); + PlayerEngineState GetPlayerState(Edict player); void ClientEarPosition(Edict entity, out Vector3 earOrigin); void GetBugReportInfo(Span buf); void NetworkIDValidated(ReadOnlySpan userName, ReadOnlySpan networkID); diff --git a/Source.Common/ServerClass.cs b/Source.Common/ServerClass.cs index 9e6aa994..ab6b18d2 100644 --- a/Source.Common/ServerClass.cs +++ b/Source.Common/ServerClass.cs @@ -1,63 +1,107 @@ using Source.Common.Engine; -using System.Reflection; -using System.Runtime.CompilerServices; namespace Source.Common; -public static class ServerClassRetriever +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Field | AttributeTargets.Property)] +public class NetworkNameAttribute(string name) : Attribute { - static readonly Dictionary ClassList = []; + public readonly string Name = name; + public string? Table { get; set; } + public bool NoBase { get; set; } +} - public static ServerClass GetOrError(Type t) { - if (ClassList.TryGetValue(t, out ServerClass? c)) - return c; +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] +public sealed class NetworkVarAttribute(string? name = null) : Attribute +{ + public readonly string? Name = name; +} - FieldInfo? field = t.GetField(nameof(ServerClass), BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy); - if (field == null) - throw new NullReferenceException(nameof(field)); +[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)] +public sealed class NetworkTableAttribute(string? name = null) : Attribute +{ + public readonly string? Name = name; + public bool NoBase { get; set; } + public NetworkSide Side { get; set; } +} - c = ClassList[t] = (ServerClass)field.GetValue(null)!; - return c; - } +[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)] +public sealed class PredictionTableAttribute : Attribute +{ } -[AttributeUsage(AttributeTargets.Class | AttributeTargets.Field | AttributeTargets.Property)] -public class NetworkNameAttribute(string name) : Attribute +public enum NetworkSide { - public readonly string Name = name; + Both, + Server, + Client } -static class NetworkClassSite +public sealed class NetworkProp(string member) { - public static string FileName(string path) => path[(path.LastIndexOfAny(['/', '\\']) + 1)..]; + public readonly string Member = member; + public static implicit operator NetworkProp(string member) => new(member); + public NetEncoding Encoding { get; init; } + public int Bits { get; init; } + public PropFlags Flags { get; init; } + public float Low { get; init; } + public float High { get; init; } + public Type? Proxy { get; init; } + public string? DataTable { get; init; } + public int Count { get; init; } + public NetworkSide Side { get; init; } + public string? Name { get; init; } + public bool Exclude { get; init; } } +public sealed class PredictionField(string member) +{ + public readonly string Member = member; + public static implicit operator PredictionField(string member) => new(member); + public FieldType Type { get; init; } + public FieldTypeDescFlags Flags { get; init; } + public float Tolerance { get; init; } + public bool Embedded { get; init; } +} +public enum NetEncoding +{ + Auto, + Int, + Bool, + Float, + Time, + Time64, + Vector, + VectorXY, + QAngles, + Angle, + EHandle, + ModelIndex, + String, + IntWithMinusOneFlag, + DataTable, + Array, + Array2, + VectorElements, + PredictableId, + GModTable, + List, + Elements +} public class ServerClass { public static ServerClass? Head; - readonly record struct Site(string TypeName, string? NetworkName); - static readonly Dictionary<(string File, int Line), Site> Sites = []; - - public static void RegisterSite(string file, int line, string typeName, string? networkName) => Sites[(file, line)] = new(typeName, networkName); - - static string TakeNetworkName(string callerFile, int callerLine) { - if (!Sites.Remove((NetworkClassSite.FileName(callerFile), callerLine), out Site site)) - throw new NullReferenceException($"No generated ServerClass registration for {callerFile}:{callerLine}"); - return site.NetworkName ?? throw new NullReferenceException($"{site.TypeName} is missing a {nameof(NetworkNameAttribute)}"); - } - public string NetworkName; public SendTable Table; public ServerClass? Next; public int ClassID; public int InstanceBaselineIndex = INetworkStringTable.INVALID_STRING_INDEX; - public ServerClass(SendTable table, [CallerArgumentExpression(nameof(table))] string? nameOfTable = null, [CallerFilePath] string callerFile = "", [CallerLineNumber] int callerLine = 0) { - NetworkName = TakeNetworkName(callerFile, callerLine); + public ServerClass(string networkName, SendTable table, string? tableName) { + NetworkName = networkName; Table = table; - if (nameOfTable != null) - table.NetTableName = nameOfTable; + if (tableName != null) + table.NetTableName = tableName; Next = null; InstanceBaselineIndex = INetworkStringTable.INVALID_STRING_INDEX; diff --git a/Source.Engine/Server/GameClient.cs b/Source.Engine/Server/GameClient.cs index 88d74de0..7d1ff817 100644 --- a/Source.Engine/Server/GameClient.cs +++ b/Source.Engine/Server/GameClient.cs @@ -570,7 +570,7 @@ void WriteViewAngleUpdate() { if (IsFakeClient()) return; - PlayerState pl = SV.ServerGameClients!.GetPlayerState(Edict); + PlayerEngineState pl = SV.ServerGameClients!.GetPlayerState(Edict); Assert(pl != null); if (pl != null && pl.FixAngle != (int)FixAngle.None) { diff --git a/Source.NET.slnx b/Source.NET.slnx index 7f9606e5..464326fb 100644 --- a/Source.NET.slnx +++ b/Source.NET.slnx @@ -28,9 +28,6 @@ - - - From bc78aa604af341d620e9d45dd4b903511f606ab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Thu, 22 Oct 2026 03:18:05 +0300 Subject: [PATCH 09/12] Add server network table CRC test --- Game.Server.Tests/Game.Server.Tests.csproj | 27 ++ Game.Server.Tests/NetworkTableCRCTests.cs | 378 +++++++++++++++++++++ Source.Engine/EngineSendTable.cs | 9 +- Source.NET.slnx | 3 + 4 files changed, 413 insertions(+), 4 deletions(-) create mode 100644 Game.Server.Tests/Game.Server.Tests.csproj create mode 100644 Game.Server.Tests/NetworkTableCRCTests.cs diff --git a/Game.Server.Tests/Game.Server.Tests.csproj b/Game.Server.Tests/Game.Server.Tests.csproj new file mode 100644 index 00000000..ed477fe5 --- /dev/null +++ b/Game.Server.Tests/Game.Server.Tests.csproj @@ -0,0 +1,27 @@ + + + + net10.0 + Exe + enable + enable + false + true + Debug;Release;Debug (Dedicated);Release (Dedicated) + bin\$(Configuration)\ + + + + + + + + + + + + + + + + diff --git a/Game.Server.Tests/NetworkTableCRCTests.cs b/Game.Server.Tests/NetworkTableCRCTests.cs new file mode 100644 index 00000000..48d31eda --- /dev/null +++ b/Game.Server.Tests/NetworkTableCRCTests.cs @@ -0,0 +1,378 @@ +using Source.Common; + +using System.Globalization; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Text; + +namespace Game.Server.Tests; + +public class NetworkTableCRCTests +{ + static readonly (string Table, int Props, uint CRC)[] ExpectedSendTables = [ + ("DT_AR2Explosion", 2, 0x61B6B98A), + ("DT_BaseParticleEntity", 1, 0xE3426E0B), + ("DT_BaseEntity", 53, 0x9CCB9E9A), + ("DT_AnimTimeMustBeFirst", 1, 0xC69C3E9B), + ("DT_CollisionProperty", 12, 0x6B7D2A15), + ("DT_PredictableId", 2, 0xC7077D8B), + ("m_GMOD_bool", 32, 0xD011B04F), + ("m_GMOD_float", 32, 0x1591910B), + ("m_GMOD_int", 32, 0x9D47AA4A), + ("m_GMOD_Vector", 32, 0x4EC9758A), + ("m_GMOD_QAngle", 32, 0x096AD79C), + ("m_GMOD_EHANDLE", 32, 0xC7D2616A), + ("DT_AI_BaseNPC", 8, 0xAE569007), + ("DT_BaseCombatCharacter", 5, 0x921DFDEA), + ("DT_BaseFlex", 9, 0xCB8128B2), + ("DT_BaseAnimatingOverlay", 2, 0x3D34E4FC), + ("DT_BaseAnimating", 25, 0x1DA0A4CE), + ("m_flPoseParameter", 24, 0xF73702B6), + ("m_flEncodedController", 4, 0x34411FE0), + ("DT_ServerAnimationData", 1, 0xE8B3A257), + ("DT_OverlayVars", 1, 0xE199EEDA), + ("_ST_m_AnimOverlay_15", 16, 0x00E9506D), + ("_LPT_m_AnimOverlay_15", 1, 0xB223562B), + ("DT_Animationlayer", 5, 0x169022A8), + ("m_flexWeight", 96, 0x60194218), + ("DT_BCCLocalPlayerExclusive", 1, 0xBD0E7BA8), + ("m_hMyWeapons", 256, 0x9BE5116C), + ("DT_AlyxEmpEffect", 4, 0x177B8FAE), + ("DT_BaseCombatWeapon", 7, 0x86BD022B), + ("DT_LocalWeaponData", 6, 0xC6BB7AC9), + ("DT_LocalActiveWeaponData", 4, 0x6CBC05BD), + ("DT_BaseDoor", 1, 0x10F76933), + ("DT_BaseToggle", 4, 0x7E1C8FE3), + ("DT_BaseGrenade", 7, 0x3434CC3A), + ("DT_BaseHelicopter", 2, 0x7AD6D709), + ("DT_BaseHelicopter_HL1", 1, 0x6D77E654), + ("DT_BaseHL1CombatWeapon", 1, 0x7D567D12), + ("DT_BaseHL1MPCombatWeapon", 1, 0xA79FFC92), + ("DT_BaseHL2MPBludgeonWeapon", 1, 0x697329EB), + ("DT_BaseHL2MPCombatWeapon", 1, 0x7428465F), + ("DT_WeaponHL2MPBase", 1, 0x730B333E), + ("DT_BaseHLBludgeonWeapon", 1, 0xCB3F9EA0), + ("DT_BaseHLCombatWeapon", 1, 0x5AB57EF7), + ("DT_BasePlayer", 19, 0x1C929139), + ("DT_PlayerState", 1, 0xAA278800), + ("DT_LocalPlayerExclusive", 18, 0x6109DE54), + ("DT_Local", 53, 0x64168075), + ("m_chAreaBits", 32, 0xB445E7B2), + ("m_chAreaPortalBits", 24, 0x1CEBC78C), + ("m_iAmmo", 256, 0xE82D54E3), + ("DT_BasePropDoor", 3, 0xB403AAD7), + ("DT_DynamicProp", 2, 0x4ADA3D2A), + ("DT_BreakableProp", 1, 0xBFB38C98), + ("DT_BaseTempEntity", 0, 0x36C48953), + ("DT_BaseTrigger", 3, 0x0A48E1FD), + ("DT_BaseViewModel", 15, 0x2F8B26FA), + ("DT_Beam", 25, 0x5E9609C6), + ("m_hAttachEntity", 10, 0xB0C9F003), + ("m_nAttachIndex", 10, 0x8B6C15DA), + ("DT_BeamPredictableId", 2, 0xE8F71388), + ("DT_BeamSpotlight", 9, 0xD52860B8), + ("DT_BoneFollower", 3, 0xE4510B90), + ("DT_BoneManipulate", 5, 0x02EF926B), + ("m_BonePos", 256, 0x5D8DD5BC), + ("m_BoneAng", 256, 0x58614E99), + ("m_BoneScale", 256, 0xD5D2B053), + ("m_BoneJiggle", 256, 0xDB9A1034), + ("DT_BreakableSurface", 10, 0x68DE501C), + ("m_RawPanelBitVec", 256, 0xD3089E1B), + ("DT_CitadelEnergyCore", 6, 0xF7E86D19), + ("DT_ColorCorrection", 11, 0xCFF4FF7A), + ("DT_ColorCorrectionVolume", 6, 0x7DCF53E0), + ("DT_CrossbowBolt", 1, 0x5207A553), + ("DT_DynamicLight", 8, 0x521CF1FC), + ("DT_Embers", 5, 0x9F18640F), + ("DT_EntityDissolve", 11, 0xF3BCCBD2), + ("DT_EntityFlame", 2, 0x88805543), + ("DT_EntityParticleTrail", 4, 0x53465FDF), + ("DT_EntityParticleTrailInfo", 3, 0x74ECECA4), + ("DT_EnvAmbientLight", 2, 0x4F48A2E6), + ("DT_SpatialEntity", 5, 0xBB89287F), + ("DT_DetailController", 2, 0x82E03CEC), + ("DT_EnvHeadcrabCanister", 3, 0x371F8CA0), + ("DT_EnvHeadcrabCanisterShared", 16, 0xFEDB41F3), + ("DT_EnvParticleScript", 2, 0x0833F1C0), + ("DT_EnvProjectedTexture", 15, 0x3918EEAC), + ("DT_QuadraticBeam", 5, 0x90E78DAB), + ("DT_EnvScreenEffect", 3, 0x315AFA7F), + ("DT_EnvScreenOverlay", 8, 0x1117537B), + ("DT_EnvStarfield", 3, 0x73F74C29), + ("DT_EnvTonemapController", 8, 0x7BD16A89), + ("DT_EnvWind", 1, 0x77DB8E5A), + ("DT_EnvWindShared", 13, 0x1A448419), + ("DT_FireSmoke", 7, 0xA90FC8DB), + ("DT_FireTrail", 3, 0x7A19B607), + ("DT_CFish", 8, 0xDF738BC4), + ("DT_Flare", 6, 0x47945371), + ("DT_FleshEffectTarget", 3, 0x7E669189), + ("DT_FlexManipulate", 4, 0x5FB96545), + ("m_iFlexWeights", 96, 0xE28865C9), + ("DT_FogController", 20, 0x226C9CD0), + ("DT_Func_Dust", 13, 0x373B2F39), + ("DT_Func_LOD", 3, 0x5B9F6EDA), + ("DT_FuncAreaPortalWindow", 5, 0x9020292D), + ("DT_FuncConveyor", 2, 0x13E3C2CF), + ("DT_FuncLadder", 5, 0x68DE25A6), + ("DT_FuncMonitor", 1, 0x22B9A9B4), + ("DT_FuncOccluder", 2, 0x304F4689), + ("DT_FuncReflectiveGlass", 1, 0x04724C07), + ("DT_FuncRotating", 9, 0x4881BCDD), + ("DT_FuncSmokeVolume", 11, 0x9A7E526D), + ("DT_FuncTrackTrain", 1, 0xCE4DBF26), + ("DT_GameRulesProxy", 0, 0x4D39FCF2), + ("DT_GMOD_Player", 22, 0x1B84514D), + ("DT_HL2MP_Player", 17, 0xA9ED10A3), + ("DT_HL2_Player", 3, 0x5D0AB5FC), + ("DT_HL2Local", 9, 0x2A236D31), + ("DT_HL2MPLocalPlayerExclusive", 3, 0xE3C6BC73), + ("DT_HL2MPNonLocalPlayerExclusive", 3, 0xE56D3461), + ("DT_GMODGameRulesProxy", 2, 0x176BA687), + ("DT_GMODRules", 2, 0x5E6A9E79), + ("DT_HL2MPGameRulesProxy", 2, 0xE8F99D66), + ("DT_HL2MPRules", 1, 0x1BAD0DB7), + ("DT_HL2MPMachineGun", 2, 0x3782D09F), + ("DT_HL2MPRagdoll", 6, 0x4FD66E51), + ("DT_HLMachineGun", 1, 0xAFB16A4C), + ("DT_HLSelectFireMachineGun", 1, 0xEA97A923), + ("DT_InfoLadderDismount", 1, 0xD9D6BC4A), + ("DT_InfoLightingRelative", 2, 0x99153181), + ("DT_InfoOverlayAccessor", 2, 0x427E6216), + ("DT_InfoTeleporterCountdown", 5, 0xB7CF71C1), + ("DT_LaserDot", 1, 0x52C7E0AE), + ("DT_LaserDot_HL1", 2, 0x1ACD9E32), + ("DT_LightGlow", 12, 0xDF1D19F4), + ("DT_LuaNextBot", 3, 0x47EA0CA6), + ("DT_NextBot", 1, 0x561AFEB2), + ("DT_ScriptedEntity", 1, 0x79E27B56), + ("DT_MaterialModifyControl", 13, 0xF92340FE), + ("DT_MortarShell", 4, 0x24629286), + ("DT_NPC_AntlionGuard", 4, 0x42AADE7C), + ("DT_Barnacle", 5, 0xEA7C089A), + ("DT_NPC_Barney", 1, 0x971D1C60), + ("DT_CombineGunship", 2, 0xAAFBC4A7), + ("DT_NPC_Manhack", 4, 0x6AD1225C), + ("DT_NPC_Portal_FloorTurret", 4, 0x042DEA76), + ("DT_NPC_Puppet", 3, 0x4B27C0D4), + ("DT_NPC_RocketTurret", 4, 0xAAB7939C), + ("DT_RollerMine", 5, 0xF4712450), + ("DT_NPC_Strider", 8, 0xE086E509), + ("DT_NPC_Vortigaunt", 4, 0xDEBB8ED7), + ("DT_ParticlePerformanceMonitor", 3, 0x39814488), + ("DT_ParticleSystem", 11, 0x00FFB10F), + ("m_hControlPointEnts", 63, 0xD8949D35), + ("m_iControlPointParents", 63, 0x157A0648), + ("DT_PhysBeam", 5, 0xA378A617), + ("DT_PhysBox", 1, 0x783EB4C8), + ("DT_PhysBoxMultiplayer", 3, 0xF531403E), + ("DT_PhysicsProp", 2, 0x2A9BD091), + ("DT_PhysicsPropMultiplayer", 5, 0xD133F9F5), + ("DT_PhysMagnet", 1, 0x6EA904D8), + ("DT_Plasma", 7, 0xBE79E39E), + ("DT_PlayerResource", 8, 0x389BCEA8), + ("m_iPing", 129, 0x083D63DB), + ("m_iScore", 129, 0x0853F72D), + ("m_iDeaths", 129, 0x8E507320), + ("m_bConnected", 129, 0xF92BCE1D), + ("m_iTeam", 129, 0x914A2507), + ("m_bAlive", 129, 0xA847D9D6), + ("m_iHealth", 129, 0xACC9E760), + ("m_iArmor", 129, 0xDC0942CE), + ("DT_PointCamera", 13, 0xF930E0A7), + ("DT_PointWorldText", 9, 0x5DC110BE), + ("DT_PoseController", 12, 0x2BDBBA55), + ("m_hProps", 4, 0xEEE78929), + ("m_chPoseIndex", 4, 0xE7E8FE48), + ("DT_Precipitation", 6, 0x1E8F9AC7), + ("DT_PrecipitationBlocker", 1, 0x27B6387E), + ("DT_PredictedViewModel", 1, 0xBE1BE7BF), + ("DT_PropAirboat", 6, 0xD358526D), + ("DT_PropVehicleDriveable", 14, 0xC94E5F01), + ("DT_PropCombineBall", 5, 0x204208B5), + ("DT_PropCrane", 6, 0x72EE6E9E), + ("DT_PropDoorRotating", 1, 0xB0F8CB9F), + ("DT_PropEnergyBall", 3, 0x658230A0), + ("DT_PropJeep", 2, 0x790A88CA), + ("DT_CPropJeepEpisodic", 6, 0x22BC0CD4), + ("DT_PropScalable", 10, 0x07D8D57B), + ("DT_PropVehicleChoreoGeneric", 16, 0x391FF1C1), + ("DT_PropVehiclePrisonerPod", 7, 0x6CA13C23), + ("DT_RagdollManager", 1, 0xB253B6EA), + ("DT_Ragdoll", 68, 0xB8422343), + ("DT_Ragdoll_Attached", 5, 0xC36B6959), + ("DT_RopeKeyframe", 23, 0x1AB347D3), + ("DT_RotorWashEmitter", 2, 0x6A2B8C91), + ("DT_RpgRocket", 1, 0xB192AF47), + ("DT_SceneEntity", 6, 0x75390978), + ("_ST_m_hActorList_16", 17, 0x1CF67C15), + ("_LPT_m_hActorList_16", 1, 0x349A2514), + ("DT_ScriptIntro", 19, 0x4168EF44), + ("DT_SENT_AI", 2, 0x8A74F538), + ("DT_SENT_anim", 2, 0x3A0D6E2A), + ("DT_SENT_point", 2, 0x305B932E), + ("DT_ShadowControl", 5, 0xB7AD6FF6), + ("DT_SlideshowDisplay", 9, 0x3CD7E011), + ("m_chCurrentSlideLists", 16, 0x1061CE5B), + ("DT_SmokeStack", 19, 0x014DB3FC), + ("DT_SpotlightEnd", 3, 0x671E86E5), + ("DT_Sprite", 12, 0xB5E0A716), + ("DT_SpriteOriented", 1, 0x392918E9), + ("DT_SpriteTrail", 9, 0x32BD22F2), + ("DT_SteamJet", 12, 0x7C82B831), + ("DT_Sun", 9, 0x4DF9570F), + ("DT_Team", 6, 0xE8978EEF), + ("DT_TEAntlionDust", 4, 0x586372F5), + ("DT_TEParticleSystem", 4, 0x065AB3D7), + ("DT_TEArmorRicochet", 1, 0xB4D64715), + ("DT_TEMetalSparks", 2, 0x2414F0A1), + ("DT_BaseBeam", 15, 0x28E975D5), + ("DT_TEBeamEntPoint", 5, 0x286C9C6C), + ("DT_TEBeamEnts", 3, 0x6A626525), + ("DT_TEBeamFollow", 2, 0x646BE734), + ("DT_TEBeamLaser", 3, 0xEFDBDC1E), + ("DT_TEBeamPoints", 3, 0x374493BC), + ("DT_TEBeamRing", 3, 0xACBB6CF0), + ("DT_TEBeamRingPoint", 4, 0xD33624C9), + ("DT_TEBeamSpline", 3, 0x494624D9), + ("DT_TEBloodSprite", 7, 0x778903D6), + ("DT_TEBloodStream", 7, 0xABF2D2EB), + ("DT_TEBreakModel", 12, 0x5A762BBA), + ("DT_TEBSPDecal", 4, 0xB697CEAD), + ("DT_TEBubbles", 7, 0x996056E1), + ("DT_TEBubbleTrail", 7, 0xEB8B9F8E), + ("DT_TEClientProjectile", 6, 0xEE48F32B), + ("DT_TEConcussiveExplosion", 5, 0xDF9E0588), + ("DT_TEDecal", 6, 0x3FFCA561), + ("DT_TEDust", 4, 0x52976EB1), + ("DT_TEDynamicLight", 9, 0x27966CDF), + ("DT_TEEffectDispatch", 2, 0x301EBD2A), + ("DT_EffectData", 29, 0xF0AE8900), + ("DT_TEEnergySplash", 3, 0x5B265DB1), + ("DT_TEExplosion", 5, 0x93CE5218), + ("DT_TEFizz", 5, 0x7B70A5FA), + ("DT_TEFootprintDecal", 5, 0x9B86DD21), + ("DT_TEGaussExplosion", 3, 0x43C32124), + ("DT_TEGlowSprite", 6, 0xD422488F), + ("DT_TEHL2MPFireBullets", 11, 0xC675BB7F), + ("DT_TEKillPlayerAttachments", 2, 0x9540E3DA), + ("DT_TELargeFunnel", 2, 0x59A289D4), + ("DT_TEMuzzleFlash", 5, 0x4D3036F3), + ("DT_TEPhysicsProp", 12, 0x778EA75F), + ("DT_TEPlayerAnimEvent", 3, 0x532041F7), + ("DT_TEPlayerDecal", 4, 0xFE26A6F9), + ("DT_TEProjectedDecal", 5, 0x42A7776F), + ("DT_TEShatterSurface", 15, 0x21B326B6), + ("DT_TEShowLine", 2, 0xA1CB8E7B), + ("DT_Tesla", 3, 0x0C9A5B83), + ("DT_TESmoke", 5, 0x295D51ED), + ("DT_TESparks", 4, 0x05D721CC), + ("DT_TESprite", 5, 0xB7390B84), + ("DT_TESpriteSpray", 7, 0xE5545674), + ("DT_TEWorldDecal", 3, 0xCAB24912), + ("DT_TriggerPlayerMovement", 1, 0x2187CAD2), + ("DT_VGuiScreen", 8, 0x578E891B), + ("DT_VortigauntChargeToken", 2, 0xC04E40E7), + ("DT_VortigauntEffectDispel", 2, 0x426D85F9), + ("DT_WaterBullet", 1, 0x92AFAB2E), + ("DT_WaterLODControl", 2, 0x6ADAA606), + ("DT_Weapon357", 1, 0x73C52326), + ("DT_Weapon357_HL1", 2, 0xAB46BF66), + ("DT_Weapon_SLAM", 10, 0x0808AE16), + ("DT_WeaponAlyxGun", 1, 0x808418B9), + ("DT_WeaponAnnabelle", 1, 0xBB3B3B58), + ("DT_WeaponAR2", 1, 0xEEEA1D64), + ("DT_WeaponBugBait", 3, 0x8979AAB5), + ("DT_WeaponCitizenPackage", 1, 0x6C488DEB), + ("DT_WeaponCitizenSuitcase", 1, 0xC6BFF170), + ("DT_WeaponCrossbow", 3, 0xD691E0C4), + ("DT_WeaponCrossbow_HL1", 2, 0xE37A340D), + ("DT_WeaponCrowbar", 1, 0xB5756514), + ("DT_WeaponCrowbar_HL1", 1, 0xBAA1281D), + ("DT_WeaponCubemap", 1, 0x436B006E), + ("DT_WeaponCycler", 1, 0x2266E2EB), + ("DT_WeaponEgon", 1, 0x0E87C413), + ("DT_WeaponFrag", 4, 0x555C7C06), + ("DT_WeaponGauss", 7, 0x69F56EF2), + ("DT_WeaponGlock", 1, 0x32DFEB29), + ("DT_WeaponHandGrenade", 3, 0xD5F74665), + ("DT_WeaponHgun", 3, 0x51E536EC), + ("DT_WeaponMP5", 1, 0x2DC7E251), + ("DT_WeaponOldManHarpoon", 1, 0xD5702B7B), + ("DT_WeaponPhysCannon", 10, 0x8A725D6D), + ("DT_WeaponPhysGun", 4, 0xC8A0F65A), + ("DT_WeaponPistol", 5, 0x51761FA4), + ("DT_WeaponRPG", 6, 0x0E4E9C4D), + ("DT_WeaponRPG_HL1", 4, 0xD2BEABF9), + ("DT_WeaponSatchel", 6, 0x19465344), + ("DT_WeaponShotgun", 5, 0x0D607CA0), + ("DT_WeaponShotgun_HL1", 3, 0x923C91F6), + ("DT_WeaponSMG1", 1, 0xD6F3A592), + ("DT_WeaponSnark", 2, 0xA0F852C1), + ("DT_WeaponStunStick", 2, 0x7C3E1C83), + ("DT_WeaponSWEP", 3, 0xA9839385), + ("DT_WeaponTripMine", 3, 0xF3FD77B7), + ("DT_WORLD", 9, 0xC770422E), + ("DT_DustTrail", 14, 0xB2DD2E23), + ("DT_MovieExplosion", 1, 0x3338325E), + ("DT_ParticleSmokeGrenade", 5, 0x490C65CD), + ("DT_RocketTrail", 16, 0xCAE35CA3), + ("DT_SmokeTrail", 16, 0x55D23D44), + ("DT_SporeExplosion", 8, 0x93EE5A2D), + ("DT_SporeTrail", 8, 0x01A19DD1), + ]; + + + [UnsafeAccessor(UnsafeAccessorKind.StaticMethod, Name = "ComputeCRC")] + static extern uint ComputeCRC([UnsafeAccessorType("Source.Engine.EngineSendTable, Source.Engine")] object? engineSendTable, ReadOnlySpan tables); + + static List ServerClassTables() { + foreach (Type type in typeof(Game.Server.BaseEntity).Assembly.GetTypes()) { + if (type.GetField(nameof(ServerClass), BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly)?.FieldType == typeof(ServerClass)) + RuntimeHelpers.RunClassConstructor(type.TypeHandle); + } + + List tables = []; + for (ServerClass? serverClass = ServerClass.Head; serverClass != null; serverClass = serverClass.Next) + tables.Add(serverClass.Table); + return tables; + } + + static void AddReachable(SendTable table, List tables, HashSet seen) { + if (!seen.Add(table)) + return; + tables.Add(table); + for (int i = 0; i < table.Props?.Length; i++) { + SendTable? subTable = table.Props[i].Type == SendPropType.DataTable ? table.Props[i].GetDataTable() : null; + if (subTable != null) + AddReachable(subTable, tables, seen); + } + } + + static string Format((string Table, int Props, uint CRC) entry) + => $"\t\t(\"{entry.Table}\", {entry.Props.ToString(CultureInfo.InvariantCulture)}, 0x{entry.CRC:X8}),"; + + [Fact] + public void SendTablesAreUnchanged() { + List tables = []; + HashSet seen = new(ReferenceEqualityComparer.Instance); + foreach (SendTable table in ServerClassTables()) + AddReachable(table, tables, seen); + + var actual = tables.Select(table => (Table: table.NetTableName!, Props: table.Props?.Length ?? 0, CRC: ComputeCRC(null, [table]))).ToList(); + Dictionary expected = ExpectedSendTables.ToDictionary(entry => entry.Table); + + var report = new StringBuilder(); + foreach (var entry in actual) { + if (!expected.Remove(entry.Table, out var old)) + report.AppendLine("added: " + Format(entry)); + else if (old != entry) + report.AppendLine("changed: " + Format(old).Trim() + " -> " + Format(entry).Trim()); + } + foreach (var entry in expected.Values) + report.AppendLine("removed: " + Format(entry)); + + Assert.True(report.Length == 0, report.ToString()); + } +} diff --git a/Source.Engine/EngineSendTable.cs b/Source.Engine/EngineSendTable.cs index 23668af1..736efcd4 100644 --- a/Source.Engine/EngineSendTable.cs +++ b/Source.Engine/EngineSendTable.cs @@ -8,6 +8,7 @@ using Source.Common.Networking; using System.Diagnostics; +using System.Runtime.InteropServices; namespace Source.Engine; @@ -27,19 +28,19 @@ internal static bool Init(Span tables) { for (int i = 0; i < tables.Length; i++) SendTables.Add(tables[i]); - SendTableCRC = ComputeCRC(); + SendTableCRC = ComputeCRC(CollectionsMarshal.AsSpan(SendTables)); return true; } - private static uint ComputeCRC() { + private static uint ComputeCRC(ReadOnlySpan tables) { CRC32_t result = default; CRC32.Init(ref result); // walk the tables and checksum them - int c = SendTables.Count(); + int c = tables.Length; for (int i = 0; i < c; i++) { - SendTable st = SendTables[i]; + SendTable st = tables[i]; result = SendTable_CRCTable(ref result, st); } diff --git a/Source.NET.slnx b/Source.NET.slnx index 464326fb..ddea3647 100644 --- a/Source.NET.slnx +++ b/Source.NET.slnx @@ -163,6 +163,9 @@ + + + From 47e6c209182da9d38739101eac4c66080f527a1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Thu, 22 Oct 2026 03:45:13 +0300 Subject: [PATCH 10/12] Correct network and prediction field types --- Game.Client/C_BaseAnimating.cs | 8 ++++---- Game.Client/C_BaseEntity.cs | 10 ++-------- Game.Client/C_BasePlayer.cs | 16 ++++++++-------- Game.Server/AI_BaseNPC.cs | 2 +- Game.Server/BaseAnimating.cs | 10 +++++----- Game.Server/BaseEntity.cs | 2 +- Game.Server/HL2MP/HL2MP_Player.cs | 2 +- Game.Server/Props.cs | 2 +- Game.Shared/BaseCombatWeaponShared.cs | 8 ++++---- Game.Shared/HL1/WeaponSatchel.cs | 8 ++++---- Game.Shared/HL1/WeaponShotgun_HL1.cs | 2 +- Game.Shared/Sprite.cs | 8 ++++---- .../NetworkVarGenerator.Tables.cs | 2 +- 13 files changed, 37 insertions(+), 43 deletions(-) diff --git a/Game.Client/C_BaseAnimating.cs b/Game.Client/C_BaseAnimating.cs index 54896daf..298aaffb 100644 --- a/Game.Client/C_BaseAnimating.cs +++ b/Game.Client/C_BaseAnimating.cs @@ -683,7 +683,7 @@ private void ClientSideAnimationChanged() { public void SetCycle(TimeUnit_t cycle) { if (cycle != Cycle) { - Cycle = cycle; + Cycle = (float)cycle; InvalidatePhysicsRecursive(InvalidatePhysicsBits.AnimationChanged); } @@ -1213,12 +1213,12 @@ public void OnModelLoadComplete(Model model) { UpdateVisibility(); } } - TimeUnit_t OldCycle; + float OldCycle; int OldSequence; float OldModelScale; public override void PreDataUpdate(DataUpdateType updateType) { - OldCycle = GetCycle(); + OldCycle = (float)GetCycle(); OldSequence = GetSequence(); OldModelScale = GetModelScale(); @@ -1968,7 +1968,7 @@ public override void GetAimEntOrigin(C_BaseEntity attachedTo, out Vector3 origin [NetworkVar("m_flFadeScale")] public float FadeScale; [NetworkVar("m_flCycle")] - public TimeUnit_t Cycle; + public float Cycle; public readonly InterpolatedVar iv_Cycle; public readonly InterpolatedVarArray iv_flPoseParameter; diff --git a/Game.Client/C_BaseEntity.cs b/Game.Client/C_BaseEntity.cs index 4948787f..b9613415 100644 --- a/Game.Client/C_BaseEntity.cs +++ b/Game.Client/C_BaseEntity.cs @@ -199,12 +199,6 @@ public partial class C_BaseEntity : IClientEntity nameof(CreationTime), new(nameof(Velocity)) { Encoding = NetEncoding.VectorElements, Proxy = typeof(LocalVelocityProxy) }, new(nameof(GMOD_DataTable)) { Encoding = NetEncoding.GModTable }, - nameof(GMOD_bool), - nameof(GMOD_float), - nameof(GMOD_int), - nameof(GMOD_Vector), - nameof(GMOD_QAngle), - nameof(GMOD_EHANDLE), new(nameof(GMOD_String0)) { Encoding = NetEncoding.String }, new(nameof(GMOD_String1)) { Encoding = NetEncoding.String }, new(nameof(GMOD_String2)) { Encoding = NetEncoding.String }, @@ -218,7 +212,7 @@ public partial class C_BaseEntity : IClientEntity nameof(Gravity), new(nameof(NetworkOrigin)) { Tolerance = coordTolerance }, new(nameof(NetworkAngles)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.NoErrorCheck }, - new(nameof(ModelIndex)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.ModelIndex }, + new(nameof(ModelIndex)) { Type = FieldType.Short, Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.ModelIndex }, nameof(RenderMode), nameof(RenderFX), nameof(TeamNum), @@ -913,7 +907,7 @@ public C_BaseEntity() { [NetworkVar("m_hGroundEntity")] public EHANDLE GroundEntity = new(); [NetworkVar("m_lifeState")] - public int LifeState; + public byte LifeState; [NetworkVar("m_vecBaseVelocity")] public Vector3 BaseVelocity; [NetworkVar("m_nNextThinkTick")] diff --git a/Game.Client/C_BasePlayer.cs b/Game.Client/C_BasePlayer.cs index 9083d18f..96550fad 100644 --- a/Game.Client/C_BasePlayer.cs +++ b/Game.Client/C_BasePlayer.cs @@ -57,16 +57,16 @@ public C_BasePlayer() { public static readonly new PredictionField[] Prediction = [ new(nameof(Local)) { Embedded = true }, new(nameof(pl)) { Embedded = true }, - new(nameof(FOV)) { Type = FieldType.Integer }, + nameof(FOV), nameof(ZoomOwner), new(nameof(FOVTime)) { Type = FieldType.Double }, - new(nameof(FOVStart)) { Type = FieldType.Integer }, + nameof(FOVStart), nameof(Vehicle), new(nameof(Maxspeed)) { Type = FieldType.Float, Tolerance = 0.5f }, new(nameof(Health)) { Type = FieldType.Integer }, new(nameof(NextThinkTick)) { Type = FieldType.Integer }, - new(nameof(LifeState)) { Type = FieldType.Integer }, - new(nameof(WaterLevel)) { Type = FieldType.Integer, Flags = FieldTypeDescFlags.InSendTable }, + nameof(LifeState), + new(nameof(WaterLevel)) { Flags = FieldTypeDescFlags.InSendTable }, new(nameof(BaseVelocity)) { Type = FieldType.Vector, Tolerance = 0.05f }, new(nameof(Buttons)) { Type = FieldType.Integer }, new(nameof(WaterJumpTime)) { Type = FieldType.Float }, @@ -82,11 +82,11 @@ public C_BasePlayer() { nameof(GroundEntity), nameof(ViewModel), new(nameof(SurfaceFriction)) { Type = FieldType.Float }, - new(nameof(ButtonsArray)) { Type = FieldType.Integer }, + nameof(ButtonsArray), nameof(UseWeaponsInVehicle), ]; - public int ButtonsArray; + public Source.InlineArray5 ButtonsArray; public override bool IsPlayer() => true; public override Mask PhysicsSolidMaskForEntity() => Mask.PlayerSolid; @@ -634,9 +634,9 @@ public void SetLocalViewAngles(in QAngle angles) { [NetworkVar("m_iObserverMode")] public int ObserverMode; [NetworkVar("m_iFOV")] - public int FOV; + public float FOV; [NetworkVar("m_iFOVStart")] - public int FOVStart; + public float FOVStart; [NetworkVar("m_flFOVTime")] public TimeUnit_t FOVTime; [NetworkVar("m_iDefaultFOV")] diff --git a/Game.Server/AI_BaseNPC.cs b/Game.Server/AI_BaseNPC.cs index b935a8be..da8c30ed 100644 --- a/Game.Server/AI_BaseNPC.cs +++ b/Game.Server/AI_BaseNPC.cs @@ -5612,7 +5612,7 @@ public virtual void RunTask(in Task_t task) { if (Cine.Get() == null) ClearSchedule("Waiting for script, but lost script!"); - PlaybackRate = 1.0; + PlaybackRate = 1.0f; } else if (cine == null) { DevMsg("Cine died!\n"); diff --git a/Game.Server/BaseAnimating.cs b/Game.Server/BaseAnimating.cs index 89de0f6b..d3fd2bda 100644 --- a/Game.Server/BaseAnimating.cs +++ b/Game.Server/BaseAnimating.cs @@ -122,7 +122,7 @@ public BaseAnimating() { public partial ref readonly InlineArrayMaxStudioBoneCtrls EncodedController { get; } public InlineArrayMaxStudioBoneCtrls OldEncodedController; [NetworkVar("m_nSequence")] public partial int Sequence { get; set; } - [NetworkVar("m_flPlaybackRate")] public partial TimeUnit_t PlaybackRate { get; set; } + [NetworkVar("m_flPlaybackRate")] public partial float PlaybackRate { get; set; } [NetworkVar("m_bClientSideAnimation")] public partial bool ClientSideAnimation { get; set; } [NetworkVar("m_bClientSideFrameReset")] @@ -163,7 +163,7 @@ public BaseAnimating() { public partial float FadeMaxDist { get; set; } [NetworkVar("m_flFadeScale")] public partial float FadeScale { get; set; } - [NetworkVar("m_flCycle")] public partial TimeUnit_t Cycle { get; set; } + [NetworkVar("m_flCycle")] public partial float Cycle { get; set; } [NetworkVar("m_OverrideViewTarget")] public partial Vector3 OverrideViewTarget { get; set; } @@ -350,7 +350,7 @@ public Activity GetSequenceActivity(int sequence) { } public TimeUnit_t GetPlaybackRate() => PlaybackRate; - public void SetPlaybackRate(TimeUnit_t rate) => PlaybackRate = rate; + public void SetPlaybackRate(TimeUnit_t rate) => PlaybackRate = (float)rate; public bool IsSequenceFinished() => SequenceFinished; public bool IsDissolving() => (GetFlags() & EntityFlags.Dissolving) != 0; @@ -1181,7 +1181,7 @@ public virtual void HandleAnimEvent(ref AnimEvent animEvent) { public bool SequenceFinished; public TimeUnit_t LastEventCheck; public TimeUnit_t GetCycle() => Cycle; - public void SetCycle(TimeUnit_t cycle) => Cycle = cycle; + public void SetCycle(TimeUnit_t cycle) => Cycle = (float)cycle; public void SetFadeDistance(float minFadeDist, float maxFadeDist) { FadeMinDist = minFadeDist; @@ -1282,7 +1282,7 @@ public void ResetSequenceInfo() { GroundSpeed = GetSequenceGroundSpeed(studioHdr, GetSequence()) * GetModelScale(); SequenceLoops = ((Animation.GetSequenceFlags(studioHdr, GetSequence()) & StudioAnimSeqFlags.Looping) != 0); // m_flAnimTime = gpGlobals.time; - PlaybackRate = 1.0; + PlaybackRate = 1.0f; SequenceFinished = false; LastEventCheck = 0; diff --git a/Game.Server/BaseEntity.cs b/Game.Server/BaseEntity.cs index 535809a8..3e3e947c 100644 --- a/Game.Server/BaseEntity.cs +++ b/Game.Server/BaseEntity.cs @@ -1992,7 +1992,7 @@ public bool IsFloating() { [NetworkVar("m_hGroundEntity")] public partial EHANDLE GroundEntity { get; set; } [NetworkVar("m_lifeState")] - public partial int LifeState { get; set; } + public partial byte LifeState { get; set; } [NetworkVar("m_vecBaseVelocity")] public partial Vector3 BaseVelocity { get; set; } [NetworkVar("m_nNextThinkTick")] diff --git a/Game.Server/HL2MP/HL2MP_Player.cs b/Game.Server/HL2MP/HL2MP_Player.cs index 0254a7b7..97291477 100644 --- a/Game.Server/HL2MP/HL2MP_Player.cs +++ b/Game.Server/HL2MP/HL2MP_Player.cs @@ -491,7 +491,7 @@ public override void SetAnimation(PlayerAnim playerAnim) { if (GetSequence() == animDesired) return; - PlaybackRate = 1.0; + PlaybackRate = 1.0f; ResetSequence(animDesired); SetCycle(0); return; diff --git a/Game.Server/Props.cs b/Game.Server/Props.cs index 72ac4c45..1e6bf71c 100644 --- a/Game.Server/Props.cs +++ b/Game.Server/Props.cs @@ -45,7 +45,7 @@ public override void Spawn() { SetNextThink(TICK_NEVER_THINK); AnimTime = gpGlobals.CurTime; - PlaybackRate = 0.0; + PlaybackRate = 0.0f; SetCycle(0); } public override void Precache() { } diff --git a/Game.Shared/BaseCombatWeaponShared.cs b/Game.Shared/BaseCombatWeaponShared.cs index cadff561..ba5a82d9 100644 --- a/Game.Shared/BaseCombatWeaponShared.cs +++ b/Game.Shared/BaseCombatWeaponShared.cs @@ -559,7 +559,7 @@ public virtual void UpdateAutoFire() { public float MaxRange1; public float MaxRange2; public bool ReloadsSingly; - public TimeUnit_t FireDuration; + public float FireDuration; public virtual void FinishReload() { BaseCombatCharacter? owner = GetOwner(); @@ -658,7 +658,7 @@ public virtual bool ReloadOrSwitchWeapons() { public virtual void HandleFireOnEmpty() { if (FireOnEmpty) { ReloadOrSwitchWeapons(); - FireDuration = 0.0; + FireDuration = 0.0f; } else { if (NextEmptySoundTime < gpGlobals.CurTime) { @@ -680,7 +680,7 @@ public virtual void ItemPostFrame() { //Track the duration of the fire //FIXME: Check for IN_ATTACK2 as well? //FIXME: What if we're calling ItemBusyFrame? - FireDuration = (owner.Buttons & InButtons.Attack) != 0 ? (FireDuration + gpGlobals.FrameTime) : 0.0f; + FireDuration = (owner.Buttons & InButtons.Attack) != 0 ? (FireDuration + (float)gpGlobals.FrameTime) : 0.0f; if (UsesClipsForAmmo1()) { CheckReload(); @@ -768,7 +768,7 @@ public virtual void ItemPostFrame() { if ((owner.Buttons & InButtons.Reload) != 0 && NextPrimaryAttack <= gpGlobals.CurTime && UsesClipsForAmmo1() && !InReload) { // reload when reload is pressed, or if no buttons are down and weapon is empty. Reload(); - FireDuration = 0.0; + FireDuration = 0.0f; } // ----------------------- diff --git a/Game.Shared/HL1/WeaponSatchel.cs b/Game.Shared/HL1/WeaponSatchel.cs index ff7c49ff..3f944912 100644 --- a/Game.Shared/HL1/WeaponSatchel.cs +++ b/Game.Shared/HL1/WeaponSatchel.cs @@ -26,12 +26,12 @@ public partial class WeaponSatchel : BaseHL1MPCombatWeapon [NetworkVar("m_iRadioViewIndex")] public partial int RadioViewIndex { get; set; } [NetworkVar("m_iRadioWorldIndex")] - public partial float RadioWorldIndex { get; set; } + public partial int RadioWorldIndex { get; set; } [NetworkVar("m_iSatchelViewIndex")] - public partial float SatchelViewIndex { get; set; } + public partial int SatchelViewIndex { get; set; } [NetworkVar("m_iSatchelWorldIndex")] - public partial float SatchelWorldIndex { get; set; } + public partial int SatchelWorldIndex { get; set; } [NetworkVar("m_iChargeReady")] - public partial float ChargeReady { get; set; } + public partial int ChargeReady { get; set; } } #endif diff --git a/Game.Shared/HL1/WeaponShotgun_HL1.cs b/Game.Shared/HL1/WeaponShotgun_HL1.cs index c5a8cf52..9eb4609e 100644 --- a/Game.Shared/HL1/WeaponShotgun_HL1.cs +++ b/Game.Shared/HL1/WeaponShotgun_HL1.cs @@ -20,6 +20,6 @@ public partial class WeaponShotgun_HL1 : BaseHL1MPCombatWeapon [NetworkVar("m_flPumpTime")] public partial float PumpTime { get; set; } [NetworkVar("m_fInSpecialReload")] - public partial float InSpecialReload { get; set; } + public partial int InSpecialReload { get; set; } } #endif diff --git a/Game.Shared/Sprite.cs b/Game.Shared/Sprite.cs index ba1ad27c..aa1de339 100644 --- a/Game.Shared/Sprite.cs +++ b/Game.Shared/Sprite.cs @@ -50,20 +50,20 @@ public Sprite() { [NetworkVar("m_nAttachment")] public partial int Attachment { get; set; } [NetworkVar("m_flScaleTime")] - public partial TimeUnit_t ScaleTime { get; set; } + public partial float ScaleTime { get; set; } // todo: RecvProxy_SpriteScale [NetworkVar("m_flSpriteScale")] public partial float SpriteScale { get; set; } [NetworkVar("m_flSpriteFramerate")] - public partial TimeUnit_t SpriteFramerate { get; set; } + public partial float SpriteFramerate { get; set; } [NetworkVar("m_flGlowProxySize")] public partial float GlowProxySize { get; set; } [NetworkVar("m_flHDRColorScale")] public partial float HDRColorScale { get; set; } [NetworkVar("m_flFrame")] - public partial TimeUnit_t Frame { get; set; } + public partial float Frame { get; set; } [NetworkVar("m_flBrightnessTime")] - public partial TimeUnit_t BrightnessTime { get; set; } + public partial float BrightnessTime { get; set; } [NetworkVar("m_nBrightness")] public partial int Brightness { get; set; } [NetworkVar("m_bWorldSpaceScale")] diff --git a/Source.CodeAnalysis.NetworkVars/NetworkVarGenerator.Tables.cs b/Source.CodeAnalysis.NetworkVars/NetworkVarGenerator.Tables.cs index 6ffb2222..861feef8 100644 --- a/Source.CodeAnalysis.NetworkVars/NetworkVarGenerator.Tables.cs +++ b/Source.CodeAnalysis.NetworkVars/NetworkVarGenerator.Tables.cs @@ -453,7 +453,7 @@ private static void EmitTables(SourceProductionContext spc, ImmutableArray Date: Thu, 22 Oct 2026 04:11:13 +0300 Subject: [PATCH 11/12] Add missing prediction entries from GMod --- Game.Client/C_BaseAnimating.cs | 5 +++++ Game.Client/C_BaseEntity.cs | 12 ++++++++++++ Game.Client/C_BasePlayer.cs | 6 +++--- Game.Client/C_ColorCorrectionVolume.cs | 5 +++++ Game.Client/C_PropEnergyBall.cs | 6 ++++++ Game.Client/HL2MP/C_HL2MP_Player.cs | 5 +++++ Game.Server/BaseAnimating.cs | 2 +- Game.Server/BaseEntity.cs | 3 +++ Game.Shared/BaseGrenade.cs | 9 +++++++++ Game.Shared/Beam.cs | 25 +++++++++++++++++++++++++ Game.Shared/GarrysMod/PhysBeam.cs | 8 ++++++++ Game.Shared/Sprite.cs | 12 ++++++++++++ 12 files changed, 94 insertions(+), 4 deletions(-) diff --git a/Game.Client/C_BaseAnimating.cs b/Game.Client/C_BaseAnimating.cs index 298aaffb..89f0dc64 100644 --- a/Game.Client/C_BaseAnimating.cs +++ b/Game.Client/C_BaseAnimating.cs @@ -911,7 +911,12 @@ public bool IsSequenceLooping(StudioHdr? studioHdr, int sequence) { public static readonly new PredictionField[] Prediction = [ nameof(Skin), nameof(Body), + new(nameof(Sequence)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.NoErrorCheck }, + new(nameof(PlaybackRate)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.NoErrorCheck }, + new(nameof(Cycle)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.NoErrorCheck }, + new(nameof(EncodedController)) { Tolerance = 0.02f }, nameof(PrevSequence), + new(nameof(NewSequenceParity)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.NoErrorCheck }, new(nameof(ResetEventsParity)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.NoErrorCheck }, nameof(MuzzleFlashParity), ]; diff --git a/Game.Client/C_BaseEntity.cs b/Game.Client/C_BaseEntity.cs index b9613415..76d1f8fd 100644 --- a/Game.Client/C_BaseEntity.cs +++ b/Game.Client/C_BaseEntity.cs @@ -199,6 +199,12 @@ public partial class C_BaseEntity : IClientEntity nameof(CreationTime), new(nameof(Velocity)) { Encoding = NetEncoding.VectorElements, Proxy = typeof(LocalVelocityProxy) }, new(nameof(GMOD_DataTable)) { Encoding = NetEncoding.GModTable }, + nameof(GMOD_bool), + nameof(GMOD_float), + nameof(GMOD_int), + nameof(GMOD_Vector), + nameof(GMOD_QAngle), + nameof(GMOD_EHANDLE), new(nameof(GMOD_String0)) { Encoding = NetEncoding.String }, new(nameof(GMOD_String1)) { Encoding = NetEncoding.String }, new(nameof(GMOD_String2)) { Encoding = NetEncoding.String }, @@ -210,6 +216,12 @@ public partial class C_BaseEntity : IClientEntity [PredictionTable] public static readonly PredictionField[] Prediction = [ nameof(Gravity), + nameof(GMOD_bool), + nameof(GMOD_float), + nameof(GMOD_int), + nameof(GMOD_Vector), + nameof(GMOD_QAngle), + nameof(GMOD_EHANDLE), new(nameof(NetworkOrigin)) { Tolerance = coordTolerance }, new(nameof(NetworkAngles)) { Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.NoErrorCheck }, new(nameof(ModelIndex)) { Type = FieldType.Short, Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.ModelIndex }, diff --git a/Game.Client/C_BasePlayer.cs b/Game.Client/C_BasePlayer.cs index 96550fad..12093654 100644 --- a/Game.Client/C_BasePlayer.cs +++ b/Game.Client/C_BasePlayer.cs @@ -57,10 +57,10 @@ public C_BasePlayer() { public static readonly new PredictionField[] Prediction = [ new(nameof(Local)) { Embedded = true }, new(nameof(pl)) { Embedded = true }, - nameof(FOV), + new(nameof(FOV)) { Tolerance = 50.0f }, nameof(ZoomOwner), - new(nameof(FOVTime)) { Type = FieldType.Double }, - nameof(FOVStart), + new(nameof(FOVTime)) { Type = FieldType.Double, Tolerance = 5.0f }, + new(nameof(FOVStart)) { Tolerance = 50.0f }, nameof(Vehicle), new(nameof(Maxspeed)) { Type = FieldType.Float, Tolerance = 0.5f }, new(nameof(Health)) { Type = FieldType.Integer }, diff --git a/Game.Client/C_ColorCorrectionVolume.cs b/Game.Client/C_ColorCorrectionVolume.cs index 7525f7af..b0499485 100644 --- a/Game.Client/C_ColorCorrectionVolume.cs +++ b/Game.Client/C_ColorCorrectionVolume.cs @@ -22,6 +22,11 @@ public partial class C_ColorCorrectionVolume : C_BaseEntity public float MaxWeight; [NetworkVar("m_FadeDuration")] public float FadeDuration; + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(Weight), + ]; + [NetworkVar("m_Weight")] public float Weight; [NetworkVar("m_lookupFilename")] diff --git a/Game.Client/C_PropEnergyBall.cs b/Game.Client/C_PropEnergyBall.cs index b32abdb6..38d6953e 100644 --- a/Game.Client/C_PropEnergyBall.cs +++ b/Game.Client/C_PropEnergyBall.cs @@ -14,6 +14,12 @@ public partial class C_PropEnergyBall : C_PropCombineBall new(nameof(TimeTillDeath)) { Bits = 0, Flags = PropFlags.NoScale }, ]; + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(IsInfiniteLife), + nameof(TimeTillDeath), + ]; + [NetworkVar("m_bIsInfiniteLife")] public bool IsInfiniteLife; [NetworkVar("m_fTimeTillDeath")] diff --git a/Game.Client/HL2MP/C_HL2MP_Player.cs b/Game.Client/HL2MP/C_HL2MP_Player.cs index 3ddbc242..5d526c59 100644 --- a/Game.Client/HL2MP/C_HL2MP_Player.cs +++ b/Game.Client/HL2MP/C_HL2MP_Player.cs @@ -43,6 +43,11 @@ public partial class C_HL2MP_Player : C_BaseHLPlayer [PredictionTable] public static readonly new PredictionField[] Prediction = [ + new(nameof(Cycle)) { Flags = FieldTypeDescFlags.Override | FieldTypeDescFlags.Private | FieldTypeDescFlags.NoErrorCheck }, + new(nameof(Sequence)) { Flags = FieldTypeDescFlags.Override | FieldTypeDescFlags.Private | FieldTypeDescFlags.NoErrorCheck }, + new(nameof(PlaybackRate)) { Flags = FieldTypeDescFlags.Override | FieldTypeDescFlags.Private | FieldTypeDescFlags.NoErrorCheck }, + new(nameof(EncodedController)) { Flags = FieldTypeDescFlags.Override | FieldTypeDescFlags.Private, Tolerance = 0.02f }, + new(nameof(NewSequenceParity)) { Flags = FieldTypeDescFlags.Override | FieldTypeDescFlags.Private | FieldTypeDescFlags.NoErrorCheck }, nameof(IsWalking), ]; diff --git a/Game.Server/BaseAnimating.cs b/Game.Server/BaseAnimating.cs index d3fd2bda..dbf36296 100644 --- a/Game.Server/BaseAnimating.cs +++ b/Game.Server/BaseAnimating.cs @@ -50,7 +50,7 @@ public BaseAnimating() { public const int ANIMATION_PLAYBACKRATE_BITS = 8; [PredictionTable] - public static readonly PredictionField[] Prediction = []; + public static readonly new PredictionField[] Prediction = []; [NetworkTable("DT_ServerAnimationData")] public static readonly NetworkProp[] ServerAnimationDataProps = [ diff --git a/Game.Server/BaseEntity.cs b/Game.Server/BaseEntity.cs index 3e3e947c..85ecbef8 100644 --- a/Game.Server/BaseEntity.cs +++ b/Game.Server/BaseEntity.cs @@ -563,6 +563,9 @@ public partial class BaseEntity : IServerEntity new(nameof(b_IsPlayerSimulated)) { Encoding = NetEncoding.Int, Bits = 1, Flags = PropFlags.Unsigned }, ]; + [PredictionTable] + public static readonly PredictionField[] Prediction = []; + [NetworkTable] public static readonly NetworkProp[] Props = [ new(nameof(AnimTimeMustBeFirstProps)) { Proxy = typeof(BaseEntity.ClientSideAnimationProxy) }, diff --git a/Game.Shared/BaseGrenade.cs b/Game.Shared/BaseGrenade.cs index 450ddca8..d550e780 100644 --- a/Game.Shared/BaseGrenade.cs +++ b/Game.Shared/BaseGrenade.cs @@ -22,6 +22,15 @@ public partial class BaseGrenade : BaseProjectile new(nameof(Flags)) { Bits = 16, Flags = PropFlags.Unsigned }, ]; + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(Thrower), + nameof(IsLive), + nameof(DmgRadius), + nameof(Damage), + new(nameof(Velocity)) { Tolerance = 0.5f }, + ]; + public BaseGrenade() { Thrower = new(); } diff --git a/Game.Shared/Beam.cs b/Game.Shared/Beam.cs index e1969e6e..0fd3991c 100644 --- a/Game.Shared/Beam.cs +++ b/Game.Shared/Beam.cs @@ -87,6 +87,31 @@ public partial class #endif ]; + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(BeamType), + nameof(NumBeamEnts), + nameof(AttachEntity), + nameof(AttachIndex), + nameof(HaloIndex), + nameof(HaloScale), + nameof(Width), + nameof(EndWidth), + nameof(FadeLength), + nameof(Amplitude), + nameof(StartFrame), + nameof(Speed), + nameof(RenderFX), + nameof(RenderMode), + nameof(FrameRate), + nameof(Frame), + new(nameof(RenderColor)) { Type = FieldType.Integer }, + nameof(MinDXLevel), + new(nameof(EndPos)) { Tolerance = 0.125f }, + new(nameof(ModelIndex)) { Type = FieldType.Short, Flags = FieldTypeDescFlags.InSendTable | FieldTypeDescFlags.ModelIndex }, + new(nameof(Origin)) { Tolerance = 0.125f }, + ]; + public static class BeamScrollSpeedProxy { #if CLIENT_DLL diff --git a/Game.Shared/GarrysMod/PhysBeam.cs b/Game.Shared/GarrysMod/PhysBeam.cs index dd0d3ab7..7f079579 100644 --- a/Game.Shared/GarrysMod/PhysBeam.cs +++ b/Game.Shared/GarrysMod/PhysBeam.cs @@ -28,6 +28,14 @@ public partial class new(nameof(PhysBone)) { Bits = 12 }, ]; + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(IsOn), + nameof(TargetEnt), + nameof(HoldPos), + nameof(PhysBone), + ]; + #if CLIENT_DLL public C_PhysBeam() { TargetEnt = new(); diff --git a/Game.Shared/Sprite.cs b/Game.Shared/Sprite.cs index aa1de339..12c060a0 100644 --- a/Game.Shared/Sprite.cs +++ b/Game.Shared/Sprite.cs @@ -41,6 +41,18 @@ public partial class Sprite : BaseEntity nameof(WorldSpaceScale), ]; + [PredictionTable] + public static readonly new PredictionField[] Prediction = [ + nameof(AttachedToEntity), + nameof(Attachment), + nameof(ScaleTime), + nameof(SpriteScale), + nameof(SpriteFramerate), + nameof(Frame), + nameof(BrightnessTime), + nameof(Brightness), + ]; + public Sprite() { AttachedToEntity = new(); } From 439392a94c3c9926fb982cbade709d284ff916ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Thu, 22 Oct 2026 04:53:21 +0300 Subject: [PATCH 12/12] Fix singleplayer weapon sounds and viewmodel animations --- Game.Client/C_BaseViewModel.cs | 16 ++++++++++++++++ Game.Client/CdllBoundedCVars.cs | 4 ++-- Game.Client/HLClient.cs | 9 +-------- Game.Shared/BaseCombatWeaponShared.cs | 2 +- Game.Shared/GarrysMod/GarrysMod.cs | 5 +++++ Source.Engine/Client/ClientState.cs | 4 ++-- Source.Engine/CvarUtilities.cs | 11 ++++++++++- 7 files changed, 37 insertions(+), 14 deletions(-) diff --git a/Game.Client/C_BaseViewModel.cs b/Game.Client/C_BaseViewModel.cs index 5880a8c2..fcbe5847 100644 --- a/Game.Client/C_BaseViewModel.cs +++ b/Game.Client/C_BaseViewModel.cs @@ -153,11 +153,17 @@ public override void OnDataChanged(DataUpdateType updateType) { public override void PostDataUpdate(DataUpdateType updateType) { base.PostDataUpdate(updateType); OnLatchInterpolatedVariables(LatchFlags.LatchAnimationVar); +#if GMOD_DLL + UpdateAnimationParity(); + OldAnimationParity = AnimationParity; +#endif } public override bool Interpolate(TimeUnit_t currentTime) { StudioHdr? studioHdr = GetModelPtr(); +#if !GMOD_DLL UpdateAnimationParity(); +#endif bool bret = base.Interpolate(currentTime); // Hack to extrapolate cycle counter for view model @@ -184,6 +190,16 @@ public override bool Interpolate(TimeUnit_t currentTime) { else dt = MathLib.Fmodf(dt, 1.0); } +#if GMOD_DLL + else if (dt < -1.0) { + if (!IsSequenceLooping(GetSequence())) + dt = 0.0; + else + dt = -MathLib.Fmodf(-dt, 1.0); + } + if (dt < 0.0) + dt = 1.0 - Math.Abs(dt); +#endif SetCycle(dt); return bret; } diff --git a/Game.Client/CdllBoundedCVars.cs b/Game.Client/CdllBoundedCVars.cs index 7f22262f..ff7a198e 100644 --- a/Game.Client/CdllBoundedCVars.cs +++ b/Game.Client/CdllBoundedCVars.cs @@ -5,7 +5,7 @@ namespace Game.Client; public class BoundedCvar_Predict() - : ConVar_ServerBounded("cl_predict", "1.0", FCvar.UserInfo | FCvar.NotConnected, "Perform client side prediction.") + : ConVar_ServerBounded("cl_predict", "1.0", FCvar.UserInfo, "Perform client side prediction.") { public static bool ForceCLPredictOff = false; ConVar? clientPredict; @@ -15,7 +15,7 @@ public override float GetFloat() { clientPredict ??= cvar.FindVar("sv_client_predict"); - if (clientPredict != null && clientPredict.GetInt() != -1) + if (clientPredict != null && clientPredict.GetInt() != -1 && gpGlobals.MaxClients > 1) return clientPredict.GetFloat(); else return GetBaseFloatValue(); diff --git a/Game.Client/HLClient.cs b/Game.Client/HLClient.cs index bfecb02f..9d48d6df 100644 --- a/Game.Client/HLClient.cs +++ b/Game.Client/HLClient.cs @@ -86,14 +86,7 @@ public void LevelInitPreEntity(ReadOnlySpan mapname) { garrysmod.LevelInit(mapname); #endif - if (gpGlobals.MaxClients > 1) { - if (cl_predict.GetInt() == 0) - engine.ClientCmd("cl_predict 1"); - } - else { - if (cl_predict.GetInt() != 0) - engine.ClientCmd("cl_predict 0"); - } + engine.ClientCmd(gpGlobals.MaxClients < 2 ? "cl_predict 0" : "cl_predict 1"); } public void LevelInitPostEntity() { diff --git a/Game.Shared/BaseCombatWeaponShared.cs b/Game.Shared/BaseCombatWeaponShared.cs index ba5a82d9..b1311eef 100644 --- a/Game.Shared/BaseCombatWeaponShared.cs +++ b/Game.Shared/BaseCombatWeaponShared.cs @@ -1080,7 +1080,7 @@ public bool SetIdealActivity(Activity ideal) { return true; } #if !CLIENT_DLL - bool SoundsEnabled; + bool SoundsEnabled = true; #endif public virtual bool HasWeaponIdleTimeElapsed() => gpGlobals.CurTime > TimeWeaponIdle; public virtual TimeUnit_t GetWeaponIdleTime(TimeUnit_t time) => TimeWeaponIdle; diff --git a/Game.Shared/GarrysMod/GarrysMod.cs b/Game.Shared/GarrysMod/GarrysMod.cs index 6c291d78..420b0584 100644 --- a/Game.Shared/GarrysMod/GarrysMod.cs +++ b/Game.Shared/GarrysMod/GarrysMod.cs @@ -83,6 +83,11 @@ void AddLanguageFiles(ReadOnlySpan language) { #endif public void InitializeMod(IServiceProvider services) { +#if GAME_DLL + engine.ServerCommand("sv_timeout 180\n"); + engine.ServerCommand("sv_allow_voice_from_file 0\n"); + engine.ServerCommand("sv_client_predict 1\n"); +#endif #if !SWDS get.IntroScreen()?.Update("Adding Custom Fonts", true); // todo: AddCustomFonts diff --git a/Source.Engine/Client/ClientState.cs b/Source.Engine/Client/ClientState.cs index e0f5e4e6..4554b7e9 100644 --- a/Source.Engine/Client/ClientState.cs +++ b/Source.Engine/Client/ClientState.cs @@ -486,13 +486,13 @@ protected override bool ProcessEntityMessage(SVC_EntityMessage msg) { } protected override bool ProcessPacketEntities(SVC_PacketEntities msg) { + CL.PreprocessEntities(); + if (!msg.IsDelta) ClientSidePrediction.OnReceivedUncompressedPacket(); else { if (DeltaTick == -1) return true; - - CL.PreprocessEntities(); } if (CL.LocalNetworkBackdoor != null) { diff --git a/Source.Engine/CvarUtilities.cs b/Source.Engine/CvarUtilities.cs index 0069d2ce..3ea6d7be 100644 --- a/Source.Engine/CvarUtilities.cs +++ b/Source.Engine/CvarUtilities.cs @@ -67,10 +67,19 @@ public unsafe bool IsCommand(in TokenizedCommand args) { #endif } + if (v.IsFlagSet(FCvar.NotConnected)) { +#if !SWDS + if (cl.IsConnected()) { + Dbg.ConMsg($"Can't set {v.GetName()} when connected\n"); + return true; + } +#endif + } + if (v.IsFlagSet(FCvar.Cheat)) { if (!Host.IsSinglePlayerGame() && !Host.CanCheat() #if !SWDS - && cl.IsHLTV + && !cl.IsHLTV #endif ) { Dbg.ConMsg($"Can't use cheat cvar {v.GetName()} in multiplayer, unless the server has sv_cheats set to 1.\n");