예제 #1
0
 public void Warp(MapPlayerSpawn spawn, int mapId)
 {
     MapId    = mapId;
     Coord    = spawn.Coord.ToFloat();
     Rotation = spawn.Rotation.ToFloat();
     Session.Send(FieldPacket.RequestEnter(Session.FieldPlayer));
 }
예제 #2
0
        public override void Handle(GameSession session, PacketReader packet)
        {
            byte function = packet.ReadByte();

            if (function == 0)
            {
                int srcMapId = packet.ReadInt();
                if (srcMapId != session.FieldManager.MapId)
                {
                    return;
                }

                int       portalId  = packet.ReadInt();
                MapPortal srcPortal = MapEntityStorage.GetPortals(srcMapId)
                                      .FirstOrDefault(portal => portal.Id == portalId);
                if (srcPortal == default)
                {
                    logger.Warning($"Unable to find portal:{portalId} in map:{srcMapId}");
                    return;
                }

                MapPortal dstPortal = MapEntityStorage.GetPortals(srcPortal.Target)
                                      .FirstOrDefault(portal => portal.Target == srcMapId);
                if (dstPortal == default)
                {
                    logger.Warning($"Unable to find return portal to map:{srcMapId} in map:{srcPortal.Target}");
                    return;
                }

                // TODO: There needs to be a more centralized way to set coordinates...
                session.Player.MapId = srcPortal.Target;
                session.Player.Coord = dstPortal.Coord.ToFloat();
                session.Send(FieldPacket.RequestEnter(session.FieldPlayer));
            }
        }
예제 #3
0
        // Example: "map -> return current map id"
        // Example: "map id:200001 -> teleport to map"
        private static void ProcessMapCommand(GameSession session, string command)
        {
            Dictionary <string, string> config = command.ToMap();

            int.TryParse(config.GetValueOrDefault("id", "0"), out int mapId);
            if (mapId == 0)
            {
                session.SendNotice($"Current map id:{session.Player.MapId}");
                return;
            }

            if (session.Player.MapId == mapId)
            {
                session.SendNotice("You are already on that map.");
                return;
            }

            MapPlayerSpawn spawn = MapEntityStorage.GetRandomPlayerSpawn(mapId);

            if (spawn != null)
            {
                session.Player.MapId    = mapId;
                session.Player.Coord    = spawn.Coord.ToFloat();
                session.Player.Rotation = spawn.Rotation.ToFloat();
                session.Send(FieldPacket.RequestEnter(session.FieldPlayer));
            }
            else
            {
                session.SendNotice("Could not find coordinates to spawn on that map.");
            }
        }
예제 #4
0
        private static void ProcessCoordCommand(GameSession session, string command)
        {
            if (command == "")
            {
                session.SendNotice(session.FieldPlayer.Coord.ToString());
            }
            else
            {
                string[] coords = command.Replace(" ", "").Split(",");
                if (!float.TryParse(coords[0], out float x))
                {
                    return;
                }
                if (!float.TryParse(coords[1], out float y))
                {
                    return;
                }
                if (!float.TryParse(coords[2], out float z))
                {
                    return;
                }

                session.Player.Coord = CoordF.From(x, y, z);
                session.Send(FieldPacket.RequestEnter(session.FieldPlayer));
            }
        }
예제 #5
0
        public override void Handle(GameSession session, PacketReader packet)
        {
            byte function = packet.ReadByte();

            if (function == 0)
            {
                int srcMapId = packet.ReadInt();
                if (srcMapId != session.FieldManager.MapId)
                {
                    return;
                }

                int       portalId  = packet.ReadInt();
                MapPortal srcPortal = MapEntityStorage.GetPortals(srcMapId)
                                      .FirstOrDefault(portal => portal.Id == portalId);
                if (srcPortal == default)
                {
                    Logger.Warning($"Unable to find portal:{portalId} in map:{srcMapId}");
                    return;
                }

                MapPortal dstPortal = MapEntityStorage.GetPortals(srcPortal.Target)
                                      .FirstOrDefault(portal => portal.Target == srcMapId);
                if (dstPortal == default)
                {
                    Logger.Warning($"Unable to find return portal to map:{srcMapId} in map:{srcPortal.Target}");
                    return;
                }

                // TODO: There needs to be a more centralized way to set coordinates...
                session.Player.MapId    = srcPortal.Target;
                session.Player.Rotation = dstPortal.Rotation.ToFloat();
                session.Player.Coord    = dstPortal.Coord.ToFloat();

                if (dstPortal.Name == "Portal_cube") // spawn on the next block if portal is a cube
                {
                    if (dstPortal.Rotation.Z == 0)   // Facing SE
                    {
                        session.Player.Coord.Y -= Block.BLOCK_SIZE;
                    }
                    else if (dstPortal.Rotation.Z == 90) // Facing NE
                    {
                        session.Player.Coord.X += Block.BLOCK_SIZE;
                    }
                    else if (dstPortal.Rotation.Z == 180) // Facing NW
                    {
                        session.Player.Coord.Y += Block.BLOCK_SIZE;
                    }
                    else if (dstPortal.Rotation.Z == 270) // Facing SW
                    {
                        session.Player.Coord.X -= Block.BLOCK_SIZE;
                    }
                }

                session.Player.SafeBlock = session.Player.Coord;
                session.Send(FieldPacket.RequestEnter(session.FieldPlayer));
            }
        }
