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 @@
+