Merge pull request #1321 from DogooFalchion/ssc_join_inv

Enable user to upload their data from when they join as SSC
This commit is contained in:
Hussein Farran 2016-10-23 20:58:40 -04:00 committed by GitHub
commit 7d323f253a
5 changed files with 182 additions and 18 deletions

View file

@ -298,6 +298,10 @@ namespace TShockAPI
{
HelpText = "Saves all serverside characters."
});
add(new Command(Permissions.uploaddata, UploadJoinData, "uploadssc")
{
HelpText = "Upload the account information when you joined the server as your Server Side Character data."
});
add(new Command(Permissions.settempgroup, TempGroup, "tempgroup")
{
HelpText = "Temporarily sets another player's group."
@ -1686,6 +1690,63 @@ namespace TShockAPI
args.Player.SendSuccessMessage("SSC of player \"{0}\" has been overriden.", matchedPlayer.Name);
}
private static void UploadJoinData(CommandArgs args)
{
TSPlayer targetPlayer = args.Player;
if (args.Parameters.Count == 1 && args.Player.HasPermission(Permissions.uploadothersdata))
{
List<TSPlayer> players = TShock.Utils.FindPlayer(args.Parameters[0]);
if (players.Count > 1)
{
TShock.Utils.SendMultipleMatchError(args.Player, players.Select(p => p.Name));
return;
}
else if (players.Count == 0)
{
args.Player.SendErrorMessage("No player was found matching'{0}'", args.Parameters[0]);
return;
}
else
{
targetPlayer = players[0];
}
}
else if (args.Parameters.Count == 1)
{
args.Player.SendErrorMessage("You do not have permission to upload another player's data.");
return;
}
else if (args.Parameters.Count > 0)
{
args.Player.SendErrorMessage("Usage: /uploadssc [playername]");
return;
}
else if (args.Parameters.Count == 0 && args.Player is TSServerPlayer)
{
args.Player.SendErrorMessage("A console can not upload their player data.");
args.Player.SendErrorMessage("Usage: /uploadssc [playername]");
return;
}
if (targetPlayer.IsLoggedIn)
{
if (TShock.CharacterDB.InsertSpecificPlayerData(targetPlayer, targetPlayer.DataWhenJoined))
{
targetPlayer.DataWhenJoined.RestoreCharacter(targetPlayer);
targetPlayer.SendSuccessMessage("Your Join Data has been uploaded to the server.");
args.Player.SendSuccessMessage("The player's data was successfully uploaded.");
}
else
{
args.Player.SendErrorMessage("Failed to upload your data, are you logged in to an account?");
}
}
else
{
args.Player.SendErrorMessage("The target player has not logged in yet.");
}
}
private static void ForceHalloween(CommandArgs args)
{
TShock.Config.ForceHalloween = !TShock.Config.ForceHalloween;

View file

@ -219,5 +219,95 @@ namespace TShockAPI.DB
return false;
}
/// <summary>
/// Inserts a specific PlayerData into the SSC table for a player.
/// </summary>
/// <param name="player">The player to store the data for.</param>
/// <param name="data">The player data to store.</param>
/// <returns>If the command succeeds.</returns>
public bool InsertSpecificPlayerData(TSPlayer player, PlayerData data)
{
PlayerData playerData = data;
if (!player.IsLoggedIn)
return false;
if (player.HasPermission(Permissions.bypassssc))
{
TShock.Log.ConsoleInfo("Skipping SSC Backup for " + player.User.Name); // Debug code
return true;
}
if (!GetPlayerData(player, player.User.ID).exists)
{
try
{
database.Query(
"INSERT INTO tsCharacter (Account, Health, MaxHealth, Mana, MaxMana, Inventory, extraSlot, spawnX, spawnY, skinVariant, hair, hairDye, hairColor, pantsColor, shirtColor, underShirtColor, shoeColor, hideVisuals, skinColor, eyeColor, questsCompleted) VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13, @14, @15, @16, @17, @18, @19, @20);",
player.User.ID,
playerData.health,
playerData.maxHealth,
playerData.mana,
playerData.maxMana,
String.Join("~", playerData.inventory),
playerData.extraSlot,
playerData.spawnX,
playerData.spawnX,
playerData.skinVariant,
playerData.hair,
playerData.hairDye,
TShock.Utils.EncodeColor(playerData.hairColor),
TShock.Utils.EncodeColor(playerData.pantsColor),
TShock.Utils.EncodeColor(playerData.shirtColor),
TShock.Utils.EncodeColor(playerData.underShirtColor),
TShock.Utils.EncodeColor(playerData.shoeColor),
TShock.Utils.EncodeBoolArray(playerData.hideVisuals),
TShock.Utils.EncodeColor(playerData.skinColor),
TShock.Utils.EncodeColor(playerData.eyeColor),
playerData.questsCompleted);
return true;
}
catch (Exception ex)
{
TShock.Log.Error(ex.ToString());
}
}
else
{
try
{
database.Query(
"UPDATE tsCharacter SET Health = @0, MaxHealth = @1, Mana = @2, MaxMana = @3, Inventory = @4, spawnX = @6, spawnY = @7, hair = @8, hairDye = @9, hairColor = @10, pantsColor = @11, shirtColor = @12, underShirtColor = @13, shoeColor = @14, hideVisuals = @15, skinColor = @16, eyeColor = @17, questsCompleted = @18, skinVariant = @19, extraSlot = @20 WHERE Account = @5;",
playerData.health,
playerData.maxHealth,
playerData.mana,
playerData.maxMana,
String.Join("~", playerData.inventory),
player.User.ID,
playerData.spawnX,
playerData.spawnX,
playerData.skinVariant,
playerData.hair,
playerData.hairDye,
TShock.Utils.EncodeColor(playerData.hairColor),
TShock.Utils.EncodeColor(playerData.pantsColor),
TShock.Utils.EncodeColor(playerData.shirtColor),
TShock.Utils.EncodeColor(playerData.underShirtColor),
TShock.Utils.EncodeColor(playerData.shoeColor),
TShock.Utils.EncodeBoolArray(playerData.hideVisuals),
TShock.Utils.EncodeColor(playerData.skinColor),
TShock.Utils.EncodeColor(playerData.eyeColor),
playerData.questsCompleted,
playerData.extraSlot ?? 0);
return true;
}
catch (Exception ex)
{
TShock.Log.Error(ex.ToString());
}
}
return false;
}
}
}

View file

@ -1506,6 +1506,8 @@ namespace TShockAPI
private static bool HandleConnecting(GetDataHandlerArgs args)
{
var user = TShock.Users.GetUserByName(args.Player.Name);
args.Player.DataWhenJoined = new PlayerData(args.Player);
args.Player.DataWhenJoined.CopyCharacter(args.Player);
if (user != null && !TShock.Config.DisableUUIDLogin)
{

View file

@ -88,6 +88,12 @@ namespace TShockAPI
[Description("User can save all the players SSI state.")]
public static readonly string savessc = "tshock.admin.savessi";
[Description("User can upload their joined character data as SSC data.")]
public static readonly string uploaddata = "tshock.ssc.upload";
[Description("User can upload other players join data to the SSC database.")]
public static readonly string uploadothersdata = "tshock.ssc.upload.others";
[Description("User can elevate other users' groups temporarily.")]
public static readonly string settempgroup = "tshock.admin.tempgroup";

View file

@ -573,6 +573,11 @@ namespace TShockAPI
}
}
/// <summary>
/// This contains the character data a player has when they join the server.
/// </summary>
public PlayerData DataWhenJoined { get; set; }
/// <summary>
/// Determines whether the player's storage contains the given key.
/// </summary>