예제 #6
0
 private static void HandleLeaveInstance(GameSession session)
 {
     session.Player.MapId          = session.Player.ReturnMapId;
     session.Player.Rotation       = session.FieldPlayer.Rotation;
     session.Player.Coord          = session.Player.ReturnCoord;
     session.Player.ReturnCoord.Z += Block.BLOCK_SIZE;
     DatabaseManager.UpdateCharacter(session.Player);
     session.Send(FieldPacket.RequestEnter(session.FieldPlayer));
 }
예제 #7
0
        public void Warp(CoordF coord, CoordF rotation, int mapId)
        {
            MapId     = mapId;
            Coord     = coord;
            Rotation  = rotation;
            SafeBlock = coord;

            if (!UnlockedMaps.Contains(MapId))
            {
                UnlockedMaps.Add(MapId);
            }

            DatabaseManager.UpdateCharacter(this);
            Session.Send(FieldPacket.RequestEnter(Session.FieldPlayer));
        }
예제 #8
0
        public void Warp(int mapId, CoordF coord = default, CoordF rotation = default, long instanceId = 0)
        {
            if (MapEntityStorage.HasSafePortal(MapId))
            {
                ReturnCoord = Coord;
                ReturnMapId = MapId;
            }
            Coord      = coord;
            Rotation   = rotation;
            SafeBlock  = coord;
            MapId      = mapId;
            InstanceId = instanceId;

            if (coord == default || rotation == default)
            {
                MapPlayerSpawn spawn = MapEntityStorage.GetRandomPlayerSpawn(mapId);
                if (spawn == null)
                {
                    Session.SendNotice($"Could not find a spawn for map {mapId}");
                    return;
                }
                if (coord == default)
                {
                    Coord     = spawn.Coord.ToFloat();
                    SafeBlock = spawn.Coord.ToFloat();
                }
                if (rotation == default)
                {
                    Rotation = spawn.Rotation.ToFloat();
                }
            }

            if (!UnlockedMaps.Contains(MapId))
            {
                UnlockedMaps.Add(MapId);
            }

            DatabaseManager.Characters.Update(this);
            Session.Send(FieldPacket.RequestEnter(this));
        }
예제 #9
0
        public static void HandleInstanceMove(GameSession session, int mapId)
        {
            // TODO: Revise to include instancing

            if (MapEntityStorage.HasSafePortal(session.Player.MapId))
            {
                session.Player.ReturnCoord = session.FieldPlayer.Coord;
                session.Player.ReturnMapId = session.Player.MapId;
            }

            MapPortal dstPortal = MapEntityStorage.GetPortals(mapId).First(x => x.Id == 1);

            if (dstPortal == null)
            {
                return;
            }

            session.Player.MapId    = mapId;
            session.Player.Rotation = dstPortal.Rotation.ToFloat();
            session.Player.Coord    = dstPortal.Coord.ToFloat();
            session.Send(FieldPacket.RequestEnter(session.FieldPlayer));
        }
