diff --git a/CHANGELOG.md b/CHANGELOG.md
index f8e2f20e..d4268cad 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -104,6 +104,8 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin
* Multiple fields got slightly renamed.
* Modifying ToggleExpert command. Main.expertMode is no longer settable. Using a Main.GameMode int property comparsion.
* GameCulture no longer has static fields to get local language. Using methods to return/compare language.
+ * Added permission "tshock.npc.spawnpets" which restricts pet spawns. This can cause high network load, so it's restricted. (@hakusaro)
+ * Updated OnTeleport to support new args per protocol changes. (@hakusaro)
## TShock 4.3.26
* Removed the stat tracking system. (@hakusaro)
diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs
index 57851fb7..94e1e76e 100644
--- a/TShockAPI/GetDataHandlers.cs
+++ b/TShockAPI/GetDataHandlers.cs
@@ -1431,8 +1431,8 @@ namespace TShockAPI
/// Flag is a bit field
/// if the first bit is set -> 0 = player, 1 = NPC
/// if the second bit is set, ignore this packet
- /// if the third bit is set, style +1
- /// if the fourth bit is set, style +1
+ /// if the third bit is set, "get extra info from target" is true
+ /// if the fourth bit is set, extra information is valid to read
///
public byte Flag { get; set; }
///
@@ -1443,12 +1443,20 @@ namespace TShockAPI
/// Y Location
///
public float Y { get; set; }
+ ///
+ /// Style
+ ///
+ public byte Style { get; set; }
+ ///
+ /// "Extra info"
+ ///
+ public int ExtraInfo { get; set; }
}
///
/// NPCStrike - Called when an NPC is attacked
///
public static HandlerList Teleport = new HandlerList();
- private static bool OnTeleport(TSPlayer player, MemoryStream data, Int16 id, byte f, float x, float y)
+ private static bool OnTeleport(TSPlayer player, MemoryStream data, Int16 id, byte f, float x, float y, byte style, int extraInfo)
{
if (Teleport == null)
return false;
@@ -1460,7 +1468,9 @@ namespace TShockAPI
ID = id,
Flag = f,
X = x,
- Y = y
+ Y = y,
+ Style = style,
+ ExtraInfo = extraInfo
};
Teleport.Invoke(null, args);
return args.Handled;
@@ -2821,6 +2831,9 @@ namespace TShockAPI
return false;
}
+ private static readonly int[] invasions = { -1, -2, -3, -4, -5, -6, -7, -8, -10, -11 };
+ private static readonly int[] pets = { -12, -13, -14 };
+ private static readonly int[] bosses = { 4, 13, 50, 125, 126, 134, 127, 128, 131, 129, 130, 222, 245, 266, 370, 657 };
private static bool HandleSpawnBoss(GetDataHandlerArgs args)
{
if (args.Player.IsBouncerThrottled())
@@ -2828,104 +2841,67 @@ namespace TShockAPI
return true;
}
- var spawnboss = false;
- var invasion = false;
var plr = args.Data.ReadInt16();
- var Type = args.Data.ReadInt16();
+ var thingType = args.Data.ReadInt16();
NPC npc = new NPC();
- npc.SetDefaults(Type);
- spawnboss = npc.boss;
- if (!spawnboss)
- {
- switch (Type)
- {
- case -1:
- case -2:
- case -3:
- case -4:
- case -5:
- case -6:
- case -7:
- case -8:
- invasion = true;
- break;
- case 4:
- case 13:
- case 50:
- case 75:
- case 125:
- case 126:
- case 127:
- case 128:
- case 129:
- case 130:
- case 131:
- case 134:
- case 222:
- case 245:
- case 266:
- case 370:
- case 398:
- case 422:
- case 439:
- case 493:
- case 507:
- case 517:
- spawnboss = true;
- break;
- }
- }
- if (spawnboss && !args.Player.HasPermission(Permissions.summonboss))
+ npc.SetDefaults(thingType);
+
+ if (bosses.Contains(thingType) && !args.Player.HasPermission(Permissions.summonboss))
{
args.Player.SendErrorMessage("You don't have permission to summon a boss.");
return true;
}
- if (invasion && !args.Player.HasPermission(Permissions.startinvasion))
+
+ if (invasions.Contains(thingType) && !args.Player.HasPermission(Permissions.startinvasion))
{
args.Player.SendErrorMessage("You don't have permission to start an invasion.");
return true;
}
- if (!spawnboss && !invasion)
+
+ if (pets.Contains(thingType) && !args.Player.HasPermission(Permissions.spawnpets))
+ {
+ args.Player.SendErrorMessage("You don't have permission to spawn pets.");
return true;
+ }
if (plr != args.Player.Index)
return true;
- string boss;
- switch (Type)
+ string thing;
+ switch (thingType)
{
case -8:
- boss = "a Moon Lord";
+ thing = "a Moon Lord";
break;
case -7:
- boss = "a Martian invasion";
+ thing = "a Martian invasion";
break;
case -6:
- boss = "an eclipse";
+ thing = "an eclipse";
break;
case -5:
- boss = "a frost moon";
+ thing = "a frost moon";
break;
case -4:
- boss = "a pumpkin moon";
+ thing = "a pumpkin moon";
break;
case -3:
- boss = "the Pirates";
+ thing = "the Pirates";
break;
case -2:
- boss = "the Snow Legion";
+ thing = "the Snow Legion";
break;
case -1:
- boss = "a Goblin Invasion";
+ thing = "a Goblin Invasion";
break;
default:
- boss = String.Format("the {0}", npc.FullName);
+ thing = String.Format("the {0}", npc.FullName);
break;
}
if (TShock.Config.AnonymousBossInvasions)
- TShock.Utils.SendLogs(string.Format("{0} summoned {1}!", args.Player.Name, boss), Color.PaleVioletRed, args.Player);
+ TShock.Utils.SendLogs(string.Format("{0} summoned {1}!", args.Player.Name, thing), Color.PaleVioletRed, args.Player);
else
- TShock.Utils.Broadcast(String.Format("{0} summoned {1}!", args.Player.Name, boss), 175, 75, 255);
+ TShock.Utils.Broadcast(String.Format("{0} summoned {1}!", args.Player.Name, thing), 175, 75, 255);
return false;
}
@@ -3023,13 +2999,12 @@ namespace TShockAPI
short id = args.Data.ReadInt16();
var x = args.Data.ReadSingle();
var y = args.Data.ReadSingle();
-
- if (OnTeleport(args.Player, args.Data, id, flag, x, y))
- return true;
+ byte style = args.Data.ReadInt8();
int type = 0;
- byte style = 0;
bool isNPC = type == 1;
+ int extraInfo = -1;
+ bool getPositionFromTarget = false;
if (flag[0])
{
@@ -3041,13 +3016,16 @@ namespace TShockAPI
}
if (flag[2])
{
- style++;
+ getPositionFromTarget = true;
}
if (flag[3])
{
- style += 2;
+ extraInfo = args.Data.ReadInt32();
}
+ if (OnTeleport(args.Player, args.Data, id, flag, x, y, style, extraInfo))
+ return true;
+
//Rod of Discord teleport (usually (may be used by modded clients to teleport))
if (type == 0 && !args.Player.HasPermission(Permissions.rod))
{
diff --git a/TShockAPI/Permissions.cs b/TShockAPI/Permissions.cs
index efd5062d..0aebd037 100644
--- a/TShockAPI/Permissions.cs
+++ b/TShockAPI/Permissions.cs
@@ -189,7 +189,7 @@ namespace TShockAPI
[Description("User can edit the spawnrate.")]
public static readonly string spawnrate = "tshock.npc.spawnrate";
- [Description("User can start an invasion.")]
+ [Description("User can start an invasion. Warning: high network use. Easy to abuse.")]
public static readonly string invade = "tshock.npc.invade";
[Description("User can hurt town NPCs.")]
@@ -198,6 +198,9 @@ namespace TShockAPI
[Description("User can spawn bosses.")]
public static readonly string spawnboss = "tshock.npc.spawnboss";
+ [Description("User can spawn pets. Warning: high network use. Easy to abuse.")]
+ public static readonly string spawnpets = "tshock.npc.spawnpets";
+
[Description("User can rename NPCs.")]
public static readonly string renamenpc = "tshock.npc.rename";