private void AddAvatarStreamEntry(AvatarStreamEntry entry) { if (this.AvatarStreamList.Size() > 50) { this.RemoveAvatarStreamEntry(this.AvatarStreamList[0]); } this.AvatarStreamList.Add(entry.GetId()); if (this.CurrentSession != null) { AvatarStreamEntryMessage avatarStreamEntryMessage = new AvatarStreamEntryMessage(); avatarStreamEntryMessage.SetAvatarStreamEntry(entry); this.CurrentSession.SendPiranhaMessage(avatarStreamEntryMessage, 1); if (entry.IsNew()) { ServerMessageManager.SendMessage(new AvatarStreamSeenMessage { AccountId = entry.GetId() }, 11); } } else { GameAvatar.Save(this); } }
public void RemoveAvatarStreamEntry(LogicLong streamId) { int index = this.AvatarStreamList.IndexOf(streamId); if (index != -1) { this.AvatarStreamList.Remove(index); ServerMessageManager.SendMessage(new RemoveAvatarStreamMessage { AccountId = streamId }, ServerManager.GetDocumentSocket(11, this.Id)); if (this.CurrentSession != null) { AvatarStreamEntryRemovedMessage avatarStreamEntryRemovedMessage = new AvatarStreamEntryRemovedMessage(); avatarStreamEntryRemovedMessage.SetStreamEntryId(streamId); this.CurrentSession.SendPiranhaMessage(avatarStreamEntryRemovedMessage, 1); } else { GameAvatar.Save(this); } } }
public static void ExecuteServerCommandsInOfflineMode(GameAvatar document) { if (document.ServerCommands.Size() != 0) { LogicGameMode logicGameMode = new LogicGameMode(); LogicLevel logicLevel = logicGameMode.GetLevel(); logicLevel.SetVisitorAvatar(document.LogicClientAvatar); try { for (int i = 0; i < document.ServerCommands.Size(); i++) { int result = document.ServerCommands[i].Execute(logicLevel); if (result == 0) { document.ServerCommands.Remove(i--); } } GameAvatarManager.Save(document); } catch (Exception exception) { Logging.Error("GameAvatarManager.executeServerCommandsInOfflineMode: server command execution in offline mode failed: " + exception); } } }
public static void Init() { GameAvatarManager.m_documents = new Dictionary <long, GameAvatar>(); int[] higherIDs = ServerGame.GameDatabase.GetCounterHigherIDs(); for (int i = 0; i < higherIDs.Length; i++) { int highId = i; Parallel.For(1, higherIDs[i] + 1, lowId => { LogicLong id = new LogicLong(highId, lowId); if (ServerManager.GetDocumentSocket(ServerCore.Type, id) == ServerCore.Socket) { IOperationResult <string> document = ServerGame.GameDatabase.Get(id).Result; if (document.Success) { lock (GameAvatarManager.m_documents) { GameAvatar gameDocument = CouchbaseDocument.Load <GameAvatar>(document.Value); GameAvatarManager.m_documents.Add(id, gameDocument); GameMatchmakingManager.Enqueue(gameDocument); } } } }); } }
public static bool TryGet(LogicLong id, out GameAvatar document) { if (ServerManager.GetDocumentSocket(ServerCore.Type, id) != ServerCore.Socket) { throw new Exception("GameAvatarManager.get - invalid document id"); } return(GameAvatarManager.m_documents.TryGetValue(id, out document)); }
public static GameAvatar Create(LogicLong id) { if (ServerManager.GetDocumentSocket(ServerCore.Type, id) != ServerCore.Socket) { throw new Exception("GameAvatarManager.create - invalid document id"); } GameAvatar document = new GameAvatar(id); document.LogicClientHome.GetCompressibleHomeJSON().Set(GameResourceManager.CompressedStartingHomeJSON); GameAvatarManager.m_documents.Add(id, document); return(document); }
public static void OnGameMatchmakingResultMessageReceived(GameMatchmakingResultMessage message) { if (GameMatchmakingManager.m_queue.TryGetValue(message.SessionId, out MatchmakingEntry entry)) { GameSession session = entry.Session; if (message.EnemyId != null) { GameAvatar enemy = GameAvatarManager.Get(message.EnemyId); GameMatchmakingManager.Dequeue(session); entry.Session.GameAvatar.AddRecentlyMatchedEnemy(message.EnemyId); session.LoadGameState(new GameMatchedAttackState { Home = enemy.LogicClientHome, HomeOwnerAvatar = enemy.LogicClientAvatar, PlayerAvatar = session.GameAvatar.LogicClientAvatar, MaintenanceTime = enemy.MaintenanceTime, SaveTime = enemy.SaveTime, LiveReplayId = LiveReplayManager.Create(session, null, null) }); } else { AttackHomeFailedMessage attackHomeFailedMessage = new AttackHomeFailedMessage(); switch (ServerStatus.Status) { case ServerStatusType.SHUTDOWN_STARTED: case ServerStatusType.MAINTENANCE: attackHomeFailedMessage.SetReason(AttackHomeFailedMessage.Reason.SHUTDOWN_ATTACK_DISABLED); break; case ServerStatusType.COOLDOWN_AFTER_MAINTENANCE: attackHomeFailedMessage.SetReason(AttackHomeFailedMessage.Reason.COOLDOWN_AFTER_MAINTENANCE); break; default: entry.MatchConfirmation = false; return; } session.SendPiranhaMessage(attackHomeFailedMessage, 1); GameMatchmakingManager.Dequeue(session); } } }
private static GameAvatar FindEnemy(MatchmakingEntry entry, Dictionary <long, GameAvatar> documents) { GameAvatar document = entry.Session.GameAvatar; LogicClientAvatar playerAvatar1 = document.LogicClientAvatar; int totalSecs = TimeUtil.GetTimestamp() - entry.Timestamp; int strength1 = GameMatchmakingManager.CalculateStrength(playerAvatar1); int maxStrengthDiff = 50 + LogicMath.Clamp(totalSecs * 150 / 60, 0, 150); foreach (GameAvatar enemy in documents.Values) { LogicClientAvatar playerAvatar2 = enemy.LogicClientAvatar; #if DEBUG if (ServerCore.Random.Rand(100) <= 95) { continue; } #else if (playerAvatar1.IsInAlliance() && playerAvatar2.IsInAlliance() && playerAvatar1.GetAllianceId().Equals(playerAvatar2.GetAllianceId())) { continue; } int strength2 = GameMatchmakingManager.CalculateStrength(playerAvatar2); if (LogicMath.Abs(strength1 - strength2) >= maxStrengthDiff) { continue; } if (document.HasRecentlyMatchedWithEnemy(enemy.Id)) { continue; } #endif return(enemy); } return(null); }
private static void Update() { while (true) { Dictionary <long, MatchmakingEntry> sessions = new Dictionary <long, MatchmakingEntry>(GameMatchmakingManager.m_queue); Dictionary <long, GameAvatar> offlineUsers = new Dictionary <long, GameAvatar>(GameMatchmakingManager.m_offlinePlayers); foreach (MatchmakingEntry entry in sessions.Values) { if (entry.MatchConfirmation) { continue; } if (ServerStatus.Status == ServerStatusType.SHUTDOWN_STARTED || ServerStatus.Status == ServerStatusType.MAINTENANCE || ServerStatus.Status == ServerStatusType.COOLDOWN_AFTER_MAINTENANCE) { entry.Session.SendMessage(new GameMatchmakingResultMessage(), 9); entry.MatchConfirmation = true; continue; } GameAvatar enemy = GameMatchmakingManager.FindEnemy(entry, offlineUsers); if (enemy != null) { entry.Session.SendMessage(new GameMatchmakingResultMessage { EnemyId = enemy.Id }, 9); entry.MatchConfirmation = true; } } Thread.Sleep(250); } }
public static void Dequeue(GameAvatar document) { GameMatchmakingManager.m_offlinePlayers.Remove(document.Id); }
public static void Enqueue(GameAvatar document) { GameMatchmakingManager.m_offlinePlayers.Add(document.Id, document); }
public static async void Save(GameAvatar document) { await ServerGame.GameDatabase.InsertOrUpdate(document.Id, CouchbaseDocument.Save(document)); }