예제 #10
0
        public override void Handle(GameSession session, PacketReader packet)
        {
            long     accountId = packet.ReadLong();
            AuthData authData  = AuthStorage.GetData(accountId);

            // Backwards seeking because we read accountId here
            packet.Skip(-8);
            HandleCommon(session, packet);

            Player player = DatabaseManager.GetCharacter(authData.CharacterId);

            if (player == default)
            {
                throw new ArgumentException("Character not found!");
            }

            player.Session = session;

            session.InitPlayer(player);

            //session.Send(0x27, 0x01); // Meret market related...?
            session.Send(BuddyPacket.Initialize());

            session.Send(LoginPacket.LoginRequired(accountId));

            if (session.Player.Guild != null)
            {
                Guild guild = DatabaseManager.GetGuild(session.Player.Guild.Id);
                session.Send(GuildPacket.UpdateGuild(guild));
                session.Send(GuildPacket.MemberJoin(player));
            }
            session.Send(BuddyPacket.LoadList(player));
            session.Send(BuddyPacket.EndList(player.BuddyList.Count));

            // Meret market
            //session.Send("6E 00 0B 00 00 00 00 00 00 00 00 00 00 00 00".ToByteArray());
            //session.Send("6E 00 0C 00 00 00 00".ToByteArray());
            // UserConditionEvent
            //session.Send("BF 00 00 00 00 00 00".ToByteArray());
            // PCBangBonus
            //session.Send("A7 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00".ToByteArray());
            TimeSyncPacket.SetInitial1();
            TimeSyncPacket.SetInitial2();
            TimeSyncPacket.Request();
            session.Send(StatPacket.SetStats(session.FieldPlayer));
            // TODO: Grab Hp/Spirit/Stam from last login
            player.Stats.InitializePools(player.Stats[PlayerStatId.Hp].Max, player.Stats[PlayerStatId.Spirit].Max, player.Stats[PlayerStatId.Stamina].Max);

            session.SyncTicks();
            session.Send(DynamicChannelPacket.DynamicChannel());
            session.Send(ServerEnterPacket.Enter(session));
            // SendUgc f(0x16), SendCash f(0x09), SendContentShutdown f(0x01, 0x04), SendPvp f(0x0C)
            PacketWriter pWriter = PacketWriter.Of(SendOp.SYNC_NUMBER);

            pWriter.WriteByte();
            session.Send(pWriter);
            // 0x112, Prestige f(0x00, 0x07)
            session.Send(PrestigePacket.Prestige(session.Player));

            // Load inventory tabs
            foreach (InventoryTab tab in Enum.GetValues(typeof(InventoryTab)))
            {
                InventoryController.LoadInventoryTab(session, tab);
            }

            List <QuestMetadata> questList = QuestMetadataStorage.GetAvailableQuests(player.Levels.Level); // TODO: This logic needs to be refactored when DB is implemented

            questList.Add(QuestMetadataStorage.GetMetadata(60100000));                                     // Manually adding "the caravan" for testing purposes

            foreach (QuestMetadata quest in questList)
            {
                session.Player.QuestList.Add(new QuestStatus(quest));
            }

            IEnumerable <List <QuestStatus> > packetCount = SplitList(session.Player.QuestList, 200); // Split the quest list in 200 quests per packet, same way kms do

            foreach (List <QuestStatus> item in packetCount)
            {
                session.Send(QuestPacket.SendQuests(item));
            }

            session.Send(TrophyPacket.WriteTableStart());
            List <Trophy> trophyList = new List <Trophy>(session.Player.TrophyData.Values);
            IEnumerable <List <Trophy> > trophyListPackets = SplitList(trophyList, 60);

            foreach (List <Trophy> trophy in trophyListPackets)
            {
                session.Send(TrophyPacket.WriteTableContent(trophy));
            }

            session.Send(WarehouseInventoryPacket.Count()); // Typically sent after buddylist
            session.Send(WarehouseInventoryPacket.StartList());
            session.Send(WarehouseInventoryPacket.EndList());
            session.Send(FurnishingInventoryPacket.StartList());
            session.Send(FurnishingInventoryPacket.EndList());
            // SendQuest, SendAchieve, SendManufacturer, SendUserMaid
            session.Send(UserEnvPacket.SetTitles(player));
            session.Send(UserEnvPacket.Send04());
            session.Send(UserEnvPacket.Send05());
            session.Send(UserEnvPacket.Send08());
            session.Send(UserEnvPacket.Send09());
            session.Send(UserEnvPacket.Send10());
            session.Send(UserEnvPacket.Send12());

            // SendMeretMarket f(0xC9)
            session.Send(FishingPacket.LoadAlbum(player));
            // SendPvp f(0x16,0x17), ResponsePet f(0x07), 0xF6
            // CharacterAbility
            // E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

            // Normally, options are only requested for a new character. Since we don't have a database, we'll always requests the users bindings
            session.Send(KeyTablePacket.RequestDefault());
            // TODO - Ask for mouse or kb controls on new character creation.
            // Commented out since its annoying to click every time
            //session.Send(KeyTablePacket.AskKeyboardOrMouse());

            // Key bindings and skill slots would normally be loaded from a database
            // If the character is not a new character, this is what we would send
            // session.Send(KeyTablePacket.SendFullOptions(session.Player.Options));

            // SendKeyTable f(0x00), SendGuideRecord f(0x03), GameEvent f(0x00)
            // SendBannerList f(0x19), SendRoomDungeon f(0x05, 0x14, 0x17)
            // FieldEntrance
            session.Send("19 00 00 65 00 00 00 29 7C 7D 01 0C 4D A1 6F 01 0C D3 1A 5F 01 0C EF 03 00 00 01 A2 3C 31 01 0C 3F 0C B7 0D 01 6B 55 5F 01 0C 3A 77 31 01 0C B1 98 BA 01 0C 03 90 5F 01 0C F9 7A 40 01 0C 91 B5 40 01 0C F9 57 31 01 0C 2F C7 BB 0D 01 81 97 7D 01 0C C2 70 5F 01 0C 51 96 40 01 0C B9 38 31 01 0C 41 78 7D 01 0C 65 9D 6F 01 0C 83 51 5F 01 0C 52 73 31 01 0C FF E0 B8 0D 01 11 77 40 01 0C A9 B1 40 01 0C 11 54 31 01 0C DA 6C 5F 01 0C 69 92 40 01 0C D1 34 31 01 0C 7D 99 6F 01 0C 03 13 5F 01 0C 69 6F 31 01 0C 32 88 5F 01 0C 9B 4D 5F 01 0C FF 6F B6 0D 01 29 73 40 01 0C C1 AD 40 01 0C 29 50 31 01 0C 81 8E 40 01 0C E9 30 31 01 0C 09 CE 8C 01 0C 95 95 6F 01 0C 1B 0F 5F 01 0C 4A 84 5F 01 0C B3 49 5F 01 0C 82 6B 31 01 0C 4F 15 BC 0D 01 F9 8C BA 01 00 D9 A9 40 01 0C 41 4C 31 01 0C EF B9 B8 0D 01 99 8A 40 01 0C 21 CA 8C 01 0C 01 AD 6F 01 0C 33 0B 5F 01 0C 99 67 31 01 0C 62 80 5F 01 0C CB 45 5F 01 0C 79 08 9C 01 0C F1 A5 40 01 0C E1 87 7D 01 0C BB 9B 5F 01 0C B1 86 40 01 0C 39 C6 8C 01 0C 7A 7C 5F 01 0C B2 63 31 01 0C 29 85 BA 01 0E 91 04 9C 01 0C 09 A2 40 01 0C 71 44 31 01 0C F9 83 7D 01 0C 1D A9 6F 01 0C D3 97 5F 01 0C C9 82 40 01 0C 51 C2 8C 01 0C 61 BD 40 01 0C C9 5F 31 01 0C 51 9F 7D 01 0C 92 78 5F 01 0C 0F 08 B9 0D 01 A9 00 9C 01 0C 89 40 31 01 0C 11 80 7D 01 0C 35 A5 6F 01 0C BB 1E 5F 01 0C 53 59 5F 01 0C E9 03 00 00 01 22 7B 31 01 0C EB 93 5F 01 0C EA 03 00 00 01 E1 7E 40 01 0C 69 BE 8C 01 0C 79 B9 40 01 0C E1 5B 31 01 0C EB 03 00 00 01 69 9B 7D 01 0C AA 74 5F 01 0C EC 03 00 00 01 ED 03 00 00 01 C1 FC 9B 01 0C EE 03 00 00 01".ToByteArray());
            // 0xF0, ResponsePet P(0F 01)
            // RequestFieldEnter
            //session.Send("16 00 00 41 75 19 03 00 01 8A 42 0F 00 00 00 00 00 00 C0 28 C4 00 40 03 44 00 00 16 44 00 00 00 00 00 00 00 00 55 FF 33 42 E8 49 01 00".ToByteArray());
            session.Send(FieldPacket.RequestEnter(session.FieldPlayer));
            // SendUgc: 15 01 00 00 00 00 00 00 00 00 00 00 00 4B 00 00 00
            // SendHomeCommand: 00 E1 0F 26 89 7F 98 3C 26 00 00 00 00 00 00 00 00

            //session.Send("B9 00 00 E1 0F 26 89 7F 98 3C 26 00 00 00 00 00 00 00 00".ToByteArray());
            //session.Send(ServerEnterPacket.Confirm());

            //session.Send(0xF0, 0x00, 0x1F, 0x78, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00);
            //session.Send(0x28, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00);
            //session.Send(ServerEnterPacket.Confirm());
        }
