Fixed all known bugs to server side inventory, its now fully tested.

Fixed pvp related stuff, its now fully working.
Inventory data is per account, not per character since I can't get SQLite to do something I need it to do.
Pvp throttling hardcoded because client side has a limit of 5 seconds, so double enforce it server side.
This commit is contained in:
Zidonuke 2011-12-20 21:30:06 -05:00
parent d343983f2c
commit f414fb4e39
4 changed files with 36 additions and 27 deletions

View file

@ -34,7 +34,6 @@ namespace TShockAPI.DB
var table = new SqlTable("Inventory",
new SqlColumn("Account", MySqlDbType.Int32) { Primary = true },
new SqlColumn("CharacterName", MySqlDbType.VarChar, 50),
new SqlColumn("MaxHealth", MySqlDbType.Int32),
new SqlColumn("MaxMana", MySqlDbType.Int32),
new SqlColumn("Inventory", MySqlDbType.Text)
@ -49,7 +48,7 @@ namespace TShockAPI.DB
try
{
using (var reader = database.QueryReader("SELECT * FROM Inventory WHERE Account=@0 AND CharacterName=@1", acctid, player.Name))
using (var reader = database.QueryReader("SELECT * FROM Inventory WHERE Account=@0", acctid))
{
if (reader.Read())
{
@ -77,7 +76,7 @@ namespace TShockAPI.DB
{
try
{
database.Query("INSERT INTO Inventory (Account, CharacterName, MaxHealth, MaxMana, Inventory) VALUES (@0, @1, @2, @3, @4);", acctid, player.Name, playerData.maxHealth, playerData.maxMana, NetItem.ToString(playerData.inventory));
database.Query("INSERT INTO Inventory (Account, MaxHealth, MaxMana, Inventory) VALUES (@0, @1, @2, @3);", acctid, playerData.maxHealth, playerData.maxMana, NetItem.ToString(playerData.inventory));
return true;
}
catch (Exception ex)
@ -89,7 +88,7 @@ namespace TShockAPI.DB
{
try
{
database.Query("UPDATE Inventory SET MaxHealth = @0, MaxMana = @1, Inventory = @3 WHERE Account = @4 AND CharacterName = @5;", playerData.maxHealth, playerData.maxMana, NetItem.ToString(playerData.inventory), player.Name, acctid);
database.Query("UPDATE Inventory SET MaxHealth = @0, MaxMana = @1, Inventory = @2 WHERE Account = @3;", playerData.maxHealth, playerData.maxMana, NetItem.ToString(playerData.inventory), acctid);
return true;
}
catch (Exception ex)

View file

@ -524,7 +524,7 @@ namespace TShockAPI
if (args.TPlayer.hostile != pvp)
{
long seconds = (long)(DateTime.UtcNow - args.Player.LastPvpChange).TotalSeconds;
if (TShock.Config.PvpThrottle > 0 && seconds < TShock.Config.PvpThrottle)
if (seconds > 5)
{
TSPlayer.All.SendMessage(string.Format("{0} has {1} PvP!", args.Player.Name, pvp ? "enabled" : "disabled"), Main.teamColor[args.Player.Team]);
}
@ -536,7 +536,10 @@ namespace TShockAPI
if (pvp == true && TShock.Config.AlwaysPvP)
args.Player.IgnoreActionsForPvP = false;
else
{
args.Player.Spawn();
args.Player.IgnoreActionsForPvP = true;
}
NetMessage.SendData((int)PacketTypes.TogglePvp, -1, -1, "", args.Player.Index);
@ -575,7 +578,7 @@ namespace TShockAPI
{
args.Player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", Color.Red);
}
else if (TShock.Config.ServerSideInventory && !args.Player.IsLoggedIn)
if (TShock.Config.ServerSideInventory && !args.Player.IsLoggedIn)
{
args.Player.SendMessage("Server Side Inventory is enabled! Please /register or /login to play!", Color.Red);
}

View file

@ -442,6 +442,10 @@ namespace TShockAPI
public PlayerData(TSPlayer player)
{
for (int i = 0; i < NetItem.maxNetInventory; i++)
{
this.inventory[i] = new NetItem();
}
this.inventory[0].netID = -15;
this.inventory[0].stack = 1;
if(player.TPlayer.inventory[0] != null && player.TPlayer.inventory[0].netID == -15)
@ -501,9 +505,9 @@ namespace TShockAPI
}
else
{
if (player.TPlayer.armor[i] != null)
if (player.TPlayer.armor[i - 48] != null)
{
this.inventory[i].netID = armor[i].netID;
this.inventory[i].netID = armor[i - 48].netID;
}
else
{
@ -512,8 +516,8 @@ namespace TShockAPI
if (this.inventory[i].netID != 0)
{
this.inventory[i].stack = armor[i].stack;
this.inventory[i].prefix = armor[i].prefix;
this.inventory[i].stack = armor[i - 48].stack;
this.inventory[i].prefix = armor[i - 48].prefix;
}
else
{
@ -537,6 +541,8 @@ namespace TShockAPI
string inventoryString = "";
for (int i = 0; i < NetItem.maxNetInventory; i++)
{
if (i != 0)
inventoryString += "~";
inventoryString += inventory[i].netID;
if (inventory[i].netID != 0)
{
@ -547,8 +553,6 @@ namespace TShockAPI
{
inventoryString += ",0,0";
}
if(i != NetItem.maxNetInventory)
inventoryString += "~";
}
return inventoryString;
}
@ -556,8 +560,13 @@ namespace TShockAPI
public static NetItem[] Parse(string data)
{
NetItem[] inventory = new NetItem[NetItem.maxNetInventory];
int i;
for (i = 0; i < NetItem.maxNetInventory; i++)
{
inventory[i] = new NetItem();
}
string[] items = data.Split('~');
int i = 0;
i = 0;
foreach (string item in items)
{
string[] idata = item.Split(',');

View file

@ -1039,7 +1039,7 @@ namespace TShockAPI
{
Item item = new Item();
Item serverItem = new Item();
if (inventory[i].netID != 0)
if (inventory[i] != null && inventory[i].netID != 0)
{
if (playerData.inventory[i].netID != inventory[i].netID)
{
@ -1057,8 +1057,7 @@ namespace TShockAPI
player.SendMessage("Error: Your item (" + item.name + ") needs to be deleted.", Color.Cyan);
check = false;
}
if (inventory[i].stack > playerData.inventory[i].stack)
else if (inventory[i].stack > playerData.inventory[i].stack)
{
item.netDefaults(inventory[i].netID);
item.Prefix(inventory[i].prefix);
@ -1072,29 +1071,28 @@ namespace TShockAPI
{
Item item = new Item();
Item serverItem = new Item();
if (armor[i].netID != 0)
if (armor[i - 48] != null && armor[i - 48].netID != 0)
{
if (playerData.inventory[i].netID != armor[i].netID)
if (playerData.inventory[i].netID != armor[i - 48].netID)
{
item.netDefaults(armor[i].netID);
item.Prefix(armor[i].prefix);
item.netDefaults(armor[i - 48].netID);
item.Prefix(armor[i - 48].prefix);
item.AffixName();
player.SendMessage("Error: Your armor (" + item.name + ") needs to be deleted.", Color.Cyan);
check = false;
}
else if (playerData.inventory[i].prefix != armor[i].prefix)
else if (playerData.inventory[i].prefix != armor[i - 48].prefix)
{
item.netDefaults(armor[i].netID);
item.Prefix(armor[i].prefix);
item.netDefaults(armor[i - 48].netID);
item.Prefix(armor[i - 48].prefix);
item.AffixName();
player.SendMessage("Error: Your armor (" + item.name + ") needs to be deleted.", Color.Cyan);
check = false;
}
if (armor[i].stack > playerData.inventory[i].stack)
else if (armor[i - 48].stack > playerData.inventory[i].stack)
{
item.netDefaults(armor[i].netID);
item.Prefix(armor[i].prefix);
item.netDefaults(armor[i - 48].netID);
item.Prefix(armor[i - 48].prefix);
item.AffixName();
player.SendMessage("Error: Your armor (" + item.name + ") (" + inventory[i].stack + ") needs to have it's stack decreased to (" + playerData.inventory[i].stack + ").", Color.Cyan);
check = false;