Introduce support for loadouts, and save current loadout index to SSC

We needed to modify `NetItem` to know that these new inventory now
exist.

`PlayerData` can now re/store these items, and properly sync them. It
also now knows of the player's currently selected index, and how to sync
it.
This commit is contained in:
James Puleo 2022-10-05 05:43:24 -04:00
parent 3163c88d4a
commit bfaa47ad1a
No known key found for this signature in database
GPG key ID: 3E16C7EFA34FB15D
5 changed files with 300 additions and 14 deletions

View file

@ -52,6 +52,7 @@ namespace TShockAPI
public int usingBiomeTorches;
public int happyFunTorchTime;
public int unlockedBiomeTorches;
public int currentLoadoutIndex;
public PlayerData(TSPlayer player)
{
@ -120,6 +121,7 @@ namespace TShockAPI
this.usingBiomeTorches = player.TPlayer.UsingBiomeTorches ? 1 : 0;
this.happyFunTorchTime = player.TPlayer.happyFunTorchTime ? 1 : 0;
this.unlockedBiomeTorches = player.TPlayer.unlockedBiomeTorches ? 1 : 0;
this.currentLoadoutIndex = player.TPlayer.CurrentLoadoutIndex;
Item[] inventory = player.TPlayer.inventory;
Item[] armor = player.TPlayer.armor;
@ -131,6 +133,12 @@ namespace TShockAPI
Item[] forge = player.TPlayer.bank3.item;
Item[] voidVault = player.TPlayer.bank4.item;
Item trash = player.TPlayer.trashItem;
Item[] loadout1Armor = player.TPlayer.Loadouts[0].Armor;
Item[] loadout1Dye = player.TPlayer.Loadouts[0].Dye;
Item[] loadout2Armor = player.TPlayer.Loadouts[1].Armor;
Item[] loadout2Dye = player.TPlayer.Loadouts[1].Dye;
Item[] loadout3Armor = player.TPlayer.Loadouts[2].Armor;
Item[] loadout3Dye = player.TPlayer.Loadouts[2].Dye;
for (int i = 0; i < NetItem.MaxInventory; i++)
{
@ -186,12 +194,42 @@ namespace TShockAPI
var index = i - NetItem.ForgeIndex.Item1;
this.inventory[i] = (NetItem)forge[index];
}
else
else if(i < NetItem.VoidIndex.Item2)
{
//220
var index = i - NetItem.VoidIndex.Item1;
this.inventory[i] = (NetItem)voidVault[index];
}
else if(i < NetItem.Loadout1Armor.Item2)
{
var index = i - NetItem.Loadout1Armor.Item1;
this.inventory[i] = (NetItem)loadout1Armor[index];
}
else if(i < NetItem.Loadout1Dye.Item2)
{
var index = i - NetItem.Loadout1Dye.Item1;
this.inventory[i] = (NetItem)loadout1Dye[index];
}
else if(i < NetItem.Loadout2Armor.Item2)
{
var index = i - NetItem.Loadout2Armor.Item1;
this.inventory[i] = (NetItem)loadout2Armor[index];
}
else if(i < NetItem.Loadout2Dye.Item2)
{
var index = i - NetItem.Loadout2Dye.Item1;
this.inventory[i] = (NetItem)loadout2Dye[index];
}
else if(i < NetItem.Loadout3Armor.Item2)
{
var index = i - NetItem.Loadout3Armor.Item1;
this.inventory[i] = (NetItem)loadout3Armor[index];
}
else if(i < NetItem.Loadout3Dye.Item2)
{
var index = i - NetItem.Loadout3Dye.Item1;
this.inventory[i] = (NetItem)loadout3Dye[index];
}
}
}
@ -217,6 +255,7 @@ namespace TShockAPI
player.TPlayer.UsingBiomeTorches = this.usingBiomeTorches == 1;
player.TPlayer.happyFunTorchTime = this.happyFunTorchTime == 1;
player.TPlayer.unlockedBiomeTorches = this.unlockedBiomeTorches == 1;
player.TPlayer.CurrentLoadoutIndex = this.currentLoadoutIndex;
if (extraSlot != null)
player.TPlayer.extraAccessory = extraSlot.Value == 1 ? true : false;
@ -353,7 +392,7 @@ namespace TShockAPI
player.TPlayer.bank3.item[index].Prefix((byte)this.inventory[i].PrefixId);
}
}
else
else if (i < NetItem.VoidIndex.Item2)
{
//260
var index = i - NetItem.VoidIndex.Item1;
@ -365,8 +404,81 @@ namespace TShockAPI
player.TPlayer.bank4.item[index].Prefix((byte)this.inventory[i].PrefixId);
}
}
else if (i < NetItem.Loadout1Armor.Item2)
{
var index = i - NetItem.Loadout1Armor.Item1;
player.TPlayer.Loadouts[0].Armor[index].netDefaults(this.inventory[i].NetId);
if (player.TPlayer.Loadouts[0].Armor[index].netID != 0)
{
player.TPlayer.Loadouts[0].Armor[index].stack = this.inventory[i].Stack;
player.TPlayer.Loadouts[0].Armor[index].Prefix((byte)this.inventory[i].PrefixId);
}
}
else if (i < NetItem.Loadout1Dye.Item2)
{
var index = i - NetItem.Loadout1Dye.Item1;
player.TPlayer.Loadouts[0].Dye[index].netDefaults(this.inventory[i].NetId);
if (player.TPlayer.Loadouts[0].Dye[index].netID != 0)
{
player.TPlayer.Loadouts[0].Dye[index].stack = this.inventory[i].Stack;
player.TPlayer.Loadouts[0].Dye[index].Prefix((byte)this.inventory[i].PrefixId);
}
}
else if (i < NetItem.Loadout2Armor.Item2)
{
var index = i - NetItem.Loadout2Armor.Item1;
player.TPlayer.Loadouts[1].Armor[index].netDefaults(this.inventory[i].NetId);
if (player.TPlayer.Loadouts[1].Armor[index].netID != 0)
{
player.TPlayer.Loadouts[1].Armor[index].stack = this.inventory[i].Stack;
player.TPlayer.Loadouts[1].Armor[index].Prefix((byte)this.inventory[i].PrefixId);
}
}
else if (i < NetItem.Loadout2Dye.Item2)
{
var index = i - NetItem.Loadout2Dye.Item1;
player.TPlayer.Loadouts[1].Dye[index].netDefaults(this.inventory[i].NetId);
if (player.TPlayer.Loadouts[1].Dye[index].netID != 0)
{
player.TPlayer.Loadouts[1].Dye[index].stack = this.inventory[i].Stack;
player.TPlayer.Loadouts[1].Dye[index].Prefix((byte)this.inventory[i].PrefixId);
}
}
else if (i < NetItem.Loadout3Armor.Item2)
{
var index = i - NetItem.Loadout3Armor.Item1;
player.TPlayer.Loadouts[2].Armor[index].netDefaults(this.inventory[i].NetId);
if (player.TPlayer.Loadouts[2].Armor[index].netID != 0)
{
player.TPlayer.Loadouts[2].Armor[index].stack = this.inventory[i].Stack;
player.TPlayer.Loadouts[2].Armor[index].Prefix((byte)this.inventory[i].PrefixId);
}
}
else if (i < NetItem.Loadout3Dye.Item2)
{
var index = i - NetItem.Loadout3Dye.Item1;
player.TPlayer.Loadouts[2].Dye[index].netDefaults(this.inventory[i].NetId);
if (player.TPlayer.Loadouts[2].Dye[index].netID != 0)
{
player.TPlayer.Loadouts[2].Dye[index].stack = this.inventory[i].Stack;
player.TPlayer.Loadouts[2].Dye[index].Prefix((byte)this.inventory[i].PrefixId);
}
}
}
// Just like in MessageBuffer when the client receives a ContinueConnecting, let's sync the CurrentLoadoutIndex _before_ any of
// the items.
// This is sent to everyone BUT this player, and then ONLY this player. When using UUID login, it is too soon for the server to
// broadcast packets to this client.
NetMessage.SendData((int)PacketTypes.SyncLoadout, remoteClient: player.Index, number: player.Index, number2: player.TPlayer.CurrentLoadoutIndex);
NetMessage.SendData((int)PacketTypes.SyncLoadout, ignoreClient: player.Index, number: player.Index, number2: player.TPlayer.CurrentLoadoutIndex);
float slot = 0f;
for (int k = 0; k < NetItem.InventorySlots; k++)
{
@ -414,6 +526,36 @@ namespace TShockAPI
NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].bank4.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank4.item[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.LoadoutArmorSlots; k++)
{
NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].Loadouts[0].Armor[k].Name), player.Index, slot, (float)Main.player[player.Index].Loadouts[0].Armor[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.LoadoutDyeSlots; k++)
{
NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].Loadouts[0].Dye[k].Name), player.Index, slot, (float)Main.player[player.Index].Loadouts[0].Dye[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.LoadoutArmorSlots; k++)
{
NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].Loadouts[1].Armor[k].Name), player.Index, slot, (float)Main.player[player.Index].Loadouts[1].Armor[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.LoadoutDyeSlots; k++)
{
NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].Loadouts[1].Dye[k].Name), player.Index, slot, (float)Main.player[player.Index].Loadouts[1].Dye[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.LoadoutArmorSlots; k++)
{
NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].Loadouts[2].Armor[k].Name), player.Index, slot, (float)Main.player[player.Index].Loadouts[2].Armor[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.LoadoutDyeSlots; k++)
{
NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].Loadouts[1].Dye[k].Name), player.Index, slot, (float)Main.player[player.Index].Loadouts[2].Dye[k].prefix);
slot++;
}
NetMessage.SendData(4, -1, -1, NetworkText.FromLiteral(player.Name), player.Index, 0f, 0f, 0f, 0);
@ -467,6 +609,36 @@ namespace TShockAPI
NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].bank4.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank4.item[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.LoadoutArmorSlots; k++)
{
NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].Loadouts[0].Armor[k].Name), player.Index, slot, (float)Main.player[player.Index].Loadouts[0].Armor[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.LoadoutDyeSlots; k++)
{
NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].Loadouts[0].Dye[k].Name), player.Index, slot, (float)Main.player[player.Index].Loadouts[0].Dye[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.LoadoutArmorSlots; k++)
{
NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].Loadouts[1].Armor[k].Name), player.Index, slot, (float)Main.player[player.Index].Loadouts[1].Armor[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.LoadoutDyeSlots; k++)
{
NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].Loadouts[1].Dye[k].Name), player.Index, slot, (float)Main.player[player.Index].Loadouts[1].Dye[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.LoadoutArmorSlots; k++)
{
NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].Loadouts[2].Armor[k].Name), player.Index, slot, (float)Main.player[player.Index].Loadouts[2].Armor[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.LoadoutDyeSlots; k++)
{
NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].Loadouts[2].Dye[k].Name), player.Index, slot, (float)Main.player[player.Index].Loadouts[2].Dye[k].prefix);
slot++;
}