public static void HandleUnlockDoor(CommandArgs args)
        {
            if (args.Parameters.Count > 1)
            {
                args.Player.SendMessage("Incorrect syntax! Correct syntax: /unlockdoors <region>", Color.Red);
                return;
            }

            Region region = null;

            if (args.Parameters.Count > 0)
            {
                region = TShock.Regions.GetRegionByName(args.Parameters[0]);
            }
            else
            {
                if (!args.Player.RealPlayer)
                {
                    args.Player.SendMessage("You must be logged in to use this without a parameter.", Color.Red);
                    return;
                }

                var regions = TShock.Regions.InAreaRegionName(args.Player.TileX, args.Player.TileY);

                if (regions.Count > 1)
                {
                    args.Player.SendMessage("You cannot unlock doors in overlapping regions.", Color.Red);
                }
                else if (regions.Count == 0)
                {
                    region = null;
                }
                else
                {
                    region = TShock.Regions.GetRegionByName(regions[0]);
                }
            }

            if (region == null)
            {
                args.Player.SendMessage("No region found with that query.", Color.Red);
                return;
            }

            if (!args.Player.Group.HasPermission(Permissions.editspawn) && !TShock.Regions.CanBuild(args.Player.TileX, args.Player.TileY, args.Player) && TShock.Regions.InArea(args.Player.TileX, args.Player.TileY))
            {
                args.Player.SendMessage(string.Format("You do not have permission to build in region {0}", args.Parameters[0]), Color.Red);
            }
            else
            {
                RegionHelperManager regionHelper = new RegionHelperManager(TShock.DB);

                regionHelper.UnlockRegion(region.Name);

                args.Player.SendMessage(string.Format("Region {0} doors are now unlocked.", region.Name), Color.Green);
            }
        }
Beispiel #2
0
        private void NetHooks_GetData(GetDataEventArgs e)
        {
            var player = Players[e.Msg.whoAmI];

            PacketTypes type = e.MsgID;

            if (type == PacketTypes.PlayerDamage)
            {
                if (player == null)
                {
                    e.Handled = true;
                    return;
                }

                if (player.IsInvincible)
                {
                    if (player.Player.TPlayer.statLife < player.Player.TPlayer.statLifeMax)
                    {
                        int deficit = player.Player.TPlayer.statLifeMax - player.Player.TPlayer.statLife;

                        int heartNum = (deficit / 20) + 4;

                        var heart = TShock.Utils.GetItemById(58);

                        for (int i = 0; i < heartNum; i++)
                        {
                            player.Player.GiveItem(heart.type, heart.name, heart.width, heart.height, 1);
                        }
                    }
                }
            }
            else if (type == PacketTypes.DoorUse)
            {
                if (player == null)
                {
                    e.Handled = false;
                    return;
                }

                using (MemoryStream ms = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                {
                    bool closed = ms.ReadBoolean();
                    int  x      = ms.ReadInt32();
                    int  y      = ms.ReadInt32();

                    RegionHelperManager regionHelper = new RegionHelperManager(TShock.DB);

                    if (!player.Player.Group.HasPermission(Permissions.editspawn) && !TShock.Regions.CanBuild(x, y, player.Player) && TShock.Regions.InArea(x, y) && regionHelper.GetRegionHelperByRegion(TShock.Regions.InAreaRegionName(x, y)).ContainsProperty(r => r.IsLocked))
                    {
                        int size = 10;

                        NetMessage.SendData((int)PacketTypes.DoorUse, -1, -1, "", 1, x, y);

                        TSPlayer.All.SendTileSquare(x, y, size);
                        WorldGen.RangeFrame(x, y, x + size, y + size);

                        int warpX = player.Player.TileX > x ? player.Player.TileX + 3 : player.Player.TileX - 3;

                        player.Player.Teleport(warpX, player.Player.TileY + 3);

                        player.Player.SendMessage(string.Format("Doors in region name: {0} are locked.", string.Join(", ", TShock.Regions.InAreaRegionName(x, y))), Color.Red);

                        e.Handled = true;
                    }
                }
            }
            else if (type == PacketTypes.PlayerUpdate)
            {
                using (MemoryStream ms = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                {
                    if (player.PrisonRecord != null)
                    {
                        if (!player.PrisonRecord.Released && player.PrisonRecord.Until <= DateTime.Now)
                        {
                            CommandHandlers.ReleaseFromPrison(new CommandArgs("releaseprisoner", null, new List <string>()
                            {
                                player.Player.UserAccountName
                            }));

                            player.PrisonRecord = null;
                        }
                        else
                        {
                            var plr     = ms.ReadInt8();
                            var control = ms.ReadInt8();
                            var item    = ms.ReadInt8();
                            var pos     = new Vector2(ms.ReadSingle(), ms.ReadSingle());
                            var vel     = new Vector2(ms.ReadSingle(), ms.ReadSingle());

                            var warp = TShock.Warps.FindWarp(Config.PrisonWarp);

                            float tilex;
                            float tiley;

                            if (warp.WarpPos != Vector2.Zero)
                            {
                                tilex = (int)(warp.WarpPos.X);
                                tiley = (int)(warp.WarpPos.Y);
                            }
                            else
                            {
                                tilex = Main.spawnTileX;
                                tiley = Main.spawnTileY;
                            }

                            float distance = Vector2.Distance(new Vector2((pos.X / 16f), (pos.Y / 16f)), new Vector2(tilex, tiley));
                            if (distance > TShock.Config.MaxRangeForDisabled)
                            {
                                if (warp.WarpPos != Vector2.Zero)
                                {
                                    player.Player.Teleport((int)warp.WarpPos.X, (int)warp.WarpPos.Y + 3);
                                }
                                else
                                {
                                    player.Player.Spawn();
                                }

                                TimeSpan remaining = player.PrisonRecord.Until - DateTime.Now;

                                player.Player.SendMessage(string.Format("You are still serving your prison sentence. {0} hour(s) {1} minute(s) remain.", (int)remaining.TotalHours, remaining.Minutes), Color.Yellow);
                            }
                        }
                    }
                    else
                    {
                        if (player.Player.Group.Name == Config.PrisonGroup)
                        {
                            CommandHandlers.ReleaseFromPrison(new CommandArgs("releaseprisoner", null, new List <string>()
                            {
                                player.Player.UserAccountName
                            }));
                        }
                    }
                }
            }
        }