예제 #11
0
        public override void Handle(GameSession session, PacketReader packet)
        {
            long     accountId = packet.ReadLong();
            AuthData authData  = AuthStorage.GetData(accountId);

            // Backwards seeking because we read accountId here
            packet.Skip(-8);
            HandleCommon(session, packet);

            session.InitPlayer(AccountStorage.GetCharacter(authData.CharacterId));

            //session.Send(0x27, 0x01); // Meret market related...?

            session.Send(PacketWriter.Of(SendOp.LOGIN_REQUIRED)
                         .WriteByte(0x17)
                         .Write(accountId)
                         .WriteInt().WriteByte().WriteLong()
                         .WriteInt(1).WriteInt().WriteInt().WriteLong()
                         );

            session.Send(BuddyListPacket.StartList());
            session.Send(BuddyListPacket.EndList());

            // Meret market
            //session.Send("6E 00 0B 00 00 00 00 00 00 00 00 00 00 00 00".ToByteArray());
            //session.Send("6E 00 0C 00 00 00 00".ToByteArray());
            // UserConditionEvent
            //session.Send("BF 00 00 00 00 00 00".ToByteArray());
            // PCBangBonus
            //session.Send("A7 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00".ToByteArray());
            TimeSyncPacket.SetInitial1();
            TimeSyncPacket.SetInitial2();
            TimeSyncPacket.Request();
            // SendStat 0x2F (How to send here without ObjectId?, Seems fine to send after entering field)

            session.SyncTicks();
            session.Send(PacketWriter.Of(SendOp.DYNAMIC_CHANNEL).WriteByte(0x00)
                         .WriteShort(10).WriteShort(9).WriteShort(9).WriteShort(9)
                         .WriteShort(9).WriteShort(10).WriteShort(10).WriteShort(10));
            session.Send(ServerEnterPacket.Enter(session));
            // SendUgc f(0x16), SendCash f(0x09), SendContentShutdown f(0x01, 0x04), SendPvp f(0x0C)
            session.Send(PacketWriter.Of(SendOp.SYNC_NUMBER).WriteByte());
            // 0x112, AdventureLevel f(0x00, 0x07)
            session.Send(AdventureLevelPacket.Prestige(session.Player));

            // Load inventory tabs
            foreach (InventoryTab tab in Enum.GetValues(typeof(InventoryTab)))
            {
                session.Send(ItemInventoryPacket.ResetTab(tab));
                session.Send(ItemInventoryPacket.LoadTab(tab));
                // Load items for above tab
                //session.Send(ItemInventoryPacket.LoadItem());
            }
            session.Send(MarketInventoryPacket.Count(0)); // Typically sent after buddylist
            session.Send(MarketInventoryPacket.StartList());
            session.Send(MarketInventoryPacket.EndList());
            session.Send(FurnishingInventoryPacket.StartList());
            session.Send(FurnishingInventoryPacket.EndList());
            // SendQuest, SendAchieve, SendManufacturer, SendUserMaid

            session.Send(UserEnvPacket.SetTitles(new List <int> {
                10000565, 10000251, 10000291, 10000292
            }));
            session.Send(UserEnvPacket.Send04());
            session.Send(UserEnvPacket.Send05());
            session.Send(UserEnvPacket.Send08());
            session.Send(UserEnvPacket.Send09());
            session.Send(UserEnvPacket.Send10());
            session.Send(UserEnvPacket.Send12());

            // SendMeretMarket f(0xC9)
            session.Send(FishingPacket.LoadLog());
            // SendPvp f(0x16,0x17), ResponsePet f(0x07), 0xF6
            // CharacterAbility
            // E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

            // Normally, options are only requested for a new character. Since we don't have a database, we'll always requests the users bindings
            session.Send(KeyTablePacket.RequestDefault());
            // TODO - Ask for mouse or kb controls on new character creation.
            // Commented out since its annoying to click every time
            //session.Send(KeyTablePacket.AskKeyboardOrMouse());

            // Key bindings and skill slots would normally be loaded from a database
            // If the character is not a new character, this is what we would send
            // session.Send(KeyTablePacket.SendFullOptions(session.Player.Options));

            // SendKeyTable f(0x00), SendGuideRecord f(0x03), GameEvent f(0x00)
            // SendBannerList f(0x19), SendRoomDungeon f(0x05, 0x14, 0x17)
            // FieldEntrance
            session.Send("19 00 00 65 00 00 00 29 7C 7D 01 0C 4D A1 6F 01 0C D3 1A 5F 01 0C EF 03 00 00 01 A2 3C 31 01 0C 3F 0C B7 0D 01 6B 55 5F 01 0C 3A 77 31 01 0C B1 98 BA 01 0C 03 90 5F 01 0C F9 7A 40 01 0C 91 B5 40 01 0C F9 57 31 01 0C 2F C7 BB 0D 01 81 97 7D 01 0C C2 70 5F 01 0C 51 96 40 01 0C B9 38 31 01 0C 41 78 7D 01 0C 65 9D 6F 01 0C 83 51 5F 01 0C 52 73 31 01 0C FF E0 B8 0D 01 11 77 40 01 0C A9 B1 40 01 0C 11 54 31 01 0C DA 6C 5F 01 0C 69 92 40 01 0C D1 34 31 01 0C 7D 99 6F 01 0C 03 13 5F 01 0C 69 6F 31 01 0C 32 88 5F 01 0C 9B 4D 5F 01 0C FF 6F B6 0D 01 29 73 40 01 0C C1 AD 40 01 0C 29 50 31 01 0C 81 8E 40 01 0C E9 30 31 01 0C 09 CE 8C 01 0C 95 95 6F 01 0C 1B 0F 5F 01 0C 4A 84 5F 01 0C B3 49 5F 01 0C 82 6B 31 01 0C 4F 15 BC 0D 01 F9 8C BA 01 00 D9 A9 40 01 0C 41 4C 31 01 0C EF B9 B8 0D 01 99 8A 40 01 0C 21 CA 8C 01 0C 01 AD 6F 01 0C 33 0B 5F 01 0C 99 67 31 01 0C 62 80 5F 01 0C CB 45 5F 01 0C 79 08 9C 01 0C F1 A5 40 01 0C E1 87 7D 01 0C BB 9B 5F 01 0C B1 86 40 01 0C 39 C6 8C 01 0C 7A 7C 5F 01 0C B2 63 31 01 0C 29 85 BA 01 0E 91 04 9C 01 0C 09 A2 40 01 0C 71 44 31 01 0C F9 83 7D 01 0C 1D A9 6F 01 0C D3 97 5F 01 0C C9 82 40 01 0C 51 C2 8C 01 0C 61 BD 40 01 0C C9 5F 31 01 0C 51 9F 7D 01 0C 92 78 5F 01 0C 0F 08 B9 0D 01 A9 00 9C 01 0C 89 40 31 01 0C 11 80 7D 01 0C 35 A5 6F 01 0C BB 1E 5F 01 0C 53 59 5F 01 0C E9 03 00 00 01 22 7B 31 01 0C EB 93 5F 01 0C EA 03 00 00 01 E1 7E 40 01 0C 69 BE 8C 01 0C 79 B9 40 01 0C E1 5B 31 01 0C EB 03 00 00 01 69 9B 7D 01 0C AA 74 5F 01 0C EC 03 00 00 01 ED 03 00 00 01 C1 FC 9B 01 0C EE 03 00 00 01".ToByteArray());
            // 0xF0, ResponsePet P(0F 01)
            // RequestFieldEnter
            //session.Send("16 00 00 41 75 19 03 00 01 8A 42 0F 00 00 00 00 00 00 C0 28 C4 00 40 03 44 00 00 16 44 00 00 00 00 00 00 00 00 55 FF 33 42 E8 49 01 00".ToByteArray());
            session.Send(FieldPacket.RequestEnter(session.FieldPlayer));
            // SendUgc: 15 01 00 00 00 00 00 00 00 00 00 00 00 4B 00 00 00
            // SendHomeCommand: 00 E1 0F 26 89 7F 98 3C 26 00 00 00 00 00 00 00 00

            //session.Send("B9 00 00 E1 0F 26 89 7F 98 3C 26 00 00 00 00 00 00 00 00".ToByteArray());
            //session.Send(ServerEnterPacket.Confirm());

            //session.Send(0xF0, 0x00, 0x1F, 0x78, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00);
            //session.Send(0x28, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00);
            //session.Send(ServerEnterPacket.Confirm());
        }
