/// <summary> /// Increases the value of the closest battlefield objective to the kill and determines reward scaling based on proximity to the objective. /// </summary> public float ModifyKill(Player killer, Player killed) { if (killed.WorldPosition == null) { Log.Error("ModifyKill", "Player died with NULL WorldPosition!"); return(1f); } float rewardMod = 1f; if (PairingLocked) { return(rewardMod); } ProximityFlag closestFlag = (ProximityFlag)GetClosestFlag(killed.WorldPosition); if (closestFlag != null) { closestFlag.AccumulatedKills++; // Defense kill. Weight the kill higher depending on the distance from the opposing objective (proactive defending) if (killer.Realm == closestFlag.OwningRealm) { rewardMod += Math.Min(killed.GetDistanceTo(closestFlag), 1000) * 0.001f * 0.5f; } // Attack kill. Weight the kill higher if it was closer to the objective (high penetration) else { rewardMod += (1000 - Math.Min(killed.GetDistanceTo(closestFlag), 1000)) * 0.001f * 0.5f; } } return(rewardMod); }
private void BroadcastFlagUnlock(ProximityFlag flag, Realms?realm = null) { for (int i = 0; i < 2; i++) { foreach (Player plr in Players[i]) { if (!realm.HasValue || plr.Realm == realm.Value) { plr.SendLocalizeString(flag.ObjectiveName + " is open for capture!", ChatLogFilters.CHATLOGFILTERS_C_WHITE, Localized_text.CHAT_TAG_DEFAULT); } } } }
private int GetFlagLevel(ProximityFlag flag) { if (FlagLevel[0].Contains(flag)) { return(0); } else if (FlagLevel[1].Contains(flag)) { return(1); } else if (FlagLevel[2].Contains(flag)) { return(2); } return(-1); }
public IBattlefrontFlag GetClosestFlag(Point3D destPos, bool inPlay = false) { ProximityFlag bestFlag = null; ulong bestDist = 0; foreach (ProximityFlag flag in _Objectives) { ulong curDist = flag.GetDistanceSquare(destPos); if (bestFlag == null || (curDist < bestDist && (!inPlay || flag.FlagState != ObjectiveFlags.ZoneLocked))) { bestFlag = flag; bestDist = flag.GetDistanceSquare(destPos); } } return(bestFlag); }
public DominationScenarioPush(Scenario_Info info, int tier) : base(info, tier) { //flags.Add(new Flag(RKF_1, "The Landing", 360109, 428854, 6433, 1024)); FlagLevel[0] = new List <ProximityFlag>(); FlagLevel[1] = new List <ProximityFlag>(); FlagLevel[2] = new List <ProximityFlag>(); foreach (Scenario_Object scenarioObject in info.ScenObjects) { Log.Info("DominationScenarioPush", "Adding flag " + scenarioObject.ObjectiveName + " realm:" + scenarioObject.Realm); if (scenarioObject.Type == "Flag") { ProximityFlag proximityFlag = new ProximityFlag(scenarioObject.Identifier, scenarioObject.ObjectiveName, scenarioObject.WorldPosX, scenarioObject.WorldPosY, scenarioObject.PosZ, scenarioObject.Heading, scenarioObject.PointGain, scenarioObject.PointOverTimeGain, scenarioObject); Flags.Add(proximityFlag); Region.AddObject(proximityFlag, info.MapId); if (scenarioObject.Realm == 0) { FlagLevel[1].Add(proximityFlag); } else if (scenarioObject.Realm == 1) { FlagLevel[0].Add(proximityFlag); } else if (scenarioObject.Realm == 2) { FlagLevel[2].Add(proximityFlag); } } else { LoadScenarioObject(scenarioObject); } } }
public DominationScenario(Scenario_Info info, int tier) : base(info, tier) { //flags.Add(new Flag(RKF_1, "The Landing", 360109, 428854, 6433, 1024)); foreach (Scenario_Object scenarioObject in info.ScenObjects) { if (scenarioObject.Type == "Flag") { ProximityFlag proximityFlag = new ProximityFlag(scenarioObject.Identifier, scenarioObject.ObjectiveName, scenarioObject.WorldPosX, scenarioObject.WorldPosY, scenarioObject.PosZ, scenarioObject.Heading, scenarioObject.PointGain, scenarioObject.PointOverTimeGain); Flags.Add(proximityFlag); Region.AddObject(proximityFlag, info.MapId); } else { LoadScenarioObject(scenarioObject); } } }
/// <summary> /// Loads battlefront objectives. /// </summary> private void LoadObjectives() { List <Battlefront_Objective> objectives = BattlefrontService.GetBattlefrontObjectives(Region.RegionId); _logger.Warn($"Calling LoadObjectives from RoRBattleFront"); if (objectives == null) { return; // t1 or database lack } float orderDistanceSum = 0f; float destroDistanceSum = 0f; foreach (Battlefront_Objective obj in objectives) { ProximityFlag flag = new ProximityFlag(obj, this, Region, Tier); _Objectives.Add(flag); Region.AddObject(flag, obj.ZoneId); orderDistanceSum += flag.GetWarcampDistance(Realms.REALMS_REALM_ORDER); destroDistanceSum += flag.GetWarcampDistance(Realms.REALMS_REALM_DESTRUCTION); _logger.Debug($"...Obj Entry:{obj.Entry} Name:{obj.Name} ZoneId:{obj.ZoneId} Region:{obj.RegionId}"); _logger.Debug($"...Flag State:{flag.FlagState} State:{flag.State}"); } // Sets the scaler to compute securization rewards #if DEBUG if (Tier != 1) { _logger.Error("Tier != 1, Distance scaler in t2, t3, t4 - should consider keeps"); //throw new NotImplementedException("Distance scaler in t2, t3, t4 - should consider keeps"); } #endif foreach (ProximityFlag flag in _Objectives) { flag.SetWarcampDistanceScaler(orderDistanceSum / objectives.Count, destroDistanceSum / objectives.Count); } }
/// <summary> /// Traces population distribution around objectives to update history. /// <para/>The collected data is used to handle zerg movement detection. /// <para/>Update the list of players around dedicated to update thread. /// </summary> private void UpdatePopulationDistribution() { _syncPlayersList.Clear(); lock (_playersInLakeSet) _syncPlayersList.AddRange(_playersInLakeSet); foreach (Player player in _syncPlayersList) { ProximityFlag flag = (ProximityFlag)GetClosestFlag(player.WorldPosition, true); if (flag != null && flag.State != StateFlags.ZoneLocked) { flag.AddPlayerInQuadrant(player); } } foreach (ProximityFlag obj in _Objectives) { if (obj.State != StateFlags.ZoneLocked) { obj.AdvancePopHistory(_orderCount, _destroCount); } } }
// This is place in code where Campaign starts in a pairing - Hargrim public override void EnableSupplies() { if (!NoSupplies) { return; } CountRealmObjectives(); if (HeldObjectives[1] + HeldObjectives[2] < 4) { Keep orderKeep = _Keeps.First(keep => keep.Realm == Realms.REALMS_REALM_ORDER && keep.Info.ZoneId == Zones[_battlefrontStatus.OpenZoneIndex].ZoneId); if (orderKeep == null) { Log.Error("ProgressingBattlefront", "Unable to find an Order keep?"); return; } Keep destroKeep = _Keeps.First(keep => keep.Realm == Realms.REALMS_REALM_DESTRUCTION && keep.Info.ZoneId == Zones[_battlefrontStatus.OpenZoneIndex].ZoneId); if (destroKeep == null) { Log.Error("ProgressingBattlefront", "Unable to find a Destruction keep?"); return; } if (Constants.DoomsdaySwitch != 2) { while (HeldObjectives[0] < 2) { ProximityFlag flag = GetClosestNeutralFlagTo(orderKeep.WorldPosition); #if DEBUG flag.UnlockObjective(); #else flag.UnlockObjective(); #endif } while (HeldObjectives[1] < 2) { ProximityFlag flag = GetClosestNeutralFlagTo(destroKeep.WorldPosition); #if DEBUG flag.UnlockObjective(); #else flag.UnlockObjective(); #endif } } } _NoSupplies = !_NoSupplies; if (Constants.DoomsdaySwitch != 2) { foreach (var objective in _Objectives) { if (objective.FlagState == ObjectiveFlags.Open || objective.FlagState == ObjectiveFlags.Locked) { objective.UnlockObjective(); objective.StartSupplyRespawnTimer(SupplyEvent.ZoneActiveStatusChanged); } } } else { foreach (var objective in _Objectives) { objective.ActivatePortals(); } } string message = "The forces of Order and Destruction direct their supply lines towards " + Zones[_battlefrontStatus.OpenZoneIndex].Name + "!"; Log.Info("ProgressingBattlefront", message); lock (Player._Players) { foreach (Player player in Player._Players) { if (player.ValidInTier(Tier, true)) { player.SendClientMessage(message, player.Realm == Realms.REALMS_REALM_ORDER ? ChatLogFilters.CHATLOGFILTERS_C_ORDER_RVR_MESSAGE : ChatLogFilters.CHATLOGFILTERS_C_DESTRUCTION_RVR_MESSAGE); player.SendClientMessage(message, ChatLogFilters.CHATLOGFILTERS_RVR); } } } ActiveSupplyLine = 1; if (PairingDrawTime == 0) { PairingDrawTime = TCPManager.GetTimeStamp() + 14400; } //Log.Info("LockTimer: ", "set to: " + PairingDrawTime.ToString() + " on zone " + Zones[_battlefrontStatus.OpenZoneIndex].Name); }
/// <summary>Builds a new portal manager.</summary> /// <param name="objective">Objective bound to this object</param> /// <param name="region">Objective's region (objective.Region is null)</param> internal ObjectivePortalsMgr(ProximityFlag objective, RegionMgr region) { _objective = objective; _region = region; Load(); }
internal QuadrantHistoryTracker(ProximityFlag objective) { _objective = objective; }