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

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