private void OnCollisionEnter2D(Collision2D other)
    {
        IFieldObject fo = other.gameObject.GetComponent <IFieldObject>();

        if (fo == null)
        {
            return;
        }
        EventParameter param = new EventParameter(
            "Name".EventParameterPairing(gameObject.name),
            "Target".EventParameterPairing(fo)
            );

        EventController.Instance.EventCall("ZoneEnterEvent", param);
    }
Beispiel #2
0
    public override void Execute(GameCommandTrigger trigger)
    {
        string jobName  = trigger.Get <string>("job");
        byte   awakened = trigger.Get <byte>("awakened");

        Player player = trigger.Session.Player;
        IFieldObject <Player> fieldPlayer = trigger.Session.Player.FieldPlayer;

        long     activeSkillTabId = player.ActiveSkillTabId;
        SkillTab skillTab         = player.SkillTabs.First(tab => tab.TabId == activeSkillTabId);

        if (string.IsNullOrEmpty(jobName))
        {
            string[] classes = Enum.GetNames(typeof(Job));

            player.Session.Send(NoticePacket.Notice("You have to give a classname and specifiy awakening (1 or 0)\nAvailable classes:\n".Bold().Color(Color.DarkOrange) +
                                                    $"{string.Join(", ", classes).Color(Color.Aquamarine)}", NoticeType.Chat));

            return;
        }

        Job job = Job.None;

        if (!Enum.TryParse(jobName, true, out job))
        {
            player.Session.SendNotice($"{jobName} is not a valid class name");
            return;
        }

        if (job == Job.None)
        {
            player.Session.SendNotice("None is not a valid class");
            return;
        }

        if (job != player.Job)
        {
            DatabaseManager.SkillTabs.Delete(skillTab.Uid);
            SkillTab newSkillTab = new(player.CharacterId, job, skillTab.TabId, skillTab.Name);

            player.SkillTabs[player.SkillTabs.IndexOf(skillTab)] = newSkillTab;
            player.Job = job;
        }

        player.Awakened = awakened == 1;

        trigger.Session.Send(JobPacket.SendJob(fieldPlayer));
    }
Beispiel #3
0
        public void AddPlayer(GameSession sender, IFieldObject <Player> player)
        {
            Debug.Assert(player.ObjectId > 0, "Player was added to field without initialized objectId.");
            player.Coord       = player.Value.Coord;
            player.Value.MapId = MapId;
            // TODO: Determine new coordinates for player as well
            lock (Sessions)
            {
                Sessions.Add(sender);
            }

            // TODO: Send the initialization state of the field
            foreach (IFieldObject <Player> existingPlayer in State.Players.Values)
            {
                sender.Send(FieldPacket.AddPlayer(existingPlayer));
                sender.Send(FieldObjectPacket.LoadPlayer(existingPlayer));
            }
            foreach (IFieldObject <Item> existingItem in State.Items.Values)
            {
                sender.Send(FieldPacket.AddItem(existingItem, 123456));
            }
            foreach (IFieldObject <Npc> existingNpc in State.Npcs.Values)
            {
                sender.Send(FieldPacket.AddNpc(existingNpc));
                sender.Send(FieldObjectPacket.LoadNpc(existingNpc));
            }
            foreach (IFieldObject <Portal> existingPortal in State.Portals.Values)
            {
                sender.Send(FieldPacket.AddPortal(existingPortal));
            }
            foreach (IFieldObject <Mob> existingMob in State.Mobs.Values)
            {
                sender.Send(FieldPacket.AddMob(existingMob));
                sender.Send(FieldObjectPacket.LoadMob(existingMob));
            }
            if (State.InteractActors.Values.Count > 0)
            {
                sender.Send(InteractActorPacket.AddInteractActors(State.InteractActors.Values));
            }
            State.AddPlayer(player);

            // Broadcast new player to all players in map
            Broadcast(session =>
            {
                session.Send(FieldPacket.AddPlayer(player));
                session.Send(FieldObjectPacket.LoadPlayer(player));
            });
        }
    private static void HandleHomePortal(GameSession session, IFieldObject <Portal> fieldPortal)
    {
        IFieldObject <Cube> srcCube = session.FieldManager.State.Cubes.Values
                                      .FirstOrDefault(x => x.Value.PortalSettings is not null &&
                                                      x.Value.PortalSettings.PortalObjectId == fieldPortal.ObjectId);

        if (srcCube is null)
        {
            return;
        }

        string destinationTarget = srcCube.Value.PortalSettings.DestinationTarget;

        if (string.IsNullOrEmpty(destinationTarget))
        {
            return;
        }

        switch (srcCube.Value.PortalSettings.Destination)
        {
        case UgcPortalDestination.PortalInHome:
            IFieldObject <Cube> destinationCube = session.FieldManager.State.Cubes.Values
                                                  .FirstOrDefault(x => x.Value.PortalSettings is not null &&
                                                                  x.Value.PortalSettings.PortalName == destinationTarget);
            if (destinationCube is null)
            {
                return;
            }
            session.Player.FieldPlayer.Coord = destinationCube.Coord;
            CoordF coordF = destinationCube.Coord;
            session.Player.Move(coordF, session.Player.FieldPlayer.Rotation);
            break;

        case UgcPortalDestination.SelectedMap:
            session.Player.Warp(int.Parse(destinationTarget));
            break;

        case UgcPortalDestination.FriendHome:
            long friendAccountId = long.Parse(destinationTarget);
            Home home            = GameServer.HomeManager.GetHomeById(friendAccountId);
            if (home is null)
            {
                return;
            }
            session.Player.WarpGameToGame((int)Map.PrivateResidence, instanceId: home.InstanceId);
            break;
        }
    }
