public static void ProccessLateJoin(Client client, PacketReader packet) { if (client.GetStage() == null) return; Battle.ResponseLateJoin(client); client.GetStage().GetTraits().Ruleset.GameLateJoinCallback(client); }
public static void ProcessBattleInfo(Client client, PacketReader packetReader) { if (client.GetStage() == null) { Log.Write("NULL Stage?"); return; } client.GetStage().GetTraits().Ruleset.GameInfoCallback(client); }
public static void BattleResponseInfo(Client client, int red, int blue, List<Client> players) { using (var packet = new PacketWriter(Operation.BattleResponseInfo, CryptFlags.Encrypt)) { var traits = client.GetStage().GetTraits(); packet.Write(traits.StageId); packet.Write(1, 6); packet.Write((byte)red); packet.Write((byte)blue); packet.Write(0); //TODO: Add rulesets here. if (!traits.Ruleset.IsBerserker() || !traits.Ruleset.IsAssassination() || ((Berserker)traits.Ruleset).CurrentBerserker == null) { packet.Write(0, 0); } else if (traits.Ruleset.IsBerserker()) { var berserker = traits.Ruleset as Berserker; if (berserker != null && berserker.CurrentBerserker != null) { packet.Write(1, 9); packet.Write((byte)8); packet.Write(berserker.CurrentBerserker.GetMuid()); } } else if (traits.Ruleset.IsAssassination()) { var rule = traits.Ruleset as Assassination; if (rule.RedVip != null && rule.BlueVip != null) { packet.Write(1, 17); packet.Write((byte) ObjectStageGameType.Assassination); packet.Write(rule.RedVip.GetMuid()); packet.Write(rule.BlueVip.GetMuid()); } else { packet.Write(0,0); } } packet.Write(players.Count, 17); foreach (var c in players) { packet.Write(c.GetMuid()); packet.Write(c.ClientPlayer.PlayerStats.Spawned); packet.Write(c.ClientPlayer.PlayerStats.Kills); packet.Write(c.ClientPlayer.PlayerStats.Deaths); } client.Send(packet); } }
public static void ProcessPeerRelay(Client client, PacketReader packetReader) { if (client.GetStage() == null) return; var charId = packetReader.ReadMuid(); var peerId = packetReader.ReadMuid(); //Now attempt to bind them! if (Globals.NatAgent != null) { AgentPackets.RelayPeer(Globals.NatAgent, new Tuple<Muid, Muid, Muid>(charId, peerId, client.GetStage().GetTraits().StageId)); Log.Write("Binding player to NAT"); } else { AgentPackets.AgentError(client, 10001); } }
public static void ProcessGameKill(Client client, PacketReader packet) { if (client.GetStage() == null) { Log.Write("Client doesn't have a stage...?"); return; } var uidKiller = packet.ReadMuid(); Client killer; lock (client.GetStage().ObjectLock) { killer = client.GetStage().GetTraits().Players.Find(c => c.GetMuid() == uidKiller); } if (killer != null) client.GetStage().GetTraits().Ruleset.GameKillCallback(killer, client); else { Log.Write("Invalid killer"); } }
public static void ResponseStageChat(Client client, PacketReader packetReader) { var uidChar = packetReader.ReadUInt64(); var uidStage = packetReader.ReadUInt64(); var message = packetReader.ReadString(); if (client.GetStage() != null) client.GetStage().Chat(client, message); }
public static void ResponseSpawnWorldItem(Client client, PacketReader packet) { var charId = packet.ReadMuid(); var itemId = packet.ReadInt32(); var X = packet.ReadSingle(); var Y = packet.ReadSingle(); var Z = packet.ReadSingle(); var spawn = new ItemSpawn(); spawn.Position.X = X; spawn.Position.Y = Y; spawn.Position.Z = Z; spawn.ItemId = (ushort)itemId; spawn.Taken = false; spawn.ItemUid = client.GetStage().GetTraits().WorldItemUid; spawn.NextSpawn = DateTime.Now.AddMilliseconds(WorldItemManager.GetTime(itemId)); Interlocked.Increment(ref client.GetStage().GetTraits().WorldItemUid); lock (client.GetStage().GetTraits().WorldItems) client.GetStage().GetTraits().WorldItems.Add(spawn); lock (client.GetStage().ObjectLock) Battle.SpawnWorldItem(client.GetStage().GetTraits().Players, spawn); }
public static void ProcessStageSettings(Client client, PacketReader packet) { if (client.GetStage() != null) client.GetStage().Settings(client, true); }
public static void ProcessStageStart(Client client, PacketReader packetReader) { if (client.GetStage() == null || client.GetStage().GetTraits().Master != client) return; client.GetStage().Start(client); }
public static void ResponseStageJoin(Client client, Results result) { using (var packet = new PacketWriter(Operation.StageJoin, CryptFlags.Encrypt)) { packet.Write(client.GetMuid()); packet.Write(client.GetStage().GetTraits().StageId); packet.Write(client.GetStage().GetTraits().StageIndex); packet.Write(client.GetStage().GetTraits().Name); client.Send(packet); } }
public static void ProcessEnterBattle(Client client, PacketReader packetReader) { if (client.GetStage() == null) return; client.GetStage().GetTraits().Ruleset.GameEnterCallback(client); }
public static void ProcessGameSpawn(Client client, PacketReader packetReader) { var uid = packetReader.ReadUInt64(); var xpos = packetReader.ReadSingle(); var ypos = packetReader.ReadSingle(); var zpos = packetReader.ReadSingle(); var xdir = packetReader.ReadSingle(); var ydir = packetReader.ReadSingle(); var zdir = packetReader.ReadSingle(); if (client.GetStage() != null) { var traits = client.GetStage().GetTraits(); if (traits.Ruleset.IsDuel()) { if (traits.DuelQueue.Challenger != client && traits.DuelQueue.Champion != client) return; } if (traits.Ruleset.IsTeam()) return; var position = new Position(); var direction = new Direction(); position.X = xpos; position.Y = ypos; position.Z = zpos; direction.X = xdir; direction.Y = ydir; direction.Z = zdir; lock (client.GetStage().ObjectLock) { Battle.GameSpawn(client.GetStage().GetTraits().Players, client.GetMuid(), position, direction); } } }
public static void ProcessLeaveBattle(Client client, PacketReader packet) { if (client.GetStage() != null) { client.ClientPlayer.PlayerLocation = Place.Stage; client.GetStage().GetTraits().Ruleset.GameLeaveBattle(client); } }
public static void ProcessStageCreate(Client client, PacketReader packetReader) { var uid = packetReader.ReadMuid(); var name = packetReader.ReadString(); var locked = packetReader.ReadBoolean(); var password = packetReader.ReadString(); if (uid != client.GetMuid()) { client.Disconnect(); return; } var traits = new StageTraits(); traits.StageId = Globals.StageCounter.GetNext(); traits.Name = name; traits.Locked = locked; traits.Password = password; traits.Master = client; client.ClientPlayer.PlayerStage = client.GetChannel().Add(traits); client.GetStage().Join(client); }
public static void ResponseStageState(Client client, PacketReader packetReader) { var charId = packetReader.ReadMuid(); var stageId = packetReader.ReadMuid(); var state = packetReader.ReadInt32(); if (!Enum.IsDefined(typeof(ObjectStageState), state) || client.GetStage() == null) { client.Disconnect(); return; } client.ClientPlayer.PlayerState = (ObjectStageState)state; client.GetStage().PlayerState(client); }
public static void ProcessRequestUseTrap2(Client pClient, PacketReader pPacket) { var id = pPacket.ReadInt16(); var x = pPacket.ReadInt16(); var y = pPacket.ReadInt16(); var z = pPacket.ReadInt16(); Log.Write("Trap2? {0} X: {1} Y: {2} Z:{3}", id, x, y, z); using (var p = new PacketWriter(Operation.MatchRequestUseTrap2, CryptFlags.Encrypt)) { p.Write(id); p.Write(x); p.Write(y); p.Write(z); pClient.GetStage().GetTraits().Players.ForEach(c => c.Send(p)); } }
public static void ProcessRelayMap(Client pClient, PacketReader pPacket) { var uid = pPacket.ReadMuid(); var type = pPacket.ReadInt32(); var count = pPacket.ReadInt32(); var totalSize = pPacket.ReadInt32(); var elementSize = pPacket.ReadInt32(); var elementCount = pPacket.ReadInt32(); if (elementCount < 0) return; var stage = pClient.GetStage().GetTraits(); stage.RelayMaps = new RelayMapInfo(); stage.RelayMaps.RepeatCount = count; stage.RelayMaps.RelayType = type; stage.RelayMaps.Maps = new List<RelayMaps>(); for (var i = 0; i < elementCount; ++i) { var map = pPacket.ReadInt32(); Log.Write("Found map: {0}", (RelayMaps)map); stage.RelayMaps.Maps.Add((RelayMaps)map); } stage.Map = (stage.RelayMaps.Maps[0]).ToString(); stage.CurrentMap = Globals.Maps.GetMap(stage.RelayMaps.Maps[0].ToString()); }
public static void ProcessLoading(Client client, PacketReader packetReader) { if (client.GetStage() == null) return; client.ClientFlags = PacketFlags.Battle; client.GetStage().GetTraits().Ruleset.GameLoadedCallback(client); }
public static void ProcessPeerList(Client client, PacketReader packet) { if (client.GetStage() != null) { lock (client.GetStage().ObjectLock) Battle.ResponsePeerList(client, client.GetStage().GetTraits().Players); } }
public static void ProcessObtainWorldItem(Client client, PacketReader packet) { var uidChar = packet.ReadMuid(); var nItem = packet.ReadInt32(); lock (client.GetStage().GetTraits().CurrentMap) { var i = client.GetStage().GetTraits().CurrentMap.DeathMatchItems.Find( ii => ii.ItemUid == nItem); if (i != null) { i.Taken = true; i.NextSpawn = DateTime.Now.AddSeconds(i.SpawnTime); Log.Write("Spawning item: {0}. Next Spawn: {1}", i.ItemId, DateTime.Now.AddSeconds(i.SpawnTime / 1000)); } else { lock (client.GetStage().GetTraits().WorldItems) { i = client.GetStage().GetTraits().WorldItems.Find(ii => ii.ItemUid == nItem); if (i != null) { client.GetStage().GetTraits().WorldItems.Remove(i); } else { return; } } } lock (client.GetStage().ObjectLock) Battle.ObtainWorldItem(client.GetStage().GetTraits().Players, client.GetMuid(), nItem); } }
public static void ResponseStageTeam(Client client, PacketReader packetReader) { var charId = packetReader.ReadMuid(); var stageId = packetReader.ReadMuid(); var team = packetReader.ReadInt32(); if (!Enum.IsDefined(typeof(Team), team) || client.GetStage() == null) { client.Disconnect(); return; } client.ClientPlayer.PlayerTeam = (Team) team; client.GetStage().Team(client); }
public static void ProcessStageLeave(Client client, PacketReader packet) { client.ClientPlayer.PlayerLocation = Place.Lobby; if (client.GetStage() != null) client.GetStage().Leave(client); }
public static void GameEnterBattle(List<Client> clients, Client client) { var stage = client.GetStage().GetTraits(); using (var packet = new PacketWriter(Operation.StageEnterBattle, CryptFlags.Encrypt)) { if (stage.State == StageState.Standby) packet.Write((byte)0); else packet.Write((byte)1); //really hate constants :(. packet.Write(1, 394); packet.Write(client.GetMuid()); if (client.PeerEnd == null) { packet.Write(new byte[4], 0, 4); packet.Write(0); } else { packet.Write(client.PeerEnd.Address.GetAddressBytes(), 0, 4); packet.Write(client.PeerEnd.Port); } packet.Write(client.GetCharacter().Name, 32); packet.Write(client.GetCharacter().ClanName, 16); packet.Write((Int32)client.GetCharacter().ClanGrade);//clan rank packet.Write(client.GetCharacter().ClanPoint);//clan points packet.Write((byte)0);//? packet.Write(client.GetCharacter().Level); packet.Write(client.GetCharacter().Sex); packet.Write(client.GetCharacter().Hair); packet.Write(client.GetCharacter().Face); packet.Write(client.GetCharacter().Xp); packet.Write(client.GetCharacter().Bp); packet.Write(client.GetCharacter().BonusRate); packet.Write(client.GetCharacter().Prize); packet.Write(client.GetCharacter().Hp); packet.Write(client.GetCharacter().Ap); packet.Write(client.GetCharacter().MaxWeight); packet.Write(client.GetCharacter().SafeFalls); packet.Write(client.GetCharacter().Fr); packet.Write(client.GetCharacter().Cr); packet.Write(client.GetCharacter().Er); packet.Write(client.GetCharacter().Wr); foreach (Item nItem in client.GetCharacter().EquippedItems) packet.Write(nItem.ItemId); packet.Write((Int32)client.ClientPlayer.PlayerAccount.Access); packet.Write(client.GetCharacter().ClanId); packet.Write(client.GetCharacter().DuelRank); // duel tourney byte[] obfuscation = new byte[] { 0x00, 0x00, 0x00, 0x00, //head 0x79, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //chest 0x7B, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //hands 0x6E, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //legs 0x6D, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //feet 0x6C, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //fingerL 0x49, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //fingerR 0x48, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //melee 0x4B, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //primary 0x72, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //secondary 0x4C, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //custom1 0x7F, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //custom2 0x4A, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //avatar 0x80, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //community1 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //community2 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //long buff1 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //long buff2 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, //head quantity 0x01, 0x00, 0x00, 0x00, //chest quantity 0x01, 0x00, 0x00, 0x00, //hands quantity 0x01, 0x00, 0x00, 0x00, //legs quantity 0x01, 0x00, 0x00, 0x00, //feet quantity 0x01, 0x00, 0x00, 0x00, //fingerL quantity 0x01, 0x00, 0x00, 0x00, //fingerR quantity 0x01, 0x00, 0x00, 0x00, //melee quantity 0x01, 0x00, 0x00, 0x00, //primary quantity 0x01, 0x00, 0x00, 0x00, //secondary quantity 0x4C, 0x00, 0x00, 0x00, //custom1 quantity 0x01, 0x00, 0x00, 0x00, //custom2 quantity 0x01, 0x00, 0x00, 0x00, //vatar quantity 0x00, 0x00, 0x00, 0x00, //community1 quantity 0x00, 0x00, 0x00, 0x00, //community2 quantity 0x00, 0x00, 0x00, 0x00, //longbuff1 quantity 0x00, 0x00, 0x00, 0x00 //longbuff2 quantity }; packet.Write(obfuscation); packet.Write((byte)client.ClientPlayer.PlayerTeam); packet.Write((byte)0); packet.Write((Int16)0); clients.ForEach(c => c.Send(packet)); } }
public static void ProcessStageMap(Client client, PacketReader packetReader) { var uid = packetReader.ReadMuid(); var map = packetReader.ReadString(); if (map.Length > 127 || client.GetStage() == null || client.GetStage().GetTraits().Master != client) { client.Disconnect(); return; } if (map != "RelayMap") { client.GetStage().GetTraits().RelayEnabled = false; client.GetStage().GetTraits().Map = map; try { client.GetStage().GetTraits().CurrentMap = Globals.Maps.GetMap(map); } catch { Log.Write("Unable to load map: {0}. Defaulting to Mansion", map); client.GetStage().GetTraits().CurrentMap = Globals.Maps.GetMap("Mansion"); } } else { client.GetStage().GetTraits().RelayEnabled = true; } client.GetStage().Settings(client, true); Channel.Refresh(client); }
public static void ResponsePeerList(Client client, List<Client> clients) { using (var packet = new PacketWriter(Operation.StageResponsePeerList, CryptFlags.Encrypt)) { packet.Write(client.GetStage().GetTraits().StageId); packet.Write(clients.Count, 394); foreach (var c in clients) { packet.Write(c.GetMuid()); if (c.PeerEnd == null) { packet.Write(new byte[4], 0, 4); packet.Write(0); } else { packet.Write(c.PeerEnd.Address.GetAddressBytes(), 0, 4); packet.Write(c.PeerEnd.Port); } packet.Write(c.GetCharacter().Name, 32); packet.Write(c.GetCharacter().ClanName, 16); packet.Write((Int32)c.GetCharacter().ClanGrade);//clan rank packet.Write(c.GetCharacter().ClanPoint);//clan points packet.Write((byte)0);//? packet.Write(c.GetCharacter().Level); packet.Write(c.GetCharacter().Sex); packet.Write(c.GetCharacter().Hair); packet.Write(c.GetCharacter().Face); packet.Write(c.GetCharacter().Xp); packet.Write(c.GetCharacter().Bp); packet.Write(c.GetCharacter().BonusRate); packet.Write(c.GetCharacter().Prize); packet.Write(c.GetCharacter().Hp); packet.Write(c.GetCharacter().Ap); packet.Write(c.GetCharacter().MaxWeight); packet.Write(c.GetCharacter().SafeFalls); packet.Write(c.GetCharacter().Fr); packet.Write(c.GetCharacter().Cr); packet.Write(c.GetCharacter().Er); packet.Write(c.GetCharacter().Wr); foreach (var nItem in c.GetCharacter().EquippedItems) packet.Write(nItem.ItemId); packet.Write((Int32)c.ClientPlayer.PlayerAccount.Access); packet.Write(c.GetCharacter().ClanId); packet.Write(c.GetCharacter().DuelRank); // duel tourney byte[] obfuscation = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x79, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; packet.Write(obfuscation); packet.Write((byte)c.ClientPlayer.PlayerTeam); packet.Write((byte)0); packet.Write((Int16)0); } client.Send(packet); } }
public static void ProcessStageSetting(Client client, PacketReader packetReader) { if (client.GetStage() == null) return; var stage = client.GetStage().GetTraits(); var uidChar = packetReader.ReadMuid(); var uidStage = packetReader.ReadMuid(); var total = packetReader.ReadInt32(); var size = packetReader.ReadInt32(); var count = packetReader.ReadInt32(); var uidStage2 = packetReader.ReadMuid(); var map = packetReader.ReadString(32); var index = packetReader.ReadInt32(); var type = packetReader.ReadInt32(); var rounds = packetReader.ReadInt32(); var time = packetReader.ReadInt32(); var level = packetReader.ReadInt32(); var players = packetReader.ReadInt32(); var teamkill = packetReader.ReadBoolean(); var balance = packetReader.ReadBoolean(); var join = packetReader.ReadBoolean(); var win = packetReader.ReadBoolean(); if ((ObjectStageGameType)type != stage.Gametype) { if (!Enum.IsDefined(typeof(ObjectStageGameType), (byte)type)) { client.Disconnect(); return; } stage.Gametype = (ObjectStageGameType)type; } switch ((ObjectStageGameType)type) { case ObjectStageGameType.DeathMatch: stage.Ruleset = new Deathmatch(client.GetStage()); break; case ObjectStageGameType.Berserker: stage.Ruleset = new Berserker(client.GetStage()); break; case ObjectStageGameType.Duel: stage.Ruleset = new Duel(client.GetStage()); break; case ObjectStageGameType.Gladiator: stage.Ruleset = new Deathmatch(client.GetStage()); break; case ObjectStageGameType.Training: stage.Ruleset = new Deathmatch(client.GetStage()); break; case ObjectStageGameType.TeamDeathMatch: stage.Ruleset = new TeamDeathmatch(client.GetStage()); break; case ObjectStageGameType.TeamGladiator: stage.Ruleset = new TeamDeathmatch(client.GetStage()); break; case ObjectStageGameType.Assassination: stage.Ruleset = new Assassination(client.GetStage()); break; case ObjectStageGameType.TeamDeathMatchExtreme: stage.Ruleset = new TeamDeathmatchExtreme(client.GetStage()); break; default: Log.Write("Unknown ruleset: {0}", type); stage.Ruleset = new Deathmatch(client.GetStage()); break; } stage.RoundCount = rounds; stage.Time = time > Byte.MaxValue ? (byte)0 : Convert.ToByte(time); stage.Level = Convert.ToByte(level); stage.MaxPlayers = Convert.ToByte(players); stage.ForcedEntry = join; stage.TeamBalanced = balance; stage.TeamKill = teamkill; if ((ObjectStageGameType)type == ObjectStageGameType.Duel && type != stage.Type) { stage.CurrentMap = Globals.Maps.GetMap("Hall"); stage.Map = "Hall"; } else { stage.Type = type; } client.GetStage().Settings(client, true); Channel.Refresh(client); }