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))