Beispiel #5
0
        public static Packet UpdateMobStats(IFieldObject <Mob> mob)
        {
            PacketWriter pWriter = PacketWriter.Of(SendOp.STAT);

            pWriter.WriteInt(mob.ObjectId);
            pWriter.WriteByte();
            pWriter.WriteByte(1);
            pWriter.WriteByte(4); // value
            // Stats
            // Damage should be update through this packet
            for (int i = 0; i < 3; i++)
            {
                pWriter.WriteLong(mob.Value.stats.Hp[i]);
            }
            return(pWriter);
        }
Beispiel #6
0
        public static Packet UpdateStats(IFieldObject<Player> player, PlayerStatId statId, params PlayerStatId[] otherIds)
        {
            PacketWriter pWriter = PacketWriter.Of(SendOp.STAT);
            pWriter.WriteInt(player.ObjectId);
            pWriter.WriteEnum(StatsMode.UpdateStats);
            pWriter.WriteByte((byte) (1 + otherIds.Length));
            pWriter.WriteEnum(statId);
            pWriter.WriteStat(statId, player.Value.Stats[statId]);
            foreach (PlayerStatId otherId in otherIds)
            {
                pWriter.WriteEnum(otherId);
                pWriter.WriteStat(otherId, player.Value.Stats[otherId]);
            }

            return pWriter;
        }
        public static Packet RequestEnter(IFieldObject <Player> player)
        {
            PacketWriter pWriter = PacketWriter.Of(SendOp.REQUEST_FIELD_ENTER);

            pWriter.WriteByte(0x00);
            pWriter.WriteInt(player.Value.MapId);
            pWriter.WriteByte();
            pWriter.WriteByte();
            pWriter.WriteInt();
            pWriter.WriteInt();
            pWriter.Write(player.Coord);
            pWriter.Write(player.Value.Rotation);
            pWriter.WriteInt(); // Whatever is here seems to be repeated by client in FIELD_ENTER response.

            return(pWriter);
        }
