コード例 #1
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.");
            }
        }
コード例 #2
0
ファイル: Player.cs プロジェクト: HazePhaze/MapleServer2
 public void Warp(MapPlayerSpawn spawn, int mapId)
 {
     MapId    = mapId;
     Coord    = spawn.Coord.ToFloat();
     Rotation = spawn.Rotation.ToFloat();
     Session.Send(FieldPacket.RequestEnter(Session.FieldPlayer));
 }
コード例 #3
0
    public void MoveUser(int mapId, int triggerId, int boxId)
    {
        List <Character> players = Field.State.Players.Values.ToList();

        if (boxId != 0)
        {
            MapTriggerBox box = MapEntityMetadataStorage.GetTriggerBox(Field.MapId, boxId);
            if (box is null)
            {
                return;
            }

            players = players.Where(player => FieldManager.IsPlayerInBox(box, player)).ToList();
        }

        // move player back to return map
        if (mapId == 0 && triggerId == 0)
        {
            foreach (IFieldObject <Player> player in players)
            {
                player.Value.Warp(player.Value.ReturnMapId, player.Value.ReturnCoord);
            }

            return;
        }

        if (mapId == Field.MapId)
        {
            IFieldObject <Portal> portal = Field.State.Portals.Values.First(p => p.Value.Id == triggerId);
            foreach (IFieldObject <Player> player in players)
            {
                player.Value.Move(portal.Coord, portal.Rotation, isTrigger: true);
            }

            return;
        }

        CoordF    moveCoord;
        CoordF    moveRotation;
        MapPortal dstPortal = MapEntityMetadataStorage.GetPortals(mapId).FirstOrDefault(portal => portal.Id == triggerId);

        if (dstPortal == null)
        {
            MapPlayerSpawn spawn = MapEntityMetadataStorage.GetRandomPlayerSpawn(mapId);
            moveCoord    = spawn.Coord.ToFloat();
            moveRotation = spawn.Rotation.ToFloat();
        }
        else
        {
            moveCoord    = dstPortal.Coord.ToFloat();
            moveRotation = dstPortal.Rotation.ToFloat();
        }

        foreach (IFieldObject <Player> player in players)
        {
            player.Value.Warp(mapId, moveCoord, moveRotation, instanceId: 1);
        }
    }
コード例 #4
0
        private static void HandleTeleport(GameSession session, int mapId)
        {
            MapPlayerSpawn spawn = MapEntityStorage.GetRandomPlayerSpawn(mapId);

            if (spawn != null)
            {
                session.Player.Warp(spawn, mapId);
            }
        }
コード例 #5
0
        public static void HandleCallAirTaxi(GameSession session, PacketReader packet, Item item)
        {
            int            fieldID = int.Parse(packet.ReadUnicodeString());
            MapPlayerSpawn spawn   = MapEntityStorage.GetRandomPlayerSpawn(fieldID);

            if (spawn != null)
            {
                InventoryController.Consume(session, item.Uid, 1);
                session.Player.Warp(spawn, fieldID);
            }
        }
コード例 #6
0
    public MushkingRoyaleSession(int mapId)
    {
        MapPlayerSpawn spawn = MapEntityMetadataStorage.GetRandomPlayerSpawn(mapId);

        MapId         = mapId;
        SpawnPosition = spawn.Coord;
        SpawnRotation = spawn.Rotation;
        SessionId     = GameServer.MushkingRoyaleSessionManager.GetSessionId();
        InstanceId    = SessionId;
        GameServer.MushkingRoyaleSessionManager.AddSession(this);
    }
コード例 #7
0
    public static void HandleCreateDungeon(GameSession session, PacketReader packet)
    {
        int    dungeonId  = packet.ReadInt();
        bool   groupEnter = packet.ReadBool();
        Player player     = session.Player;

        if (player.DungeonSessionId != -1)
        {
            session.SendNotice("Leave your current dungeon before opening another.");
            return;
        }

        int            dungeonLobbyId = DungeonStorage.GetDungeonByDungeonId(dungeonId).LobbyFieldId;
        MapPlayerSpawn spawn          = MapEntityStorage.GetRandomPlayerSpawn(dungeonLobbyId);

        DungeonSession dungeonSession = GameServer.DungeonManager.CreateDungeonSession(dungeonId, groupEnter ? DungeonType.Group : DungeonType.Solo);

        //TODO: Send packet that greys out enter alone / enter as party when already in a dungeon session (sendRoomDungeon packet/s).
        //the session belongs to the party leader
        if (groupEnter)
        {
            Party party = player.Party;
            if (party.DungeonSessionId != -1)
            {
                session.SendNotice("Need to reset dungeon before entering another instance");
                return;
            }
            foreach (Player member in party.Members)
            {
                if (member.DungeonSessionId != -1)
                {
                    session.SendNotice($"{member.Name} is still in a Dungeon Instance.");
                    return;
                }
            }
            party.DungeonSessionId = dungeonSession.SessionId;
            party.BroadcastPacketParty(PartyPacket.PartyHelp(dungeonId));
            //TODO: Update Party with dungeon Info via party packets (0d,0e and others are involved).
        }
        else // solo join dungeon
        {
            player.DungeonSessionId = dungeonSession.SessionId;
        }
        session.Player.Warp(dungeonLobbyId, instanceId: dungeonSession.DungeonInstanceId);
        //TODO: things after map is created here: spawn doctor npc.
        //This packet sets the banner in the dungeon that displays the dungeonname and the playersize it was created for.
        //party.BroadcastPacketParty(DungeonWaitPacket.Show(dungeonId, DungeonStorage.GetDungeonByDungeonId(dungeonId).MaxUserCount));
    }
