diff --git a/CHANGELOG.md b/CHANGELOG.md index 23493249..a59a5159 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin * Update for OTAPI 2.0.0.36 and Terraria 1.4.0.4. (@hakusaro, @Patrikkk, @DeathCradle) * Fixed /wind command. (@AxeelAnder) * Fixed NPC buff bouncer. (@AxeelAnder) +* Fixed players are unable to remove an NPC. Change `byte NPCHomeChangeEventArgs.Homeless` to `HouseholdStatus NPCHomeChangeEventArgs.HouseholdStatus`. (@AxeelAnder) ## TShock 4.4.0 (Pre-release 7 (Entangled)) * Fixed bed spawn issues when trying to remove spawn point in SSC. (@Olink) diff --git a/TShockAPI/Bouncer.cs b/TShockAPI/Bouncer.cs index dd55f6ef..e5600d90 100644 --- a/TShockAPI/Bouncer.cs +++ b/TShockAPI/Bouncer.cs @@ -1547,7 +1547,6 @@ namespace TShockAPI int id = args.ID; short x = args.X; short y = args.Y; - byte homeless = args.Homeless; if (!args.Player.HasBuildPermission(x, y)) { @@ -1558,7 +1557,8 @@ namespace TShockAPI return; } - if (!args.Player.IsInRange(x, y)) + // When kicking out an npc, x and y in args are 0, we shouldn't check range at this case + if (args.HouseholdStatus != HouseholdStatus.Homeless && !args.Player.IsInRange(x, y)) { args.Player.SendData(PacketTypes.UpdateNPCHome, "", id, Main.npc[id].homeTileX, Main.npc[id].homeTileY, Convert.ToByte(Main.npc[id].homeless)); diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 19c6f4b0..8c5a314b 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -125,7 +125,7 @@ namespace TShockAPI { PacketTypes.NpcSpecial, HandleSpecial }, { PacketTypes.NpcAddBuff, HandleNPCAddBuff }, { PacketTypes.PlayerAddBuff, HandlePlayerAddBuff }, - { PacketTypes.UpdateNPCHome, UpdateNPCHome }, + { PacketTypes.UpdateNPCHome, HandleUpdateNPCHome }, { PacketTypes.SpawnBossorInvasion, HandleSpawnBoss }, { PacketTypes.PaintTile, HandlePaintTile }, { PacketTypes.PaintWall, HandlePaintWall }, @@ -1307,6 +1307,13 @@ namespace TShockAPI return args.Handled; } + public enum HouseholdStatus : byte + { + None = 0, + Homeless = 1, + HasRoom = 2, + } + /// /// For use in a NPCHome event /// @@ -1325,15 +1332,15 @@ namespace TShockAPI /// public short Y { get; set; } /// - /// ByteBool homeless + /// HouseholdStatus of the NPC /// - public byte Homeless { get; set; } + public HouseholdStatus HouseholdStatus { get; set; } } /// /// NPCHome - Called when an NPC's home is changed /// public static HandlerList NPCHome = new HandlerList(); - private static bool OnUpdateNPCHome(TSPlayer player, MemoryStream data, short id, short x, short y, byte homeless) + private static bool OnUpdateNPCHome(TSPlayer player, MemoryStream data, short id, short x, short y, byte houseHoldStatus) { if (NPCHome == null) return false; @@ -1345,7 +1352,7 @@ namespace TShockAPI ID = id, X = x, Y = y, - Homeless = homeless, + HouseholdStatus = (HouseholdStatus) houseHoldStatus, }; NPCHome.Invoke(null, args); return args.Handled; @@ -2763,14 +2770,14 @@ namespace TShockAPI return true; } - private static bool UpdateNPCHome(GetDataHandlerArgs args) + private static bool HandleUpdateNPCHome(GetDataHandlerArgs args) { var id = args.Data.ReadInt16(); var x = args.Data.ReadInt16(); var y = args.Data.ReadInt16(); - var homeless = args.Data.ReadInt8(); + var householdStatus = args.Data.ReadInt8(); - if (OnUpdateNPCHome(args.Player, args.Data, id, x, y, homeless)) + if (OnUpdateNPCHome(args.Player, args.Data, id, x, y, householdStatus)) return true; if (!args.Player.HasPermission(Permissions.movenpc))