예제 #1
0
        /// <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);
            }
        }
예제 #2
0
        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);
        }
예제 #3
0
        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!");
                    }
                }
            });
        }
예제 #5
0
        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));
            }
        }
예제 #6
0
        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;
                }
            }
        }
예제 #7
0
        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;
                }
            }
        }
예제 #8
0
        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);
                }
            }
        }
예제 #9
0
        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));
            }
        }
예제 #10
0
        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);
        }
예제 #11
0
        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.");
                        }
                    }
                }
            }
        }
예제 #12
0
        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));
            }
        }