コード例 #8
0
        public static Player Char2(long accountId, long characterId, string name = "Char2")
        {
            Job         job   = Job.Archer;
            PlayerStats stats = new PlayerStats();

            int             mapId     = (int)Map.Queenstown;
            MapPlayerSpawn  spawn     = MapEntityStorage.GetRandomPlayerSpawn(mapId);
            List <SkillTab> skillTabs = new List <SkillTab>
            {
                new SkillTab(job)
            };

            return(new Player
            {
                SkillTabs = skillTabs,
                MapId = mapId,
                AccountId = accountId,
                CharacterId = characterId,
                Name = name,
                Gender = 0,
                Motto = "Motto",
                HomeName = "HomeName",
                Coord = CoordF.From(spawn.Coord.X, spawn.Coord.Y, spawn.Coord.Z),
                Job = job,
                SkinColor = new SkinColor()
                {
                    Primary = Color.Argb(0xFF, 0xEA, 0xBF, 0xAE)
                },
                CreationTime = DateTimeOffset.Now.ToUnixTimeSeconds() + Environment.TickCount,
                Equips = new Dictionary <ItemSlot, Item> {
                    { ItemSlot.ER, Item.EarMale() },
                    { ItemSlot.HR, Item.HairMale() },
                    { ItemSlot.FA, Item.FaceMale() },
                    { ItemSlot.FD, Item.FaceDecorationMale() },
                    { ItemSlot.CL, Item.CloathMale() },
                    { ItemSlot.SH, Item.ShoesMale() },
                },
                Stats = stats
            });
        }
コード例 #9
0
ファイル: Player.cs プロジェクト: lynsone/MapleServer2
        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));
        }
コード例 #10
0
        public void MoveUser(int mapId, int triggerId, int boxId)
        {
            List <IFieldObject <Player> > players = Field.State.Players.Values.ToList();

            if (boxId != 0)
            {
                MapTriggerBox box = MapEntityStorage.GetTriggerBox(Field.MapId, boxId);
                List <IFieldObject <Player> > boxedPlayers = new List <IFieldObject <Player> >();
                foreach (IFieldObject <Player> player in players)
                {
                    if (FieldManager.IsPlayerInBox(box, player))
                    {
                        boxedPlayers.Add(player);
                    }
                }
                players = boxedPlayers;
            }

            // move player back to return map
            if (mapId == 0 && triggerId == 0)
            {
                foreach (IFieldObject <Player> player in players)
                {
                    player.Value.Warp(player.Value.ReturnMapId, player.Value.ReturnCoord);
                }
                return;
            }

            if (mapId == Field.MapId)
            {
                IFieldObject <Portal> portal = Field.State.Portals.Values.First(p => p.Value.Id == triggerId);
                foreach (IFieldObject <Player> player in players)
                {
                    player.Coord    = portal.Coord;
                    player.Rotation = portal.Rotation;
                    player.Value.Session.Send(UserMoveByPortalPacket.Move(player, portal.Coord, portal.Rotation));
                }
                return;
            }

            CoordF    moveCoord;
            CoordF    moveRotation;
            MapPortal dstPortal = MapEntityStorage.GetPortals(mapId).FirstOrDefault(portal => portal.Id == triggerId);

            if (dstPortal == null)
            {
                MapPlayerSpawn spawn = MapEntityStorage.GetRandomPlayerSpawn(mapId);
                moveCoord    = spawn.Coord.ToFloat();
                moveRotation = spawn.Rotation.ToFloat();
            }
            else
            {
                moveCoord    = dstPortal.Coord.ToFloat();
                moveRotation = dstPortal.Rotation.ToFloat();
            }

            foreach (IFieldObject <Player> player in players)
            {
                player.Value.Warp(mapId, moveCoord, moveRotation);
            }
        }
コード例 #11
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));
                }
            }
        }