Beispiel #8
0
        public bool Remove(IFieldObject item)
        {
            bool result = false;

            for (int i = 0; i < _fieldobjects.Count; i++)
            {
                var curFieldObject = _fieldobjects[i];
                if (Equals(curFieldObject, item))
                {
                    _fieldobjects.RemoveAt(i);
                    result = true;
                    break;
                }
            }
            return(result);
        }
 public void AddBalloonTalk(int spawnPointId, string msg, int duration, int delayTick, bool isNpcId)
 {
     if (!isNpcId)
     {
         if (spawnPointId == 0)
         {
             IFieldObject <Player> player = Field.State.Players.Values.First();
             if (player == null)
             {
                 return;
             }
             player.Value.Session.Send(CinematicPacket.BalloonTalk(player.ObjectId, isNpcId, msg, duration, delayTick));
             return;
         }
     }
 }
Beispiel #10
0
    public void SetInteractObject(int[] interactObjectIds, byte state, bool arg4, bool arg3)
    {
        InteractObjectState objectState = (InteractObjectState)state;

        foreach (int interactObjectId in interactObjectIds)
        {
            IFieldObject <InteractObject> interactObject = Field.State.InteractObjects.Values.FirstOrDefault(x => x.Value.InteractId == interactObjectId);
            if (interactObject == null)
            {
                continue;
            }

            interactObject.Value.State = objectState;
            Field.BroadcastPacket(InteractObjectPacket.Set(interactObject.Value));
        }
    }
Beispiel #11
0
        public static Packet Use(IFieldObject <Player> fieldPlayer, bool start, int itemId = 0, long itemUid = 0)
        {
            PacketWriter pWriter = PacketWriter.Of(SendOp.SET_BUILD_MODE);

            pWriter.WriteInt(fieldPlayer.ObjectId);
            pWriter.WriteBool(start);
            if (start)
            {
                pWriter.WriteInt(itemId);
                pWriter.WriteLong(itemUid);
                pWriter.WriteLong();
                pWriter.WriteByte();
                pWriter.WriteInt();
            }
            return(pWriter);
        }
        public static Packet LoadHome(IFieldObject <Player> fieldPlayer)
        {
            PacketWriter pWriter = PacketWriter.Of(SendOp.RESPONSE_CUBE);

            pWriter.WriteEnum(ResponseCubePacketMode.LoadHome);
            pWriter.WriteInt(fieldPlayer.ObjectId);
            pWriter.WriteInt(fieldPlayer.Value.HomeMapId);
            pWriter.WriteInt(fieldPlayer.Value.PlotMapId);
            pWriter.WriteInt(fieldPlayer.Value.HomePlotNumber);
            pWriter.WriteInt(fieldPlayer.Value.ApartmentNumber);
            pWriter.WriteUnicodeString(fieldPlayer.Value.HomeName);
            pWriter.WriteLong(fieldPlayer.Value.HomeExpiration);
            pWriter.WriteLong();
            pWriter.WriteByte(1);
            return(pWriter);
        }
Beispiel #13
0
    public void SetPortal(int portalId, bool visible, bool enabled, bool minimapVisible, bool arg5)
    {
        if (Field.State.Portals.IsEmpty)
        {
            return;
        }

        IFieldObject <Portal> portal = Field.State.Portals.Values.FirstOrDefault(p => p.Value.Id == portalId);

        if (portal == null)
        {
            return;
        }
        portal.Value.Update(visible, enabled, minimapVisible);
        Field.BroadcastPacket(FieldPortalPacket.UpdatePortal(portal));
    }
        public void RemovePlayer(GameSession sender, IFieldObject <Player> player)
        {
            lock (sessions)
            {
                sessions.Remove(sender);
            }
            State.RemovePlayer(player.ObjectId);

            // Remove player
            Broadcast(session =>
            {
                session.Send(FieldPacket.RemovePlayer(player));
            });

            ((FieldObject <Player>)player).ObjectId = -1; // Reset object id
        }
