public static void UpdateClansWithInfo(ClansOutput result) { CharacterIds.Clear(); CharacterClans.Clear(); ClanLeaders.Clear(); ClanNames.Clear(); Players.ForEach(player => player.ClanId = 0); foreach (var row in result.Clans) { CharacterIds.Add(row.CharacterName, row.CharacterId); CharacterClans.Add(row.CharacterId, row.ClanId); if (row.IsLeader) { ClanLeaders.Add(row.CharacterId); } if (!ClanNames.ContainsKey(row.ClanId)) { ClanNames.Add(row.ClanId, row.ClanName); } Player foundPlayer = Players.FirstOrDefault(x => x.Name == row.CharacterName); if (foundPlayer != null) { foundPlayer.Id = row.CharacterId; foundPlayer.ClanId = row.ClanId; foundPlayer.IsClanLeader = row.IsLeader; } } byte[] message = MergeByteArrays(ToBytes(Command.ClanUpdate)); // inform game servers that they need to update clans from db by themselves foreach (Socket gameServer in GameServers) { gameServer.SendOrFail(message); } }
public static void PlayerLogin(Socket conn, string characterName) { var newPlayer = new Player(conn, characterName); // if it's a character that's in some clan, get his id if (CharacterIds.ContainsKey(newPlayer.Name)) { newPlayer.Id = CharacterIds[newPlayer.Name]; // if a clan for this character id is found, assign clan to character if (CharacterClans.ContainsKey(newPlayer.Id)) { newPlayer.ClanId = CharacterClans[newPlayer.Id]; } // set him as clan leader if he's in the list of clan leaders if (ClanLeaders.Contains(newPlayer.Id)) { newPlayer.IsClanLeader = true; } } // if it's a reconnecting character, remove him from list of online characters Players.RemoveAll(x => x.Name == newPlayer.Name); // add him to list of online characters Players.Add(newPlayer); // update this player in groups if he was in one before reconnecting Groups.ForEach(group => group.UpdateReconnectedPlayer(newPlayer)); if (PendingKicks.ContainsKey(newPlayer.Name)) //cancel automatic kick { PendingKicks[newPlayer.Name].Stop(); PendingKicks.Remove(newPlayer.Name); } }