Пример #1
0
        private static void HandleBuyPlot(GameSession session, PacketReader packet)
        {
            int groupId         = packet.ReadInt();
            int housingTemplate = packet.ReadInt();

            //TODO: If player already owns a plot, reject

            UGCMapGroup land = UGCMapMetadataStorage.GetMetadata(session.Player.MapId, (byte)groupId);

            if (!HandlePlotPayment(session, land.PriceItemCode, land.Price))
            {
                return;
            }

            session.Player.PlotMapId      = session.Player.MapId;
            session.Player.HomePlotNumber = land.Id;
            session.Player.HomeExpiration = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + Environment.TickCount + (land.ContractDate * (24 * 60 * 60));
            session.Player.HomeName       = session.Player.Name;

            session.FieldManager.BroadcastPacket(ResponseCubePacket.PurchasePlot(session.Player));
            session.FieldManager.BroadcastPacket(ResponseCubePacket.EnablePlotFurnishing(session.Player));
            session.Send(ResponseCubePacket.LoadHome(session.FieldPlayer));
            session.FieldManager.BroadcastPacket(ResponseCubePacket.NameHome(session.Player), session);
            session.Send(ResponseCubePacket.CompletePurchase());
        }
Пример #2
0
        private static void HandleBuyPlot(GameSession session, PacketReader packet)
        {
            int groupId         = packet.ReadInt();
            int housingTemplate = packet.ReadInt();

            //TODO: If player already owns a plot, reject

            UGCMapGroup land = UGCMapMetadataStorage.GetMetadata(session.Player.MapId, (byte)groupId);

            if (land == null)
            {
                return;
            }

            //Check if sale event is active
            int       price     = land.Price;
            GameEvent gameEvent = DatabaseManager.GetSingleGameEvent(GameEventType.UGCMapContractSale);

            if (gameEvent != null)
            {
                int markdown = land.Price * ((gameEvent.UGCMapContractSale.DiscountAmount / 100) / 100);
                price = land.Price - markdown;
            }

            if (!HandlePlotPayment(session, land.PriceItemCode, price))
            {
                return;
            }

            session.Player.PlotMapId      = session.Player.MapId;
            session.Player.HomePlotNumber = land.Id;
            session.Player.HomeExpiration = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + Environment.TickCount + (land.ContractDate * (24 * 60 * 60));
            session.Player.HomeName       = session.Player.Name;

            session.FieldManager.BroadcastPacket(ResponseCubePacket.PurchasePlot(session.Player));
            session.FieldManager.BroadcastPacket(ResponseCubePacket.EnablePlotFurnishing(session.Player));
            session.Send(ResponseCubePacket.LoadHome(session.FieldPlayer));
            session.FieldManager.BroadcastPacket(ResponseCubePacket.NameHome(session.Player), session);
            session.Send(ResponseCubePacket.CompletePurchase());
        }
Пример #3
0
        public override void Handle(GameSession session, PacketReader packet)
        {
            bool           mapIsHome      = session.Player.MapId == (int)Map.PrivateResidence;
            UGCMapMetadata ugcMapMetadata = UGCMapMetadataStorage.GetMetadata(session.Player.MapId);
            List <byte>    plots          = new List <byte>();

            if (ugcMapMetadata != null)
            {
                plots = ugcMapMetadata.Groups.Select(x => x.Id).ToList();
            }

            List <Home> homes;

            if (mapIsHome)
            {
                Home home = GameServer.HomeManager.GetHome(session.Player.VisitingHomeId);
                if (home == null)
                {
                    session.Send(ResponseLoadUGCMapPacket.LoadUGCMap(false));
                    return;
                }

                homes = new List <Home>()
                {
                    home
                };

                session.Send(ResponseLoadUGCMapPacket.LoadUGCMap(mapIsHome, home, session.Player.IsInDecorPlanner));

                // Find spawning coords for home
                int         cubePortalId = 50400190;
                List <Cube> portals      = home.FurnishingInventory.Values.Where(x => x.Item != null && x.Item.Id == cubePortalId).ToList();
                CoordF      coord;
                CoordF      rotation;
                if (portals.Count > 0)
                {
                    Cube portal = portals.OrderBy(x => RandomProvider.Get().Next()).Take(1).First();
                    coord       = portal.CoordF;
                    coord.Z    += 1;
                    rotation    = portal.Rotation;
                    rotation.Z -= 90;
                }
                else
                {
                    byte homeSize = (byte)(home.Size - 1);
                    int  x        = -1 * Block.BLOCK_SIZE * homeSize;
                    coord    = CoordF.From(x, x, 151);
                    rotation = CoordF.From(0, 0, 0);
                }
                session.Player.Coord     = coord;
                session.Player.SafeBlock = coord;
                session.Player.Rotation  = rotation;
                if (session.Player.InstanceId == 0)
                {
                    session.Player.InstanceId = home.InstanceId;
                }
            }
            else
            {
                homes = GameServer.HomeManager.GetPlots(session.Player.MapId);
                session.Send(ResponseLoadUGCMapPacket.LoadUGCMap(mapIsHome));
            }

            List <Cube> cubes = new List <Cube>();

            if (!session.Player.IsInDecorPlanner)
            {
                homes.ForEach(h =>
                {
                    int plotNumber = mapIsHome ? 1 : h.PlotNumber;
                    cubes.AddRange(h.FurnishingInventory.Values.Where(x => x.Item.Id != 0 && x.PlotNumber == plotNumber).ToList());
                });
            }

            session.Send(SendCubesPacket.LoadPlots(homes, session.Player.MapId));
            session.Send(SendCubesPacket.LoadCubes(cubes));
            session.Send(SendCubesPacket.LoadAvailablePlots(homes, plots));
            session.Send(SendCubesPacket.Expiration(homes.Where(x => x.PlotNumber != 0).ToList()));

            session.Send("6D 00 12 00 00 00 00 00 00 00 00 00 00 00 00".ToByteArray()); // send ugc
        }