Beispiel #15
0
        public static Packet PlayScore(IFieldObject <Player> player, string itemFileName)
        {
            PacketWriter pWriter = PacketWriter.Of(SendOp.PLAY_INSTRUMENT);

            pWriter.WriteEnum(InstrumentPacketMode.PlayScore);
            pWriter.WriteByte();
            pWriter.WriteInt(player.ObjectId);
            pWriter.WriteInt(player.ObjectId);
            pWriter.Write(player.Coord);
            pWriter.WriteInt(0x616F09CE); // scoreUid?
            pWriter.WriteInt();
            pWriter.WriteInt();
            pWriter.WriteByte();
            pWriter.WriteUnicodeString(itemFileName);
            return(pWriter);
        }
Beispiel #16
0
        private static void HandleAoeDamage(GameSession session, PacketReader packet)
        {
            List <(IFieldObject <Mob>, DamageHandler)> mobs = new List <(IFieldObject <Mob>, DamageHandler)>();
            long   skillSN        = packet.ReadLong();
            int    unkValue       = packet.ReadInt();
            int    playerObjectId = packet.ReadInt();
            CoordF coords         = packet.Read <CoordF>();
            CoordF coords2        = packet.Read <CoordF>();
            CoordF coords3        = packet.Read <CoordF>();

            packet.ReadByte();
            byte count = packet.ReadByte();

            packet.ReadInt();

            bool isCrit = DamageHandler.RollCrit(session.Player.Stats[PlayerStatId.CritRate].Current);

            for (int i = 0; i < count; i++)
            {
                int entity = packet.ReadInt();
                packet.ReadByte();

                IFieldObject <Mob> mob = session.FieldManager.State.Mobs.GetValueOrDefault(entity);
                if (mob != null)
                {
                    DamageHandler damage = DamageHandler.CalculateDamage(session.FieldPlayer.Value.SkillCast, session.FieldPlayer.Value, mob.Value, isCrit);

                    mob.Value.Damage(damage.Damage);
                    session.Send(StatPacket.UpdateMobStats(mob));

                    if (mob.Value.IsDead)
                    {
                        HandleMobKill(session, mob);
                    }

                    if (mob.Value.Id == 29000128) // Temp fix for tutorial barrier
                    {
                        session.Send("4F 00 03 E8 03 00 00 00 00 00 00 00 00 00 00 00 00 80 3F".ToByteArray());
                        session.Send("4F 00 03 D0 07 00 00 00 00 00 00 00 00 00 00 00 00 80 3F".ToByteArray());
                        session.Send("4F 00 08 01 04 01 00 00".ToByteArray());
                    }

                    mobs.Add((mob, damage));
                }
            }
            session.Send(SkillDamagePacket.ApplyDamage(skillSN, unkValue, coords, session.FieldPlayer, mobs));
        }
Beispiel #17
0
        private static void DoDirChange(ITank tank, IFieldObject obstacle)
        {
            ITank saveTank = new Tank(tank.Width, tank.Height, tank.X, tank.Y);

            saveTank.Direction = tank.Direction;

            var dir = DirectionsForTank(tank);

            if (dir.Length == 1)
            {
                DoDir(dir[0], tank);
            }

            else
            {
                double left   = Math.Max(tank.X, obstacle.X);
                double top    = Math.Min(tank.Y + tank.Height, obstacle.Y + obstacle.Height);
                double right  = Math.Min(tank.X + tank.Width, obstacle.X + obstacle.Width);
                double bottom = Math.Max(tank.Y, obstacle.Y);

                double width  = right - left;
                double height = top - bottom;

                if (width > height)
                {
                    if (dir[0] == Directions.Down || dir[0] == Directions.Up)
                    {
                        DoDir(dir[0], tank);
                    }
                    else if (dir[1] == Directions.Down || dir[1] == Directions.Up)
                    {
                        DoDir(dir[1], tank);
                    }
                }
                else
                {
                    if (dir[0] == Directions.Left || dir[0] == Directions.Right)
                    {
                        DoDir(dir[0], tank);
                    }
                    else if (dir[1] == Directions.Left || dir[1] == Directions.Right)
                    {
                        DoDir(dir[1], tank);
                    }
                }
            }
        }
