public static void OnClanJoin(TSPlayer ts, Clan clan) { if (ClanJoin == null) return; ClanJoin(new ClanJoinEventArgs() { TSplayer = ts, Clan = clan }); }
public void ReloadConfig(bool console = false, TSPlayer receiver = null) { var configPath = Path.Combine(TShock.SavePath, "BossConfig.json"); (AutoBoss.config = Config.Read(configPath)).Write(configPath); var invalidRegions = new List<string>(); foreach (var arena in AutoBoss.config.BossArenas.Where(a => a.Value)) { var region = TShock.Regions.GetRegionByName(arena.Key); if (region == null) { invalidRegions.Add(arena.Key); continue; } if (!AutoBoss.ActiveArenas.Contains(region)) AutoBoss.ActiveArenas.Add(region); } arenaCount = AutoBoss.ActiveArenas.Count; if (invalidRegions.Count == 0) { AutoBoss.Timers = new BossTimer(); return; } TShock.Log.ConsoleError("Invalid regions encountered: " + string.Join(", ", invalidRegions)); if (!console && receiver != null) receiver.SendErrorMessage("Invalid regions encountered: " + string.Join(", ", invalidRegions)); }
/// <summary>Sends tile updates for a region border to a client.</summary> /// <param name="player">The player to send to.</param> public void refresh(TShockAPI.TSPlayer player) { // Due to the way the Rectangle class works, the Width and Height values are one tile less than the actual dimensions of the region. if (this.showArea.Width <= 3 || this.showArea.Height <= 3) { player.SendData(PacketTypes.TileSendSection, "", this.showArea.Left - 1, this.showArea.Top - 1, this.showArea.Width + 3, this.showArea.Height + 3, 0); } else { if (this.showArea.Top == this.area.Top) { player.SendData(PacketTypes.TileSendSection, "", this.showArea.Left - 1, this.showArea.Top - 1, this.showArea.Width + 3, 3, 0); } if (this.showArea.Left == this.area.Left) { player.SendData(PacketTypes.TileSendSection, "", this.showArea.Left - 1, this.showArea.Top + 2, 3, this.showArea.Height, 0); } if (this.showArea.Right == this.area.Right) { player.SendData(PacketTypes.TileSendSection, "", this.showArea.Right - 1, this.showArea.Top + 2, 3, this.showArea.Height, 0); } if (this.showArea.Bottom == this.area.Bottom) { player.SendData(PacketTypes.TileSendSection, "", this.showArea.Left + 2, this.showArea.Bottom - 1, this.showArea.Width - 3, 3, 0); } } player.SendData(PacketTypes.TileFrameSection, "", (int)(this.showArea.Left / 200), (int)(this.showArea.Top / 150), (int)(this.showArea.Right / 200), (int)(this.showArea.Bottom / 150), 0); }
public static void SendChestItem(TSPlayer player, int chestIndex, IList<ItemData> items) { const int TerrariaPacketHeaderSize = 3; const int ChestItemPacketSizeNoHeader = 8; const short PacketSize = TerrariaPacketHeaderSize + ChestItemPacketSizeNoHeader; using (MemoryStream packetData = new MemoryStream(new byte[PacketSize])) { BinaryWriter writer = new BinaryWriter(packetData); // Header writer.Write(PacketSize); // Packet size writer.Write((byte)PacketTypes.ChestItem); writer.Write((short)chestIndex); // Re-write item data for each item and send the packet for (int i = 0; i < items.Count; i++) { ItemData item = items[i]; writer.Write((byte)i); writer.Write((short)item.StackSize); writer.Write((byte)item.Prefix); writer.Write((short)item.Type); player.SendRawData(packetData.ToArray()); // Rewind to write the item data of another item packetData.Position -= ChestItemPacketSizeNoHeader; } } }
public IceWandEventArgs(int x, int y, TSPlayer player, int data = 0) { Data = data; Player = player; X = x; Y = y; }
private CircuitProcessingResult ProcessCircuit(TSPlayer triggerer, DPoint tileLocation, SignalType? overrideSignal = null, bool switchSender = true) { CircuitProcessor processor = new CircuitProcessor(this.PluginTrace, this, tileLocation); CircuitProcessingResult result = processor.ProcessCircuit(triggerer, overrideSignal, switchSender); this.NotifyPlayer(result); return result; }
public RegionPlayer( TSPlayer ply, FlaggedRegionManager regionManager ) { player = ply; positions = new PositionQueue(); this.regionManager = regionManager; OriginalGroup = ply.Group; }
public bool ChangeGroup(object Player, object Group) { TShockAPI.TSPlayer p = null; TShockAPI.DB.User u = new TShockAPI.DB.User(); string g = ""; if ((p = GetPlayer(Player)) == null) { return(false); } if (Group is string) { g = Group as string; } else if (Group is TShockAPI.Group) { g = (Group as TShockAPI.Group).Name; } if (string.IsNullOrEmpty(g) == true) { return(false); } try { u.Name = p.User.Name; TShockAPI.TShock.Users.SetUserGroup(u, g); } catch (Exception ex) { ScriptLog.ErrorFormat("tshock_change_group", "Group change failed: {0}", ex.Message); return(false); } return(true); }
public override bool HandleTileEdit(TSPlayer player, TileEditType editType, BlockType blockType, DPoint location, int objectStyle) { if (this.IsDisposed) return false; if (base.HandleTileEdit(player, editType, blockType, location, objectStyle)) return true; if (editType == TileEditType.PlaceTile) return this.HandleTilePlace(player, blockType, location, objectStyle); if (editType == TileEditType.TileKill || editType == TileEditType.TileKillNoItem) return this.HandleTileDestruction(player, location); if (editType == TileEditType.PlaceWire || editType == TileEditType.PlaceWireBlue || editType == TileEditType.PlaceWireGreen) return this.HandleWirePlace(player, location); #if DEBUG || Testrun if (editType == TileEditType.DestroyWire) { player.SendMessage(location.ToString(), Color.Aqua); if (!TerrariaUtils.Tiles[location].active()) return false; ObjectMeasureData measureData = TerrariaUtils.Tiles.MeasureObject(location); player.SendInfoMessage(string.Format( "X: {0}, Y: {1}, FrameX: {2}, FrameY: {3}, Origin X: {4}, Origin Y: {5}, Active State: {6}", location.X, location.Y, TerrariaUtils.Tiles[location].frameX, TerrariaUtils.Tiles[location].frameY, measureData.OriginTileLocation.X, measureData.OriginTileLocation.Y, TerrariaUtils.Tiles.ObjectHasActiveState(measureData) )); } #endif return false; }
public async Task<bool> AddAsync(TSPlayer player, DateTime expiration) { return await Task.Run(() => { syncLock.EnterWriteLock(); try { return db.Query("INSERT INTO Mutes VALUES (@0, @1, @2, @3, @4, @5)", null, player.Name, player.UUID, player.IP, DateTime.UtcNow.ToString("s"), expiration.ToString("s")) > 0; } catch (Exception ex) { TShock.Log.Error(ex.ToString()); return false; } finally { syncLock.ExitWriteLock(); } }); }
public static void DisplaySearchResults(TSPlayer Player, List<object> Results, int Page) { if (Results[0] is Item) Send.Info(Player, "Item Search:"); else if (Results[0] is NPC) Send.Info(Player, "NPC Search:"); var sb = new StringBuilder(); if (Results.Count > (8 * (Page - 1))) { for (int j = (8 * (Page - 1)); j < (8 * Page); j++) { if (sb.Length != 0) sb.Append(" | "); if (Results[j] is Item) sb.Append(((Item)Results[j]).netID).Append(": ").Append(((Item)Results[j]).name); else if (Results[j] is NPC) sb.Append(((NPC)Results[j]).netID).Append(": ").Append(((NPC)Results[j]).name); if (j == Results.Count - 1) { Send.Success(Player, sb.ToString()); break; } if ((j + 1) % 2 == 0) { Send.Success(Player, sb.ToString()); sb.Clear(); } } } if (Results.Count > (8 * Page)) { Send.Info(Player, "Type /spage {0} for more Results.", Page + 1); } }
public bool CheckPermissions(TSPlayer player) { if (player == null) return false; var sPly = SignCommands.ScPlayers[player.Index]; if (sPly == null) { TShock.Log.ConsoleError("An error occured while executing a sign command." + "TSPlayer {0} at index {1} does not exist as an ScPlayer", player.Name, player.Index); player.SendErrorMessage("An error occured. Please try again"); return false; } if (freeAccess) return true; if (!string.IsNullOrEmpty(requiredPermission)) if (player.Group.HasPermission(requiredPermission)) return true; else { if (sPly.AlertPermissionCooldown == 0) { player.SendErrorMessage("You do not have the required permission to use this sign."); sPly.AlertPermissionCooldown = 3; } return false; } if (commands.Values.All(command => command.CanRun(player))) return true; if (sPly.AlertPermissionCooldown == 0) { player.SendErrorMessage("You do not have access to the commands on this sign."); sPly.AlertPermissionCooldown = 3; } return false; }
public ScSign(string text, TSPlayer registrar, Point point) { _point = point; cooldown = 0; _cooldownGroup = string.Empty; RegisterCommands(text, registrar); }
public InfoCommand(string account, int time, int radius, TSPlayer sender) : base(sender) { this.account = account; this.time = time; this.radius = radius; }
public static void DisplaySearchResults(TSPlayer Player, List<object> Results, int Page) { if (Results[0] is Item) Player.SendInfoMessage("Item Search:"); else if (Results[0] is NPC) Player.SendInfoMessage("NPC Search:"); var sb = new StringBuilder(); if (Results.Count > (8 * (Page - 1))) { for (int j = (8 * (Page - 1)); j < (8 * Page); j++) { if (sb.Length != 0) sb.Append(" | "); if (Results[j] is Item) sb.Append(((Item)Results[j]).netID).Append(": ").Append(((Item)Results[j]).name); else if (Results[j] is NPC) sb.Append(((NPC)Results[j]).netID).Append(": ").Append(((NPC)Results[j]).name); if (j == Results.Count - 1) { Player.SendMessage(sb.ToString(), Color.MediumSeaGreen); break; } if ((j + 1) % 2 == 0) { Player.SendMessage(sb.ToString(), Color.MediumSeaGreen); sb.Clear(); } } } if (Results.Count > (8 * Page)) { Player.SendMessage(string.Format("Type /spage {0} for more Results.", (Page + 1)), Color.Yellow); } }
public static void InvokeChannelCreated(TSPlayer ts, Channel channel) { if (OnChannelCreate == null) return; OnChannelCreate(new ChannelEventArgs() { TSPlayer = ts, Channel = channel }); }
public static void OnClanLeave(TSPlayer ts, Clan clan) { if (ClanLeave == null) return; ClanLeave(new ClanLeaveEventArgs() { TSplayer = ts, Clan = clan }); }
public SetWire(int x, int y, int x2, int y2, TSPlayer plr, int wire, bool state, Expression expression) : base(x, y, x2, y2, plr) { this.expression = expression ?? new TestExpression(new Test(t => true)); this.state = state; this.wire = wire; }
public DataStorage(int _ID, int _style, TSPlayer _tsplayer, bool _isAuto) { ID = _ID; style = _style; tsplayer = _tsplayer; isAuto = _isAuto; }
public static void OnClanLogout(TSPlayer ts, Clan clan) { if (ClanLogout == null) return; ClanLogout(new ClanLogoutEventArgs() { TSplayer = ts, Clan = clan }); }
public PlayerData(Vault instance, TSPlayer player) { main = instance; TSPlayer = player; UpdatePlayerData(); StartUpdating(); }
public static void SendEmail(TSPlayer player, string email, User user) { MailMessage mail = new MailMessage(AccountRecovery.Config.EmailFrom, email); SmtpClient client = new SmtpClient(); client.Timeout = 15000; client.Host = AccountRecovery.Config.HostSMTPServer; client.Port = AccountRecovery.Config.HostPort; client.DeliveryMethod = SmtpDeliveryMethod.Network; client.UseDefaultCredentials = false; client.Credentials = new System.Net.NetworkCredential(AccountRecovery.Config.ServerEmailAddress, AccountRecovery.Config.ServerEmailPassword); client.EnableSsl = true; //client.ServicePoint.MaxIdleTime = 1; mail.Subject = AccountRecovery.Config.EmailSubjectLine; mail.Body = AccountRecovery.Config.EmailBodyLine; mail.IsBodyHtml = AccountRecovery.Config.UseHTML; string passwordGenerated = GeneratePassword(AccountRecovery.Config.GeneratedPasswordLength); TShock.Users.SetUserPassword(user, passwordGenerated); TShock.Log.ConsoleInfo("{0} has requested a new password succesfully.", user.Name); mail.Body = string.Format(mail.Body.Replace("$NEW_PASSWORD", passwordGenerated)); mail.Body = string.Format(mail.Body.Replace("$USERNAME", user.Name)); client.Send(mail); client.Dispose(); player.SendSuccessMessage("A new password has been generated and sent to {0} for {1}.", email, user.Name); TShock.Log.ConsoleInfo("A new password has been generated and sent to {0} for {1}.", email, user.Name); }
public static void OnClanCreated(TSPlayer ts, string clanname) { if (ClanCreated == null) return; ClanCreated(new ClanCreatedEventArgs() { TSplayer = ts, ClanName = clanname }); }
public CommandArgs(string message, bool silent, TSPlayer ply, List<string> args) { Message = message; Player = ply; Parameters = args; Silent = silent; }
/// <summary>Calculates what part of the region border to show for a large region.</summary> public void calculateArea(TSPlayer tPlayer) { this.showArea = this.area; // If the region is large, only part of its border will be shown. if (this.showArea.Width >= MaximumSize) { this.showArea.X = (int) (tPlayer.X / 16) - MaximumSize / 2; this.showArea.Width = MaximumSize - 1; if (this.showArea.Left < this.area.Left) this.showArea.X = this.area.Left; else if (this.showArea.Right > this.area.Right) this.showArea.X = this.area.Right - (MaximumSize - 1); } if (this.showArea.Height >= MaximumSize) { this.showArea.Y = (int) (tPlayer.Y / 16) - MaximumSize / 2; this.showArea.Height = MaximumSize - 1; if (this.showArea.Top < this.area.Top) this.showArea.Y = this.area.Top; else if (this.showArea.Bottom > this.area.Bottom) this.showArea.Y = this.area.Bottom - (MaximumSize - 1); } // Ensure the region boundary is within the world. if (this.showArea.Left < 1) this.showArea.X = 1; else if (this.showArea.Left >= Main.maxTilesX - 1) this.showArea.X = Main.maxTilesX - 1; if (this.showArea.Top < 1) this.showArea.Y = 1; else if (this.showArea.Top >= Main.maxTilesY - 1) this.showArea.Y = Main.maxTilesY - 1; if (this.showArea.Right >= Main.maxTilesX - 1) this.showArea.Width = Main.maxTilesX - this.showArea.X - 2; if (this.showArea.Bottom >= Main.maxTilesY - 1) this.showArea.Height = Main.maxTilesY - this.showArea.Y - 2; }
public ChestModifySlotEventArgs(TSPlayer player, int chestIndex, int slotIndex, ItemData newItem) : base(player) { this.ChestIndex = chestIndex; this.SlotIndex = slotIndex; this.NewItem = newItem; }
public static void SpeedSpree(CommandArgs args) { config = Statistics.config; player = args.Player; switch (args.Parameters[0].ToLowerInvariant()) { case "-l": SpeedKills.listTimers(); break; case "-start": SpeedKills.StartSpeedKill(); break; case "-stop": SpeedKills.StopSpeedKill(); break; case "-i": case "-interval": config.SpeedSpreeTimeout = Int32.Parse(args.Parameters[1]); break; case "-p": SpeedKills.NewPlayer(Int32.Parse(args.Parameters[1])); break; } }
public bool Protector_CheckProtected(TSPlayer player, DPoint tileLocation, bool fullAccessRequired) { try { return !ProtectorPlugin.LatestInstance.ProtectionManager.CheckBlockAccess(player, tileLocation, fullAccessRequired); } catch (Exception ex) { throw new CooperatingPluginException(null, ex); } }
public static void InvokeChannelLogout(TSPlayer ts, Channel channel) { if (OnChannelLogout == null) return; OnChannelLogout(new ChannelEventArgs() { TSPlayer = ts, Channel = channel }); }
public static bool CanCreate(TSPlayer player, scSign sign) { foreach (scCommand cmd in sign.Commands) if (!player.Group.HasPermission(string.Concat("essentials.signs.create.", cmd.command))) return false; return true; }
public static void InvalidNewBountyUsage(TSPlayer player) { player.SendErrorMessage("Invalid usage! Proper usages:"); player.SendErrorMessage("/nbty <bounty name> <target>"); player.SendErrorMessage("/nbty <-setrewards> [SEconomy currency amount]"); player.SendErrorMessage("/nbty <-confirm/-cancel>"); }
private static void NotifyAdministrator(TSPlayer player, string[] changes) { player.SendMessage("The server is out of date.", Color.Red); for (int j = 0; j < changes.Length; j++) { player.SendMessage(changes[j], Color.Red); } }
public bool CanRun(TSPlayer ply) { if (!ply.Group.HasPermission(permission)) { return false; } return true; }
/// <summary>Checks whether a given player is near a given region.</summary> /// <param name="tPlayer">The player to check</param> /// <param name="area">The region to check</param> /// <returns>true if the player is within 100 tiles of the region; false otherwise</returns> public static bool isPlayerNearby(TShockAPI.TSPlayer tPlayer, Rectangle area) { int playerX = (int)(tPlayer.X / 16); int playerY = (int)(tPlayer.Y / 16); return(playerX >= area.Left - NearRange && playerX <= area.Right + NearRange && playerY >= area.Top - NearRange && playerY <= area.Bottom + NearRange); }
/// <summary> /// This is a copy of TShocks handlecommand method, sans the permission checks /// </summary> public static bool PermissionlessInvoke(this TShockAPI.TSPlayer player, string text, bool silent = false) { IEnumerable <TShockAPI.Command> cmds; List <string> args; string cmdName; string cmdText; if (string.IsNullOrEmpty(text)) { return(false); } cmdText = text.Remove(0, 1); args = typeof(TShockAPI.Commands).CallPrivateMethod <List <string> >(true, "ParseParameters", cmdText); if (args.Count < 1) { return(false); } cmdName = args[0].ToLower(); args.RemoveAt(0); cmds = TShockAPI.Commands.ChatCommands.Where(c => c.HasAlias(cmdName)); if (Enumerable.Count(cmds) == 0) { if (player.AwaitingResponse.ContainsKey(cmdName)) { Action <TShockAPI.CommandArgs> call = player.AwaitingResponse[cmdName]; player.AwaitingResponse.Remove(cmdName); call(new TShockAPI.CommandArgs(cmdText, player, args)); return(true); } player.SendErrorMessage("Invalid command entered. Type /help for a list of valid commands."); return(true); } foreach (TShockAPI.Command cmd in cmds) { if (!cmd.AllowServer && !player.RealPlayer) { player.SendErrorMessage("You must use this command in-game."); } else { if (cmd.DoLog && silent == false) { TShockAPI.TShock.Utils.SendLogs(string.Format("{0} executed: /{1}.", player.Name, cmdText), Color.Red); } cmd.RunWithoutPermissions(cmdText, player, args); } } return(true); }
//Buffs #region Permabuff public static void Permabuff(CommandArgs args) { if (args.Parameters.Count == 0) { var player = Utils.GetPlayers(args.Player.Index); player.isPermabuff = !player.isPermabuff; args.Player.SendSuccessMessage("Permabuffs are now " + (player.isPermabuff ? "on" : "off")); } else { string str = args.Parameters[0]; var findPlayers = TShockAPI.TShock.Utils.FindPlayer(str); if (findPlayers.Count > 1) { List <string> foundPlayers = new List <string>(); foreach (TSPlayer player in findPlayers) { foundPlayers.Add(player.Name); } TShock.Utils.SendMultipleMatchError(args.Player, foundPlayers); } else if (findPlayers.Count < 1) { args.Player.SendErrorMessage(findPlayers.Count + " players matched."); } else { var player = Utils.GetPlayers(args.Parameters[0]); TShockAPI.TSPlayer ply = findPlayers[0]; player.isPermabuff = !player.isPermabuff; args.Player.SendSuccessMessage(string.Format("You have {0}tivated permabuffs on {1}.", (player.isPermabuff ? "ac" : "deac"), ply.Name)); ply.SendInfoMessage(string.Format("{0} has {1}tivated permabuffs on you", args.Player.Name, (player.isPermabuff ? "ac" : "deac"))); if (player.isPermabuff) { if (!updateTimers.permaBuffTimer.Enabled) { updateTimers.permaBuffTimer.Enabled = true; } } } } }
public bool PlayerHasPermission(object PlayerRef, object GroupName) { TShockAPI.TSPlayer returnPlayer = null; if ((returnPlayer = GetPlayer(PlayerRef)) == null || GroupName == null) { return(false); } return(returnPlayer.Group.HasPermission(GroupName.ToString())); }
public static bool CheckPermissions(this TShockAPI.TSPlayer player, List <string> perms) { foreach (var perm in perms) { if (player.HasPermission(perm)) { return(true); } } return(false); }
public static void AutoHeal(CommandArgs args) { if (args.Parameters.Count == 0) { var player = Utils.GetPlayers(args.Player.Index); player.isHeal = !player.isHeal; args.Player.SendSuccessMessage("Autoheal is now " + (player.isHeal ? "on" : "off")); } else { string str = args.Parameters[0]; var findPlayers = TShockAPI.TShock.Utils.FindPlayer(str); if (findPlayers.Count > 1) { List <string> foundPlayers = new List <string>(); foreach (TSPlayer player in findPlayers) { foundPlayers.Add(player.Name); } TShock.Utils.SendMultipleMatchError(args.Player, foundPlayers); } else if (findPlayers.Count < 1) { args.Player.SendMessage(findPlayers.Count + " players matched.", Color.Red); } else { var player = Utils.GetPlayers(args.Parameters[0]); TShockAPI.TSPlayer ply = findPlayers[0]; player.isHeal = !player.isHeal; if (player.isHeal) { args.Player.SendInfoMessage("You have activated auto-heal for " + ply.Name + "."); ply.SendInfoMessage(args.Player.Name + " has activated auto-heal on you"); } else { args.Player.SendInfoMessage("You have deactivated auto-heal for " + ply.Name + "."); ply.SendInfoMessage(args.Player.Name + " has deactivated auto-heal on you"); } } } }
public void MessageWithColour(object Colour, object Player, object Message) { TShockAPI.TSPlayer ply = null; string msg = Message.ToString(); Color c = ParseColour(Colour); if ((ply = GetPlayer(Player)) == null || string.IsNullOrEmpty(msg) == true) { return; } ply.SendMessageFormat(c, "{0}", Message); }
public IBankAccount GetBankAccount(TShockAPI.TSPlayer tsPlayer) { if (tsPlayer == null || RunningJournal == null) { return(null); } if (tsPlayer == TSPlayer.Server) { return(WorldAccount); } try { return(RunningJournal.GetBankAccountByName(tsPlayer.UserAccountName)); } catch (Exception ex) { TShock.Log.ConsoleError("seconomy error: Error getting bank account for {0}: {1}", tsPlayer.Name, ex.Message); return(null); } }
public bool ExecuteCommandSilent(object Player, object Command) { TShockAPI.TSPlayer p = null; string commandToExecute = ""; if ((p = GetPlayer(Player)) == null) { return(false); } try { if (Command is List <string> ) { List <string> cmdList = Command as List <string>; foreach (var param in cmdList.Skip(1)) { commandToExecute += " " + param; } } else if (Command is string) { commandToExecute = Command.ToString(); } if (string.IsNullOrEmpty((commandToExecute = commandToExecute.Trim())) == true) { return(false); } p.PermissionlessInvoke(commandToExecute, true); return(true); } catch (Exception) { ScriptLog.ErrorFormat("tshock_exec_silent", "The command \"{0}\" failed.", commandToExecute.Trim()); return(false); } }
/// <summary> /// Restores a player's character to the state stored in the database /// </summary> /// <param name="player"></param> public void RestoreCharacter(TSPlayer player) { // Start ignoring SSC-related packets! This is critical so that we don't send or receive dirty data! player.IgnoreSSCPackets = true; player.TPlayer.statLife = this.health; player.TPlayer.statLifeMax = this.maxHealth; player.TPlayer.statMana = this.maxMana; player.TPlayer.statManaMax = this.maxMana; player.TPlayer.SpawnX = this.spawnX; player.TPlayer.SpawnY = this.spawnY; player.sX = this.spawnX; player.sY = this.spawnY; player.TPlayer.hairDye = this.hairDye; player.TPlayer.anglerQuestsFinished = this.questsCompleted; if (extraSlot != null) { player.TPlayer.extraAccessory = extraSlot.Value == 1 ? true : false; } if (this.skinVariant != null) { player.TPlayer.skinVariant = this.skinVariant.Value; } if (this.hair != null) { player.TPlayer.hair = this.hair.Value; } if (this.hairColor != null) { player.TPlayer.hairColor = this.hairColor.Value; } if (this.pantsColor != null) { player.TPlayer.pantsColor = this.pantsColor.Value; } if (this.shirtColor != null) { player.TPlayer.shirtColor = this.shirtColor.Value; } if (this.underShirtColor != null) { player.TPlayer.underShirtColor = this.underShirtColor.Value; } if (this.shoeColor != null) { player.TPlayer.shoeColor = this.shoeColor.Value; } if (this.skinColor != null) { player.TPlayer.skinColor = this.skinColor.Value; } if (this.eyeColor != null) { player.TPlayer.eyeColor = this.eyeColor.Value; } if (this.hideVisuals != null) { player.TPlayer.hideVisual = this.hideVisuals; } else { player.TPlayer.hideVisual = new bool[player.TPlayer.hideVisual.Length]; } for (int i = 0; i < NetItem.MaxInventory; i++) { if (i < NetItem.InventoryIndex.Item2) { //0-58 player.TPlayer.inventory[i].netDefaults(this.inventory[i].NetId); if (player.TPlayer.inventory[i].netID != 0) { player.TPlayer.inventory[i].stack = this.inventory[i].Stack; player.TPlayer.inventory[i].prefix = this.inventory[i].PrefixId; } } else if (i < NetItem.ArmorIndex.Item2) { //59-78 var index = i - NetItem.ArmorIndex.Item1; player.TPlayer.armor[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.armor[index].netID != 0) { player.TPlayer.armor[index].stack = this.inventory[i].Stack; player.TPlayer.armor[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.DyeIndex.Item2) { //79-88 var index = i - NetItem.DyeIndex.Item1; player.TPlayer.dye[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.dye[index].netID != 0) { player.TPlayer.dye[index].stack = this.inventory[i].Stack; player.TPlayer.dye[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.MiscEquipIndex.Item2) { //89-93 var index = i - NetItem.MiscEquipIndex.Item1; player.TPlayer.miscEquips[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.miscEquips[index].netID != 0) { player.TPlayer.miscEquips[index].stack = this.inventory[i].Stack; player.TPlayer.miscEquips[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.MiscDyeIndex.Item2) { //93-98 var index = i - NetItem.MiscDyeIndex.Item1; player.TPlayer.miscDyes[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.miscDyes[index].netID != 0) { player.TPlayer.miscDyes[index].stack = this.inventory[i].Stack; player.TPlayer.miscDyes[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.PiggyIndex.Item2) { //98-138 var index = i - NetItem.PiggyIndex.Item1; player.TPlayer.bank.item[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.bank.item[index].netID != 0) { player.TPlayer.bank.item[index].stack = this.inventory[i].Stack; player.TPlayer.bank.item[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.SafeIndex.Item2) { //138-178 var index = i - NetItem.SafeIndex.Item1; player.TPlayer.bank2.item[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.bank2.item[index].netID != 0) { player.TPlayer.bank2.item[index].stack = this.inventory[i].Stack; player.TPlayer.bank2.item[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.TrashIndex.Item2) { //179-219 var index = i - NetItem.TrashIndex.Item1; player.TPlayer.trashItem.netDefaults(this.inventory[i].NetId); if (player.TPlayer.trashItem.netID != 0) { player.TPlayer.trashItem.stack = this.inventory[i].Stack; player.TPlayer.trashItem.prefix = (byte)this.inventory[i].PrefixId; } } else { //220 var index = i - NetItem.ForgeIndex.Item1; player.TPlayer.bank3.item[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.bank3.item[index].netID != 0) { player.TPlayer.bank3.item[index].stack = this.inventory[i].Stack; player.TPlayer.bank3.item[index].Prefix((byte)this.inventory[i].PrefixId); } } } float slot = 0f; for (int k = 0; k < NetItem.InventorySlots; k++) { NetMessage.SendData(5, -1, -1, Main.player[player.Index].inventory[k].name, player.Index, slot, (float)Main.player[player.Index].inventory[k].prefix); slot++; } for (int k = 0; k < NetItem.ArmorSlots; k++) { NetMessage.SendData(5, -1, -1, Main.player[player.Index].armor[k].name, player.Index, slot, (float)Main.player[player.Index].armor[k].prefix); slot++; } for (int k = 0; k < NetItem.DyeSlots; k++) { NetMessage.SendData(5, -1, -1, Main.player[player.Index].dye[k].name, player.Index, slot, (float)Main.player[player.Index].dye[k].prefix); slot++; } for (int k = 0; k < NetItem.MiscEquipSlots; k++) { NetMessage.SendData(5, -1, -1, Main.player[player.Index].miscEquips[k].name, player.Index, slot, (float)Main.player[player.Index].miscEquips[k].prefix); slot++; } for (int k = 0; k < NetItem.MiscDyeSlots; k++) { NetMessage.SendData(5, -1, -1, Main.player[player.Index].miscDyes[k].name, player.Index, slot, (float)Main.player[player.Index].miscDyes[k].prefix); slot++; } for (int k = 0; k < NetItem.PiggySlots; k++) { NetMessage.SendData(5, -1, -1, Main.player[player.Index].bank.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank.item[k].prefix); slot++; } for (int k = 0; k < NetItem.SafeSlots; k++) { NetMessage.SendData(5, -1, -1, Main.player[player.Index].bank2.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank2.item[k].prefix); slot++; } NetMessage.SendData(5, -1, -1, Main.player[player.Index].trashItem.name, player.Index, slot++, (float)Main.player[player.Index].trashItem.prefix); for (int k = 0; k < NetItem.ForgeSlots; k++) { NetMessage.SendData(5, -1, -1, Main.player[player.Index].bank3.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank3.item[k].prefix); slot++; } NetMessage.SendData(4, -1, -1, player.Name, player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(42, -1, -1, "", player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(16, -1, -1, "", player.Index, 0f, 0f, 0f, 0); slot = 0f; for (int k = 0; k < NetItem.InventorySlots; k++) { NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].inventory[k].name, player.Index, slot, (float)Main.player[player.Index].inventory[k].prefix); slot++; } for (int k = 0; k < NetItem.ArmorSlots; k++) { NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].armor[k].name, player.Index, slot, (float)Main.player[player.Index].armor[k].prefix); slot++; } for (int k = 0; k < NetItem.DyeSlots; k++) { NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].dye[k].name, player.Index, slot, (float)Main.player[player.Index].dye[k].prefix); slot++; } for (int k = 0; k < NetItem.MiscEquipSlots; k++) { NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].miscEquips[k].name, player.Index, slot, (float)Main.player[player.Index].miscEquips[k].prefix); slot++; } for (int k = 0; k < NetItem.MiscDyeSlots; k++) { NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].miscDyes[k].name, player.Index, slot, (float)Main.player[player.Index].miscDyes[k].prefix); slot++; } for (int k = 0; k < NetItem.PiggySlots; k++) { NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].bank.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank.item[k].prefix); slot++; } for (int k = 0; k < NetItem.SafeSlots; k++) { NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].bank2.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank2.item[k].prefix); slot++; } NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].trashItem.name, player.Index, slot++, (float)Main.player[player.Index].trashItem.prefix); for (int k = 0; k < NetItem.ForgeSlots; k++) { NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].bank3.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank3.item[k].prefix); slot++; } NetMessage.SendData(4, player.Index, -1, player.Name, player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(42, player.Index, -1, "", player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(16, player.Index, -1, "", player.Index, 0f, 0f, 0f, 0); for (int k = 0; k < 22; k++) { player.TPlayer.buffType[k] = 0; } /* * The following packets are sent twice because the server will not send a packet to a client * if they have not spawned yet if the remoteclient is -1 * This is for when players login via uuid or serverpassword instead of via * the login command. */ NetMessage.SendData(50, -1, -1, "", player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(50, player.Index, -1, "", player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(76, player.Index, -1, "", player.Index); NetMessage.SendData(76, -1, -1, "", player.Index); NetMessage.SendData(39, player.Index, -1, "", 400); }
public static void SendPage( TSPlayer player, int pageNumber, IEnumerable dataToPaginate, int dataToPaginateCount, Settings settings = null) { if (settings == null) { settings = new Settings(); } if (dataToPaginateCount == 0) { if (settings.NothingToDisplayString != null) { if (!player.RealPlayer) { player.SendSuccessMessage(settings.NothingToDisplayString); } else { player.SendMessage(settings.NothingToDisplayString, settings.HeaderTextColor); } } return; } int pageCount = ((dataToPaginateCount - 1) / settings.MaxLinesPerPage) + 1; if (settings.PageLimit > 0 && pageCount > settings.PageLimit) { pageCount = settings.PageLimit; } if (pageNumber > pageCount) { pageNumber = pageCount; } if (settings.IncludeHeader) { if (!player.RealPlayer) { player.SendSuccessMessage(string.Format(settings.HeaderFormat, pageNumber, pageCount)); } else { player.SendMessage(string.Format(settings.HeaderFormat, pageNumber, pageCount), settings.HeaderTextColor); } } int listOffset = (pageNumber - 1) * settings.MaxLinesPerPage; int offsetCounter = 0; int lineCounter = 0; foreach (object lineData in dataToPaginate) { if (lineData == null) { continue; } if (offsetCounter++ < listOffset) { continue; } if (lineCounter++ == settings.MaxLinesPerPage) { break; } string lineMessage; Color lineColor = settings.LineTextColor; if (lineData is Tuple <string, Color> ) { var lineFormat = (Tuple <string, Color>)lineData; lineMessage = lineFormat.Item1; lineColor = lineFormat.Item2; } else if (settings.LineFormatter != null) { try { Tuple <string, Color> lineFormat = settings.LineFormatter(lineData, offsetCounter, pageNumber); if (lineFormat == null) { continue; } lineMessage = lineFormat.Item1; lineColor = lineFormat.Item2; } catch (Exception ex) { throw new InvalidOperationException( "The method referenced by LineFormatter has thrown an exception. See inner exception for details.", ex); } } else { lineMessage = lineData.ToString(); } if (lineMessage != null) { if (!player.RealPlayer) { player.SendInfoMessage(lineMessage); } else { player.SendMessage(lineMessage, lineColor); } } } if (lineCounter == 0) { if (settings.NothingToDisplayString != null) { if (!player.RealPlayer) { player.SendSuccessMessage(settings.NothingToDisplayString); } else { player.SendMessage(settings.NothingToDisplayString, settings.HeaderTextColor); } } } else if (settings.IncludeFooter && pageNumber + 1 <= pageCount) { if (!player.RealPlayer) { player.SendInfoMessage(string.Format(settings.FooterFormat, pageNumber + 1, pageNumber, pageCount)); } else { player.SendMessage(string.Format(settings.FooterFormat, pageNumber + 1, pageNumber, pageCount), settings.FooterTextColor); } } }
public static void BlitzMatch(CommandArgs args) { config = Statistics.config; player = args.Player; if (args.Parameters.Count < 1) { if (DateTime.Now >= config.BlitzEventStart) { config.BlitzEventStart = DateTime.Now.AddSeconds(30); } KillingSpree.StartSpree(); return; } switch (args.Parameters[0].ToLowerInvariant()) { case "-bt": case "-blitztype": if (args.Parameters.Count >= 2) { config.BlitzEventType = args.Parameters[1]; } break; case "-t": case "-target": config.BlitzEventGoal = Int32.Parse(args.Parameters[1]); break; case "-i": case "-interval": config.BlitzEventLength = Int32.Parse(args.Parameters[1]); break; case "-s": case "-start": startSpree = new TimeSpan(0, 0, 0, 30); if (args.Parameters.Count >= 2) { try { if (args.Parameters[1].Contains("h")) { startSpree = DateTime.ParseExact(args.Parameters[1], "H'h'm'm'", CultureInfo.InvariantCulture).TimeOfDay; } else { startSpree = DateTime.ParseExact(args.Parameters[1], "m'm'", CultureInfo.InvariantCulture).TimeOfDay; } } catch { args.Player.SendErrorMessage("Start is not a valid date/time."); return; } } break; case "-go": config.BlitzEventStart = DateTime.Now.Add(startSpree); KillingSpree.StartSpree(); break; } }
public static void SendPage(TSPlayer player, int pageNumber, IList dataToPaginate, Settings settings = null) { PaginationTools.SendPage(player, pageNumber, dataToPaginate, dataToPaginate.Count, settings); }
public static void Core(CommandArgs args) { config = Statistics.config; player = args.Player; string[] statList = { "MobKills", "BossKills", "PlayerKills" }; if (args.Parameters.Count < 1) { string options = ""; options += "-k(ills) - list the number of kills for the player"; options += "-t(ime) - show time on for player"; options += "-hs/highscores - list the top 5 players"; options += "-d(amage) - show the amount of damage"; options += "-s(een) - when the player was last seen"; options += "-l(ist) - show all the data for the player(s)"; options += "-stop - stops the Announcement feature"; options += "-prune <days> - will prune KillingSpree table of data before <days> ago"; options += "-o(ptions) will list all the values of the config file"; options += "-r(eload) will reload the current config file and set all the values and time intervals as specified"; options += "-n(otify) will send out all the announcements now. This will not impact the timing"; args.Player.SendErrorMessage("Invalid syntax. /stats [flag] <player name>"); args.Player.SendErrorMessage(options); return; } switch (args.Parameters[0].ToLowerInvariant()) { case "-debug": if (args.Player.RealPlayer) { args.Player.SendErrorMessage("Invalid stats option"); return; } Statistics.statsDebug = true; Console.WriteLine("Debug mode set"); break; case "-kl": if (args.Player.RealPlayer) { args.Player.SendErrorMessage("Invalid stats option"); return; } var playerData = TShock.Users.GetUserByID(Int32.Parse(args.Parameters[1])); var userName = TShock.Users.GetUserByID(Int32.Parse(args.Parameters[1])); KillingSpree.SendKillingNotice(playerData.Name, Int32.Parse(args.Parameters[1]), 1, 0, 0); break; case "-km": if (args.Player.RealPlayer) { args.Player.SendErrorMessage("Invalid stats option"); return; } playerData = TShock.Users.GetUserByID(Int32.Parse(args.Parameters[1])); if (args.Player.RealPlayer) { args.Player.SendErrorMessage("Invalid stats option"); return; } Statistics.database.UpdateKillingSpree(Int32.Parse(args.Parameters[1]), 1, 0, 0); KillingSpree.SendKillingNotice(playerData.Name, Int32.Parse(args.Parameters[1]), 1, 0, 0); break; case "-kb": if (args.Player.RealPlayer) { args.Player.SendErrorMessage("Invalid stats option"); return; } playerData = TShock.Users.GetUserByID(Int32.Parse(args.Parameters[1])); Statistics.database.UpdateKillingSpree(Int32.Parse(args.Parameters[1]), 0, 1, 0); KillingSpree.SendKillingNotice(playerData.Name, Int32.Parse(args.Parameters[1]), 0, 1, 0); break; case "-kk": SpeedKills.PlayerKill(Int32.Parse(args.Parameters[1])); break; case "-kp": if (args.Player.RealPlayer) { args.Player.SendErrorMessage("Invalid stats option"); return; } playerData = TShock.Users.GetUserByID(Int32.Parse(args.Parameters[1])); Statistics.database.UpdateKillingSpree(Int32.Parse(args.Parameters[1]), 0, 0, 1); KillingSpree.SendKillingNotice(playerData.Name, Int32.Parse(args.Parameters[1]), 0, 0, 1); break; case "-kd": if (args.Player.RealPlayer) { args.Player.SendErrorMessage("Invalid stats option"); return; } Statistics.database.CloseKillingSpree(Int32.Parse(args.Parameters[1])); KillingSpree.ClearBlitzEvent(Int32.Parse(args.Parameters[1])); break; case "-o": case "-options": if (args.Player.RealPlayer) { args.Player.SendErrorMessage("Invalid stats option"); return; } Announcements.ConsoleSendMessage(string.Format(" isActive {0}", config.isActive)); Announcements.ConsoleSendMessage(string.Format(" byTime {0}", config.byTime)); Announcements.ConsoleSendMessage(string.Format(" showTimeStamp {0}", config.showTimeStamp)); Announcements.ConsoleSendMessage(string.Format(" tellConsole {0}", config.tellConsole)); Announcements.ConsoleSendMessage(string.Format(" consoleColor {0}", config.consoleColor)); Announcements.ConsoleSendMessage(string.Format(" showKills {0}", config.showKills)); Announcements.ConsoleSendMessage(string.Format(" KillstimeInterval {0}", config.KillstimeInterval)); Announcements.ConsoleSendMessage(string.Format(" KillstimeOffset {0}", config.KillstimeOffset)); Announcements.ConsoleSendMessage(string.Format(" KillsColor {0}", string.Join(",", config.KillsColor))); Announcements.ConsoleSendMessage(string.Format(" DamagetimeInterval {0}", config.DamagetimeInterval)); Announcements.ConsoleSendMessage(string.Format(" showDamageKills {0}", config.showDamage)); Announcements.ConsoleSendMessage(string.Format(" DamagetimeOffset {0}", config.DamagetimeOffset)); Announcements.ConsoleSendMessage(string.Format(" DamageColor {0}", string.Join(",", config.DamageColor))); Announcements.ConsoleSendMessage(string.Format(" DeathstimeInterval {0}", config.DeathstimeInterval)); Announcements.ConsoleSendMessage(string.Format(" showDeathsKills {0}", config.showDeaths)); Announcements.ConsoleSendMessage(string.Format(" DeathstimeOffset {0}", config.DeathstimeOffset)); Announcements.ConsoleSendMessage(string.Format(" DeathsColor {0}", string.Join(",", config.DeathsColor))); Announcements.ConsoleSendMessage(string.Format(" KillingSpree {0}", config.KillingSpree)); Announcements.ConsoleSendMessage(string.Format(" KillingSpreeThreshold {0}", string.Join(",", config.KillingSpreeThreshold))); Announcements.ConsoleSendMessage(string.Format(" KillingSpreeMessage {0}", string.Join(",", config.KillingSpreeMessage))); Announcements.ConsoleSendMessage(string.Format(" KillingSpreeType {0}", config.KillingSpreeType)); Announcements.ConsoleSendMessage(string.Format(" KillingSpreeColor {0}", string.Join(",", config.KillingSpreeColor))); Announcements.ConsoleSendMessage(string.Format(" SpreeStart {0}", config.BlitzEventStart)); Announcements.ConsoleSendMessage(string.Format(" SpreeLength {0}", config.BlitzEventLength)); Announcements.ConsoleSendMessage(string.Format(" SpreeEndByTime {0}", config.BlitzEventEndByTime)); Announcements.ConsoleSendMessage(string.Format(" SpreeGoal {0}", config.BlitzEventGoal)); Announcements.ConsoleSendMessage(string.Format(" SpreeType {0}", config.BlitzEventType)); break; case "-prune": if (args.Parameters.Count < 2) { args.Player.SendErrorMessage("No days specified for pruning."); return; } int days = 0; try { days = Int32.Parse(args.Parameters[1]); } catch { args.Player.SendErrorMessage("days specified is not numeric."); return; } if (days <= 0 || days >= 1000) { args.Player.SendErrorMessage("days must be > 0 and < 1000."); return; } int[] counts = Statistics.database.PruneKillingSpree(days); Announcements.ConsoleSendMessage(string.Format(" KillingSpree pruned {0} days: before[{1}] after[{2}].", Int32.Parse(args.Parameters[1]), counts[0], counts[1])); break; case "-r": case "-reload": if (args.Player.RealPlayer) { args.Player.SendErrorMessage("Invalid stats option"); return; } Statistics.config = Config.loadConfig(Statistics.configPath); Announcements.stopAnnouncements(); Announcements.setupAnnouncements(); Announcements.ConsoleSendMessage(string.Format(" Announcements config reloaded")); break; case "-stop": Statistics.config.isActive = false; Announcements.stopAnnouncements(); Announcements.ConsoleSendMessage(string.Format(" Announcements stopped")); break; // case "-init": // Statistics.database.dropTables(); // Statistics.OnInitialize(null); // break; case "-n": case "-notify": if (args.Player.RealPlayer) { args.Player.SendErrorMessage("Invalid stats option"); return; } if (args.Parameters.Count < 2) { Announcements.SendNoticeAll(""); } else { if (statList.Contains(args.Parameters[1])) { Announcements.SendNoticeAll(args.Parameters[1]); } else { Announcements.ConsoleSendMessage(string.Format(" Invalid stats option")); } } break; case "-l": case "-list": { Dictionary <string, int[]> statsList = new Dictionary <string, int[]>(); int page = 0, totalPages = 0; totalPages = Statistics.database.CountAllPlayers(); if (totalPages == 0) { args.Player.SendErrorMessage("No statistical data available"); return; } var lineColor = Color.Yellow; totalPages = (totalPages / 5) + 1; statsList.Clear(); if (args.Parameters.Count < 2) { statsList = Statistics.database.GetAllPlayers(page, 0); page = 1; } else { bool isNum = Int32.TryParse(args.Parameters[1], out page); if (isNum) { statsList = Statistics.database.GetAllPlayers(page, 0); if (!args.Player.RealPlayer) { args.Player.SendInfoMessage("Statistics List - Page {0} of {1}", page, totalPages); } else { args.Player.SendMessage(string.Format("Statistics List - Page {0} of {1}", page, totalPages), lineColor); } } else { var user = TShock.Users.GetUsers().Find(u => u.Name.StartsWith(args.Parameters[1])); if (user == null) { args.Player.SendErrorMessage("No users found matching the name '{0}'", args.Parameters[1]); } else { statsList = Statistics.database.GetAllPlayers(1, user.ID); } } } foreach (KeyValuePair <string, int[]> stat in statsList) { string statsName = stat.Key; int[] stats = stat.Value; TimeSpan ts = new TimeSpan(0, 0, 0, stats[2]); var total = ts.Add(new TimeSpan(0, 0, 0, Statistics.TimeCache[stats[0]])); if (!args.Player.RealPlayer) { args.Player.SendInfoMessage(" {0}, died {1} kills: player {4} mob {5} boss {6} - damage: mob {7} boss {8} player {9} received {10} on for {2} logins {3}", statsName, stats[1], total.SToString(), stats[3], stats[4], stats[5], stats[6], stats[7], stats[8], stats[9], stats[10]); } else { args.Player.SendMessage(string.Format(" {0}, died {1} kills: player {4} mob {5} boss {6} - damage: mob {7} boss {8} player {9} received {10} on for {2} logins {3}", statsName, stats[1], total.SToString(), stats[3], stats[4], stats[5], stats[6], stats[7], stats[8], stats[9], stats[10]), lineColor); } } } break; case "-k": case "-kills": { if (args.Parameters.Count < 2) { var kills = Statistics.database.GetCurrentKills(args.Player.User.ID); if (kills == null) { args.Player.SendErrorMessage("Unable to discover your killcount. Sorry."); } else { args.Player.SendSuccessMessage( "You have killed {0} player{4}, {1} mob{5}, {2} boss{6} and died {3} time{7}", kills[4], kills[5], kills[6], kills[3], kills[4].Suffix(), kills[5].Suffix(), kills[6].Suffix(true), kills[3].Suffix()); } } else { var name = args.Parameters[1]; var user = TShock.Users.GetUsers().Find(u => u.Name.StartsWith(name)); if (user == null) { args.Player.SendErrorMessage("No users found matching the name '{0}'", name); } else { var kills = Statistics.database.GetCurrentKills(user.ID); if (kills == null) { args.Player.SendErrorMessage("Unable to discover the killcount of {0}. Sorry.", user.Name); } else { args.Player.SendSuccessMessage( "{0} has killed {1} player{5}, {2} mob{6}, {3} boss{7} and died {4} time{8}", user.Name, kills[4], kills[5], kills[6], kills[3], kills[4].Suffix(), kills[5].Suffix(), kills[6].Suffix(true), kills[3].Suffix()); } } } break; } case "-t": case "-time": { var logins = 1; if (args.Parameters.Count < 2) { var times = Statistics.database.GetTimes(args.Player.User.ID, ref logins); if (times == null) { args.Player.SendErrorMessage("Unable to discover your times. Sorry."); } else { var total = times[1].Add(new TimeSpan(0, 0, 0, Statistics.TimeCache[args.Player.Index])); args.Player.SendSuccessMessage("You have played for {0}.", total.SToString()); args.Player.SendSuccessMessage("You have been registered for {0}.", times[0].SToString()); args.Player.SendSuccessMessage("You have logged in {0} times.", logins); } } else { var name = args.Parameters[1]; var users = GetUsers(name); if (users.Count > 1) { args.Player.SendErrorMessage("More than one user matched your search '{0}': {1}", name, string.Join(", ", users.Select(u => u.Name))); break; } if (users.Count == 0) { args.Player.SendErrorMessage("No users matched your search '{0}'", name); break; } var user = users[0]; var times = Statistics.database.GetTimes(user.ID, ref logins); if (times == null) { args.Player.SendErrorMessage("Unable to discover the times of {0}. Sorry.", user.Name); } else { args.Player.SendSuccessMessage("{0} has played for {1}.", user.Name, times[1].SToString()); args.Player.SendSuccessMessage("{0} has been registered for {1}.", user.Name, times[0].SToString()); args.Player.SendSuccessMessage("{0} has logged in {1} times.", user.Name, logins); } } break; } case "-s": case "-seen": { if (args.Parameters.Count < 2) { args.Player.SendErrorMessage("Invalid syntax. /stats -s [player name]"); } else { var name = args.Parameters[1]; var users = GetUsers(name); if (users.Count > 1) { args.Player.SendErrorMessage("More than one user matched your search '{0}': {1}", name, string.Join(", ", users.Select(u => u.Name))); break; } if (users.Count == 0) { args.Player.SendErrorMessage("No users matched your search '{0}'", name); break; } var user = users[0]; var seen = Statistics.database.GetLastSeen(user.ID); if (seen == TimeSpan.MaxValue) { args.Player.SendErrorMessage("Unable to find {0}'s last login time.", user.Name); } else { args.Player.SendSuccessMessage("{0} last logged in {1} ago.", user.Name, seen.SToString()); } } break; } case "-hs": case "-highscores": { var highscores = new Dictionary <string, int>(); var page = 1; if (args.Parameters.Count < 2) { highscores = Statistics.database.GetHighScores(1); } else if (HsPagination.TryParsePageNumber(args.Parameters, 1, args.Player, out page)) { highscores = Statistics.database.GetHighScores(page); } HsPagination.SendPage(args.Player, page, highscores, new HsPagination.FormatSettings { FooterFormat = "use /stats -hs {0} for more high scores", FooterTextColor = Color.Lime, HeaderFormat = "High Scores- Page {0} of {1}", HeaderTextColor = Color.Lime, IncludeFooter = true, IncludeHeader = true, MaxLinesPerPage = 5, NothingToDisplayString = "No highscores available" }); break; } case "-d": case "-damage": { if (args.Parameters.Count < 2) { var damages = Statistics.database.GetDamage(args.Player.User.ID); if (damages == null) { args.Player.SendErrorMessage("Unable to discover your damage statistics. Sorry."); return; } args.Player.SendSuccessMessage("You have dealt {0} damage to mobs, {1} damage to bosses " + "and {2} damage to players.", damages[0], damages[1], damages[2]); args.Player.SendSuccessMessage("You have been dealt {0} damage.", damages[3]); } else { var name = args.Parameters[1]; var users = GetUsers(name); if (users.Count > 1) { args.Player.SendErrorMessage("More than one user matched your search '{0}': {1}", name, string.Join(", ", users.Select(u => u.Name))); break; } if (users.Count == 0) { args.Player.SendErrorMessage("No users matched your search '{0}'", name); break; } var user = users[0]; var damages = Statistics.database.GetDamage(user.ID); if (damages == null) { args.Player.SendErrorMessage("Unable to discover your damage statistics. Sorry."); return; } args.Player.SendSuccessMessage("{0} has dealt {1} damage to mobs, {2} damage to bosses " + "and {3} damage to players.", user.Name, damages[0], damages[1], damages[2]); args.Player.SendSuccessMessage("{0} has been dealt {1} damage.", user.Name, damages[3]); } break; } case "-ix": case "-infox": { break; } } }
public static bool TryParsePageNumber(List <string> commandParameters, int expectedParameterIndex, TSPlayer errorMessageReceiver, out int pageNumber) { pageNumber = 1; if (commandParameters.Count <= expectedParameterIndex) { return(true); } string pageNumberRaw = commandParameters[expectedParameterIndex]; if (!int.TryParse(pageNumberRaw, out pageNumber) || pageNumber < 1) { if (errorMessageReceiver != null) { errorMessageReceiver.SendErrorMessage("\"{0}\" is not a valid page number.", pageNumberRaw); } pageNumber = 1; return(false); } return(true); }
/// <summary> /// Copies a characters data to this object /// </summary> /// <param name="player"></param> public void CopyCharacter(TSPlayer player) { this.health = player.TPlayer.statLife > 0 ? player.TPlayer.statLife : 1; this.maxHealth = player.TPlayer.statLifeMax; this.mana = player.TPlayer.statMana; this.maxMana = player.TPlayer.statManaMax; if (player.sX > 0 && player.sY > 0) { this.spawnX = player.sX; this.spawnY = player.sY; } else { this.spawnX = player.TPlayer.SpawnX; this.spawnY = player.TPlayer.SpawnY; } extraSlot = player.TPlayer.extraAccessory ? 1 : 0; this.skinVariant = player.TPlayer.skinVariant; this.hair = player.TPlayer.hair; this.hairDye = player.TPlayer.hairDye; this.hairColor = player.TPlayer.hairColor; this.pantsColor = player.TPlayer.pantsColor; this.shirtColor = player.TPlayer.shirtColor; this.underShirtColor = player.TPlayer.underShirtColor; this.shoeColor = player.TPlayer.shoeColor; this.hideVisuals = player.TPlayer.hideVisual; this.skinColor = player.TPlayer.skinColor; this.eyeColor = player.TPlayer.eyeColor; this.questsCompleted = player.TPlayer.anglerQuestsFinished; Item[] inventory = player.TPlayer.inventory; Item[] armor = player.TPlayer.armor; Item[] dye = player.TPlayer.dye; Item[] miscEqups = player.TPlayer.miscEquips; Item[] miscDyes = player.TPlayer.miscDyes; Item[] piggy = player.TPlayer.bank.item; Item[] safe = player.TPlayer.bank2.item; Item trash = player.TPlayer.trashItem; for (int i = 0; i < NetItem.MaxInventory; i++) { if (i < NetItem.InventorySlots) { //0-58 this.inventory[i] = (NetItem)inventory[i]; } else if (i < NetItem.InventorySlots + NetItem.ArmorSlots) { //59-78 var index = i - NetItem.InventorySlots; this.inventory[i] = (NetItem)armor[index]; } else if (i < NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots) { //79-88 var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots); this.inventory[i] = (NetItem)dye[index]; } else if (i < NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots) { //89-93 var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots); this.inventory[i] = (NetItem)miscEqups[index]; } else if (i < NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + NetItem.MiscDyeSlots) { //93-98 var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots); this.inventory[i] = (NetItem)miscDyes[index]; } else if (i < NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + NetItem.MiscDyeSlots + NetItem.PiggySlots) { //98-138 var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + NetItem.MiscDyeSlots); this.inventory[i] = (NetItem)piggy[index]; } else if (i < NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + NetItem.MiscDyeSlots + NetItem.PiggySlots + NetItem.SafeSlots) { //138-178 var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + NetItem.MiscDyeSlots + NetItem.PiggySlots); this.inventory[i] = (NetItem)safe[index]; } else { //179 this.inventory[i] = (NetItem)trash; } } }
public static bool CheckInventory(TSPlayer player) { PlayerData playerData = player.PlayerData; bool check = true; if (player.TPlayer.statLifeMax > playerData.maxHealth) { player.SendMessage("Error: Your max health exceeded (" + playerData.maxHealth + ") which is stored on server", Color.Cyan); check = false; } if (player.TPlayer.statManaMax > playerData.maxMana) { player.SendMessage("Error: Your max mana exceeded (" + playerData.maxMana + ") which is stored on server", Color.Cyan); check = false; } Item[] inventory = player.TPlayer.inventory; Item[] armor = player.TPlayer.armor; for (int i = 0; i < NetItem.maxNetInventory; i++) { if (i < 49) { Item item = new Item(); Item serverItem = new Item(); if (inventory[i] != null && inventory[i].netID != 0) { if (playerData.inventory[i].netID != inventory[i].netID) { item.netDefaults(inventory[i].netID); item.Prefix(inventory[i].prefix); item.AffixName(); player.SendMessage("Error: Your item (" + item.name + ") needs to be deleted.", Color.Cyan); check = false; } else if (playerData.inventory[i].prefix != inventory[i].prefix) { item.netDefaults(inventory[i].netID); item.Prefix(inventory[i].prefix); item.AffixName(); player.SendMessage("Error: Your item (" + item.name + ") needs to be deleted.", Color.Cyan); check = false; } else if (inventory[i].stack > playerData.inventory[i].stack) { item.netDefaults(inventory[i].netID); item.Prefix(inventory[i].prefix); item.AffixName(); player.SendMessage("Error: Your item (" + item.name + ") (" + inventory[i].stack + ") needs to have it's stack decreased to (" + playerData.inventory[i].stack + ").", Color.Cyan); check = false; } } } else { Item item = new Item(); Item serverItem = new Item(); if (armor[i - 48] != null && armor[i - 48].netID != 0) { if (playerData.inventory[i].netID != armor[i - 48].netID) { 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 - 48].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 (armor[i - 48].stack > playerData.inventory[i].stack) { 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; } } } } return(check); }
/// <summary> /// Executes the AliasCommand. Will either forward the command to the tshock handler or do something else /// </summary> protected void DoCommands(AliasCommand alias, TShockAPI.TSPlayer player, List <string> parameters) { //loop through each alias and do the commands. foreach (string commandToExecute in alias.CommandsToExecute) { //todo: parse paramaters and dynamics string mangledString = commandToExecute; //specifies whether the command to run should be executed as a command, or ignored. //useful for functions like $msg that does other shit bool executeCommand = true; //replace parameter markers with actual parameter values ReplaceParameterMarkers(parameters, ref mangledString); mangledString = mangledString.Replace("$calleraccount", player.User.Name); mangledString = mangledString.Replace("$callername", player.Name); //$random(x,y) support. Returns a random number between x and y if (randomRegex.IsMatch(mangledString)) { foreach (Match match in randomRegex.Matches(mangledString)) { int randomFrom = 0; int randomTo = 0; if (!string.IsNullOrEmpty(match.Groups[2].Value) && int.TryParse(match.Groups[2].Value, out randomTo) && !string.IsNullOrEmpty(match.Groups[1].Value) && int.TryParse(match.Groups[1].Value, out randomFrom)) { // this is a critical section // Random class is seeded from the system clock if you construct one without a seed. // therefore, calls to Next() at exactly the same point in time is likely to produce the same number. lock (__rndLock) { mangledString = mangledString.Replace(match.ToString(), randomGenerator.Next(randomFrom, randomTo).ToString()); } } else { TShock.Log.ConsoleError(match.ToString() + " has some stupid shit in it, have a look at your AliasCmd config file."); mangledString = mangledString.Replace(match.ToString(), ""); } } } // $runas(u,cmd) support. Run command as user if (runasFunctionRegex.IsMatch(mangledString)) { foreach (Match match in runasFunctionRegex.Matches(mangledString)) { string impersonatedName = match.Groups[2].Value; TSPlayer impersonatedPlayer = TShockAPI.TShock.Players.FirstOrDefault(i => i != null && i.Name == impersonatedName); if (impersonatedPlayer != null) { string commandToRun = match.Groups[3].Value; player = impersonatedPlayer; mangledString = commandToRun.Trim(); } } } // $msg(u,msg) support. Sends the user a non-chat informational message if (msgRegex.IsMatch(mangledString)) { foreach (Match match in msgRegex.Matches(mangledString)) { string msgTarget = match.Groups[2].Value.Trim(); string message = match.Groups[3].Value.Trim(); TSPlayer destinationPlayer = TShockAPI.TShock.Players.FirstOrDefault(i => i != null && i.Name == msgTarget); if (destinationPlayer != null) { //custom command, skip forwarding of the command to the tshock executer executeCommand = false; destinationPlayer.SendInfoMessage(message); } } } //and send the command to tshock to do. try { //prevent an infinite loop for a subcommand calling the alias again causing a commandloop string command = mangledString.Split(' ')[0].Substring(1); if (!command.Equals(alias.CommandAlias, StringComparison.CurrentCultureIgnoreCase)) { if (executeCommand) { player.PermissionlessInvoke(mangledString); } } else { TShock.Log.ConsoleError(string.Format("cmdalias {0}: calling yourself in an alias will cause an infinite loop. Ignoring.", alias.CommandAlias)); } } catch { //execute the command disregarding permissions player.SendErrorMessage(alias.UsageHelpText); } } }
/// <summary> /// Sends the player an error message stating that more than one match was found /// appending a csv list of the matches. /// </summary> /// <param name="ply">Player to send the message to</param> /// <param name="matches">An enumerable list with the matches</param> public void SendMultipleMatchError(TSPlayer ply, IEnumerable <object> matches) { ply.SendErrorMessage("More than one match found: {0}", string.Join(",", matches)); ply.SendErrorMessage("Use \"my query\" for items with spaces"); }
/// <summary> /// Restores a player's character to the state stored in the database /// </summary> /// <param name="player"></param> public void RestoreCharacter(TSPlayer player) { // Start ignoring SSC-related packets! This is critical so that we don't send or receive dirty data! player.IgnoreSSCPackets = true; player.TPlayer.statLife = this.health; player.TPlayer.statLifeMax = this.maxHealth; player.TPlayer.statMana = this.maxMana; player.TPlayer.statManaMax = this.maxMana; player.TPlayer.SpawnX = this.spawnX; player.TPlayer.SpawnY = this.spawnY; player.sX = this.spawnX; player.sY = this.spawnY; player.TPlayer.hairDye = this.hairDye; player.TPlayer.anglerQuestsFinished = this.questsCompleted; if (extraSlot != null) { player.TPlayer.extraAccessory = extraSlot.Value == 1 ? true : false; } if (this.skinVariant != null) { player.TPlayer.skinVariant = this.skinVariant.Value; } if (this.hair != null) { player.TPlayer.hair = this.hair.Value; } if (this.hairColor != null) { player.TPlayer.hairColor = this.hairColor.Value; } if (this.pantsColor != null) { player.TPlayer.pantsColor = this.pantsColor.Value; } if (this.shirtColor != null) { player.TPlayer.shirtColor = this.shirtColor.Value; } if (this.underShirtColor != null) { player.TPlayer.underShirtColor = this.underShirtColor.Value; } if (this.shoeColor != null) { player.TPlayer.shoeColor = this.shoeColor.Value; } if (this.skinColor != null) { player.TPlayer.skinColor = this.skinColor.Value; } if (this.eyeColor != null) { player.TPlayer.eyeColor = this.eyeColor.Value; } if (this.hideVisuals != null) { player.TPlayer.hideVisibleAccessory = this.hideVisuals; } else { player.TPlayer.hideVisibleAccessory = new bool[player.TPlayer.hideVisibleAccessory.Length]; } if (this.unlockedBiomeTorches != null) { player.TPlayer.unlockedBiomeTorches = this.unlockedBiomeTorches == 1 ? true : false; player.TPlayer.UsingBiomeTorches = this.unlockedBiomeTorches == 1 ? true : false; } for (int i = 0; i < NetItem.MaxInventory; i++) { if (i < NetItem.InventoryIndex.Item2) { //0-58 player.TPlayer.inventory[i].netDefaults(this.inventory[i].NetId); if (player.TPlayer.inventory[i].netID != 0) { player.TPlayer.inventory[i].stack = this.inventory[i].Stack; player.TPlayer.inventory[i].prefix = this.inventory[i].PrefixId; } } else if (i < NetItem.ArmorIndex.Item2) { //59-78 var index = i - NetItem.ArmorIndex.Item1; player.TPlayer.armor[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.armor[index].netID != 0) { player.TPlayer.armor[index].stack = this.inventory[i].Stack; player.TPlayer.armor[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.DyeIndex.Item2) { //79-88 var index = i - NetItem.DyeIndex.Item1; player.TPlayer.dye[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.dye[index].netID != 0) { player.TPlayer.dye[index].stack = this.inventory[i].Stack; player.TPlayer.dye[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.MiscEquipIndex.Item2) { //89-93 var index = i - NetItem.MiscEquipIndex.Item1; player.TPlayer.miscEquips[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.miscEquips[index].netID != 0) { player.TPlayer.miscEquips[index].stack = this.inventory[i].Stack; player.TPlayer.miscEquips[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.MiscDyeIndex.Item2) { //93-98 var index = i - NetItem.MiscDyeIndex.Item1; player.TPlayer.miscDyes[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.miscDyes[index].netID != 0) { player.TPlayer.miscDyes[index].stack = this.inventory[i].Stack; player.TPlayer.miscDyes[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.PiggyIndex.Item2) { //98-138 var index = i - NetItem.PiggyIndex.Item1; player.TPlayer.bank.item[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.bank.item[index].netID != 0) { player.TPlayer.bank.item[index].stack = this.inventory[i].Stack; player.TPlayer.bank.item[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.SafeIndex.Item2) { //138-178 var index = i - NetItem.SafeIndex.Item1; player.TPlayer.bank2.item[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.bank2.item[index].netID != 0) { player.TPlayer.bank2.item[index].stack = this.inventory[i].Stack; player.TPlayer.bank2.item[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.TrashIndex.Item2) { //179-219 var index = i - NetItem.TrashIndex.Item1; player.TPlayer.trashItem.netDefaults(this.inventory[i].NetId); if (player.TPlayer.trashItem.netID != 0) { player.TPlayer.trashItem.stack = this.inventory[i].Stack; player.TPlayer.trashItem.prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.ForgeIndex.Item2) { //220 var index = i - NetItem.ForgeIndex.Item1; player.TPlayer.bank3.item[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.bank3.item[index].netID != 0) { player.TPlayer.bank3.item[index].stack = this.inventory[i].Stack; player.TPlayer.bank3.item[index].Prefix((byte)this.inventory[i].PrefixId); } } else { //260 var index = i - NetItem.VoidIndex.Item1; player.TPlayer.bank4.item[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.bank4.item[index].netID != 0) { player.TPlayer.bank4.item[index].stack = this.inventory[i].Stack; player.TPlayer.bank4.item[index].Prefix((byte)this.inventory[i].PrefixId); } } } float slot = 0f; for (int k = 0; k < NetItem.InventorySlots; k++) { NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].inventory[k].Name), player.Index, slot, (float)Main.player[player.Index].inventory[k].prefix); slot++; } for (int k = 0; k < NetItem.ArmorSlots; k++) { NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].armor[k].Name), player.Index, slot, (float)Main.player[player.Index].armor[k].prefix); slot++; } for (int k = 0; k < NetItem.DyeSlots; k++) { NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].dye[k].Name), player.Index, slot, (float)Main.player[player.Index].dye[k].prefix); slot++; } for (int k = 0; k < NetItem.MiscEquipSlots; k++) { NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].miscEquips[k].Name), player.Index, slot, (float)Main.player[player.Index].miscEquips[k].prefix); slot++; } for (int k = 0; k < NetItem.MiscDyeSlots; k++) { NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].miscDyes[k].Name), player.Index, slot, (float)Main.player[player.Index].miscDyes[k].prefix); slot++; } for (int k = 0; k < NetItem.PiggySlots; k++) { NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].bank.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank.item[k].prefix); slot++; } for (int k = 0; k < NetItem.SafeSlots; k++) { NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].bank2.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank2.item[k].prefix); slot++; } NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].trashItem.Name), player.Index, slot++, (float)Main.player[player.Index].trashItem.prefix); for (int k = 0; k < NetItem.ForgeSlots; k++) { NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].bank3.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank3.item[k].prefix); slot++; } for (int k = 0; k < NetItem.VoidSlots; k++) { 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++; } NetMessage.SendData(4, -1, -1, NetworkText.FromLiteral(player.Name), player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(42, -1, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(16, -1, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0); slot = 0f; for (int k = 0; k < NetItem.InventorySlots; k++) { NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].inventory[k].Name), player.Index, slot, (float)Main.player[player.Index].inventory[k].prefix); slot++; } for (int k = 0; k < NetItem.ArmorSlots; k++) { NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].armor[k].Name), player.Index, slot, (float)Main.player[player.Index].armor[k].prefix); slot++; } for (int k = 0; k < NetItem.DyeSlots; k++) { NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].dye[k].Name), player.Index, slot, (float)Main.player[player.Index].dye[k].prefix); slot++; } for (int k = 0; k < NetItem.MiscEquipSlots; k++) { NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].miscEquips[k].Name), player.Index, slot, (float)Main.player[player.Index].miscEquips[k].prefix); slot++; } for (int k = 0; k < NetItem.MiscDyeSlots; k++) { NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].miscDyes[k].Name), player.Index, slot, (float)Main.player[player.Index].miscDyes[k].prefix); slot++; } for (int k = 0; k < NetItem.PiggySlots; k++) { NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].bank.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank.item[k].prefix); slot++; } for (int k = 0; k < NetItem.SafeSlots; k++) { NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].bank2.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank2.item[k].prefix); slot++; } NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].trashItem.Name), player.Index, slot++, (float)Main.player[player.Index].trashItem.prefix); for (int k = 0; k < NetItem.ForgeSlots; k++) { NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].bank3.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank3.item[k].prefix); slot++; } for (int k = 0; k < NetItem.VoidSlots; k++) { 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++; } NetMessage.SendData(4, player.Index, -1, NetworkText.FromLiteral(player.Name), player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(42, player.Index, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(16, player.Index, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0); for (int k = 0; k < 22; k++) { player.TPlayer.buffType[k] = 0; } /* * The following packets are sent twice because the server will not send a packet to a client * if they have not spawned yet if the remoteclient is -1 * This is for when players login via uuid or serverpassword instead of via * the login command. */ NetMessage.SendData(50, -1, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(50, player.Index, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(76, player.Index, -1, NetworkText.Empty, player.Index); NetMessage.SendData(76, -1, -1, NetworkText.Empty, player.Index); NetMessage.SendData(39, player.Index, -1, NetworkText.Empty, 400); if (Main.GameModeInfo.IsJourneyMode) { var sacrificedItems = TShock.ResearchDatastore.GetSacrificedItems(); for (int i = 0; i < ItemID.Count; i++) { var amount = 0; if (sacrificedItems.ContainsKey(i)) { amount = sacrificedItems[i]; } var response = NetCreativeUnlocksModule.SerializeItemSacrifice(i, amount); NetManager.Instance.SendToClient(response, player.Index); } } }
/// <summary> /// Restores a player's character to the state stored in the database /// </summary> /// <param name="player"></param> public void RestoreCharacter(TSPlayer player) { // Start ignoring SSC-related packets! This is critical so that we don't send or receive dirty data! player.IgnoreSSCPackets = true; player.TPlayer.statLife = this.health; player.TPlayer.statLifeMax = this.maxHealth; player.TPlayer.statMana = this.maxMana; player.TPlayer.statManaMax = this.maxMana; player.TPlayer.SpawnX = this.spawnX; player.TPlayer.SpawnY = this.spawnY; player.sX = this.spawnX; player.sY = this.spawnY; player.TPlayer.hairDye = this.hairDye; player.TPlayer.anglerQuestsFinished = this.questsCompleted; if (extraSlot != null) { player.TPlayer.extraAccessory = extraSlot.Value == 1 ? true : false; } if (this.skinVariant != null) { player.TPlayer.skinVariant = this.skinVariant.Value; } if (this.hair != null) { player.TPlayer.hair = this.hair.Value; } if (this.hairColor != null) { player.TPlayer.hairColor = this.hairColor.Value; } if (this.pantsColor != null) { player.TPlayer.pantsColor = this.pantsColor.Value; } if (this.shirtColor != null) { player.TPlayer.shirtColor = this.shirtColor.Value; } if (this.underShirtColor != null) { player.TPlayer.underShirtColor = this.underShirtColor.Value; } if (this.shoeColor != null) { player.TPlayer.shoeColor = this.shoeColor.Value; } if (this.skinColor != null) { player.TPlayer.skinColor = this.skinColor.Value; } if (this.eyeColor != null) { player.TPlayer.eyeColor = this.eyeColor.Value; } if (this.hideVisuals != null) { player.TPlayer.hideVisual = this.hideVisuals; } else { player.TPlayer.hideVisual = new bool[player.TPlayer.hideVisual.Length]; } for (int i = 0; i < NetItem.MaxInventory; i++) { if (i < NetItem.InventorySlots) { //0-58 player.TPlayer.inventory[i].netDefaults(this.inventory[i].NetId); if (player.TPlayer.inventory[i].netID != 0) { player.TPlayer.inventory[i].stack = this.inventory[i].Stack; player.TPlayer.inventory[i].prefix = this.inventory[i].PrefixId; } } else if (i < NetItem.InventorySlots + NetItem.ArmorSlots) { //59-78 var index = i - NetItem.InventorySlots; player.TPlayer.armor[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.armor[index].netID != 0) { player.TPlayer.armor[index].stack = this.inventory[i].Stack; player.TPlayer.armor[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots) { //79-88 var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots); player.TPlayer.dye[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.dye[index].netID != 0) { player.TPlayer.dye[index].stack = this.inventory[i].Stack; player.TPlayer.dye[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots) { //89-93 var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots); player.TPlayer.miscEquips[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.miscEquips[index].netID != 0) { player.TPlayer.miscEquips[index].stack = this.inventory[i].Stack; player.TPlayer.miscEquips[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + NetItem.MiscDyeSlots) { //93-98 var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots); player.TPlayer.miscDyes[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.miscDyes[index].netID != 0) { player.TPlayer.miscDyes[index].stack = this.inventory[i].Stack; player.TPlayer.miscDyes[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + NetItem.MiscDyeSlots + NetItem.PiggySlots) { //98-138 var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + NetItem.MiscDyeSlots); player.TPlayer.bank.item[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.bank.item[index].netID != 0) { player.TPlayer.bank.item[index].stack = this.inventory[i].Stack; player.TPlayer.bank.item[index].prefix = (byte)this.inventory[i].PrefixId; } } else if (i < NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + NetItem.MiscDyeSlots + NetItem.PiggySlots + NetItem.SafeSlots) { var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + NetItem.MiscDyeSlots + NetItem.PiggySlots); player.TPlayer.bank2.item[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.bank2.item[index].netID != 0) { player.TPlayer.bank2.item[index].stack = this.inventory[i].Stack; player.TPlayer.bank2.item[index].prefix = (byte)this.inventory[i].PrefixId; } } else { player.TPlayer.trashItem.netDefaults(this.inventory[i].NetId); if (player.TPlayer.trashItem.netID != 0) { player.TPlayer.trashItem.stack = this.inventory[i].Stack; player.TPlayer.trashItem.prefix = (byte)this.inventory[i].PrefixId; } } } float slot = 0f; for (int k = 0; k < NetItem.InventorySlots; k++) { NetMessage.SendData(5, -1, -1, Main.player[player.Index].inventory[k].name, player.Index, slot, (float)Main.player[player.Index].inventory[k].prefix); slot++; } for (int k = 0; k < NetItem.ArmorSlots; k++) { NetMessage.SendData(5, -1, -1, Main.player[player.Index].armor[k].name, player.Index, slot, (float)Main.player[player.Index].armor[k].prefix); slot++; } for (int k = 0; k < NetItem.DyeSlots; k++) { NetMessage.SendData(5, -1, -1, Main.player[player.Index].dye[k].name, player.Index, slot, (float)Main.player[player.Index].dye[k].prefix); slot++; } for (int k = 0; k < NetItem.MiscEquipSlots; k++) { NetMessage.SendData(5, -1, -1, Main.player[player.Index].miscEquips[k].name, player.Index, slot, (float)Main.player[player.Index].miscEquips[k].prefix); slot++; } for (int k = 0; k < NetItem.MiscDyeSlots; k++) { NetMessage.SendData(5, -1, -1, Main.player[player.Index].miscDyes[k].name, player.Index, slot, (float)Main.player[player.Index].miscDyes[k].prefix); slot++; } for (int k = 0; k < NetItem.PiggySlots; k++) { NetMessage.SendData(5, -1, -1, Main.player[player.Index].bank.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank.item[k].prefix); slot++; } for (int k = 0; k < NetItem.SafeSlots; k++) { NetMessage.SendData(5, -1, -1, Main.player[player.Index].bank2.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank2.item[k].prefix); slot++; } NetMessage.SendData(5, -1, -1, Main.player[player.Index].trashItem.name, player.Index, slot, (float)Main.player[player.Index].trashItem.prefix); NetMessage.SendData(4, -1, -1, player.Name, player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(42, -1, -1, "", player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(16, -1, -1, "", player.Index, 0f, 0f, 0f, 0); slot = 0f; for (int k = 0; k < NetItem.InventorySlots; k++) { NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].inventory[k].name, player.Index, slot, (float)Main.player[player.Index].inventory[k].prefix); slot++; } for (int k = 0; k < NetItem.ArmorSlots; k++) { NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].armor[k].name, player.Index, slot, (float)Main.player[player.Index].armor[k].prefix); slot++; } for (int k = 0; k < NetItem.DyeSlots; k++) { NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].dye[k].name, player.Index, slot, (float)Main.player[player.Index].dye[k].prefix); slot++; } for (int k = 0; k < NetItem.MiscEquipSlots; k++) { NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].miscEquips[k].name, player.Index, slot, (float)Main.player[player.Index].miscEquips[k].prefix); slot++; } for (int k = 0; k < NetItem.MiscDyeSlots; k++) { NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].miscDyes[k].name, player.Index, slot, (float)Main.player[player.Index].miscDyes[k].prefix); slot++; } for (int k = 0; k < NetItem.PiggySlots; k++) { NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].bank.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank.item[k].prefix); slot++; } for (int k = 0; k < NetItem.SafeSlots; k++) { NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].bank2.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank2.item[k].prefix); slot++; } NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].trashItem.name, player.Index, slot, (float)Main.player[player.Index].trashItem.prefix); NetMessage.SendData(4, player.Index, -1, player.Name, player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(42, player.Index, -1, "", player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(16, player.Index, -1, "", player.Index, 0f, 0f, 0f, 0); for (int k = 0; k < 22; k++) { player.TPlayer.buffType[k] = 0; } NetMessage.SendData(50, -1, -1, "", player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(50, player.Index, -1, "", player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(76, -1, -1, "", player.Index); NetMessage.SendData(39, player.Index, -1, "", 400); }
/// <summary> /// Kicks a player from the server without checking for immunetokick permission. /// </summary> /// <param name="player">TSPlayer player</param> /// <param name="reason">string reason</param> /// <param name="silent">bool silent (default: false)</param> /// <param name="saveSSI">bool saveSSI (default: false)</param> public void ForceKick(TSPlayer player, string reason, bool silent = false, bool saveSSI = false) { Kick(player, reason, true, silent, null, saveSSI); }
/// <summary> /// Invokes a command ignoring permissions /// </summary> public static bool RunWithoutPermissions(this TShockAPI.Command cmd, string msg, TShockAPI.TSPlayer ply, List <string> parms) { try { TShockAPI.CommandDelegate cmdDelegateRef = cmd.CommandDelegate; cmdDelegateRef(new TShockAPI.CommandArgs(msg, ply, parms)); } catch (Exception e) { ply.SendErrorMessage("Command failed, check logs for more details."); TShock.Log.Error(e.ToString()); } return(true); }