/// <summary> /// Gives the specified item if the player does not already have it. /// </summary> /// <param name="player">The player, which must not be <c>null</c>.</param> /// <param name="item">The item.</param> /// <exception cref="ArgumentNullException"><paramref name="player" /> is <c>null</c>.</exception> public static void GiveItemIfNot([NotNull] this TSPlayer player, Item item) { if (player == null) { throw new ArgumentNullException(nameof(player)); } var tplayer = player.TPlayer; var type = item.Type; if (!tplayer.HasItem(type)) { player.GiveItem(type, item.StackSize, item.Prefix); } }
public int Do(TSPlayer plr, int amount = 1) { if (!plr.InventorySlotAvailable) { plr.SendErrorMessage("Zabraklo miejsca w ekwipunku."); return(0); } for (int i = 0; i < amount; i++) { foreach (SimpleItem ingredient in Ingredients) { PowelderAPI.Utils.PlayerRemoveItems(plr, TShock.Utils.GetItemById(ingredient.Id), ingredient.Amount); } plr.GiveItem(Result.Id, Result.Amount); } return(amount); }
public static bool StrikeNpc(BinaryReader read, TSPlayer who) { short npcid = read.ReadInt16(); short damage = read.ReadInt16(); float knockback = read.ReadSingle(); read.ReadByte(); bool crit = read.ReadBoolean(); NPC npc = Main.npc[npcid]; double finalDamage = Main.CalculateDamageNPCsTake(damage, npc.defense); if (crit) { finalDamage *= 2.0; } bool isDead = false || npc.life - finalDamage <= 0; if (npc.type == 661) { if (Main.dayTime) { who.SendErrorMessage("Wolimy uniknac masowej rzezni."); return(true); } if (!Goals.IsDone(636)) { who.SendErrorMessage("Ten boss w tej chwili jest zablokowany."); return(true); } if ((SurvivalCore.SrvPlayers[who.Index].BossCooldown - DateTime.Now).TotalSeconds > 0) { who.GiveItem(SpawnItemId(npcid), 1); who.SendErrorMessage($"Musisz odczekac jakis czas, aby moc zrespic kolejnego bossa. Mozliwe to bedzie za {PowelderAPI.Utils.ExpireCountDown(SurvivalCore.SrvPlayers[who.Index].BossCooldown)}"); return(true); } } return(false); }
void onPostInit(EventArgs args) { TSPlayer player; int item; Console.WriteLine("Starting Giving Random Items..."); Task.Run(async() => { for (; ;) { await Task.Delay(config.interval); //Console.WriteLine($"{online.Count} Online Players..."); TShock.Utils.Broadcast("Giving random Item to online players. Let's Go!", Color.Green); foreach (int index in online) { player = new TSPlayer(index); item = config.items[random.Next(0, config.items.Length)]; player.GiveItem(item, random.Next(1, 10)); //Console.WriteLine($"Item Given to {player.Name}..."); player.SendSuccessMessage($"You have recieved a random Item [{TShock.Utils.GetItemById(item).Name}]. Yehey!"); } } }); }
private void KeyChange(CommandArgs args) { TSPlayer ply = args.Player; // SSC check to alert users if (!Main.ServerSideCharacter) { ply.SendWarningMessage("[Advertencia] Este complemento puede no funcionar en servidores que no tengan SSC activado."); } if (args.Parameters.Count < 1) { // Plugin Info var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; ply.SendMessage($"KeyChanger (v{version}) por Enerdy - Actualizado y traducido por Tsviets", Color.SkyBlue); ply.SendMessage("Descripcion: Abre cajas de botin con llaves para obtener objetos.", Color.SkyBlue); ply.SendMessage($"Modo de uso: {Commands.Specifier}botin <lista/modo/abrir> [tipo]", Color.SkyBlue); ply.SendMessage($"Escribe {Commands.Specifier}help botin para más informacion.", Color.SkyBlue); } else if (args.Parameters[0].ToLower() == "abrir" && args.Parameters.Count == 1) { ply.SendErrorMessage("Error de uso. Uso correcto: {0}botin abrir <tipo>", Commands.Specifier); } else if (args.Parameters.Count > 0) { string cmd = args.Parameters[0].ToLower(); switch (cmd) { case "abrir": // Prevents cast from the server console if (!ply.RealPlayer) { ply.SendErrorMessage("Debes usar este comando dentro del juego."); return; } if (!ply.HasPermission("botin.abrir")) { ply.SendErrorMessage("No tienes acceso a este comando."); break; } KeyTypes type; if (!Enum.TryParse(args.Parameters[1].ToLowerInvariant(), true, out type)) { ply.SendErrorMessage("El botin seleccionado es invalido. Tipos de botines disponibles: " + String.Join(", ", Config.EnableTempleKey ? "templo" : null, Config.EnableJungleKey ? "jungla" : null, Config.EnableCorruptionKey ? "corrupto" : null, Config.EnableCrimsonKey ? "carmesi" : null, Config.EnableHallowedKey ? "sagrado" : null, Config.EnableFrozenKey ? "helado" : null, Config.EnableGoldenKey ? "dorado" : null, Config.EnableShadowKey ? "sombrio" : null, Config.EnableLightKey ? "radiante" : null, Config.EnableNightKey ? "nocturno" : null, Config.EnableDesertKey ? "desierto" : null)); return; } Key key = Utils.LoadKey(type); // Verifies whether the key has been enabled if (!key.Enabled) { ply.SendInfoMessage("El botin seleccionado se encuentra deshabilitado."); return; } if (!Config.UseSSC) { // Begin the exchange, expect the player to drop the key Exchanging[args.Player.Index] = type; ply.SendInfoMessage($"Drop (hold & right-click) any number of {key.Name} keys to proceed."); return; } // Checks if the player carries the necessary key var lookup = ply.TPlayer.inventory.FirstOrDefault(i => i.netID == (int)key.Type); if (lookup == null) { ply.SendErrorMessage("Asegurate de tener en tu inventario la llave del botin que quieres abrir."); return; } if (Config.EnableRegionExchanges) { Region region; if (Config.MarketMode) { region = TShock.Regions.GetRegionByName(Config.MarketRegion); } else { region = key.Region; } // Checks if the required region is set to null if (region == null) { ply.SendInfoMessage("No se ha especificado una region de intercambio para este botin."); return; } // Checks if the player is inside the region if (!region.InArea(args.Player.TileX, args.Player.TileY)) { ply.SendErrorMessage("Debes ir a la region indicada para abrir tu botin -> " + region.Name); return; } } Item item; for (int i = 0; i < 50; i++) { item = ply.TPlayer.inventory[i]; // Loops through the player's inventory if (item.netID == (int)key.Type) { // Found the item, checking for available slots. This will increase invManage for each empty slot until ic = 50, as any further slot have other purposes (coins, ammo, etc.) var invManage = 0; for (int ic = 0; ic < 50; ic++) { if (ply.TPlayer.inventory[ic].Name == "") { invManage++; } } var cfgCount = Config.ItemCountGiven; var LBenabler = Config.EnableLootboxMode; if ((item.stack == 1 & (item.stack + invManage) >= cfgCount & LBenabler == true) || ((invManage >= cfgCount) & LBenabler == true)) // If your key stack is 1, this will consider it as an empty slot as well. { ply.TPlayer.inventory[i].stack--; ply.SendSuccessMessage("Has usado una llave de botin => [i:{0}]", key.Items); // This here will show the opened lootbox, rename args as you see fit. Random rand = new Random(); for (int icount = 0; icount < cfgCount; icount++) { NetMessage.SendData((int)PacketTypes.PlayerSlot, -1, -1, NetworkText.Empty, ply.Index, i); Item give = key.Items[rand.Next(0, key.Items.Count)]; ply.GiveItem(give.netID, 1); Item take = TShock.Utils.GetItemById((int)key.Type); ply.SendSuccessMessage("Has recibido [i:{0}]!", give.netID); } } else if ((item.stack == 1 & (item.stack + invManage) > key.Items.Count & LBenabler == false) || ((invManage > key.Items.Count) & LBenabler == false)) { ply.TPlayer.inventory[i].stack--; ply.SendSuccessMessage("Has abierto usado una llave de botin => [i:{0}]", key.Type); for (int norand = 0; norand < key.Items.Count; norand++) { NetMessage.SendData((int)PacketTypes.PlayerSlot, -1, -1, NetworkText.Empty, ply.Index, i); Item give = key.Items[norand]; ply.GiveItem(give.netID, 1); Item take = TShock.Utils.GetItemById((int)key.Type); ply.SendSuccessMessage("Has recibido [i:{0}]!", give.netID); } } else { // Sent if neither of the above conditions were fulfilled. ply.SendErrorMessage("Asegurate de tener espacio en tu inventario."); return; } } } break; case "reload": { if (!ply.HasPermission("botin.reload")) { ply.SendErrorMessage("No tienes permiso para usar este comando."); break; } Config = Config.Read(); ply.SendSuccessMessage("Se han actualizado los cambios en la configuracion."); break; } case "lista": { ply.SendMessage("Botin del Templo - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Templo).Items.Select(i => i.netID)) + "]", Color.Chocolate); ply.SendMessage("Botin de la Jungla - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Jungla).Items.Select(i => i.netID)) + "]", Color.DarkGreen); ply.SendMessage("Botin Corrupto - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Corrupto).Items.Select(i => i.netID)) + "]", Color.Purple); ply.SendMessage("Botin Carmesi - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Carmesi).Items.Select(i => i.netID)) + "]", Color.OrangeRed); ply.SendMessage("Botin Sagrado - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Sagrado).Items.Select(i => i.netID)) + "]", Color.LightPink); ply.SendMessage("Botin Helado - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Helado).Items.Select(i => i.netID)) + "]", Color.SkyBlue); break; } case "lista 1": { ply.SendMessage("Botin del Templo [i:1141] - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Templo).Items.Select(i => i.netID)) + "]", Color.Chocolate); ply.SendMessage("Botin de la Jungla [i:1533] - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Jungla).Items.Select(i => i.netID)) + "]", Color.DarkGreen); ply.SendMessage("Botin Corrupto [i:1534] - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Corrupto).Items.Select(i => i.netID)) + "]", Color.Purple); ply.SendMessage("Botin Carmesi [i:1535] - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Carmesi).Items.Select(i => i.netID)) + "]", Color.OrangeRed); ply.SendMessage("Botin Sagrado [i:1536] - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Sagrado).Items.Select(i => i.netID)) + "]", Color.LightPink); ply.SendMessage("Escribe /botin lista 2 para ver más resultados", Color.Yellow); break; } case "lista 2": { ply.SendMessage("Botin Helado [i:1537] - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Helado).Items.Select(i => i.netID)) + "]", Color.SkyBlue); ply.SendMessage("Botin Dorado [i:327] - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Dorado).Items.Select(i => i.netID)) + "]", Color.Goldenrod); ply.SendMessage("Botin Sombrio [i:329] - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Sombrio).Items.Select(i => i.netID)) + "]", Color.DarkViolet); ply.SendMessage("Botin Radiante [i:3092] - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Radiante).Items.Select(i => i.netID)) + "]", Color.LightYellow); ply.SendMessage("Botin Nocturno [i:3091] - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Nocturno).Items.Select(i => i.netID)) + "]", Color.DarkBlue); ply.SendMessage("Botin del Desierto [i:4714] - [i:" + String.Join("] [i:", Utils.LoadKey(KeyTypes.Desierto).Items.Select(i => i.netID)) + "]", Color.LightGoldenrodYellow); break; } case "modo": { if (!ply.HasPermission("botin.modo")) { ply.SendErrorMessage("No tienes acceso a este comando."); break; } if (args.Parameters.Count < 2) { ply.SendErrorMessage("Error de uso. Modo de uso: {0}botin modo <normal/region/mercado>", Commands.Specifier); break; } string query = args.Parameters[1].ToLower(); if (query == "normal") { Config.EnableRegionExchanges = false; ply.SendSuccessMessage("Modo de intercambio asignado: normal (cualquier lugar)."); } else if (query == "region") { Config.EnableRegionExchanges = true; Config.MarketMode = false; ply.SendSuccessMessage("Modo de intercambio asignado: region (una region por cada llave)."); } else if (query == "mercado") { Config.EnableRegionExchanges = true; Config.MarketMode = true; ply.SendSuccessMessage("Modo de intercambio asignado: mercado (una region para todas las llaves)."); } else { ply.SendErrorMessage("Sintaxis invalida. Modo de uso: {0}llaves modo <normal/region/mercado>", Commands.Specifier); return; } Config.Write(); break; } default: { ply.SendErrorMessage(Utils.ErrorMessage(ply)); break; } } } else { ply.SendErrorMessage(Utils.ErrorMessage(ply)); } }
void OnGetData(GetDataEventArgs e) { if (!e.Handled && TShock.Players[e.Msg.whoAmI].GetData <bool>("buildmode")) { Player plr = Main.player[e.Msg.whoAmI]; TSPlayer tsplr = TShock.Players[e.Msg.whoAmI]; switch (e.MsgID) { case PacketTypes.PlayerHurtV2: using (MemoryStream data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) { data.ReadByte(); PlayerDeathReason.FromReader(new BinaryReader(data)); int damage = data.ReadInt16(); tsplr.Heal((int)Terraria.Main.CalculateDamagePlayersTake(damage, plr.statDefense) + 2); } break; case PacketTypes.Teleport: if ((e.Msg.readBuffer[3] == 0)) { List <int> buffs = new List <int>(plr.buffType); if (buffs.Contains(Terraria.ID.BuffID.ChaosState) && plr.inventory[plr.selectedItem].netID == Terraria.ID.ItemID.RodofDiscord) //rod 1326 { tsplr.Heal(plr.statLifeMax2 / 7); } } break; case PacketTypes.PaintTile: case PacketTypes.PaintWall: //0% { int count = 0; int type = e.Msg.readBuffer[7]; Terraria.Item lastItem = null; foreach (Item i in plr.inventory) { if (i.paint == type) { lastItem = i; count += i.stack; } } if (count <= 10 && lastItem != null) { tsplr.GiveItem(lastItem.type, lastItem.maxStack + 1 - count); } } break; case PacketTypes.Tile: //1% { int count = 0; int type = e.Msg.readBuffer[e.Index]; switch (type) { case 1: //PlaceTile case 3: //PlaceWall case 21: //ReplaceTile case 22: //ReplaceWall if (plr.inventory[plr.selectedItem].type != Terraria.ID.ItemID.StaffofRegrowth) //230 { int tile = e.Msg.readBuffer[e.Index + 5]; if (tsplr.SelectedItem.tileWand > 0) { tile = tsplr.SelectedItem.tileWand; } Item lastItem = null; foreach (Item i in plr.inventory) { if (i.createTile == tile || i.createWall == tile) { lastItem = i; count += i.stack; } } if (count <= 10 && lastItem != null) { tsplr.GiveItem(lastItem.type, lastItem.maxStack + 1 - count); } } break; // Placing wires case 5: //Red case 10: //Blue case 12: //Green case 16: //Yellow foreach (Item i in plr.inventory) { if (i.type == Terraria.ID.ItemID.Wire) //530 { count += i.stack; } } if (count <= 10) { tsplr.GiveItem(Terraria.ID.ItemID.Wire, 1000 - count); } break; case 8: //Place Actuator foreach (Item i in plr.inventory) { if (i.type == Terraria.ID.ItemID.Actuator) //849 { count += i.stack; } } if (count <= 10) { tsplr.GiveItem(Terraria.ID.ItemID.Actuator, 1000 - count); } break; } } break; } } }
void OnGetData(GetDataEventArgs e) { if (!e.Handled && Build[e.Msg.whoAmI]) { Player plr = Main.player[e.Msg.whoAmI]; TSPlayer tsplr = TShock.Players[e.Msg.whoAmI]; switch (e.MsgID) { case PacketTypes.PlayerDamage: { tsplr.Heal(BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2)); plr.statLife = plr.statLifeMax; } break; case PacketTypes.Teleport: if ((e.Msg.readBuffer[e.Index] & 1) == 0 && (e.Msg.readBuffer[e.Index] & 2) != 2) { for (int i = 0; i < Player.maxBuffs; i++) { if (plr.buffType[i] == 88 && plr.buffTime[i] > 0) { tsplr.Heal(100); } } } break; case PacketTypes.PaintTile: case PacketTypes.PaintWall: { int count = 0; int type = e.Msg.readBuffer[e.Index + 8]; Item lastItem = null; foreach (Item i in plr.inventory) { if (i.paint == type) { lastItem = i; count += i.stack; } } if (count <= 5 && lastItem != null) { tsplr.GiveItem(lastItem.type, lastItem.name, plr.width, plr.height, lastItem.maxStack + 1 - count); } } break; case PacketTypes.Tile: { int count = 0; int type = e.Msg.readBuffer[e.Index]; if ((type == 1 || type == 3) && plr.inventory[plr.selectedItem].type != 213) { int tile = e.Msg.readBuffer[e.Index + 9]; if (tsplr.SelectedItem.tileWand > 0) { tile = tsplr.SelectedItem.tileWand; } Item lastItem = null; foreach (Item i in plr.inventory) { if ((type == 1 && i.createTile == tile) || (type == 3 && i.createWall == tile)) { lastItem = i; count += i.stack; } } if (count <= 5 && lastItem != null) { tsplr.GiveItem(lastItem.type, lastItem.name, plr.width, plr.height, lastItem.maxStack + 1 - count); } } else if (type == 5 || type == 10 || type == 12) { foreach (Item i in plr.inventory) { if (i.type == 530) { count += i.stack; } } if (count <= 5) { tsplr.GiveItem(530, "Wire", plr.width, plr.height, 1000 - count); } } else if (type == 8) { foreach (Item i in plr.inventory) { if (i.type == 849) { count += i.stack; } } if (count <= 5) { tsplr.GiveItem(849, "Actuator", plr.width, plr.height, 1000 - count); } } } break; case PacketTypes.TogglePvp: plr.hostile = false; NetMessage.SendData(30, -1, -1, "", e.Msg.whoAmI); e.Handled = true; break; } } }
public static void onChat(ServerChatEventArgs e) { if (e.Handled == true) { return; } { String sendername = TShock.Players[e.Who].Name; TSPlayer sender = TShock.Players[e.Who]; if (e.Text == Variables.code) { if (sender.IsLoggedIn == false) { sender.SendMessage("[CodeReward] " + Variables.ALL.LoginIn, Color.Silver); return; } if (sender.mute == true) { sender.SendMessage("[CodeReward] " + Variables.ALL.Muted, Color.Silver); return; } if (Variables.lastp == sendername) { if (Variables.ALL.twotimesblock == true) { sender.SendMessage("[CodeReward] " + Variables.ALL.TwoTimes, Color.Silver); return; } } Variables.lastp = sendername; Variables.code = null; Variables.codeon = false; bool stop = true; int i = 0; while (stop == true) { i++; List <string> keys = new List <string>(Variables.ALL.Packages.Keys); Random rand = new Random(); string randomKey = keys[rand.Next(Variables.ALL.Packages.Count)]; foreach (var reward in Variables.ALL.Packages[randomKey].ItemsOptions) { sender.GiveItem(reward.ID, "", 0, 0, reward.Amount, reward.Prefix); } foreach (var reward in Variables.ALL.Packages[randomKey].BuffOptions) { sender.SetBuff(reward.ID, reward.Time, true); } if (Variables.ALL.Packages[randomKey].NextOneAfterThis == false) { stop = false; } else { if (i > Variables.ALL.Packages.Count) { stop = false; } } } string message = Variables.ALL.winMessage; while (message.Contains("%player%")) { message = message.Replace("%player%", sendername); } NetMessage.SendData((int)PacketTypes.CreateCombatText, -1, -1, Variables.ALL.onHead, 0, sender.X, sender.Y, 0, 0, 0, 0); TSPlayer.All.SendMessage("[CodeReward] " + message, Color.Silver); } } if (Variables.codeon2 == true) { String sendername = TShock.Players[e.Who].Name; TSPlayer sender = TShock.Players[e.Who]; if (e.Text == Variables.code2) { if (sender.IsLoggedIn == false) { sender.SendMessage("[CodeReward] " + Variables.ALL.LoginIn, Color.Silver); return; } if (sender.mute == true) { sender.SendMessage("[CodeReward] " + Variables.ALL.Muted, Color.Silver); return; } if (Variables.lastp == sendername) { if (Variables.ALL.twotimesblock == true) { sender.SendMessage("[CodeReward] " + Variables.ALL.TwoTimes, Color.Silver); return; } } Variables.lastp = sendername; Variables.code2 = null; Variables.codeon2 = false; bool stop = true; int i = 0; while (stop == true) { i++; List <string> keys = new List <string>(Variables.ALL.Packages.Keys); Random rand = new Random(); string randomKey = keys[rand.Next(Variables.ALL.Packages.Count)]; foreach (var reward in Variables.ALL.Packages[randomKey].ItemsOptions) { sender.GiveItem(reward.ID, "", 0, 0, reward.Amount, reward.Prefix); } foreach (var reward in Variables.ALL.Packages[randomKey].BuffOptions) { sender.SetBuff(reward.ID, reward.Time, true); } if (Variables.ALL.Packages[randomKey].NextOneAfterThis == false) { stop = false; } else { if (i > Variables.ALL.Packages.Count) { stop = false; } } } string message = Variables.ALL.winMessage; while (message.Contains("%player%")) { message = message.Replace("%player%", sendername); } NetMessage.SendData((int)PacketTypes.CreateCombatText, -1, -1, Variables.ALL.onHead, 0, sender.X, sender.Y, 0, 0, 0, 0); TSPlayer.All.SendMessage("[CodeReward]" + message, Color.Silver); } } }
private void KeyChange(CommandArgs args) { TSPlayer ply = args.Player; // SSC check to alert users if (!Main.ServerSideCharacter) { ply.SendWarningMessage("[Warning] This plugin will not work properly with ServerSideCharacters disabled."); } if (args.Parameters.Count < 1) { // Plugin Info var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; ply.SendMessage($"KeyChanger (v{version}) by Enerdy", Color.SkyBlue); ply.SendMessage("Description: Changes special chest keys into their specific items", Color.SkyBlue); ply.SendMessage($"Syntax: {Commands.Specifier}key <list/mode/change/reload> [type]", Color.SkyBlue); ply.SendMessage($"Type {Commands.Specifier}help key for more info", Color.SkyBlue); } else if (args.Parameters[0].ToLower() == "change" && args.Parameters.Count == 1) { ply.SendErrorMessage("Invalid syntax! Proper syntax: {0}key change <type>", Commands.Specifier); } else if (args.Parameters.Count > 0) { string cmd = args.Parameters[0].ToLower(); switch (cmd) { case "change": // Prevents cast from the server console if (!ply.RealPlayer) { ply.SendErrorMessage("You must use this command in-game."); return; } if (!ply.HasPermission("key.change")) { ply.SendErrorMessage("You do not have access to this command."); break; } KeyTypes type; if (!Enum.TryParse(args.Parameters[1].ToLowerInvariant(), true, out type)) { ply.SendErrorMessage("Invalid key type! Available types: " + String.Join(", ", Config.EnableTempleKey ? "temple" : null, Config.EnableJungleKey ? "jungle" : null, Config.EnableCorruptionKey ? "corruption" : null, Config.EnableCrimsonKey ? "crimson" : null, Config.EnableHallowedKey ? "hallowed" : null, Config.EnableFrozenKey ? "frozen" : null)); return; } Key key = Utils.LoadKey(type); // Verifies whether the key has been enabled if (!key.Enabled) { ply.SendInfoMessage("The selected key is disabled."); return; } if (!Config.UseSSC) { // Begin the exchange, expect the player to drop the key Exchanging[args.Player.Index] = type; ply.SendInfoMessage($"Drop (hold & right-click) any number of {key.Name} keys to proceed."); return; } // Checks if the player carries the necessary key var lookup = ply.TPlayer.inventory.FirstOrDefault(i => i.netID == (int)key.Type); if (lookup == null) { ply.SendErrorMessage("Make sure you carry the selected key in your inventory."); return; } if (Config.EnableRegionExchanges) { Region region; if (Config.MarketMode) { region = TShock.Regions.GetRegionByName(Config.MarketRegion); } else { region = key.Region; } // Checks if the required region is set to null if (region == null) { ply.SendInfoMessage("No valid region was set for this key."); return; } // Checks if the player is inside the region if (!region.InArea(args.Player.TileX, args.Player.TileY)) { ply.SendErrorMessage("You are not in a valid region to make this exchange."); return; } } Item item; for (int i = 0; i < 50; i++) { item = ply.TPlayer.inventory[i]; // Loops through the player's inventory if (item.netID == (int)key.Type) { // Found the item, checking for available slots if (item.stack == 1 || ply.InventorySlotAvailable) { ply.TPlayer.inventory[i].stack--; NetMessage.SendData((int)PacketTypes.PlayerSlot, -1, -1, NetworkText.Empty, ply.Index, i); Random rand = new Random(); Item give = key.Items[rand.Next(0, key.Items.Count)]; ply.GiveItem(give.netID, give.Name, give.width, give.height, 1); Item take = TShock.Utils.GetItemById((int)key.Type); ply.SendSuccessMessage("Exchanged a {0} for 1 {1}!", take.Name, give.Name); return; } // Sent if neither of the above conditions were fulfilled. ply.SendErrorMessage("Make sure you have at least one available inventory slot."); return; } } break; case "reload": { if (!ply.HasPermission("key.reload")) { ply.SendErrorMessage("You do not have access to this command."); break; } Config = Config.Read(); ply.SendSuccessMessage("KeyChangerConfig.json reloaded successfully."); break; } case "list": { ply.SendMessage("Temple Key - " + String.Join(", ", Utils.LoadKey(KeyTypes.Temple).Items.Select(i => i.Name)), Color.Goldenrod); ply.SendMessage("Jungle Key - " + String.Join(", ", Utils.LoadKey(KeyTypes.Jungle).Items.Select(i => i.Name)), Color.Goldenrod); ply.SendMessage("Corruption Key - " + String.Join(", ", Utils.LoadKey(KeyTypes.Corruption).Items.Select(i => i.Name)), Color.Goldenrod); ply.SendMessage("Crimson Key - " + String.Join(", ", Utils.LoadKey(KeyTypes.Crimson).Items.Select(i => i.Name)), Color.Goldenrod); ply.SendMessage("Hallowed Key - " + String.Join(", ", Utils.LoadKey(KeyTypes.Hallowed).Items.Select(i => i.Name)), Color.Goldenrod); ply.SendMessage("Frozen Key - " + String.Join(", ", Utils.LoadKey(KeyTypes.Frozen).Items.Select(i => i.Name)), Color.Goldenrod); break; } case "mode": { if (!ply.HasPermission("key.mode")) { ply.SendErrorMessage("You do not have access to this command."); break; } if (args.Parameters.Count < 2) { ply.SendErrorMessage("Invalid syntax! Proper syntax: {0}key mode <normal/region/market>", Commands.Specifier); break; } string query = args.Parameters[1].ToLower(); if (query == "normal") { Config.EnableRegionExchanges = false; ply.SendSuccessMessage("Exchange mode set to normal (exchange everywhere)."); } else if (query == "region") { Config.EnableRegionExchanges = true; Config.MarketMode = false; ply.SendSuccessMessage("Exchange mode set to region (a region for each type)."); } else if (query == "market") { Config.EnableRegionExchanges = true; Config.MarketMode = true; ply.SendSuccessMessage("Exchange mode set to market (one region for every type)."); } else { ply.SendErrorMessage("Invalid syntax! Proper syntax: {0}key mode <normal/region/market>", Commands.Specifier); return; } Config.Write(); break; } default: { ply.SendErrorMessage(Utils.ErrorMessage(ply)); break; } } } else { ply.SendErrorMessage(Utils.ErrorMessage(ply)); } }
public static bool BossOrInvasionStart(BinaryReader read) { TSPlayer tSPlayer = TShock.Players[read.ReadInt16()]; int npcid = read.ReadInt16(); if ((DateTime.UtcNow - tSPlayer.LastThreat).TotalMilliseconds < 5000.0) { return(true); } bool isBoss; int cost = 0; NPC nPc = new NPC(); nPc.SetDefaults(npcid); isBoss = nPc.boss; if (!isBoss) { switch (npcid) { case 4: case 13: case 50: case 75: case 125: case 126: case 127: case 128: case 129: case 130: case 131: case 134: case 222: case 245: case 266: case 370: case 398: case 422: case 439: case 493: case 507: case 517: case 657: isBoss = true; break; } } switch (npcid) { case -1: cost = 1300; break; case -2: cost = 2650; break; case -3: cost = 2000; break; case -4: cost = 3100; break; case -5: cost = 4200; break; case -6: cost = 2700; break; case -7: cost = 15000; break; case -8: cost = 3000; break; case -10: cost = 500; break; } if (PowelderAPI.Utils.IsNpcOnWorld(125) && npcid == 126) { return(false); } int bossId = (npcid == 266 || npcid == 13 ? 6969 : npcid); if (npcid == 126 || npcid == 125 || npcid == 134 || npcid == 127 || npcid == 128 || npcid == 129 || npcid == 130 || npcid == 131) { bossId = 42069; } if (!Goals.IsDone(bossId)) { tSPlayer.SendErrorMessage("Ten boss w tej chwili jest zablokowany."); if (SpawnItemId(npcid) != -1) { tSPlayer.GiveItem(SpawnItemId(npcid), 1); } return(true); } if ((SurvivalCore.SrvPlayers[tSPlayer.Index].BossCooldown - DateTime.Now).TotalSeconds > 0) { tSPlayer.SendErrorMessage( $"Musisz odczekac jakis czas, aby moc zrespic kolejnego bossa/inwazje. Mozliwe to bedzie za {PowelderAPI.Utils.ExpireCountDown(SurvivalCore.SrvPlayers[tSPlayer.Index].BossCooldown)}"); if (SpawnItemId(npcid) != -1 & npcid != 126) { tSPlayer.GiveItem(SpawnItemId(npcid), 1); } return(true); } if (cost > 0) { cost = Utils.CostCalc(tSPlayer, cost); if (SurvivalCore.SrvPlayers[tSPlayer.Index].Money < cost) { tSPlayer.SendErrorMessage("Nie stac cie na {0}. Koszt {1} €", isBoss ? ("przywolanie " + nPc.FullName) : ("rozpoczecie " + GetInvasion(npcid)), cost); if (SpawnItemId(npcid) != -1) { tSPlayer.GiveItem(SpawnItemId(npcid), 1); } return(true); } SurvivalCore.SrvPlayers[tSPlayer.Index].Money -= cost; } SurvivalCore.SrvPlayers[tSPlayer.Index].BossCooldown = DateTime.Now.AddMinutes(30); return(false); }
void OnGetData(GetDataEventArgs args) { if (config.CraftFromInventory) { return; } if (args.MsgID == PacketTypes.ItemDrop) { if (args.Handled) { return; } using (var data = new MemoryStream(args.Msg.readBuffer, args.Index, args.Length)) { Int16 id = data.ReadInt16(); float posx = data.ReadSingle(); float posy = data.ReadSingle(); float velx = data.ReadSingle(); float vely = data.ReadSingle(); Int16 stacks = data.ReadInt16(); int prefix = data.ReadByte(); bool nodelay = data.ReadBoolean(); Int16 netid = data.ReadInt16(); Item item = new Item(); item.SetDefaults(netid); if (id != 400) { return; } TSPlayer tsplayer = TShock.Players[args.Msg.whoAmI]; RecipeData recData; if (tsplayer != null && tsplayer.Active && (recData = tsplayer.GetRecipeData()) != null && recData.activeRecipe != null) { List <Ingredient> fulfilledIngredient = new List <Ingredient>(); foreach (Ingredient ing in recData.activeIngredients) { //ing.prefix == -1 means accepts any prefix if (ing.name == item.Name && (ing.prefix == -1 || ing.prefix == prefix)) { ing.stack -= stacks; if (ing.stack > 0) { tsplayer.SendInfoMessage("Drop another {0}.", Utils.FormatItem((Item)ing)); if (recData.droppedItems.Exists(i => i.name == ing.name)) { recData.droppedItems.Find(i => i.name == ing.name).stack += stacks; } else { recData.droppedItems.Add(new RecItem(item.Name, stacks, prefix)); } args.Handled = true; return; } else if (ing.stack < 0) { tsplayer.SendInfoMessage("Giving back {0}.", Utils.FormatItem((Item)ing)); tsplayer.GiveItem(item.type, item.Name, item.width, item.height, Math.Abs(ing.stack), prefix); if (recData.droppedItems.Exists(i => i.name == ing.name)) { recData.droppedItems.Find(i => i.name == ing.name).stack += (stacks + ing.stack); } else { recData.droppedItems.Add(new RecItem(item.Name, stacks + ing.stack, prefix)); } foreach (Ingredient ingr in recData.activeIngredients) { if ((ingr.group == 0 && ingr.name == ing.name) || (ingr.group != 0 && ingr.group == ing.group)) { fulfilledIngredient.Add(ingr); } } args.Handled = true; } else { tsplayer.SendInfoMessage("Dropped {0}.", Utils.FormatItem((Item)ing, stacks)); if (recData.droppedItems.Exists(i => i.name == ing.name)) { recData.droppedItems.Find(i => i.name == ing.name).stack += stacks; } else { recData.droppedItems.Add(new RecItem(item.Name, stacks, prefix)); } foreach (Ingredient ingr in recData.activeIngredients) { if ((ingr.group == 0 && ingr.name == ing.name) || (ingr.group != 0 && ingr.group == ing.group)) { fulfilledIngredient.Add(ingr); } } args.Handled = true; } } } if (fulfilledIngredient.Count < 1) { return; } recData.activeIngredients.RemoveAll(i => fulfilledIngredient.Contains(i)); foreach (Ingredient ing in recData.activeRecipe.ingredients) { if (ing.name == item.Name && ing.prefix == -1) { ing.prefix = prefix; } } if (recData.activeIngredients.Count < 1) { List <Product> lDetPros = Utils.DetermineProducts(recData.activeRecipe.products); foreach (Product pro in lDetPros) { Item product = new Item(); product.SetDefaults(TShock.Utils.GetItemByIdOrName(pro.name).First().netID); //itm.Prefix(-1) means at least a 25% chance to hit prefix = 0. if < -1, even chances. product.Prefix(pro.prefix); pro.prefix = product.prefix; tsplayer.GiveItem(product.type, product.Name, product.width, product.height, pro.stack, product.prefix); tsplayer.SendSuccessMessage("Received {0}.", Utils.FormatItem((Item)pro)); } List <RecItem> prods = new List <RecItem>(); lDetPros.ForEach(i => prods.Add(new RecItem(i.name, i.stack, i.prefix))); Log.Recipe(new LogRecipe(recData.activeRecipe.name, recData.droppedItems, prods), tsplayer.Name); // Commands :o (NullReferenceException-free :l) recData.activeRecipe.Clone().ExecuteCommands(tsplayer); recData.activeRecipe = null; recData.droppedItems.Clear(); tsplayer.SendInfoMessage("Finished crafting."); } } } } }
private void KeyChange(CommandArgs args) { TSPlayer ply = args.Player; // SSC check to alert users if (!Main.ServerSideCharacter) { ply.SendWarningMessage("[Warning] This plugin will not work properly with ServerSideCharacters disabled."); } if (args.Parameters.Count < 1) { // Plugin Info var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; ply.SendMessage(string.Format("KeyChanger (v{0}) by Enerdy", version), Color.SkyBlue); ply.SendMessage("Description: Changes special chest keys into their specific items", Color.SkyBlue); ply.SendMessage("Syntax: /key <list/mode/change/reload> [type]", Color.SkyBlue); ply.SendMessage("Type /help key for more info", Color.SkyBlue); } else if (args.Parameters[0].ToLower() == "change" && args.Parameters.Count == 1) { ply.SendErrorMessage("Invalid syntax! Proper syntax: /key change <type>"); } else if (args.Parameters.Count > 0) { string cmd = args.Parameters[0].ToLower(); switch (cmd) { case "change": if (!ply.Group.HasPermission("key.change")) { ply.SendErrorMessage("You do not have access to this command."); break; } // Prevents cast from the server console if (ply == TSPlayer.Server) { ply.SendErrorMessage("You must use this command in-game."); return; } Key key; string str = args.Parameters[1].ToLower(); if (str == Key.Temple.Name) { key = Key.Temple; } else if (str == Key.Jungle.Name) { key = Key.Jungle; } else if (str == Key.Corruption.Name) { key = Key.Corruption; } else if (str == Key.Crimson.Name) { key = Key.Crimson; } else if (str == Key.Hallowed.Name) { key = Key.Hallowed; } else if (str == Key.Frozen.Name) { key = Key.Frozen; } else { ply.SendErrorMessage("Invalid key type! Available types: " + string.Join(", ", Key.Temple.Enabled ? Key.Temple.Name : null, Key.Jungle.Enabled ? Key.Jungle.Name : null, Key.Corruption.Enabled ? Key.Corruption.Name : null, Key.Crimson.Enabled ? Key.Crimson.Name : null, Key.Hallowed.Enabled ? Key.Hallowed.Name : null, Key.Frozen.Enabled ? Key.Frozen.Name : null)); return; } // Verifies whether the key has been enabled if (!key.Enabled) { ply.SendInfoMessage("The selected key is disabled."); return; } // Checks if the player carries the necessary key var lookup = ply.TPlayer.inventory.FirstOrDefault(i => i.netID == (int)key.Type); if (lookup == null) { ply.SendErrorMessage("Make sure you carry the selected key in your inventory."); return; } if (Config.contents.EnableRegionExchanges) { Region region; if (Config.contents.MarketMode) { region = TShock.Regions.GetRegionByName(Config.contents.MarketRegion); } else { region = key.Region; } // Checks if the required region is set to null if (region == null) { ply.SendInfoMessage("No valid region was set for this key."); return; } // Checks if the player is inside the region if (!region.Area.Contains(ply.TileX, ply.TileY)) { ply.SendErrorMessage("You are not in a valid region to make this exchange."); return; } } Item item; for (int i = 0; i < 50; i++) { item = ply.TPlayer.inventory[i]; // Loops through the player's inventory if (item.netID == (int)key.Type) { // Found the item, checking for available slots if (item.stack == 1 || ply.InventorySlotAvailable) { ply.TPlayer.inventory[i].stack--; NetMessage.SendData((int)PacketTypes.PlayerSlot, -1, -1, string.Empty, ply.Index, i); Random rand = new Random(); Item give = key.Items[rand.Next(0, key.Items.Count)]; ply.GiveItem(give.netID, give.name, give.width, give.height, 1); Item take = TShock.Utils.GetItemById((int)key.Type); ply.SendSuccessMessage("Exchanged a {0} for 1 {1}!", take.name, give.name); return; } // Sent if neither of the above conditions were fulfilled. ply.SendErrorMessage("Make sure you have at least one available inventory slot."); return; } } break; case "reload": { if (!ply.Group.HasPermission("key.reload")) { ply.SendErrorMessage("You do not have access to this command."); break; } if (Config.ReadConfig()) { Utils.InitKeys(); ply.SendMessage("KeyChangerConfig.json reloaded successfully.", Color.Green); break; } else { ply.SendErrorMessage("Failed to read KeyChangerConfig.json. Consider deleting the file so that it may be recreated."); break; } } case "list": { ply.SendMessage("Temple Key - " + string.Join(", ", Key.Temple.Items.Select(i => i.name)), Color.Goldenrod); ply.SendMessage("Jungle Key - " + string.Join(", ", Key.Jungle.Items.Select(i => i.name)), Color.Goldenrod); ply.SendMessage("Corruption Key - " + string.Join(", ", Key.Corruption.Items.Select(i => i.name)), Color.Goldenrod); ply.SendMessage("Crimson Key - " + string.Join(", ", Key.Crimson.Items.Select(i => i.name)), Color.Goldenrod); ply.SendMessage("Hallowed Key - " + string.Join(", ", Key.Hallowed.Items.Select(i => i.name)), Color.Goldenrod); ply.SendMessage("Frozen Key - " + string.Join(", ", Key.Frozen.Items.Select(i => i.name)), Color.Goldenrod); break; } case "mode": { if (!ply.Group.HasPermission("key.mode")) { ply.SendErrorMessage("You do not have access to this command."); break; } if (args.Parameters.Count < 2) { ply.SendErrorMessage("Invalid syntax! Proper syntax: /key mode <normal/region/market>"); break; } string query = args.Parameters[1].ToLower(); if (query == "normal") { Config.contents.EnableRegionExchanges = false; ply.SendSuccessMessage("Exchange mode set to normal (exchange everywhere)."); } else if (query == "region") { Config.contents.EnableRegionExchanges = true; Config.contents.MarketMode = false; ply.SendSuccessMessage("Exchange mode set to region (a region for each type)."); } else if (query == "market") { Config.contents.EnableRegionExchanges = true; Config.contents.MarketMode = true; ply.SendSuccessMessage("Exchange mode set to market (one region for every type)."); } else { ply.SendErrorMessage("Invalid syntax! Proper syntax: /key mode <normal/region/market>"); return; } Config.UpdateConfig(); break; } default: { ply.SendErrorMessage(Utils.ErrorMessage(ply)); break; } } } else { ply.SendErrorMessage(Utils.ErrorMessage(ply)); } }