/// <summary> /// Destructs this instance. /// </summary> public override void Destruct() { base.Destruct(); this._clientHome = null; this._clientAvatar = null; this._npcAvatar = null; }
/// <summary> /// Removes the <see cref="LogicNpcAvatar"/> instance. /// </summary> public LogicNpcAvatar RemoveLogicNpcAvatar() { LogicNpcAvatar tmp = this._npcAvatar; this._npcAvatar = null; return(tmp); }
public void StateChangeConfirmed() { switch (this.m_data.GetMissionType()) { case 1: if (this.m_progress == 0) { this.m_level.GetGameMode().StartDefendState(LogicNpcAvatar.GetNpcAvatar(this.m_data.GetDefendNpcData())); this.m_progress = 1; } break; case 7: case 8: case 9: case 10: case 11: case 20: case 21: this.m_progress = 1; this.Finished(); break; case 16: if (this.m_progress == 0) { // ? } this.m_progress += 1; break; case 19: if (this.m_progress == 1) { LogicClientAvatar playerAvatar = this.m_level.GetPlayerAvatar(); int duelScoreGain = LogicDataTables.GetGlobals().GetVillage2FirstVictoryTrophies(); playerAvatar.AddDuelReward(LogicDataTables.GetGlobals().GetVillage2FirstVictoryGold(), LogicDataTables.GetGlobals().GetVillage2FirstVictoryElixir(), 0, 0, null); playerAvatar.SetDuelScore(playerAvatar.GetDuelScore() + LogicDataTables.GetGlobals().GetVillage2FirstVictoryTrophies()); playerAvatar.GetChangeListener().DuelScoreChanged(playerAvatar.GetAllianceId(), duelScoreGain, -1, false); this.m_progress = 2; this.Finished(); } break; } }
/// <summary> /// Initializes a new instance of the <see cref="LogicNpcAttack"/> class. /// </summary> public LogicNpcAttack(LogicLevel level) { this._placePositionX = -1; this._placePositionY = -1; this._level = level; this._npcAvatar = (LogicNpcAvatar)level.GetVisitorAvatar(); this._buildingClass = LogicDataTables.GetBuildingClassByName("Defense"); if (this._buildingClass == null) { Debugger.Error("LogicNpcAttack - Unable to find Defense building class"); } }
/// <summary> /// Decodes this instance. /// </summary> public override void Decode() { base.Decode(); this._secondsSinceLastSave = this.Stream.ReadInt(); this._currentTimestamp = this.Stream.ReadInt(); this._clientHome = new LogicClientHome(); this._clientHome.Decode(this.Stream); this._clientAvatar = new LogicClientAvatar(); this._clientAvatar.Decode(this.Stream); this._npcAvatar = new LogicNpcAvatar(); this._npcAvatar.Decode(this.Stream); this._npcDuel = this.Stream.ReadBoolean(); }
public static GameMode LoadNpcDuelState(HomeSession session, GameNpcDuelState state) { LogicClientHome home = state.Home; LogicNpcAvatar homeOwnerAvatar = state.NpcAvatar; LogicClientAvatar visitorAvatar = state.PlayerAvatar; int currentTimestamp = TimeUtil.GetTimestamp(); int secondsSinceLastSave = state.SaveTime != -1 ? currentTimestamp - state.SaveTime : 0; NpcDataMessage npcDataMessage = new NpcDataMessage(); npcDataMessage.SetCurrentTimestamp(currentTimestamp); npcDataMessage.SetLogicClientHome(home); npcDataMessage.SetLogicClientAvatar(visitorAvatar); npcDataMessage.SetLogicNpcAvatar(homeOwnerAvatar); npcDataMessage.SetSecondsSinceLastSave(secondsSinceLastSave); npcDataMessage.SetNpcDuel(true); npcDataMessage.Encode(); CompressibleStringHelper.Uncompress(home.GetCompressibleHomeJSON()); CompressibleStringHelper.Uncompress(home.GetCompressibleCalendarJSON()); CompressibleStringHelper.Uncompress(home.GetCompressibleGlobalJSON()); try { GameMode gameMode = new GameMode(session); gameMode.m_avatarChangeListener = new AvatarChangeListener(gameMode, visitorAvatar); visitorAvatar.SetChangeListener(gameMode.m_avatarChangeListener); gameMode.m_logicGameMode.LoadNpcDuelState(home, homeOwnerAvatar, visitorAvatar, currentTimestamp, secondsSinceLastSave); session.SendPiranhaMessage(npcDataMessage, 1); return(gameMode); } catch (Exception exception) { Logging.Error("GameMode.loadNpcDuelState: exception while the loading of attack state: " + exception); } return(null); }
/// <summary> /// Loads the npc attack state. /// </summary> public void LoadNpcAttackState(LogicClientHome home, LogicAvatar homeOwnerAvatar, LogicAvatar visitorAvatar, int currentTimestamp, int secondsSinceLastSave) { if (this._state == 1) { Debugger.Error("loadAttackState called from invalid state"); } else { this._state = 2; this._currentTimestamp = currentTimestamp; this._calendar.Load(home.GetCalendarJSON(), currentTimestamp); if (this._battleTimer != null) { this._battleTimer.Destruct(); this._battleTimer = null; } if (homeOwnerAvatar.IsNpcAvatar()) { LogicNpcAvatar npcAvatar = (LogicNpcAvatar)homeOwnerAvatar; LogicNpcData npcData = npcAvatar.GetNpcData(); homeOwnerAvatar.SetResourceCount(LogicDataTables.GetGoldData(), LogicMath.Max(npcData.Gold - visitorAvatar.GetLootedNpcGold(npcData), 0)); homeOwnerAvatar.SetResourceCount(LogicDataTables.GetElixirData(), LogicMath.Max(npcData.Elixir - visitorAvatar.GetLootedNpcElixir(npcData), 0)); this._level.SetMatchType(2, 0); this._level.SetHome(home, false); this._level.SetHomeOwnerAvatar(homeOwnerAvatar); this._level.SetVisitorAvatar(visitorAvatar); this._level.FastForwardTime(secondsSinceLastSave); this._level.LoadingFinished(); } else { Debugger.Error("loadNpcAttackState called and home owner is not npc avatar"); } } }
/// <summary> /// Called when the change of state is confirmed. /// </summary> public void StateChangeConfirmed() { switch (this._data.GetMissionType()) { case 1: if (this._progress == 0) { this._level.GetGameMode().StartDefendState(LogicNpcAvatar.GetNpcAvatar(this._data.GetDefendNpcData())); this._progress = 1; } break; case 7: case 8: case 9: case 10: case 11: case 20: case 21: this._progress = 1; break; } }
public override void Decode(ByteStream stream) { base.Decode(stream); this.NpcAvatar = new LogicNpcAvatar(); this.NpcAvatar.Decode(stream); }
/// <summary> /// Destructs this instance. /// </summary> public void Destruct() { this._level = null; this._npcAvatar = null; this._buildingClass = null; }
/// <summary> /// Sets the <see cref="LogicNpcAvatar"/> instance. /// </summary> public void SetLogicNpcAvatar(LogicNpcAvatar instance) { this._npcAvatar = instance; }
private static void OnChangeGameStateMessageReceived(ChangeGameStateMessage message) { if (GameSessionManager.TryGet(message.SessionId, out GameSession session)) { GameAvatar document = session.GameAvatar; switch (message.StateType) { case GameStateType.HOME: session.DestructGameState(); session.LoadGameState(new GameHomeState { PlayerAvatar = document.LogicClientAvatar, Home = document.LogicClientHome, SaveTime = document.SaveTime, MaintenanceTime = document.MaintenanceTime, ServerCommands = document.ServerCommands, LayoutId = message.LayoutId, MapId = message.MapId }); break; case GameStateType.NPC_ATTACK: session.DestructGameState(); session.LoadGameState(new GameNpcAttackState { PlayerAvatar = document.LogicClientAvatar, Home = GameResourceManager.NpcHomes[message.NpcData.GetInstanceID()], NpcAvatar = LogicNpcAvatar.GetNpcAvatar(message.NpcData), SaveTime = -1 }); break; case GameStateType.NPC_DUEL: session.DestructGameState(); session.LoadGameState(new GameNpcDuelState { PlayerAvatar = document.LogicClientAvatar, Home = GameResourceManager.NpcHomes[message.NpcData.GetInstanceID()], NpcAvatar = LogicNpcAvatar.GetNpcAvatar(message.NpcData), SaveTime = -1 }); break; case GameStateType.VISIT: ServerRequestManager.Create(new GameAvatarRequestMessage { AccountId = message.HomeId }, ServerManager.GetDocumentSocket(9, message.HomeId), 5).OnComplete = args => { if (!session.IsDestructed()) { if (args.ErrorCode == ServerRequestError.Success && args.ResponseMessage.Success) { GameAvatarResponseMessage gameAvatarResponseMessage = (GameAvatarResponseMessage)args.ResponseMessage; session.DestructGameState(); session.LoadGameState(new GameVisitState { Home = gameAvatarResponseMessage.Document.LogicClientHome, HomeOwnerAvatar = gameAvatarResponseMessage.Document.LogicClientAvatar, SaveTime = gameAvatarResponseMessage.Document.SaveTime, PlayerAvatar = session.GameAvatar.LogicClientAvatar }); } else { session.SendPiranhaMessage(new VisitFailedMessage(), 1); } } }; break; case GameStateType.CHALLENGE_ATTACK: session.DestructGameState(); LogicLong liveReplayId = LiveReplayManager.Create(session, message.ChallengeAllianceId, message.ChallengeStreamId); LogicClientHome logicClientHome = new LogicClientHome(); logicClientHome.SetHomeId(message.ChallengeHomeId); logicClientHome.GetCompressibleHomeJSON().Set(message.ChallengeHomeJSON); session.LoadGameState(new GameChallengeAttackState { Home = logicClientHome, PlayerAvatar = document.LogicClientAvatar, SaveTime = -1, LiveReplayId = liveReplayId, AllianceId = message.ChallengeAllianceId, StreamId = message.ChallengeStreamId, MapId = message.ChallengeMapId }); ServerMessageManager.SendMessage(new AllianceChallengeLiveReplayIdMessage { AccountId = message.ChallengeStreamId, LiveReplayId = liveReplayId }, 11); break; } } }
public void SetBattleOver() { if (this.m_battleOver) { return; } this.m_level.GetBattleLog().SetBattleEnded(LogicDataTables.GetGlobals().GetAttackLengthSecs() - this.GetRemainingAttackSeconds()); this.m_level.GetMissionManager().Tick(); LogicArrayList <LogicComponent> components = this.m_level.GetComponentManager().GetComponents(LogicComponentType.COMBAT); for (int i = 0; i < components.Size(); i++) { ((LogicCombatComponent)components[i]).Boost(0, 0, 0); } bool duelMatch = (this.m_level.GetMatchType() & 0xFFFFFFFE) == 8; if (duelMatch) { LogicAvatar avatar = this.m_level.GetVisitorAvatar(); if (avatar != null && avatar.IsClientAvatar()) { ((LogicClientAvatar)avatar).RemoveUnitsVillage2(); } } if (this.m_state == 3) { this.EndDefendState(); } else { LogicBattleLog battleLog = this.m_level.GetBattleLog(); if (battleLog.GetBattleStarted()) { LogicAvatar visitorAvatar = this.m_level.GetVisitorAvatar(); LogicAvatar homeOwnerAvatar = this.m_level.GetHomeOwnerAvatar(); int stars = battleLog.GetStars(); if (!this.m_level.GetVisitorAvatar().IsClientAvatar() || !this.m_level.GetHomeOwnerAvatar().IsClientAvatar()) { if (visitorAvatar.IsClientAvatar() && homeOwnerAvatar.IsNpcAvatar()) { LogicNpcAvatar npcAvatar = (LogicNpcAvatar)homeOwnerAvatar; LogicNpcData npcData = npcAvatar.GetNpcData(); int npcStars = visitorAvatar.GetNpcStars(npcData); if (stars > npcStars && npcData.IsSinglePlayer()) { visitorAvatar.SetNpcStars(npcData, stars); visitorAvatar.GetChangeListener().CommodityCountChanged(0, npcData, stars); } // TODO: LogicBattleLog::sendNpcAttackEndEvents. } } else { LogicClientAvatar attacker = (LogicClientAvatar)visitorAvatar; LogicClientAvatar defender = (LogicClientAvatar)homeOwnerAvatar; int originalAttackerScore = attacker.GetScore(); int originalDefenderScore = defender.GetScore(); int matchType = this.m_level.GetMatchType(); if (matchType == 1 || !LogicDataTables.GetGlobals().ScoringOnlyFromMatchedMode() && (matchType == 0 || matchType == 2 || matchType == 4 || matchType == 6)) { LogicGamePlayUtil.CalculateCombatScore(attacker, defender, stars, false, matchType == 4, battleLog.GetDestructionPercentage(), this.m_calendar.GetStarBonusMultiplier(), duelMatch); if (!duelMatch && homeOwnerAvatar.GetTownHallLevel() >= LogicDataTables.GetGlobals().GetLootCartEnabledTownHall()) { LogicDataTable resourceTable = LogicDataTables.GetTable(LogicDataType.RESOURCE); if (resourceTable.GetItemCount() > 0) { bool hasStolen = false; for (int i = 0; i < resourceTable.GetItemCount(); i++) { LogicResourceData data = (LogicResourceData)resourceTable.GetItemAt(i); if (!data.IsPremiumCurrency()) { if (battleLog.GetStolenResources(data) > 0) { hasStolen = true; } } } if (hasStolen) { LogicGameObjectManager gameObjectManager = this.m_level.GetGameObjectManagerAt(0); LogicObstacle lootCart = gameObjectManager.GetLootCart(); if (lootCart == null) { gameObjectManager.AddLootCart(); lootCart = gameObjectManager.GetLootCart(); } if (lootCart != null) { LogicLootCartComponent lootCartComponent = lootCart.GetLootCartComponent(); if (lootCartComponent != null) { for (int i = 0; i < resourceTable.GetItemCount(); i++) { LogicResourceData data = (LogicResourceData)resourceTable.GetItemAt(i); if (!data.IsPremiumCurrency() && data.GetWarResourceReferenceData() == null) { int lootPercentage = lootCart.GetObstacleData().GetLootDefensePercentage(); int lootCount = battleLog.GetStolenResources(data) * lootPercentage / 100; lootCartComponent.SetResourceCount(i, LogicMath.Min(LogicMath.Max(lootCount, lootCartComponent.GetResourceCount(i)), lootCartComponent.GetCapacityCount(i))); } } } } } } } this.m_level.UpdateBattleShieldStatus(false); if (stars > 0) { LogicArrayList <LogicDataSlot> castedUnits = battleLog.GetCastedUnits(); LogicArrayList <LogicDataSlot> castedSpells = battleLog.GetCastedSpells(); LogicArrayList <LogicUnitSlot> castedAllianceUnits = battleLog.GetCastedAllianceUnits(); LogicArrayList <LogicDataSlot> placedUnits = new LogicArrayList <LogicDataSlot>(castedUnits.Size()); for (int i = 0; i < castedUnits.Size(); i++) { placedUnits.Add(new LogicDataSlot(castedUnits[i].GetData(), castedUnits[i].GetCount())); } for (int i = 0; i < castedSpells.Size(); i++) { int idx = -1; for (int j = 0; j < placedUnits.Size(); j++) { if (placedUnits[j].GetData() == castedSpells[i].GetData()) { idx = j; break; } } if (idx != -1) { placedUnits[idx].SetCount(placedUnits[idx].GetCount() + castedSpells[i].GetCount()); } else { placedUnits.Add(new LogicDataSlot(castedSpells[i].GetData(), castedSpells[i].GetCount())); } } for (int i = 0; i < castedAllianceUnits.Size(); i++) { placedUnits.Add(new LogicDataSlot(castedAllianceUnits[i].GetData(), castedAllianceUnits[i].GetCount())); } for (int i = 0; i < placedUnits.Size(); i++) { LogicCombatItemData data = (LogicCombatItemData)placedUnits[i].GetData(); LogicCalendarUseTroop calendarUseTroopEvent = this.m_calendar.GetUseTroopEvents(data); if (calendarUseTroopEvent != null) { int count = attacker.GetEventUnitCounterCount(data); if (placedUnits[i].GetCount() >= count >> 16) { int progressCount = (short)count + 1; int eventCounter = progressCount | (int)(count & 0xFFFF0000); attacker.SetCommodityCount(6, data, eventCounter); attacker.GetChangeListener().CommodityCountChanged(6, data, eventCounter); if (calendarUseTroopEvent.GetParameter(0) == progressCount) { int diamonds = calendarUseTroopEvent.GetParameter(2); int xp = calendarUseTroopEvent.GetParameter(3); attacker.XpGainHelper(xp); attacker.SetDiamonds(attacker.GetDiamonds() + diamonds); attacker.SetFreeDiamonds(attacker.GetFreeDiamonds() + diamonds); attacker.GetChangeListener().FreeDiamondsAdded(diamonds, 9); Debugger.HudPrint(string.Format("USE TROOP Event: Awarding XP: {0} GEMS {1}", xp, diamonds)); } } } } for (int i = 0; i < placedUnits.Size(); i++) { placedUnits[i].Destruct(); } placedUnits.Destruct(); } } if (this.m_state != 5 && this.m_level.GetDefenseShieldActivatedHours() == 0 && battleLog.GetDestructionPercentage() > 0) { int defenseVillageGuardCounter = defender.GetDefenseVillageGuardCounter() + 1; defender.SetDefenseVillageGuardCounter(defenseVillageGuardCounter); defender.GetChangeListener().DefenseVillageGuardCounterChanged(defenseVillageGuardCounter); int villageGuardMins = (defenseVillageGuardCounter & 0xFFFFFF) == 3 * ((defenseVillageGuardCounter & 0xFFFFFF) / 3) ? defender.GetLeagueTypeData().GetVillageGuardInMins() : LogicDataTables.GetGlobals().GetDefaultDefenseVillageGuard(); this.m_level.GetHome().GetChangeListener().GuardActivated(60 * villageGuardMins); Debugger.HudPrint(string.Format("Battle end. No Shield, Village Guard for defender: {0}", villageGuardMins)); } battleLog.SetAttackerScore(attacker.GetScore() - originalAttackerScore); battleLog.SetDefenderScore(defender.GetScore() - originalDefenderScore); battleLog.SetOriginalAttackerScore(originalAttackerScore); battleLog.SetOriginalDefenderScore(originalDefenderScore); if (this.m_state != 5) { if (stars != 0) { if (matchType != 3 && matchType != 7 && matchType != 8 && matchType != 9) { if (matchType == 5) { if (stars > this.m_level.GetPreviousAttackStars() && !this.m_level.GetIgnoreAttack()) { this.m_level.GetAchievementManager().IncreaseWarStars(stars); } } else { this.m_level.GetAchievementManager().PvpAttackWon(); } } } else if (matchType > 9 || matchType == 3 || matchType == 5 || matchType == 7 || matchType == 8 || matchType == 9) { this.m_level.GetAchievementManager().PvpDefenseWon(); } } } } } this.m_battleOver = true; }