/// <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);
        }
Esempio n. 2
0
 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);
             }
         }
     }
 }
Esempio n. 3
0
        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);
        }
Esempio n. 5
0
        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);
                }
            }
        }
Esempio n. 9
0
        // 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;
 }