Beispiel #18
0
    private static void UpdateAllPortals(GameSession session)
    {
        foreach (IFieldObject <Portal> fieldPortal in session.FieldManager.State.Portals.Values)
        {
            session.FieldManager.RemovePortal(fieldPortal);
        }

        // Re-add cube portals in map
        IEnumerable <IFieldObject <Cube> > fieldCubePortals = session.FieldManager.State.Cubes.Values.Where(x => x.Value.Item.Id == 50400158);

        foreach (IFieldObject <Cube> fieldCubePortal in fieldCubePortals)
        {
            Cube   cubePortal = fieldCubePortal.Value;
            Portal portal     = new(GuidGenerator.Int())
            {
                IsVisible        = true,
                IsEnabled        = true,
                IsMinimapVisible = false,
                Rotation         = cubePortal.Rotation,
                PortalType       = PortalTypes.Home,
                UGCPortalMethod  = cubePortal.PortalSettings.Method
            };

            IFieldObject <Portal> fieldPortal = session.FieldManager.RequestFieldObject(portal);
            fieldPortal.Coord = cubePortal.CoordF;
            if (!string.IsNullOrEmpty(cubePortal.PortalSettings.DestinationTarget))
            {
                switch (cubePortal.PortalSettings.Destination)
                {
                case UGCPortalDestination.PortalInHome:
                    fieldPortal.Value.TargetMapId = (int)Map.PrivateResidence;
                    break;

                case UGCPortalDestination.SelectedMap:
                    fieldPortal.Value.TargetMapId = int.Parse(cubePortal.PortalSettings.DestinationTarget);
                    break;

                case UGCPortalDestination.FriendHome:
                    fieldPortal.Value.TargetHomeAccountId = long.Parse(cubePortal.PortalSettings.DestinationTarget);
                    break;
                }
            }
            cubePortal.PortalSettings.PortalObjectId = fieldPortal.ObjectId;
            session.FieldManager.AddPortal(fieldPortal);
        }
    }
}
Beispiel #19
0
        public override void Execute(GameCommandTrigger trigger)
        {
            int   id    = trigger.Get <int>("id");
            short level = trigger.Get <short>("level") > 0 ? trigger.Get <short>("level") : (short)1;

            if (SkillMetadataStorage.GetSkill(id) == null)
            {
                trigger.Session.SendNotice($"Skill with id: {id} is not defined.");
                return;
            }

            SkillCast             skillCast = new SkillCast(id, level, GuidGenerator.Long(), trigger.Session.ServerTick, trigger.Session.FieldPlayer.ObjectId, trigger.Session.ClientTick);
            CoordF                empty     = CoordF.From(0, 0, 0);
            IFieldObject <Player> player    = trigger.Session.FieldPlayer;

            trigger.Session.FieldManager.BroadcastPacket(SkillUsePacket.SkillUse(skillCast, player.Coord, empty, empty));
        }
Beispiel #20
0
    // not sure about the name
    public static PacketWriter UpdateUGCItem(IFieldObject <Player> fieldPlayer, Item item)
    {
        PacketWriter pWriter = PacketWriter.Of(SendOp.UGC);

        pWriter.Write(UgcMode.UpdateUGC);
        pWriter.WriteInt(fieldPlayer.ObjectId);
        pWriter.WriteLong(item.Uid);
        pWriter.WriteInt(item.Id);
        pWriter.WriteInt(item.Amount);
        pWriter.WriteUnicodeString(item.UGC.Name);
        pWriter.WriteByte(1);     // unknown
        pWriter.WriteLong(item.UGC.SalePrice);
        pWriter.WriteBool(false); // unknown
        pWriter.WriteUgcTemplate(item.UGC);

        return(pWriter);
    }