예제 #12
0
        public override void Handle(GameSession session, PacketReader packet)
        {
            long     accountId = packet.ReadLong();
            AuthData authData  = AuthStorage.GetData(accountId);

            // Backwards seeking because we read accountId here
            packet.Skip(-8);
            HandleCommon(session, packet);

            Player player = DatabaseManager.Characters.FindPlayerById(authData.CharacterId);

            if (player == default)
            {
                throw new ArgumentException("Character not found!");
            }

            player.Session                             = session;
            player.Wallet.Meso.Session                 = session;
            player.Wallet.ValorToken.Session           = session;
            player.Wallet.Treva.Session                = session;
            player.Wallet.Rue.Session                  = session;
            player.Wallet.HaviFruit.Session            = session;
            player.Account.Meret.Session               = session;
            player.Account.GameMeret.Session           = session;
            player.Account.EventMeret.Session          = session;
            player.Account.MesoToken.Session           = session;
            player.Account.BankInventory.Mesos.Session = session;
            player.Levels.Player                       = player;
            player.BuddyList                           = GameServer.BuddyManager.GetBuddies(player.CharacterId);
            player.Mailbox                             = GameServer.MailManager.GetMails(player.CharacterId);

            session.InitPlayer(player);

            //session.Send(0x27, 0x01); // Meret market related...?

            session.Send(MushkingRoyaleSystemPacket.LoadStats(accountId));

            if (player.GuildId != 0)
            {
                Guild guild = GameServer.GuildManager.GetGuildById(player.GuildId);
                player.Guild       = guild;
                player.GuildMember = guild.Members.First(x => x.Id == player.CharacterId);
                session.Send(GuildPacket.UpdateGuild(guild));
                session.Send(GuildPacket.MemberJoin(player));
            }
            session.Send(BuddyPacket.Initialize());
            session.Player.GetUnreadMailCount();
            session.Send(BuddyPacket.LoadList(player.BuddyList));
            session.Send(BuddyPacket.EndList(player.BuddyList.Count));

            // Meret market
            //session.Send("6E 00 0B 00 00 00 00 00 00 00 00 00 00 00 00".ToByteArray());
            //session.Send("6E 00 0C 00 00 00 00".ToByteArray());
            // UserConditionEvent
            //session.Send("BF 00 00 00 00 00 00".ToByteArray());
            // PCBangBonus
            //session.Send("A7 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00".ToByteArray());
            TimeSyncPacket.SetInitial1();
            TimeSyncPacket.SetInitial2();
            TimeSyncPacket.Request();
            session.Send(StatPacket.SetStats(session.FieldPlayer));
            // TODO: Grab Hp/Spirit/Stam from last login
            player.Stats.InitializePools(player.Stats[PlayerStatId.Hp].Max, player.Stats[PlayerStatId.Spirit].Max, player.Stats[PlayerStatId.Stamina].Max);
            session.Player.ClientTickSyncLoop();
            session.Send(DynamicChannelPacket.DynamicChannel());
            session.Send(ServerEnterPacket.Enter(session));
            // SendUgc f(0x16), SendCash f(0x09), SendContentShutdown f(0x01, 0x04), SendPvp f(0x0C)
            session.Send(SyncNumberPacket.Send());
            // 0x112, Prestige f(0x00, 0x07)
            session.Send(PrestigePacket.Prestige(player));

            // Load inventory tabs
            foreach (InventoryTab tab in Enum.GetValues(typeof(InventoryTab)))
            {
                InventoryController.LoadInventoryTab(session, tab);
            }

            if (player.Account.HomeId != 0)
            {
                Home home = GameServer.HomeManager.GetHomeById(player.Account.HomeId);
                player.Account.Home = home;
                session.Send(WarehouseInventoryPacket.StartList());
                int counter = 0;
                foreach (KeyValuePair <long, Item> kvp in home.WarehouseInventory)
                {
                    session.Send(WarehouseInventoryPacket.Load(kvp.Value, ++counter));
                }
                session.Send(WarehouseInventoryPacket.EndList());

                session.Send(FurnishingInventoryPacket.StartList());
                foreach (Cube cube in home.FurnishingInventory.Values.Where(x => x.Item != null))
                {
                    session.Send(FurnishingInventoryPacket.Load(cube));
                }
                session.Send(FurnishingInventoryPacket.EndList());
            }

            session.Send(QuestPacket.StartList());
            session.Send(QuestPacket.Packet1F());
            session.Send(QuestPacket.Packet20());

            IEnumerable <List <QuestStatus> > packetCount = SplitList(player.QuestList, 200); // Split the quest list in 200 quests per packet

            foreach (List <QuestStatus> item in packetCount)
            {
                session.Send(QuestPacket.SendQuests(item));
            }
            session.Send(QuestPacket.EndList());

            session.Send(TrophyPacket.WriteTableStart());
            List <Trophy> trophyList = new List <Trophy>(player.TrophyData.Values);
            IEnumerable <List <Trophy> > trophyListPackets = SplitList(trophyList, 60);

            foreach (List <Trophy> trophy in trophyListPackets)
            {
                session.Send(TrophyPacket.WriteTableContent(trophy));
            }

            // SendQuest, SendAchieve, SendManufacturer, SendUserMaid
            session.Send(UserEnvPacket.SetTitles(player));
            session.Send(UserEnvPacket.Send04());
            session.Send(UserEnvPacket.Send05());
            session.Send(UserEnvPacket.UpdateLifeSkills(player.GatheringCount));
            session.Send(UserEnvPacket.Send09());
            session.Send(UserEnvPacket.Send10());
            session.Send(UserEnvPacket.Send12());

            // SendMeretMarket f(0xC9)
            session.Send(FishingPacket.LoadAlbum(player));
            // SendPvp f(0x16,0x17), ResponsePet f(0x07), 0xF6
            // CharacterAbility
            // E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

            // Key bindings and skill slots would normally be loaded from a database
            // If the character is not a new character, this is what we would send
            session.Send(KeyTablePacket.SendFullOptions(player.GameOptions));

            if (player.MapId == (int)Map.UnknownLocation)  // tutorial map
            {
                session.Send(KeyTablePacket.AskKeyboardOrMouse());
            }

            // SendKeyTable f(0x00), SendGuideRecord f(0x03), GameEvent f(0x00)
            // SendBannerList f(0x19), SendRoomDungeon f(0x05, 0x14, 0x17)
            // FieldEntrance
            session.Send("19 00 00 65 00 00 00 29 7C 7D 01 0C 4D A1 6F 01 0C D3 1A 5F 01 0C EF 03 00 00 01 A2 3C 31 01 0C 3F 0C B7 0D 01 6B 55 5F 01 0C 3A 77 31 01 0C B1 98 BA 01 0C 03 90 5F 01 0C F9 7A 40 01 0C 91 B5 40 01 0C F9 57 31 01 0C 2F C7 BB 0D 01 81 97 7D 01 0C C2 70 5F 01 0C 51 96 40 01 0C B9 38 31 01 0C 41 78 7D 01 0C 65 9D 6F 01 0C 83 51 5F 01 0C 52 73 31 01 0C FF E0 B8 0D 01 11 77 40 01 0C A9 B1 40 01 0C 11 54 31 01 0C DA 6C 5F 01 0C 69 92 40 01 0C D1 34 31 01 0C 7D 99 6F 01 0C 03 13 5F 01 0C 69 6F 31 01 0C 32 88 5F 01 0C 9B 4D 5F 01 0C FF 6F B6 0D 01 29 73 40 01 0C C1 AD 40 01 0C 29 50 31 01 0C 81 8E 40 01 0C E9 30 31 01 0C 09 CE 8C 01 0C 95 95 6F 01 0C 1B 0F 5F 01 0C 4A 84 5F 01 0C B3 49 5F 01 0C 82 6B 31 01 0C 4F 15 BC 0D 01 F9 8C BA 01 00 D9 A9 40 01 0C 41 4C 31 01 0C EF B9 B8 0D 01 99 8A 40 01 0C 21 CA 8C 01 0C 01 AD 6F 01 0C 33 0B 5F 01 0C 99 67 31 01 0C 62 80 5F 01 0C CB 45 5F 01 0C 79 08 9C 01 0C F1 A5 40 01 0C E1 87 7D 01 0C BB 9B 5F 01 0C B1 86 40 01 0C 39 C6 8C 01 0C 7A 7C 5F 01 0C B2 63 31 01 0C 29 85 BA 01 0E 91 04 9C 01 0C 09 A2 40 01 0C 71 44 31 01 0C F9 83 7D 01 0C 1D A9 6F 01 0C D3 97 5F 01 0C C9 82 40 01 0C 51 C2 8C 01 0C 61 BD 40 01 0C C9 5F 31 01 0C 51 9F 7D 01 0C 92 78 5F 01 0C 0F 08 B9 0D 01 A9 00 9C 01 0C 89 40 31 01 0C 11 80 7D 01 0C 35 A5 6F 01 0C BB 1E 5F 01 0C 53 59 5F 01 0C E9 03 00 00 01 22 7B 31 01 0C EB 93 5F 01 0C EA 03 00 00 01 E1 7E 40 01 0C 69 BE 8C 01 0C 79 B9 40 01 0C E1 5B 31 01 0C EB 03 00 00 01 69 9B 7D 01 0C AA 74 5F 01 0C EC 03 00 00 01 ED 03 00 00 01 C1 FC 9B 01 0C EE 03 00 00 01".ToByteArray());
            // 0xF0, ResponsePet P(0F 01)
            // RequestFieldEnter
            //session.Send("16 00 00 41 75 19 03 00 01 8A 42 0F 00 00 00 00 00 00 C0 28 C4 00 40 03 44 00 00 16 44 00 00 00 00 00 00 00 00 55 FF 33 42 E8 49 01 00".ToByteArray());
            session.Send(FieldPacket.RequestEnter(player));

            Party party = GameServer.PartyManager.GetPartyByMember(player.CharacterId);

            if (party != null)
            {
                player.Party = party;
                session.Send(PartyPacket.Create(party, false));
            }

            // SendUgc: 15 01 00 00 00 00 00 00 00 00 00 00 00 4B 00 00 00
            // SendHomeCommand: 00 E1 0F 26 89 7F 98 3C 26 00 00 00 00 00 00 00 00

            session.Player.TimeSyncLoop();
            session.Send(TimeSyncPacket.SetSessionServerTick(0));
            //session.Send("B9 00 00 E1 0F 26 89 7F 98 3C 26 00 00 00 00 00 00 00 00".ToByteArray());
            session.Send(ServerEnterPacket.Confirm());

            //session.Send(0xF0, 0x00, 0x1F, 0x78, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00);
            //session.Send(0x28, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00);
            //session.Send(ServerEnterPacket.Confirm());
        }
