diff --git a/TrClient/TClient.cs b/TrClient/TClient.cs index e1dbf8d..bb2ad42 100644 --- a/TrClient/TClient.cs +++ b/TrClient/TClient.cs @@ -18,7 +18,7 @@ public class TClient private TcpClient client; public byte PlayerSlot { get; private set; } - public string CurRelease = "Terraria279"; + public string CurRelease = "Terraria315"; public string Username = ""; public bool IsPlaying { get; private set; } @@ -156,6 +156,7 @@ private void InternalOn() On(player => { PlayerSlot = player.PlayerSlot; + Send(new ClientUUID() { UUID = Guid.NewGuid().ToString() }); SendPlayer(); Send(new RequestWorldInfo()); }); diff --git a/TrClientTest/Program.cs b/TrClientTest/Program.cs index a21b38f..f3f3b5b 100644 --- a/TrClientTest/Program.cs +++ b/TrClientTest/Program.cs @@ -13,8 +13,8 @@ class Program static void Main(string[] args) { var client = new TClient(); - var ip = "43.248.184.35"; - ushort port = 1001; + var ip = "127.0.0.1"; + ushort port = 7777; /* ip = "43.248.184.35"; port = 7777;*/ @@ -35,7 +35,7 @@ static void Main(string[] args) bool shouldSpam = false; client.On(_ => - client.Send(new ClientUUID { UUID = Guid.Empty.ToString() })); + client.Send(new ClientUUID { UUID = Guid.NewGuid().ToString() })); client.On(_ => { if (!shouldSpam) diff --git a/TrProtocol/MessageID.cs b/TrProtocol/MessageID.cs index 5348c37..b944e16 100644 --- a/TrProtocol/MessageID.cs +++ b/TrProtocol/MessageID.cs @@ -1,4 +1,6 @@ -namespace TrProtocol; +using System.Runtime.InteropServices; + +namespace TrProtocol; public enum MessageID : byte { @@ -13,10 +15,12 @@ public enum MessageID : byte RequestTileData = 8, StatusText = 9, TileSection = 10, - FrameSection = 11, + [Obsolete("Deprecated. Framing happens as needed after TileSection is sent.")] + FrameSection = 11, SpawnPlayer = 12, PlayerControls = 13, - Unused15 = 15, + [Obsolete("Deprecated.")] + Unused15 = 15, PlayerHealth = 16, TileChange = 17, MenuSunMoon = 18, @@ -49,7 +53,8 @@ public enum MessageID : byte KillPlayer = 44, RequestReadSign = 46, ReadSign = 47, - LiquidUpdate = 48, + [Obsolete("Deprecated. Use NetLiquidModule instead.")] + LiquidUpdate = 48, StartPlaying = 49, PlayerBuffs = 50, Assorted1 = 51, @@ -74,14 +79,17 @@ public enum MessageID : byte InvasionProgressReport = 78, CombatTextInt = 81, NetModules = 82, - NPCKillCountDeathTally = 83, + [Obsolete("Deprecated.")] + NPCKillCountDeathTally = 83, QuickStackChests = 85, TileEntitySharing = 86, TileEntityPlacement = 87, ItemTweaker = 88, ItemFrameTryPlacing = 89, + [Obsolete("Deprecated.")] InstancedItem = 90, SyncEmoteBubble = 91, + [Obsolete("Deprecated.")] Unused94 = 94, MurderSomeoneElsesProjectile = 95, TeleportPlayerThroughPortal = 96, @@ -109,7 +117,6 @@ public enum MessageID : byte TileGetSection = 8, Status = 9, TileSendSection = 10, - TileFrameSection = 11, PlayerSpawn = 12, PlayerUpdate = 13, PlayerActive = 14, @@ -142,7 +149,6 @@ public enum MessageID : byte PlayerTeam = 45, SignRead = 46, SignNew = 47, - LiquidSet = 48, PlayerSpawnSelf = 49, PlayerBuff = 50, NpcSpecial = 51, @@ -177,7 +183,6 @@ public enum MessageID : byte SyncPlayerChestIndex = 80, CreateCombatText = 81, LoadNetModule = 82, - NpcKillCount = 83, PlayerStealth = 84, ForceItemIntoNearestChest = 85, UpdateTileEntity = 86, @@ -201,18 +206,23 @@ public enum MessageID : byte NpcShopItem = 104, GemLockToggle = 105, PoofOfSmoke = 106, + [Obsolete("Deprecated. Use NetTextModule instead.")] SmartTextMessage = 107, WiredCannonShot = 108, MassWireOperation = 109, MassWireOperationPay = 110, + [Obsolete("Deprecated.")] ToggleParty = 111, TreeGrowFX = 112, CrystalInvasionStart = 113, + [Obsolete] CrystalInvasionWipeAll = 114, + [Obsolete] MinionAttackTargetUpdate = 115, CrystalInvasionSendWaitTime = 116, PlayerHurtV2 = 117, PlayerDeathV2 = 118, + [Obsolete] CreateCombatTextExtended = 119, Emoji = 120, TileEntityDisplayDollItemSync = 121, @@ -223,6 +233,7 @@ public enum MessageID : byte SyncRevengeMarker = 126, RemoveRevengeMarker = 127, LandGolfBallInCup = 128, + [Obsolete] FinishedConnectingToServer = 129, FishOutNPC = 130, TamperWithNPC = 131, @@ -232,18 +243,36 @@ public enum MessageID : byte DeadPlayer = 135, SyncCavernMonsterType = 136, RequestNPCBuffRemoval = 137, + [Obsolete] ClientSyncedInventory = 138, SetCountsAsHostForGameplay = 139, SetMiscEventValues = 140, RequestLucyPopup = 141, SyncProjectileTrackers = 142, + [Obsolete] CrystalInvasionRequestedToSkipWaitTime = 143, + [Obsolete] RequestQuestEffect = 144, + [Obsolete] SyncItemsWithShimmer = 145, ShimmerActions = 146, SyncLoadout = 147, + [Obsolete] SyncItemCannotBeTakenByEnemies = 148, + DeadCellsDisplayJarTryPlacing = 149, - ServerInfo = 149, - PlayerPlatformInfo = 150 + ServerInfo = 180, + PlayerPlatformInfo = 170, + SpectatePlayer = 150, + SyncItemDespawn = 151, + ItemUseSound = 152, + NPCDebuffDamage = 153, + Ping = 154, + SyncChestSize = 155, + TELeashedEntityAnchorPlaceItem = 156, + TeamChangeFromUI = 157, + ExtraSpawnSectionLoaded = 158, + RequestSection = 159, + ItemPosition = 160, + HostToken = 161, } \ No newline at end of file diff --git a/TrProtocol/Models/BannersMessageType.cs b/TrProtocol/Models/BannersMessageType.cs new file mode 100644 index 0000000..a88e6cb --- /dev/null +++ b/TrProtocol/Models/BannersMessageType.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Models; + +public enum BannersMessageType : byte +{ + FullState, + KillCountUpdate, + ClaimCountUpdate, + ClaimRequest, + ClaimResponse +} diff --git a/TrProtocol/Models/Buff.cs b/TrProtocol/Models/Buff.cs index 1823197..fa64d0b 100644 --- a/TrProtocol/Models/Buff.cs +++ b/TrProtocol/Models/Buff.cs @@ -11,5 +11,5 @@ namespace TrProtocol.Models; public partial struct Buff { public ushort BuffType { get; set; } - public short BuffTime { get; set; } + public ushort BuffTime { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Models/ExtraSpawnPointData.cs b/TrProtocol/Models/ExtraSpawnPointData.cs new file mode 100644 index 0000000..176c736 --- /dev/null +++ b/TrProtocol/Models/ExtraSpawnPointData.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Models; + +public partial struct ExtraSpawnPointData +{ + public byte Count { get; set; } + public ShortPosition[] SpawnPoints { get; set; } +} diff --git a/TrProtocol/Models/NetModuleType.cs b/TrProtocol/Models/NetModuleType.cs index 9e8c3c9..e1e78d1 100644 --- a/TrProtocol/Models/NetModuleType.cs +++ b/TrProtocol/Models/NetModuleType.cs @@ -7,10 +7,14 @@ public enum NetModuleType : short NetPingModule = 2, NetAmbienceModule = 3, NetBestiaryModule = 4, - NetCreativeUnlocksModule = 5, - NetCreativePowersModule = 6, - NetCreativeUnlocksPlayerReportModule = 7, - NetTeleportPylonModule = 8, - NetParticlesModule = 9, - NetCreativePowerPermissionsModule = 10 + NetCreativePowersModule = 5, + NetCreativeUnlocksPlayerReportModule = 6, + NetTeleportPylonModule = 7, + NetParticlesModule = 8, + NetCreativePowerPermissionsModule = 9, + BannerSystemNetBannersModule = 10, + CraftingRequestsNetCraftingRequestsModule = 11, + TagEffectStateNetModule = 12, + LeashedEntityNetModule = 13, + UnbreakableWallScanNetModule = 14 } \ No newline at end of file diff --git a/TrProtocol/Models/ParticleOrchestraSettings.cs b/TrProtocol/Models/ParticleOrchestraSettings.cs index 23560ff..5d557c4 100644 --- a/TrProtocol/Models/ParticleOrchestraSettings.cs +++ b/TrProtocol/Models/ParticleOrchestraSettings.cs @@ -31,6 +31,6 @@ public static ParticleOrchestraSettings DeserializeFrom(BinaryReader reader) public byte IndexOfPlayerWhoInvokedThis; - public const int SerializationSize = 21; + public const int SerializationSize = 22; } diff --git a/TrProtocol/Models/QuickStackChestData.cs b/TrProtocol/Models/QuickStackChestData.cs new file mode 100644 index 0000000..526ec95 --- /dev/null +++ b/TrProtocol/Models/QuickStackChestData.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Models; + +public partial struct QuickStackChestData +{ + public int ItemCount { get; set; } + public short[] SlotIds { get; set; } + public short ChestSlot { get; set; } +} diff --git a/TrProtocol/Models/RequiredItemData.cs b/TrProtocol/Models/RequiredItemData.cs new file mode 100644 index 0000000..30a9f41 --- /dev/null +++ b/TrProtocol/Models/RequiredItemData.cs @@ -0,0 +1,12 @@ +namespace TrProtocol.Models; + +public partial struct RequiredItemData +{ + public int ItemCount { get; set; } + + public RequiredItemEntry[] ItemEntries { get; set; } + + public int ChestCount { get; set; } + + public int[] ChestSlots { get; set; } +} diff --git a/TrProtocol/Models/RequiredItemEntry.cs b/TrProtocol/Models/RequiredItemEntry.cs new file mode 100644 index 0000000..ac8ef3d --- /dev/null +++ b/TrProtocol/Models/RequiredItemEntry.cs @@ -0,0 +1,7 @@ +namespace TrProtocol.Models; + +public struct RequiredItemEntry +{ + public int ItemIdOrRecipeGroup { get; set; } + public int Stack { get; set; } +} diff --git a/TrProtocol/Models/TagEffectType.cs b/TrProtocol/Models/TagEffectType.cs new file mode 100644 index 0000000..60e41bf --- /dev/null +++ b/TrProtocol/Models/TagEffectType.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Models; + +public enum TagEffectType +{ + FullState, + ChangeActiveEffect, + ApplyTagToNPC, + EnableProcOnNPC, + ClearProcOnNPC +} diff --git a/TrProtocol/PacketSerializer.cs b/TrProtocol/PacketSerializer.cs index c3ce67d..9eb88ec 100644 --- a/TrProtocol/PacketSerializer.cs +++ b/TrProtocol/PacketSerializer.cs @@ -136,7 +136,7 @@ public Packet Deserialize(BinaryReader br0) using var br = new BinaryReader(ms); Packet result = null; var msgid = (MessageID)br.ReadByte(); - if (msgid == MessageID.NetModules) + if (msgid == MessageID.LoadNetModule) { var moduletype = (NetModuleType)br.ReadInt16(); if (moduledeserializers.TryGetValue(moduletype, out var f)) diff --git a/TrProtocol/Packets/AchievementMessageEventHappened.cs b/TrProtocol/Packets/AchievementMessageEventHappened.cs index 53499d6..29855e6 100644 --- a/TrProtocol/Packets/AchievementMessageEventHappened.cs +++ b/TrProtocol/Packets/AchievementMessageEventHappened.cs @@ -2,6 +2,6 @@ public class AchievementMessageEventHappened : Packet { - public override MessageID Type => MessageID.AchievementMessageEventHappened; + public override MessageID Type => MessageID.NotifyPlayerOfEvent; public short EventType { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/AchievementMessageNPCKilled.cs b/TrProtocol/Packets/AchievementMessageNPCKilled.cs index 294aeb1..e6e32ef 100644 --- a/TrProtocol/Packets/AchievementMessageNPCKilled.cs +++ b/TrProtocol/Packets/AchievementMessageNPCKilled.cs @@ -2,6 +2,6 @@ public class AchievementMessageNPCKilled : Packet { - public override MessageID Type => MessageID.AchievementMessageNPCKilled; + public override MessageID Type => MessageID.NotifyPlayerNpcKilled; public short NPCType { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/AddNPCBuff.cs b/TrProtocol/Packets/AddNPCBuff.cs index 7271579..02d77c7 100644 --- a/TrProtocol/Packets/AddNPCBuff.cs +++ b/TrProtocol/Packets/AddNPCBuff.cs @@ -2,7 +2,7 @@ public class AddNPCBuff : Packet, INPCSlot { - public override MessageID Type => MessageID.AddNPCBuff; + public override MessageID Type => MessageID.NpcAddBuff; public short NPCSlot { get; set; } public ushort BuffType { get; set; } public short BuffTime { get; set; } diff --git a/TrProtocol/Packets/AddPlayerBuff.cs b/TrProtocol/Packets/AddPlayerBuff.cs index e68b5c5..16d76f1 100644 --- a/TrProtocol/Packets/AddPlayerBuff.cs +++ b/TrProtocol/Packets/AddPlayerBuff.cs @@ -2,7 +2,7 @@ public class AddPlayerBuff : Packet, IOtherPlayerSlot { - public override MessageID Type => MessageID.AddPlayerBuff; + public override MessageID Type => MessageID.PlayerAddBuff; public byte OtherPlayerSlot { get; set; } public ushort BuffType { get; set; } public int BuffTime { get; set; } diff --git a/TrProtocol/Packets/AnglerQuestCountSync.cs b/TrProtocol/Packets/AnglerQuestCountSync.cs index eb354cc..693095a 100644 --- a/TrProtocol/Packets/AnglerQuestCountSync.cs +++ b/TrProtocol/Packets/AnglerQuestCountSync.cs @@ -2,7 +2,7 @@ public class AnglerQuestCountSync : Packet, IPlayerSlot { - public override MessageID Type => MessageID.AnglerQuestCountSync; + public override MessageID Type => MessageID.NumberOfAnglerQuestsCompleted; public byte PlayerSlot { get; set; } public int AnglerQuestsFinished { get; set; } public int GolferScoreAccumulated { get; set; } diff --git a/TrProtocol/Packets/AnglerQuestFinished.cs b/TrProtocol/Packets/AnglerQuestFinished.cs index 979709c..d0699a4 100644 --- a/TrProtocol/Packets/AnglerQuestFinished.cs +++ b/TrProtocol/Packets/AnglerQuestFinished.cs @@ -2,5 +2,5 @@ public class AnglerQuestFinished : Packet { - public override MessageID Type => MessageID.AnglerQuestFinished; + public override MessageID Type => MessageID.CompleteAnglerQuest; } \ No newline at end of file diff --git a/TrProtocol/Packets/Assorted1.cs b/TrProtocol/Packets/Assorted1.cs index 072fc6f..33c66f9 100644 --- a/TrProtocol/Packets/Assorted1.cs +++ b/TrProtocol/Packets/Assorted1.cs @@ -2,7 +2,7 @@ public class Assorted1 : Packet, IPlayerSlot { - public override MessageID Type => MessageID.Assorted1; + public override MessageID Type => MessageID.NpcSpecial; public byte PlayerSlot { get; set; } public byte Unknown { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/BugCatching.cs b/TrProtocol/Packets/BugCatching.cs index d8c7938..cf1119d 100644 --- a/TrProtocol/Packets/BugCatching.cs +++ b/TrProtocol/Packets/BugCatching.cs @@ -2,7 +2,7 @@ public class BugCatching : Packet, IPlayerSlot, INPCSlot { - public override MessageID Type => MessageID.BugCatching; + public override MessageID Type => MessageID.CatchNPC; public short NPCSlot { get; set; } public byte PlayerSlot { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/BugReleasing.cs b/TrProtocol/Packets/BugReleasing.cs index 30243c8..36c02bc 100644 --- a/TrProtocol/Packets/BugReleasing.cs +++ b/TrProtocol/Packets/BugReleasing.cs @@ -2,7 +2,7 @@ public class BugReleasing : Packet { - public override MessageID Type => MessageID.BugReleasing; + public override MessageID Type => MessageID.ReleaseNPC; public Position Position { get; set; } public short NPCType { get; set; } public byte Style { get; set; } diff --git a/TrProtocol/Packets/ChangeDoor.cs b/TrProtocol/Packets/ChangeDoor.cs index b8eccd5..2a382e3 100644 --- a/TrProtocol/Packets/ChangeDoor.cs +++ b/TrProtocol/Packets/ChangeDoor.cs @@ -2,7 +2,7 @@ public class ChangeDoor : Packet { - public override MessageID Type => MessageID.ChangeDoor; + public override MessageID Type => MessageID.DoorUse; public bool ChangeType { get; set; } public ShortPosition Position { get; set; } public byte Direction { get; set; } diff --git a/TrProtocol/Packets/DeadCellsDisplayJarTryPlacing.cs b/TrProtocol/Packets/DeadCellsDisplayJarTryPlacing.cs new file mode 100644 index 0000000..fe59013 --- /dev/null +++ b/TrProtocol/Packets/DeadCellsDisplayJarTryPlacing.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Packets; + +public class DeadCellsDisplayJarTryPlacing : Packet +{ + public override MessageID Type => MessageID.DeadCellsDisplayJarTryPlacing; + public ShortPosition Position { get; set; } + public short ItemType { get; set; } + public byte Prefix { get; set; } + public int Stack { get; set; } + +} diff --git a/TrProtocol/Packets/ExtraSpawnSectionLoaded.cs b/TrProtocol/Packets/ExtraSpawnSectionLoaded.cs new file mode 100644 index 0000000..dfb4c5c --- /dev/null +++ b/TrProtocol/Packets/ExtraSpawnSectionLoaded.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Packets; + +public class ExtraSpawnSectionLoaded : Packet, IPlayerSlot +{ + public override MessageID Type => MessageID.ExtraSpawnSectionLoaded; + public byte PlayerSlot { get; set; } +} diff --git a/TrProtocol/Packets/FrameSection.cs b/TrProtocol/Packets/FrameSection.cs index 04408ed..abc49f2 100644 --- a/TrProtocol/Packets/FrameSection.cs +++ b/TrProtocol/Packets/FrameSection.cs @@ -1,5 +1,6 @@ namespace TrProtocol.Packets; +[Obsolete("Deprecated. Framing happens as needed after TileSection is sent.")] public class FrameSection : Packet { public override MessageID Type => MessageID.FrameSection; diff --git a/TrProtocol/Packets/HostToken.cs b/TrProtocol/Packets/HostToken.cs new file mode 100644 index 0000000..1249b05 --- /dev/null +++ b/TrProtocol/Packets/HostToken.cs @@ -0,0 +1,7 @@ +namespace TrProtocol.Packets; + +public class HostToken : Packet +{ + public override MessageID Type => MessageID.HostToken; + public string Token { get; set; } +} diff --git a/TrProtocol/Packets/ItemOwner.cs b/TrProtocol/Packets/ItemOwner.cs index 7e41bce..5b6b73c 100644 --- a/TrProtocol/Packets/ItemOwner.cs +++ b/TrProtocol/Packets/ItemOwner.cs @@ -5,4 +5,5 @@ public class ItemOwner : Packet, IItemSlot, IOtherPlayerSlot public override MessageID Type => MessageID.ItemOwner; public short ItemSlot { get; set; } public byte OtherPlayerSlot { get; set; } + public Vector2 ItemPosition { get; set; } } diff --git a/TrProtocol/Packets/ItemPosition.cs b/TrProtocol/Packets/ItemPosition.cs new file mode 100644 index 0000000..98e503a --- /dev/null +++ b/TrProtocol/Packets/ItemPosition.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Packets; + +public class ItemPosition : Packet, IItemSlot +{ + public override MessageID Type => MessageID.ItemPosition; + public short ItemSlot { get; set; } + public Vector2 Position { get; set; } +} diff --git a/TrProtocol/Packets/ItemUseSound.cs b/TrProtocol/Packets/ItemUseSound.cs new file mode 100644 index 0000000..77bfb46 --- /dev/null +++ b/TrProtocol/Packets/ItemUseSound.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Packets; + +internal class ItemUseSound : Packet, IPlayerSlot +{ + public override MessageID Type => MessageID.ItemUseSound; + + public byte PlayerSlot { get; set; } +} diff --git a/TrProtocol/Packets/Modules/CraftingRequestsNetCraftingRequestsModuleC2S.cs b/TrProtocol/Packets/Modules/CraftingRequestsNetCraftingRequestsModuleC2S.cs new file mode 100644 index 0000000..75526e0 --- /dev/null +++ b/TrProtocol/Packets/Modules/CraftingRequestsNetCraftingRequestsModuleC2S.cs @@ -0,0 +1,10 @@ +namespace TrProtocol.Packets.Modules; + +[C2SOnly] +public class CraftingRequestsNetCraftingRequestsModuleC2S : NetModulesPacket +{ + public override MessageID Type => MessageID.NetModules; + public override NetModuleType ModuleType => NetModuleType.CraftingRequestsNetCraftingRequestsModule; + public RequiredItemData RequiredItemData { get; set; } + +} diff --git a/TrProtocol/Packets/Modules/CraftingRequestsNetCraftingRequestsModuleS2C.cs b/TrProtocol/Packets/Modules/CraftingRequestsNetCraftingRequestsModuleS2C.cs new file mode 100644 index 0000000..7de3951 --- /dev/null +++ b/TrProtocol/Packets/Modules/CraftingRequestsNetCraftingRequestsModuleS2C.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Packets.Modules; + +[S2COnly] +public class CraftingRequestsNetCraftingRequestsModuleS2C : NetModulesPacket +{ + public override MessageID Type => MessageID.NetModules; + public override NetModuleType ModuleType => NetModuleType.CraftingRequestsNetCraftingRequestsModule; + public bool Approved { get; set; } +} diff --git a/TrProtocol/Packets/Modules/NetBannersModule.cs b/TrProtocol/Packets/Modules/NetBannersModule.cs new file mode 100644 index 0000000..a9bba48 --- /dev/null +++ b/TrProtocol/Packets/Modules/NetBannersModule.cs @@ -0,0 +1,191 @@ + +namespace TrProtocol.Packets.Modules; + +public interface IBannersModule +{ + public BannersMessageType BannersType { get; } + + public void Serialize(BinaryWriter bw); + + public IBannersModule Deserialize(BinaryReader br); +} + +[Serializer(typeof(BannersModuleSerializer))] +public class BannersAdpter +{ + public BannersMessageType BannersType { get; set; } + + public IBannersModule BannersData { get; set; } + + private class BannersModuleSerializer : FieldSerializer + { + protected override BannersAdpter ReadOverride(BinaryReader br) + { + var data = new BannersAdpter() + { + BannersType = (BannersMessageType)br.ReadByte(), + }; + data.BannersData = data.BannersType switch + { + BannersMessageType.FullState => new FullStateModule().Deserialize(br), + BannersMessageType.KillCountUpdate => new KillCountUpdateModule().Deserialize(br), + BannersMessageType.ClaimCountUpdate => new ClaimCountUpdateModule().Deserialize(br), + BannersMessageType.ClaimRequest => new ClaimRequestModule().Deserialize(br), + BannersMessageType.ClaimResponse => new ClaimResponseModule().Deserialize(br), + _ => throw new NotImplementedException(), + }; + return data; + } + + protected override void WriteOverride(BinaryWriter bw, BannersAdpter t) + { + bw.Write((byte)t.BannersType); + t.BannersData.Serialize(bw); + } + } +} + +public struct FullStateModule : IBannersModule +{ + public readonly BannersMessageType BannersType => BannersMessageType.FullState; + public short KillCount { get; set; } + public int[] Kills { get; set; } + public short ClaimableBannerCount { get; set; } + public ushort[] ClaimableBanners { get; set; } + + public IBannersModule Deserialize(BinaryReader br) + { + var module = new FullStateModule + { + KillCount = br.ReadInt16() + }; + module.Kills = new int[module.KillCount]; + for (int i = 0; i < module.KillCount; i++) + { + module.Kills[i] = br.ReadInt32(); + } + module.ClaimableBannerCount = br.ReadInt16(); + module.ClaimableBanners = new ushort[module.ClaimableBannerCount]; + for (int i = 0; i < module.ClaimableBannerCount; i++) + { + module.ClaimableBanners[i] = br.ReadUInt16(); + } + return module; + } + + public readonly void Serialize(BinaryWriter bw) + { + bw.Write(KillCount); + foreach (var kill in Kills) + { + bw.Write(kill); + } + bw.Write(ClaimableBannerCount); + foreach (var banner in ClaimableBanners) + { + bw.Write(banner); + } + } +} + +public struct KillCountUpdateModule : IBannersModule +{ + public short BannerId { get; set; } + public int Kill { get; set; } + + public BannersMessageType BannersType => BannersMessageType.KillCountUpdate; + + public IBannersModule Deserialize(BinaryReader br) + { + return new KillCountUpdateModule + { + BannerId = br.ReadInt16(), + Kill = br.ReadInt32() + }; + } + + public readonly void Serialize(BinaryWriter bw) + { + bw.Write(BannerId); + bw.Write(Kill); + } +} + +public struct ClaimCountUpdateModule : IBannersModule +{ + public readonly BannersMessageType BannersType => BannersMessageType.ClaimCountUpdate; + public short BannerId { get; set; } + public ushort ClaimableBanner { get; set; } + + public IBannersModule Deserialize(BinaryReader br) + { + return new ClaimCountUpdateModule + { + BannerId = br.ReadInt16(), + ClaimableBanner = br.ReadUInt16() + }; + } + + public readonly void Serialize(BinaryWriter bw) + { + bw.Write(BannerId); + bw.Write(ClaimableBanner); + } +} + +public struct ClaimRequestModule : IBannersModule +{ + public BannersMessageType BannersType => BannersMessageType.ClaimRequest; + public short BannerId { get; set; } + public ushort Amount { get; set; } + + public IBannersModule Deserialize(BinaryReader br) + { + return new ClaimRequestModule + { + BannerId = br.ReadInt16(), + Amount = br.ReadUInt16() + }; + } + + public readonly void Serialize(BinaryWriter bw) + { + bw.Write(BannerId); + bw.Write(Amount); + } +} + +public struct ClaimResponseModule : IBannersModule +{ + public BannersMessageType BannersType => BannersMessageType.ClaimResponse; + public short BannerId { get; set; } + public ushort Amount { get; set; } + public bool Granted { get; set; } + + public IBannersModule Deserialize(BinaryReader br) + { + return new ClaimResponseModule + { + BannerId = br.ReadInt16(), + Amount = br.ReadUInt16(), + Granted = br.ReadBoolean() + }; + } + + public readonly void Serialize(BinaryWriter bw) + { + bw.Write(BannerId); + bw.Write(Amount); + bw.Write(Granted); + } +} + + +public class NetBannersModule : NetModulesPacket +{ + public override NetModuleType ModuleType => NetModuleType.BannerSystemNetBannersModule; + + public override MessageID Type => MessageID.NetModules; + + public BannersAdpter BannersData { get; set; } +} diff --git a/TrProtocol/Packets/Modules/NetCreativeUnlocksModule.cs b/TrProtocol/Packets/Modules/NetCreativeUnlocksModule.cs index c9e9952..b345f88 100644 --- a/TrProtocol/Packets/Modules/NetCreativeUnlocksModule.cs +++ b/TrProtocol/Packets/Modules/NetCreativeUnlocksModule.cs @@ -1,9 +1,9 @@ namespace TrProtocol.Packets.Modules; -public class NetCreativeUnlocksModule : NetModulesPacket -{ - public override MessageID Type => MessageID.NetModules; - public override NetModuleType ModuleType => NetModuleType.NetCreativeUnlocksModule; - public short ItemId { get; set; } - public ushort Count { get; set; } -} \ No newline at end of file +//public class NetCreativeUnlocksModule : NetModulesPacket +//{ +// public override MessageID Type => MessageID.NetModules; +// public override NetModuleType ModuleType => NetModuleType.NetCreativeUnlocksModule; +// public short ItemId { get; set; } +// public ushort Count { get; set; } +//} \ No newline at end of file diff --git a/TrProtocol/Packets/Modules/TagEffectStateNetModule.cs b/TrProtocol/Packets/Modules/TagEffectStateNetModule.cs new file mode 100644 index 0000000..b456c08 --- /dev/null +++ b/TrProtocol/Packets/Modules/TagEffectStateNetModule.cs @@ -0,0 +1,171 @@ +namespace TrProtocol.Packets.Modules; + +public interface ITagEffectStateNetModule +{ + TagEffectType TagEffectType { get; } + + public void Serialize(BinaryWriter bw); + + public ITagEffectStateNetModule Deserialize(BinaryReader br); +} +public struct TagEffectFullStateModule : ITagEffectStateNetModule +{ + public short Type { get; set; } + + public int[] TimeLeftOnNPCs { get; set; } + public int[] ProcTimeLeftOnNPCs { get; set; } + public readonly TagEffectType TagEffectType => TagEffectType.FullState; + + public ITagEffectStateNetModule Deserialize(BinaryReader br) + { + var data = new TagEffectFullStateModule + { + Type = br.ReadInt16(), + TimeLeftOnNPCs = new int[200] + }; + ReadSparseNPCTimeArray(br, data.TimeLeftOnNPCs); + if (br.BaseStream.Position < br.BaseStream.Length) + { + data.ProcTimeLeftOnNPCs = new int[200]; + ReadSparseNPCTimeArray(br, data.ProcTimeLeftOnNPCs); + } + return data; + } + + public readonly void Serialize(BinaryWriter bw) + { + bw.Write(Type); + WriteSparseNPCTimeArray(bw, TimeLeftOnNPCs); + WriteSparseNPCTimeArray(bw, ProcTimeLeftOnNPCs); + } + + public static void ReadSparseNPCTimeArray(BinaryReader reader, int[] array) + { + while (true) + { + int num = reader.ReadByte(); + if (num < array.Length) + { + array[num] = reader.ReadInt32(); + continue; + } + break; + } + } + + public static void WriteSparseNPCTimeArray(BinaryWriter writer, int[] array) + { + for (int i = 0; i < array.Length; i++) + { + int num = array[i]; + if (num != 0) + { + writer.Write((byte)i); + writer.Write(num); + } + } + writer.Write((byte)array.Length); + } +} + +public struct TagEffectChangeActiveEffectModule : ITagEffectStateNetModule +{ + public readonly TagEffectType TagEffectType => TagEffectType.ChangeActiveEffect; + public short Type { get; set; } + public ITagEffectStateNetModule Deserialize(BinaryReader br) + { + return new TagEffectChangeActiveEffectModule() { Type = br.ReadInt16() }; + } + public readonly void Serialize(BinaryWriter bw) + { + bw.Write(Type); + } +} + +public struct TagEffectApplyTagToNPCModule : ITagEffectStateNetModule +{ + public readonly TagEffectType TagEffectType => TagEffectType.ApplyTagToNPC; + + public byte NPCSlot { get; set; } + + public ITagEffectStateNetModule Deserialize(BinaryReader br) + { + return new TagEffectApplyTagToNPCModule() { NPCSlot = br.ReadByte() }; + } + public readonly void Serialize(BinaryWriter bw) + { + bw.Write(NPCSlot); + } +} + +public struct TagEffectEnableProcOnNPCModule : ITagEffectStateNetModule +{ + public byte NPCSlot { get; set; } + public readonly TagEffectType TagEffectType => TagEffectType.EnableProcOnNPC; + public ITagEffectStateNetModule Deserialize(BinaryReader br) + { + return new TagEffectEnableProcOnNPCModule() { NPCSlot = br.ReadByte() }; + } + public readonly void Serialize(BinaryWriter bw) + { + bw.Write(NPCSlot); + } +} + +public struct TagEffectClearProcOnNPCModule : ITagEffectStateNetModule +{ + public byte NPCSlot { get; set; } + public readonly TagEffectType TagEffectType => TagEffectType.ClearProcOnNPC; + public ITagEffectStateNetModule Deserialize(BinaryReader br) + { + return new TagEffectClearProcOnNPCModule() { NPCSlot = br.ReadByte() }; + } + public readonly void Serialize(BinaryWriter bw) + { + bw.Write(NPCSlot); + } +} + +[Serializer(typeof(TagEffectModuleSerializer))] +public class TagEffectAdapter +{ + public TagEffectType TagEffectType { get; set; } + public ITagEffectStateNetModule TagEffectData { get; set; } + private class TagEffectModuleSerializer : FieldSerializer + { + protected override TagEffectAdapter ReadOverride(BinaryReader br) + { + var data = new TagEffectAdapter() + { + TagEffectType = (TagEffectType)br.ReadByte(), + }; + data.TagEffectData = data.TagEffectType switch + { + TagEffectType.FullState => new TagEffectFullStateModule().Deserialize(br), + TagEffectType.ChangeActiveEffect => new TagEffectChangeActiveEffectModule().Deserialize(br), + TagEffectType.ApplyTagToNPC => new TagEffectApplyTagToNPCModule().Deserialize(br), + TagEffectType.EnableProcOnNPC => new TagEffectEnableProcOnNPCModule().Deserialize(br), + TagEffectType.ClearProcOnNPC => new TagEffectClearProcOnNPCModule().Deserialize(br), + _ => throw new NotImplementedException(), + }; + return data; + } + protected override void WriteOverride(BinaryWriter bw, TagEffectAdapter t) + { + bw.Write((byte)t.TagEffectType); + t.TagEffectData.Serialize(bw); + } +} +} + +public class TagEffectStateNetModule : NetModulesPacket, IPlayerSlot +{ + public override NetModuleType ModuleType => NetModuleType.TagEffectStateNetModule; + + public override MessageID Type => MessageID.NetModules; + + public byte PlayerSlot { get; set; } + + public TagEffectAdapter TagEffectData { get; set; } + +} diff --git a/TrProtocol/Packets/MurderSomeoneElsesProjectile.cs b/TrProtocol/Packets/MurderSomeoneElsesProjectile.cs index c428747..faea96e 100644 --- a/TrProtocol/Packets/MurderSomeoneElsesProjectile.cs +++ b/TrProtocol/Packets/MurderSomeoneElsesProjectile.cs @@ -1,9 +1,8 @@ namespace TrProtocol.Packets; -public class MurderSomeoneElsesProjectile : Packet, IOtherPlayerSlot +public class MurderSomeoneElsesProjectile : Packet { public override MessageID Type => MessageID.MurderSomeoneElsesProjectile; - public byte OtherPlayerSlot { get; set; } - public byte HighBitOfPlayerIsAlwaysZero { get; set; } = 0; + public ushort OtherPlayerSlot { get; set; } public byte AI1 { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/NPCDebuffDamage.cs b/TrProtocol/Packets/NPCDebuffDamage.cs new file mode 100644 index 0000000..b621541 --- /dev/null +++ b/TrProtocol/Packets/NPCDebuffDamage.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Packets; + +internal class NPCDebuffDamage : Packet +{ + public override MessageID Type => MessageID.NPCDebuffDamage; + public byte NPCSlot { get; set; } + public short Amount { get; set; } +} diff --git a/TrProtocol/Packets/PaintTile.cs b/TrProtocol/Packets/PaintTile.cs index 8da6f7a..01dc6d4 100644 --- a/TrProtocol/Packets/PaintTile.cs +++ b/TrProtocol/Packets/PaintTile.cs @@ -5,4 +5,6 @@ public class PaintTile : Packet public override MessageID Type => MessageID.PaintTile; public ShortPosition Position { get; set; } public byte Color { get; set; } + + public byte Unknown { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/PaintWall.cs b/TrProtocol/Packets/PaintWall.cs index 761bd5f..a0cd0ba 100644 --- a/TrProtocol/Packets/PaintWall.cs +++ b/TrProtocol/Packets/PaintWall.cs @@ -5,4 +5,5 @@ public class PaintWall : Packet public override MessageID Type => MessageID.PaintWall; public ShortPosition Position { get; set; } public byte Color { get; set; } + public byte Unknown { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/Ping.cs b/TrProtocol/Packets/Ping.cs new file mode 100644 index 0000000..bc7f4e7 --- /dev/null +++ b/TrProtocol/Packets/Ping.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Packets; + +public class Ping : Packet +{ + public override MessageID Type => MessageID.Ping; + +} diff --git a/TrProtocol/Packets/PlayerBuffs.cs b/TrProtocol/Packets/PlayerBuffs.cs index ca6baba..a9c88a7 100644 --- a/TrProtocol/Packets/PlayerBuffs.cs +++ b/TrProtocol/Packets/PlayerBuffs.cs @@ -6,4 +6,6 @@ public class PlayerBuffs : Packet, IPlayerSlot public byte PlayerSlot { get; set; } [ArraySize(44)] public ushort[] BuffTypes { get; set; } + + public ushort EndMarker { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/PlayerControls.cs b/TrProtocol/Packets/PlayerControls.cs index a634a57..810bd8a 100644 --- a/TrProtocol/Packets/PlayerControls.cs +++ b/TrProtocol/Packets/PlayerControls.cs @@ -1,4 +1,6 @@ -namespace TrProtocol.Packets; +using System.Drawing; + +namespace TrProtocol.Packets; public class PlayerControls : Packet, IPlayerSlot { @@ -12,8 +14,12 @@ public class PlayerControls : Packet, IPlayerSlot public Vector2 Position { get; set; } [Condition(nameof(Bit2), 2)] public Vector2 Velocity { get; set; } + [Condition(nameof(Bit2), 7)] + public ushort MountType { get; set; } [Condition(nameof(Bit3), 6)] public Vector2 PotionOfReturnOriginalUsePosition { get; set; } [Condition(nameof(Bit3), 6)] public Vector2 PotionOfReturnHomePosition { get; set; } + [Condition(nameof(Bit4), 5)] + public Vector2 NetCameraTarget { get; set; } } diff --git a/TrProtocol/Packets/PlayerZone.cs b/TrProtocol/Packets/PlayerZone.cs index 69a6b83..25a1a20 100644 --- a/TrProtocol/Packets/PlayerZone.cs +++ b/TrProtocol/Packets/PlayerZone.cs @@ -6,4 +6,6 @@ public class PlayerZone : Packet, IPlayerSlot public byte PlayerSlot { get; set; } [ArraySize(5)] public byte[] Zone { get; set; } + + public byte TownNPCs { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/QuickStackChests.cs b/TrProtocol/Packets/QuickStackChests.cs index 8adf781..23453e2 100644 --- a/TrProtocol/Packets/QuickStackChests.cs +++ b/TrProtocol/Packets/QuickStackChests.cs @@ -1,7 +1,8 @@ namespace TrProtocol.Packets; -public class QuickStackChests : Packet, IChestSlot +public class QuickStackChests : Packet { public override MessageID Type => MessageID.QuickStackChests; - public short ChestSlot { get; set; } + + public QuickStackChestData QuickStackChestData { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/RequestSection.cs b/TrProtocol/Packets/RequestSection.cs new file mode 100644 index 0000000..b1fc9a4 --- /dev/null +++ b/TrProtocol/Packets/RequestSection.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Packets; + +public class RequestSection : Packet +{ + public override MessageID Type => MessageID.RequestSection; + public UShortPosition Position { get; set; } +} diff --git a/TrProtocol/Packets/RequestTileData.cs b/TrProtocol/Packets/RequestTileData.cs index 8757f6b..bfd5e8b 100644 --- a/TrProtocol/Packets/RequestTileData.cs +++ b/TrProtocol/Packets/RequestTileData.cs @@ -4,4 +4,5 @@ public class RequestTileData : Packet { public override MessageID Type => MessageID.RequestTileData; public Position Position { get; set; } + public byte Team { get; set; } } diff --git a/TrProtocol/Packets/SendNPCBuffs.cs b/TrProtocol/Packets/SendNPCBuffs.cs index 832f65d..1051b82 100644 --- a/TrProtocol/Packets/SendNPCBuffs.cs +++ b/TrProtocol/Packets/SendNPCBuffs.cs @@ -6,4 +6,5 @@ public class SendNPCBuffs : Packet, INPCSlot public short NPCSlot { get; set; } [ArraySize(20)] public Buff[] Buffs { get; set; } + public short EndMarker { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/ShimmerActions.cs b/TrProtocol/Packets/ShimmerActions.cs index a6cd5de..96d51f2 100644 --- a/TrProtocol/Packets/ShimmerActions.cs +++ b/TrProtocol/Packets/ShimmerActions.cs @@ -1,20 +1,15 @@ namespace TrProtocol.Packets; -public class ShimmerActions : Packet, INPCSlot +public class ShimmerActions : Packet { public override MessageID Type => MessageID.ShimmerActions; public byte ShimmerType { get; set; } private bool IsItemShimmer => ShimmerType == 0; private bool IsPlayerShimmer => ShimmerType == 1; - private bool IsNpcShimmer => ShimmerType == 2; [Condition(nameof(IsItemShimmer))] public Vector2 ShimmerPosition { get; set; } [Condition(nameof(IsPlayerShimmer))] public Vector2 CoinPosition { get; set; } [Condition(nameof(IsPlayerShimmer))] public int CoinAmount { get; set; } - [Condition(nameof(IsNpcShimmer))] - public short NPCSlot { get; set; } - [Condition(nameof(IsNpcShimmer))] - public short NPCSlotHighBits { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/SpawnBoss.cs b/TrProtocol/Packets/SpawnBoss.cs index 2782b0f..4143da6 100644 --- a/TrProtocol/Packets/SpawnBoss.cs +++ b/TrProtocol/Packets/SpawnBoss.cs @@ -1,9 +1,8 @@ namespace TrProtocol.Packets; -public class SpawnBoss : Packet, IOtherPlayerSlot +public class SpawnBoss : Packet { - public override MessageID Type => MessageID.SpawnBoss; - public byte OtherPlayerSlot { get; set; } - public byte HighBitOfPlayerIsAlwaysZero { get; set; } = 0; + public override MessageID Type => MessageID.SpawnBossorInvasion; + public short OtherPlayerSlot { get; set; } public short NPCType { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/SpawnPlayer.cs b/TrProtocol/Packets/SpawnPlayer.cs index 9cc6383..ac74e09 100644 --- a/TrProtocol/Packets/SpawnPlayer.cs +++ b/TrProtocol/Packets/SpawnPlayer.cs @@ -8,5 +8,6 @@ public class SpawnPlayer : Packet, IPlayerSlot public int Timer { get; set; } public short DeathsPVE { get; set; } public short DeathsPVP { get; set; } + public byte Team { get; set; } public PlayerSpawnContext Context { get; set; } } diff --git a/TrProtocol/Packets/SpecialFX.cs b/TrProtocol/Packets/SpecialFX.cs index 4a38ab7..17a25ae 100644 --- a/TrProtocol/Packets/SpecialFX.cs +++ b/TrProtocol/Packets/SpecialFX.cs @@ -7,4 +7,5 @@ public class SpecialFX : Packet public Position Position { get; set; } public byte Height { get; set; } public short Gore { get; set; } + public byte Style { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/SpectatePlayer.cs b/TrProtocol/Packets/SpectatePlayer.cs new file mode 100644 index 0000000..b41b0c4 --- /dev/null +++ b/TrProtocol/Packets/SpectatePlayer.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Packets; + +public class SpectatePlayer : Packet, IPlayerSlot +{ + public override MessageID Type => MessageID.SpectatePlayer; + + public byte PlayerSlot { get; set; } + public short TargetPlayer { get; set; } +} diff --git a/TrProtocol/Packets/SyncChestSize.cs b/TrProtocol/Packets/SyncChestSize.cs new file mode 100644 index 0000000..ae39782 --- /dev/null +++ b/TrProtocol/Packets/SyncChestSize.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Packets; + +public class SyncChestSize : Packet +{ + public override MessageID Type => MessageID.SyncChestSize; + public short ChestID { get; set; } + public short Size { get; set; } +} diff --git a/TrProtocol/Packets/SyncEquipment.cs b/TrProtocol/Packets/SyncEquipment.cs index c0b5a87..9af4b61 100644 --- a/TrProtocol/Packets/SyncEquipment.cs +++ b/TrProtocol/Packets/SyncEquipment.cs @@ -8,4 +8,5 @@ public class SyncEquipment : Packet, IPlayerSlot public short Stack { get; set; } public byte Prefix { get; set; } public short ItemType { get; set; } + public BitsByte Favorited { get; set; } } diff --git a/TrProtocol/Packets/SyncItemDespawn.cs b/TrProtocol/Packets/SyncItemDespawn.cs new file mode 100644 index 0000000..b91b538 --- /dev/null +++ b/TrProtocol/Packets/SyncItemDespawn.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Packets; + +public class SyncItemDespawn : Packet, IItemSlot +{ + public override MessageID Type => MessageID.SyncItemDespawn; + + public short ItemSlot { get; set; } +} diff --git a/TrProtocol/Packets/SyncPlayer.cs b/TrProtocol/Packets/SyncPlayer.cs index f2bcead..e6f0ddf 100644 --- a/TrProtocol/Packets/SyncPlayer.cs +++ b/TrProtocol/Packets/SyncPlayer.cs @@ -5,6 +5,8 @@ public class SyncPlayer : Packet, IPlayerSlot public override MessageID Type => MessageID.SyncPlayer; public byte PlayerSlot { get; set; } public byte SkinVariant { get; set; } + public byte VoiceVariant { get; set; } + public float VoicePitchOffset { get; set; } public byte Hair { get; set; } public string Name { get; set; } public byte HairDye { get; set; } diff --git a/TrProtocol/Packets/SyncProjectile.cs b/TrProtocol/Packets/SyncProjectile.cs index e6d9a1e..8ebee22 100644 --- a/TrProtocol/Packets/SyncProjectile.cs +++ b/TrProtocol/Packets/SyncProjectile.cs @@ -4,6 +4,7 @@ public class SyncProjectile : Packet, IProjSlot, IPlayerSlot { public override MessageID Type => MessageID.SyncProjectile; public short ProjSlot { get; set; } + public short Identity { get; set; } public Vector2 Position { get; set; } public Vector2 Velocity { get; set; } public byte PlayerSlot { get; set; } diff --git a/TrProtocol/Packets/TEDisplayDollItemSync.cs b/TrProtocol/Packets/TEDisplayDollItemSync.cs index d9a4409..a8af4d6 100644 --- a/TrProtocol/Packets/TEDisplayDollItemSync.cs +++ b/TrProtocol/Packets/TEDisplayDollItemSync.cs @@ -6,6 +6,7 @@ public class TEDisplayDollItemSync : Packet, IPlayerSlot public byte PlayerSlot { get; set; } public int TileEntityID { get; set; } public byte ItemSlot { get; set; } + public byte Unknown { get; set; } public ushort ItemID { get; set; } public ushort Stack { get; set; } public byte Prefix { get; set; } diff --git a/TrProtocol/Packets/TEHatRackItemSync.cs b/TrProtocol/Packets/TEHatRackItemSync.cs index eeb8df5..3e2e203 100644 --- a/TrProtocol/Packets/TEHatRackItemSync.cs +++ b/TrProtocol/Packets/TEHatRackItemSync.cs @@ -9,4 +9,6 @@ public class TEHatRackItemSync : Packet, IPlayerSlot public ushort ItemID { get; set; } public ushort Stack { get; set; } public byte Prefix { get; set; } + public int Unknown { get; set; } = 0; + public byte EndMarker { get; set; } = 0; } \ No newline at end of file diff --git a/TrProtocol/Packets/TELeashedEntityAnchorPlaceItem.cs b/TrProtocol/Packets/TELeashedEntityAnchorPlaceItem.cs new file mode 100644 index 0000000..78c38fd --- /dev/null +++ b/TrProtocol/Packets/TELeashedEntityAnchorPlaceItem.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Packets; + +public class TELeashedEntityAnchorPlaceItem : Packet +{ + public override MessageID Type => MessageID.TELeashedEntityAnchorPlaceItem; + public Position Position { get; set; } + public short ItemType { get; set; } + +} diff --git a/TrProtocol/Packets/TamperWithNPC.cs b/TrProtocol/Packets/TamperWithNPC.cs index 79ad95f..2506376 100644 --- a/TrProtocol/Packets/TamperWithNPC.cs +++ b/TrProtocol/Packets/TamperWithNPC.cs @@ -1,6 +1,6 @@ namespace TrProtocol.Packets; -public class TamperWithNPC : Packet, INPCSlot, IOtherPlayerSlot +public class TamperWithNPC : Packet, INPCSlot { public override MessageID Type => MessageID.TamperWithNPC; public short NPCSlot { get; set; } @@ -10,6 +10,5 @@ public class TamperWithNPC : Packet, INPCSlot, IOtherPlayerSlot [Condition(nameof(_isUniqueImmune))] public int Time { get; set; } [Condition(nameof(_isUniqueImmune))] - public byte OtherPlayerSlot { get; set; } - public byte HighBitOfPlayerIsAlwaysZero { get; set; } = 0; + public short FromWho { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/TeamChangeFromUI.cs b/TrProtocol/Packets/TeamChangeFromUI.cs new file mode 100644 index 0000000..32995b3 --- /dev/null +++ b/TrProtocol/Packets/TeamChangeFromUI.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrProtocol.Packets; + +public class TeamChangeFromUI : Packet, IPlayerSlot +{ + public override MessageID Type => MessageID.TeamChangeFromUI; + public byte PlayerSlot { get; set; } + public byte Team { get; set; } +} diff --git a/TrProtocol/Packets/Teleport.cs b/TrProtocol/Packets/Teleport.cs index a47f35e..c2056da 100644 --- a/TrProtocol/Packets/Teleport.cs +++ b/TrProtocol/Packets/Teleport.cs @@ -1,11 +1,10 @@ namespace TrProtocol.Packets; -public class Teleport : Packet, IPlayerSlot +public class Teleport : Packet { public override MessageID Type => MessageID.Teleport; public BitsByte Bit1 { get; set; } - public byte PlayerSlot { get; set; } - public byte HighBitOfPlayerIsAlwaysZero { get; set; } = 0; + public short PlayerSlot { get; set; } public Vector2 Position { get; set; } public byte Style { get; set; } [Condition(nameof(Bit1), 3)] public int ExtraInfo { get; set; } diff --git a/TrProtocol/Packets/TeleportNPCThroughPortal.cs b/TrProtocol/Packets/TeleportNPCThroughPortal.cs index 591f50e..5af5d42 100644 --- a/TrProtocol/Packets/TeleportNPCThroughPortal.cs +++ b/TrProtocol/Packets/TeleportNPCThroughPortal.cs @@ -1,9 +1,9 @@ namespace TrProtocol.Packets; -public class TeleportNPCThroughPortal : Packet, INPCSlot +public class TeleportNPCThroughPortal : Packet { public override MessageID Type => MessageID.TeleportNPCThroughPortal; - public short NPCSlot { get; set; } + public ushort NPCSlot { get; set; } public ushort Extra { get; set; } public Vector2 Position { get; set; } public Vector2 Velocity { get; set; } diff --git a/TrProtocol/Packets/TeleportPlayerThroughPortal.cs b/TrProtocol/Packets/TeleportPlayerThroughPortal.cs index 880ad38..41fa4cf 100644 --- a/TrProtocol/Packets/TeleportPlayerThroughPortal.cs +++ b/TrProtocol/Packets/TeleportPlayerThroughPortal.cs @@ -4,7 +4,7 @@ public class TeleportPlayerThroughPortal : Packet, IOtherPlayerSlot { public override MessageID Type => MessageID.TeleportPlayerThroughPortal; public byte OtherPlayerSlot { get; set; } - public ushort Extra { get; set; } + public short Extra { get; set; } public Vector2 Position { get; set; } public Vector2 Velocity { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/UpdatePlayerLuckFactors.cs b/TrProtocol/Packets/UpdatePlayerLuckFactors.cs index f1154d1..b064c1b 100644 --- a/TrProtocol/Packets/UpdatePlayerLuckFactors.cs +++ b/TrProtocol/Packets/UpdatePlayerLuckFactors.cs @@ -8,6 +8,8 @@ public class UpdatePlayerLuckFactors : Packet, IPlayerSlot public float Torch { get; set; } public byte Potion { get; set; } public bool HasGardenGnomeNearby { get; set; } + public bool BrokenMirrorBadLuck { get; set; } public float Equip { get; set; } public float Coin { get; set; } + public byte KiteLuckLevel { get; set; } } \ No newline at end of file diff --git a/TrProtocol/Packets/WorldData.cs b/TrProtocol/Packets/WorldData.cs index e3cef24..4b2630a 100644 --- a/TrProtocol/Packets/WorldData.cs +++ b/TrProtocol/Packets/WorldData.cs @@ -18,7 +18,10 @@ public class WorldData : Packet public Guid WorldUniqueID { get; set; } public ulong WorldGeneratorVersion { get; set; } public byte MoonType { get; set; } - public byte TreeBackground { get; set; } + public byte TreeBackground1 { get; set; } + public byte TreeBackground2 { get; set; } + public byte TreeBackground3 { get; set; } + public byte TreeBackground4 { get; set; } public byte CorruptionBackground { get; set; } public byte JungleBackground { get; set; } public byte SnowBackground { get; set; } @@ -26,11 +29,8 @@ public class WorldData : Packet public byte CrimsonBackground { get; set; } public byte DesertBackground { get; set; } public byte OceanBackground { get; set; } - public byte UnknownBackground1 { get; set; } - public byte UnknownBackground2 { get; set; } - public byte UnknownBackground3 { get; set; } - public byte UnknownBackground4 { get; set; } - public byte UnknownBackground5 { get; set; } + public byte MushroomBackground { get; set; } + public byte UnderworldBackground { get; set; } public byte IceBackStyle { get; set; } public byte JungleBackStyle { get; set; } public byte HellBackStyle { get; set; } @@ -86,4 +86,6 @@ public class WorldData : Packet public sbyte InvasionType { get; set; } public ulong LobbyID { get; set; } public float SandstormSeverity { get; set; } + + public ExtraSpawnPointData ExtraSpawnPoints { get; set; } } diff --git a/TrProtocol/Serializers/ExtraSpawnPointSerailizer.cs b/TrProtocol/Serializers/ExtraSpawnPointSerailizer.cs new file mode 100644 index 0000000..18f26c1 --- /dev/null +++ b/TrProtocol/Serializers/ExtraSpawnPointSerailizer.cs @@ -0,0 +1,33 @@ +namespace TrProtocol.Models; + +[Serializer(typeof(ExtraSpawnPointDataSerializer))] +public partial struct ExtraSpawnPointData +{ + private class ExtraSpawnPointDataSerializer : FieldSerializer + { + protected override ExtraSpawnPointData ReadOverride(BinaryReader br) + { + var count = br.ReadByte(); + var data = new ExtraSpawnPointData() + { + Count = count, + SpawnPoints = new ShortPosition[count] + }; + for (int i = 0; i < count; i++) + { + data.SpawnPoints[i] = new ShortPosition(br.ReadInt16(), br.ReadInt16()); + } + return data; + } + protected override void WriteOverride(BinaryWriter bw, ExtraSpawnPointData t) + { + bw.Write(t.Count); + bw.Write((byte)t.SpawnPoints.Length); + foreach (ShortPosition pos in t.SpawnPoints) + { + bw.Write(pos.X); + bw.Write(pos.Y); + } + } + } +} diff --git a/TrProtocol/Serializers/InternalTypeSerializers.cs b/TrProtocol/Serializers/InternalTypeSerializers.cs index 3dc800e..e983ab3 100644 --- a/TrProtocol/Serializers/InternalTypeSerializers.cs +++ b/TrProtocol/Serializers/InternalTypeSerializers.cs @@ -88,6 +88,8 @@ protected override void WriteOverride(BinaryWriter bw, T[] t) public IConfigurable Configure(PropertyInfo prop, string version) { + Console.WriteLine(prop.DeclaringType); + Console.WriteLine(prop.Name); if (elementSerializer is IConfigurable conf) conf.Configure(prop, version); return new ArraySerializer() diff --git a/TrProtocol/Serializers/QuickStackChestSerrailizer.cs b/TrProtocol/Serializers/QuickStackChestSerrailizer.cs new file mode 100644 index 0000000..61f17e8 --- /dev/null +++ b/TrProtocol/Serializers/QuickStackChestSerrailizer.cs @@ -0,0 +1,34 @@ +namespace TrProtocol.Models; + +[Serializer(typeof(QuickStackChestDataSerializer))] +public partial struct QuickStackChestData +{ + private class QuickStackChestDataSerializer : FieldSerializer + { + protected override QuickStackChestData ReadOverride(BinaryReader br) + { + var count = br.ReadInt32(); + var data = new QuickStackChestData() + { + ItemCount = count, + SlotIds = new short[count] + }; + for (int i = 0; i < data.SlotIds.Length; i++) + { + data.SlotIds[i] = br.ReadInt16(); + } + data.ChestSlot = br.ReadInt16(); + return data; + } + protected override void WriteOverride(BinaryWriter bw, QuickStackChestData t) + { + bw.Write(t.ItemCount); + bw.Write(t.SlotIds.Length); + foreach (short slotId in t.SlotIds) + { + bw.Write(slotId); + } + bw.Write(t.ChestSlot); + } + } +} diff --git a/TrProtocol/Serializers/RequiredItemSerializer.cs b/TrProtocol/Serializers/RequiredItemSerializer.cs new file mode 100644 index 0000000..74b7616 --- /dev/null +++ b/TrProtocol/Serializers/RequiredItemSerializer.cs @@ -0,0 +1,80 @@ +namespace TrProtocol.Models; + +[Serializer(typeof(RequiredItemDataSerializer))] +public partial struct RequiredItemData +{ + private class RequiredItemDataSerializer : FieldSerializer + { + protected override RequiredItemData ReadOverride(BinaryReader br) + { + var data = new RequiredItemData() + { + ItemCount = Read7BitEncodedInt(br), + }; + var items = new RequiredItemEntry[data.ItemCount]; + for (int i = 0; i < data.ItemCount; i++) + { + items[i] = new RequiredItemEntry() + { + ItemIdOrRecipeGroup = br.ReadInt32(), + Stack = Read7BitEncodedInt(br), + }; + } + data.ChestCount = Read7BitEncodedInt(br); + var chestSlots = new int[data.ChestCount]; + for (int i = 0; i < data.ChestCount; i++) + { + chestSlots[i] = Read7BitEncodedInt(br); + } + data.ItemEntries = items; + data.ChestSlots = chestSlots; + return data; + } + + protected override void WriteOverride(BinaryWriter bw, RequiredItemData t) + { + Write7BitEncodedInt(bw, t.ItemCount); + for (int i = 0; i < t.ItemCount; i++) + { + bw.Write(t.ItemEntries[i].ItemIdOrRecipeGroup); + Write7BitEncodedInt(bw, t.ItemEntries[i].Stack); + } + Write7BitEncodedInt(bw, t.ChestCount); + for (int i = 0; i < t.ChestCount; i++) + { + Write7BitEncodedInt(bw, t.ChestSlots[i]); + } + } + + private static void Write7BitEncodedInt(BinaryWriter writer, int value) + { + uint num; + for (num = (uint)value; num > 127; num >>= 7) + { + writer.Write((byte)(num | 0xFFFFFF80u)); + } + writer.Write((byte)num); + } + + private static int Read7BitEncodedInt(BinaryReader reader) + { + uint num = 0u; + byte b; + for (int i = 0; i < 28; i += 7) + { + b = reader.ReadByte(); + num |= (uint)((b & 0x7F) << i); + if ((uint)b <= 127u) + { + return (int)num; + } + } + b = reader.ReadByte(); + if (b > 15) + { + throw new FormatException("Bad 7bit encoded int"); + } + return (int)num | (b << 28); + } + } +}