Beispiel #21
0
    public static PacketWriter LoadFurnishingItem(IFieldObject <Player> player, int itemId, long itemUid, Item item = null)
    {
        PacketWriter pWriter = PacketWriter.Of(SendOp.ResponseCube);

        pWriter.Write(ResponseCubePacketMode.LoadFurnishingItem);
        pWriter.WriteInt(player.ObjectId);
        pWriter.WriteInt(itemId);
        pWriter.WriteLong(itemUid);
        pWriter.WriteLong();
        pWriter.WriteBool(item?.Ugc is not null);
        if (item?.Ugc is not null)
        {
            pWriter.WriteClass(item.Ugc);
        }

        return(pWriter);
    }
    public static PacketWriter Drop(IFieldObject <LiftableObject> fieldLiftableObject)
    {
        LiftableObject liftableObject = fieldLiftableObject.Value;

        PacketWriter pWriter = PacketWriter.Of(SendOp.Liftable);

        pWriter.Write(LiftableMode.Drop);
        pWriter.WriteString($"4_{fieldLiftableObject.Coord.ToByte().AsHexadecimal()}");
        pWriter.WriteInt(liftableObject.ItemCount);
        pWriter.WriteUnicodeString(liftableObject.Metadata.MaskQuestId);
        pWriter.WriteUnicodeString(liftableObject.Metadata.MaskQuestState);
        pWriter.WriteUnicodeString(liftableObject.Metadata.EffectQuestId);
        pWriter.WriteUnicodeString(liftableObject.Metadata.EffectQuestState);
        pWriter.WriteBool(true); // effect

        return(pWriter);
    }
Beispiel #23
0
        public static bool IsPlayerInBox(MapTriggerBox box, IFieldObject <Player> player)
        {
            CoordF minCoord = CoordF.From(
                box.Position.X - box.Dimension.X / 2,
                box.Position.Y - box.Dimension.Y / 2,
                box.Position.Z - box.Dimension.Z / 2);

            CoordF maxCoord = CoordF.From(
                box.Position.X + box.Dimension.X / 2,
                box.Position.Y + box.Dimension.Y / 2,
                box.Position.Z + box.Dimension.Z / 2);

            bool min = player.Coord.X >= minCoord.X && player.Coord.Y >= minCoord.Y && player.Coord.Z >= minCoord.Z;
            bool max = player.Coord.X <= maxCoord.X && player.Coord.Y <= maxCoord.Y && player.Coord.Z <= maxCoord.Z;

            return(min && max);
        }
Beispiel #24
0
        public static void HandleOpen(GameSession session, IFieldObject <Npc> npcFieldObject)
        {
            NpcMetadata metadata = NpcMetadataStorage.GetNpc(npcFieldObject.Value.Id);

            ShopMetadata shop = ShopMetadataStorage.GetShop(metadata.ShopId);

            if (shop == null)
            {
                Console.WriteLine($"Unknown shop ID: {metadata.ShopId}");
                return;
            }

            session.Send(ShopPacket.Open(shop));
            session.Send(ShopPacket.LoadProducts(shop.Items));
            session.Send(ShopPacket.Reload());
            session.Send(NpcTalkPacket.Respond(npcFieldObject, NpcType.Default, DialogType.None, 0));
        }