예제 #13
0
        public override void Handle(GameSession session, PacketReader packet)
        {
            byte function = packet.ReadByte();

            if (function == 0)
            {
                int srcMapId = packet.ReadInt();
                if (srcMapId != session.FieldManager.MapId)
                {
                    return;
                }

                int       portalId  = packet.ReadInt();
                MapPortal srcPortal = MapEntityStorage.GetPortals(srcMapId)
                                      .FirstOrDefault(portal => portal.Id == portalId);
                if (srcPortal == default)
                {
                    Logger.Warning($"Unable to find portal:{portalId} in map:{srcMapId}");
                    return;
                }

                if (!MapEntityStorage.HasSafePortal(srcMapId)) // map is instance only
                {
                    session.Player.MapId          = session.Player.ReturnMapId;
                    session.Player.Rotation       = session.FieldPlayer.Rotation;
                    session.Player.Coord          = session.Player.ReturnCoord;
                    session.Player.ReturnCoord.Z += Block.BLOCK_SIZE;
                    session.Send(FieldPacket.RequestEnter(session.FieldPlayer));
                    return;
                }

                MapPortal dstPortal = MapEntityStorage.GetPortals(srcPortal.Target)
                                      .FirstOrDefault(portal => portal.Target == srcMapId);
                if (dstPortal == default)
                {
                    session.Player.ReturnCoord = session.FieldPlayer.Coord;
                    session.Player.ReturnMapId = session.Player.MapId;
                }

                dstPortal = MapEntityStorage.GetPortals(srcPortal.Target)
                            .FirstOrDefault(portal => portal.Id == srcPortal.TargetPortalId);
                if (dstPortal == default)
                {
                    Logger.Warning($"Unable to find portal id:{srcPortal.TargetPortalId} in map:{srcPortal.Target}");
                    return;
                }

                // TODO: There needs to be a more centralized way to set coordinates...
                session.Player.MapId    = srcPortal.Target;
                session.Player.Rotation = dstPortal.Rotation.ToFloat();
                session.Player.Coord    = dstPortal.Coord.ToFloat();

                if (dstPortal.Name == "Portal_cube") // spawn on the next block if portal is a cube
                {
                    if (dstPortal.Rotation.Z == Direction.SOUTH_EAST)
                    {
                        session.Player.Coord.Y -= Block.BLOCK_SIZE;
                    }
                    else if (dstPortal.Rotation.Z == Direction.NORTH_EAST)
                    {
                        session.Player.Coord.X += Block.BLOCK_SIZE;
                    }
                    else if (dstPortal.Rotation.Z == Direction.NORTH_WEST)
                    {
                        session.Player.Coord.Y += Block.BLOCK_SIZE;
                    }
                    else if (dstPortal.Rotation.Z == Direction.SOUTH_WEST)
                    {
                        session.Player.Coord.X -= Block.BLOCK_SIZE;
                    }
                }

                session.Player.SafeBlock = session.Player.Coord;
                DatabaseManager.UpdateCharacter(session.Player);
                session.Send(FieldPacket.RequestEnter(session.FieldPlayer));
            }
        }
