Merge branch 'general-devel' of https://github.com/Pryaxis/TShock into general-devel

This commit is contained in:
Chris 2020-05-18 15:47:40 +09:30
commit ea53fdf04a
3 changed files with 55 additions and 72 deletions

View file

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

View file

@ -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
/// </summary>
public byte Flag { get; set; }
/// <summary>
@ -1443,12 +1443,20 @@ namespace TShockAPI
/// Y Location
/// </summary>
public float Y { get; set; }
/// <summary>
/// Style
/// </summary>
public byte Style { get; set; }
/// <summary>
/// "Extra info"
/// </summary>
public int ExtraInfo { get; set; }
}
/// <summary>
/// NPCStrike - Called when an NPC is attacked
/// </summary>
public static HandlerList<TeleportEventArgs> Teleport = new HandlerList<TeleportEventArgs>();
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))
{

View file

@ -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";