From c2e3f65a2a0d1c87e1fcd73d4f95c02e79d47dfb Mon Sep 17 00:00:00 2001 From: Chris <2648373+QuiCM@users.noreply.github.com> Date: Mon, 18 May 2020 15:47:31 +0930 Subject: [PATCH] Add modeling to new projectile handling --- TShockAPI/GetDataHandlers.cs | 14 +-- TShockAPI/Models/PlayerUpdate/MiscDataSet3.cs | 3 + .../Models/Projectiles/NewProjectileData.cs | 86 +++++++++++++++++++ TShockAPI/TShockAPI.csproj | 1 + 4 files changed, 97 insertions(+), 7 deletions(-) create mode 100644 TShockAPI/Models/Projectiles/NewProjectileData.cs diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index bdc49a63..57851fb7 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -38,6 +38,7 @@ using OTAPI.Tile; using TShockAPI.Localization; using TShockAPI.Models; using TShockAPI.Models.PlayerUpdate; +using TShockAPI.Models.Projectiles; namespace TShockAPI { @@ -2364,18 +2365,17 @@ namespace TShockAPI Vector2 vel = args.Data.ReadVector2(); byte owner = args.Data.ReadInt8(); short type = args.Data.ReadInt16(); - BitsByte bits = (BitsByte)args.Data.ReadByte(); + NewProjectileData bits = new NewProjectileData((BitsByte)args.Data.ReadByte()); float[] ai = new float[Projectile.maxAI]; for (int i = 0; i < Projectile.maxAI; ++i) - ai[i] = !bits[i] ? 0.0f : args.Data.ReadSingle(); - short dmg = bits[4] ? args.Data.ReadInt16() : (short)0; - float knockback = bits[5] ? args.Data.ReadSingle() : 0.0f; - short origDmg = bits[6] ? args.Data.ReadInt16() : (short)0; - short projUUID = bits[7] ? args.Data.ReadInt16() : (short)-1; + ai[i] = !bits.AI[i] ? 0.0f : args.Data.ReadSingle(); + short dmg = bits.HasDamage ? args.Data.ReadInt16() : (short)0; + float knockback = bits.HasKnockback ? args.Data.ReadSingle() : 0.0f; + short origDmg = bits.HasOriginalDamage ? args.Data.ReadInt16() : (short)0; + short projUUID = bits.HasUUUID ? args.Data.ReadInt16() : (short)-1; if (projUUID >= 1000) projUUID = -1; - var index = TShock.Utils.SearchProjectile(ident, owner); if (OnNewProjectile(args.Data, ident, pos, vel, knockback, dmg, owner, type, index, args.Player)) diff --git a/TShockAPI/Models/PlayerUpdate/MiscDataSet3.cs b/TShockAPI/Models/PlayerUpdate/MiscDataSet3.cs index 5b18a0fd..04a45b6a 100644 --- a/TShockAPI/Models/PlayerUpdate/MiscDataSet3.cs +++ b/TShockAPI/Models/PlayerUpdate/MiscDataSet3.cs @@ -14,6 +14,9 @@ namespace TShockAPI.Models.PlayerUpdate { public BitsByte bitsbyte; + /// + /// Gets or Sets the Sleeping flag on the backing field + /// public bool IsSleeping { get => bitsbyte[0]; diff --git a/TShockAPI/Models/Projectiles/NewProjectileData.cs b/TShockAPI/Models/Projectiles/NewProjectileData.cs new file mode 100644 index 00000000..7caa057e --- /dev/null +++ b/TShockAPI/Models/Projectiles/NewProjectileData.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Terraria; + +namespace TShockAPI.Models.Projectiles +{ + /// + /// Model for the data sent with a new projectile packet + /// + public struct NewProjectileData + { + public BitsByte bitsbyte; + + /// + /// Gets or Sets the keepTryingHoverDown flag on the backing field + /// + public bool[] AI + { + get + { + bool[] arr = new bool[Projectile.maxAI]; + for (int i = 0; i < Projectile.maxAI; i++) + { + arr[i] = bitsbyte[i]; + } + + return arr; + } + set + { + for (int i = 0; i < Projectile.maxAI; i++) + { + bitsbyte[i] = value[i]; + } + } + } + + /// + /// Gets or Sets the Damage flag on the backing field + /// + public bool HasDamage + { + get => bitsbyte[4]; + set => bitsbyte[4] = value; + } + + /// + /// Gets or Sets the Knockback flag on the backing field + /// + public bool HasKnockback + { + get => bitsbyte[5]; + set => bitsbyte[5] = value; + } + + /// + /// Gets or Sets the Original Damage flag on the backing field + /// + public bool HasOriginalDamage + { + get => bitsbyte[6]; + set => bitsbyte[6] = value; + } + + /// + /// Gets or Sets the UUID flag on the backing field + /// + public bool HasUUUID + { + get => bitsbyte[7]; + set => bitsbyte[7] = value; + } + + /// + /// Constructs a new instance of NewProjectileData with the given backing BitsByte + /// + /// + public NewProjectileData(BitsByte bitsbyte) + { + this.bitsbyte = bitsbyte; + } + } +} diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 97b54a0d..02b9e43e 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -97,6 +97,7 @@ +