// 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."); } }
public void Warp(MapPlayerSpawn spawn, int mapId) { MapId = mapId; Coord = spawn.Coord.ToFloat(); Rotation = spawn.Rotation.ToFloat(); Session.Send(FieldPacket.RequestEnter(Session.FieldPlayer)); }
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); } }
private static void HandleTeleport(GameSession session, int mapId) { MapPlayerSpawn spawn = MapEntityStorage.GetRandomPlayerSpawn(mapId); if (spawn != null) { session.Player.Warp(spawn, mapId); } }
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); } }
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); }
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)); }
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 }); }
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)); }
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); } }
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)); } } }