Beispiel #25
0
        public IList <ICollidable> GetCollisions(IFieldObject targetObject, IEnumerable <IFieldObject> objectsOnField)
        {
            var targetObjectArea = targetObject.GetArea();

            var objectsToCollide = new List <ICollidable>();

            foreach (var fieldObject in objectsOnField)
            {
                var fieldObjectArea = fieldObject.GetArea();
                if (fieldObjectArea.Intersects(targetObjectArea) > 0)
                {
                    objectsToCollide.Add(fieldObject);
                }
            }

            return(objectsToCollide);
        }
    private static void HandleInstallBillBoard(GameSession session, PacketReader packet, Item item)
    {
        string[] parameters  = packet.ReadUnicodeString().Split("'");
        string   title       = parameters[0];
        string   description = parameters[1];
        bool     publicHouse = parameters[2].Equals("1");

        int    balloonUid = GuidGenerator.Int();
        string id         = "AdBalloon_" + balloonUid;
        IFieldObject <InteractObject> fieldAdBallon = session.FieldManager.AddAdBalloon(new(id, item.Function.InstallBillboard.InteractId,
                                                                                            InteractObjectState.Default, InteractObjectType.AdBalloon,
                                                                                            session.Player, item.Function.InstallBillboard, title, description, publicHouse));

        session.FieldManager.State.AddInteractObject(fieldAdBallon);
        session.FieldManager.BroadcastPacket(InteractObjectPacket.Add(fieldAdBallon));
        session.Player.Inventory.ConsumeItem(session, item.Uid, 1);
    }
        public static Packet Add(IFieldObject <Player> player)
        {
            PacketWriter pWriter = PacketWriter.Of(SendOp.GUIDE_OBJECT);

            pWriter.WriteEnum(GuideObjectPacketMode.Add);
            pWriter.WriteShort(player.Value.Guide.Value.Type);
            pWriter.WriteInt(player.Value.Guide.ObjectId);
            pWriter.WriteLong(player.Value.CharacterId);
            pWriter.Write(player.Value.Guide.Coord);
            pWriter.Write(player.Rotation);
            if (player.Value.Guide.Value.Type == 0)
            {
                pWriter.WriteLong();
            }

            return(pWriter);
        }
Beispiel #28
0
    public static PacketWriter Add(IFieldObject <GuideObject> guide)
    {
        PacketWriter pWriter = PacketWriter.Of(SendOp.GuideObject);

        pWriter.Write(GuideObjectPacketMode.Add);
        pWriter.WriteShort(guide.Value.Type);
        pWriter.WriteInt(guide.ObjectId);
        pWriter.WriteLong(guide.Value.BoundCharacterId);
        pWriter.Write(guide.Coord);
        pWriter.Write(guide.Rotation);
        if (guide.Value.Type == 0)
        {
            pWriter.WriteLong();
        }

        return(pWriter);
    }
Beispiel #29
0
        private static void HandleAddFurnishing(GameSession session, PacketReader packet)
        {
            CoordB coord    = packet.Read <CoordB>();
            byte   padding  = packet.ReadByte();
            int    itemId   = packet.ReadInt();
            long   itemUid  = packet.ReadLong();
            byte   padding2 = packet.ReadByte();
            CoordF rotation = packet.Read <CoordF>();

            int plotNumber = MapMetadataStorage.GetPlotNumber(session.Player.MapId, coord);

            if (plotNumber < 0)
            {
                return;
            }

            // TODO: Check if player has rights to this plot

            FurnishingShopMetadata shopMetadata = FurnishingShopMetadataStorage.GetMetadata(itemId);

            if (shopMetadata == null || !shopMetadata.Buyable)
            {
                return;
            }

            if (itemUid == 0) // player needs to purchase
            {
                if (!PurchaseFurnishingItem(session, shopMetadata))
                {
                    return;
                }


                Item item = new Item(itemId);

                //TODO: Add and remove appropriate item to warehouse inventory and furnishing inventory

                Cube cube = new Cube(item, plotNumber);

                IFieldObject <Cube> fieldCube = session.FieldManager.RequestFieldObject(cube);
                fieldCube.Coord    = coord.ToFloat();
                fieldCube.Rotation = rotation;
                session.FieldManager.AddCube(fieldCube, session.FieldPlayer);
            }
        }
Beispiel #30
0
    public static PacketWriter Vibrate(string objectHash, SkillCast skillCast, IFieldObject <Player> player)
    {
        PacketWriter pWriter = PacketWriter.Of(SendOp.VIBRATE);

        pWriter.WriteByte(1);
        pWriter.WriteString(objectHash);
        pWriter.WriteLong(skillCast.SkillSn);
        pWriter.WriteInt(skillCast.SkillId);
        pWriter.WriteShort(skillCast.SkillLevel);
        pWriter.WriteByte(); // motion point?
        pWriter.WriteByte();
        pWriter.Write(player.Coord.ToShort());
        pWriter.Write(player.Value.Session.ServerTick);
        pWriter.WriteString();
        pWriter.WriteByte();

        return(pWriter);
    }