예제 #14
0
        public override void Handle(GameSession session, PacketReader packet)
        {
            byte mode  = packet.ReadByte();
            long price = 0;
            bool paid  = false;
            int  mapId = 0;

            if (mode != 5)
            {
                mapId = packet.ReadInt();
            }

            switch (mode)
            {
            case 1:     // car taxi
                price = packet.ReadShort();
                if (session.Player.Mesos >= price)
                {
                    session.Player.Mesos -= price;
                    session.Send(MesosPacket.UpdateMesos(session));
                    paid = true;
                }
                break;

            case 3:     // rotors using mesos
                price = 60000;
                if (session.Player.Mesos >= price)
                {
                    session.Player.Mesos -= price;
                    session.Send(MesosPacket.UpdateMesos(session));
                    paid = true;
                }
                break;

            case 4:     // rotors using merets
                price = 15;
                if (session.Player.Merets >= price)
                {
                    session.Player.Merets -= price;
                    session.Send(MeretsPacket.UpdateMerets(session));
                    paid = true;
                }
                break;

            case 5:     // is sent after using rotors with meret, idk why..
                return;
            }

            if (paid)
            {
                MapPlayerSpawn spawn = MapEntityStorage.GetRandomPlayerSpawn(mapId);

                if (spawn != null)
                {
                    session.Player.MapId    = mapId;
                    session.Player.Coord    = spawn.Coord.ToFloat();
                    session.Player.Rotation = spawn.Rotation.ToFloat();
                    session.Send(FieldPacket.RequestEnter(session.FieldPlayer));
                }
            }
        }