示例#1
0
        public static float GetThreatLevel(ImprovedSpawnGroup spawnGroup, Vector3D startCoords)
        {
            float totalThreatLevel = 0;

            GetGridThreatLevels();

            foreach (var cubeGrid in GridThreatLevels.Keys.ToList())
            {
                if (cubeGrid == null || MyAPIGateway.Entities.Exist(cubeGrid) == false)
                {
                    GridThreatLevels.Remove(cubeGrid);
                    continue;
                }

                if (Vector3D.Distance(startCoords, cubeGrid.GetPosition()) > spawnGroup.ThreatLevelCheckRange)
                {
                    continue;
                }

                bool validOwner = false;

                if (cubeGrid.BigOwners.Count > 0)
                {
                    foreach (var owner in cubeGrid.BigOwners)
                    {
                        if (owner == 0)
                        {
                            Logger.AddMsg("NoOwner", true);
                            continue;
                        }

                        if (NPCWatcher.NPCFactionTagToFounder.ContainsKey(spawnGroup.FactionOwner) == true)
                        {
                            if (NPCWatcher.NPCFactionTagToFounder[spawnGroup.FactionOwner] == owner)
                            {
                                break;
                            }
                        }

                        if (spawnGroup.ThreatIncludeOtherNpcOwners == false && NPCWatcher.NPCFactionFounders.Contains(owner) == true)
                        {
                            continue;
                        }

                        validOwner = true;
                    }
                }

                if (validOwner == false)
                {
                    continue;
                }

                totalThreatLevel += GridThreatLevels[cubeGrid];
            }

            return(totalThreatLevel - Settings.General.ThreatReductionHandicap);
        }
        public static void GetReversedForwardDirections(ImprovedSpawnGroup spawnGroup, int index, ref Vector3D forward)
        {
            if (index >= spawnGroup.ReverseForwardDirections.Count)
            {
                Logger.AddMsg("Installation Prefab Index Higher Than Rotation List Count", true);
                return;
            }

            if (spawnGroup.ReverseForwardDirections[index] == true)
            {
                forward *= -1;
            }
        }
        public static void GetDerelictDirections(ImprovedSpawnGroup spawnGroup, int index, Vector3D coords, ref Vector3D forward, ref Vector3D up)
        {
            if (index >= spawnGroup.RotateInstallations.Count)
            {
                Logger.AddMsg("Installation Prefab Index Higher Than Rotation List Count", true);
                return;
            }

            var rotationData = spawnGroup.RotateInstallations[index];

            //Do Not Rotate
            if (rotationData == Vector3D.Zero)
            {
                Logger.AddMsg("Installation Rotation Data is Zero", true);
                return;
            }

            //Produce Random Rotation
            if (rotationData == new Vector3D(100, 100, 100))
            {
                Logger.AddMsg("Installation Rotation Randomized", true);
                double x = SpawnResources.rnd.Next(-100, 110);
                double y = SpawnResources.rnd.Next(-100, 110);
                double z = SpawnResources.rnd.Next(-100, 110);
                var    rotationVector = new Vector3D(x / 10.0, y / 10.0, z / 10.0);
                var    tempMatrix     = MatrixD.CreateWorld(Vector3D.Zero, forward, up);
                var    rotationMatrix = CalculateDerelictSpawnMatrix(tempMatrix, rotationVector);
                forward = rotationMatrix.Forward;
                up      = rotationMatrix.Up;
                return;
            }
            else
            {
                Logger.AddMsg("Installation Rotation Set To Preset", true);
                var tempMatrix     = MatrixD.CreateWorld(Vector3D.Zero, forward, up);
                var rotationMatrix = CalculateDerelictSpawnMatrix(tempMatrix, rotationData);
                forward = rotationMatrix.Forward;
                up      = rotationMatrix.Up;
            }
        }
示例#4
0
        public static float GetPCULevel(ImprovedSpawnGroup spawnGroup, Vector3D startCoords)
        {
            int totalPCULevel = 0;

            GetGridThreatLevels();

            foreach (var cubeGrid in GridPCULevels.Keys.ToList())
            {
                if (cubeGrid == null || MyAPIGateway.Entities.Exist(cubeGrid) == false)
                {
                    GridThreatLevels.Remove(cubeGrid);
                    continue;
                }

                if (Vector3D.Distance(startCoords, cubeGrid.GetPosition()) > spawnGroup.PCUCheckRadius)
                {
                    continue;
                }

                totalPCULevel += GridPCULevels[cubeGrid];
            }

            return(totalPCULevel);
        }
        public static bool CalculateAtmoTravelPath(ImprovedSpawnGroup spawnGroup, Vector3D startCoords, MyPlanet planet, out Vector3D startPathCoords, out Vector3D endPathCoords, out MatrixD startMatrix)
        {
            startPathCoords = Vector3D.Zero;
            endPathCoords   = Vector3D.Zero;
            startMatrix     = MatrixD.CreateWorld(Vector3D.Zero, Vector3D.Forward, Vector3D.Up);
            SpawnResources.RefreshEntityLists();

            if (planet == null)
            {
                return(false);
            }

            var planetEntity = planet as IMyEntity;

            for (int i = 0; i < Settings.PlanetaryCargoShips.MaxSpawnAttempts; i++)
            {
                //Get Starting Point
                var randDirFromPlayer = SpawnResources.GetRandomCompassDirection(startCoords, planet);
                var pathDist          = SpawnResources.GetRandomPathDist(Settings.PlanetaryCargoShips.MinPathDistanceFromPlayer, Settings.PlanetaryCargoShips.MaxPathDistanceFromPlayer);
                var midPointSurface   = SpawnResources.GetNearestSurfacePoint(randDirFromPlayer * pathDist + startCoords, planet);
                var upDir             = Vector3D.Normalize(midPointSurface - planetEntity.GetPosition());
                var altitudeFromMid   = SpawnResources.GetRandomPathDist(Settings.PlanetaryCargoShips.MinSpawningAltitude, Settings.PlanetaryCargoShips.MaxSpawningAltitude);
                var tempStartPath     = upDir * altitudeFromMid + midPointSurface;

                if (spawnGroup.PlanetRequiresAtmo == true && planet.GetAirDensity(tempStartPath) < Settings.PlanetaryCargoShips.MinAirDensity)
                {
                    tempStartPath = upDir * Settings.PlanetaryCargoShips.MinSpawningAltitude + midPointSurface;

                    if (spawnGroup.PlanetRequiresAtmo == true && planet.GetAirDensity(tempStartPath) < Settings.PlanetaryCargoShips.MinAirDensity)
                    {
                        continue;
                    }
                }

                if (SpawnResources.IsPositionNearEntities(tempStartPath, Settings.PlanetaryCargoShips.MinSpawnFromGrids) == true)
                {
                    continue;
                }

                var startCoordsDistFromCenter = Vector3D.Distance(planetEntity.GetPosition(), tempStartPath);

                //Get Ending Point
                var randPathDir  = SpawnResources.GetRandomCompassDirection(tempStartPath, planet);
                var randPathDist = SpawnResources.GetRandomPathDist(Settings.PlanetaryCargoShips.MinPathDistance, Settings.PlanetaryCargoShips.MaxPathDistance);
                var endPathA     = randPathDir * randPathDist + tempStartPath;
                var endPathB     = -randPathDir * randPathDist + tempStartPath;
                var tempEndPath  = Vector3D.Zero;

                if (Vector3D.Distance(endPathA, startCoords) < Vector3D.Distance(endPathB, startCoords))
                {
                    tempEndPath = endPathA;
                }
                else
                {
                    tempEndPath  = endPathB;
                    randPathDir *= -1;
                }

                //TODO: Set At Same Height From Sealevel As Start
                var endUpDir = Vector3D.Normalize(tempEndPath - planetEntity.GetPosition());
                tempEndPath = endUpDir * startCoordsDistFromCenter + planetEntity.GetPosition();

                //Check Path
                var  tempMatrix  = MatrixD.CreateWorld(tempStartPath, randPathDir, upDir);
                var  truePathDir = Vector3D.Normalize(tempEndPath - tempStartPath);
                bool badPath     = false;

                foreach (var prefab in spawnGroup.SpawnGroup.Prefabs)
                {
                    var    modifiedStart = Vector3D.Transform((Vector3D)prefab.Position, tempMatrix);
                    double totalSteps    = 0;

                    while (totalSteps < randPathDist)
                    {
                        var testPath = totalSteps * truePathDir + modifiedStart;

                        if (SpawnResources.IsPositionInSafeZone(testPath) == true)
                        {
                            badPath = true;
                            break;
                        }

                        if (SpawnResources.GetDistanceFromSurface(testPath, planet) < Settings.PlanetaryCargoShips.MinPathAltitude)
                        {
                            badPath = true;
                            break;
                        }

                        totalSteps += Settings.PlanetaryCargoShips.PathStepCheckDistance;
                    }

                    if (badPath == true)
                    {
                        break;
                    }
                }

                if (badPath == true)
                {
                    continue;
                }

                startPathCoords = tempStartPath;
                endPathCoords   = tempEndPath;
                startMatrix     = tempMatrix;
                return(true);
            }

            return(false);
        }
        public static bool GetSpawnCoords(ImprovedSpawnGroup spawnGroup, Vector3D startCoords, out Vector3D spawnCoords)
        {
            spawnCoords = Vector3D.Zero;
            SpawnResources.RefreshEntityLists();
            MyPlanet planet        = SpawnResources.GetNearestPlanet(startCoords);
            var      planetEntity  = planet as IMyEntity;
            double   extraDistance = 0;
            double   terrainVarianceCheckTarget = Settings.PlanetaryInstallations.SmallTerrainCheckDistance;

            if (planetEntity == null || planet == null)
            {
                Logger.AddMsg("Planet Somehow Doesn't Exist... Even Though It Should If Script Got Here...", true);
                return(false);
            }

            if (spawnGroup.PlanetaryInstallationType == "Medium")
            {
                extraDistance = Settings.PlanetaryInstallations.MediumSpawnDistanceIncrement;
                terrainVarianceCheckTarget = Settings.PlanetaryInstallations.MediumTerrainCheckDistance;
            }

            if (spawnGroup.PlanetaryInstallationType == "Large")
            {
                extraDistance = Settings.PlanetaryInstallations.LargeSpawnDistanceIncrement;
                terrainVarianceCheckTarget = Settings.PlanetaryInstallations.LargeTerrainCheckDistance;
            }

            var startDist    = Settings.PlanetaryInstallations.MinimumSpawnDistanceFromPlayers + extraDistance;
            var endDist      = Settings.PlanetaryInstallations.MaximumSpawnDistanceFromPlayers + extraDistance;
            var upDir        = Vector3D.Normalize(startCoords - planetEntity.GetPosition());
            var forwardDir   = Vector3D.Normalize(MyUtils.GetRandomPerpendicularVector(ref upDir));
            var searchMatrix = MatrixD.CreateWorld(startCoords, forwardDir, upDir);

            //Searches in 8 directions from the player position
            var searchDirections = new List <Vector3D>();

            searchDirections.Add(searchMatrix.Forward);
            searchDirections.Add(searchMatrix.Backward);
            searchDirections.Add(searchMatrix.Left);
            searchDirections.Add(searchMatrix.Right);

            if (Settings.PlanetaryInstallations.AggressivePathCheck == true)
            {
                searchDirections.Add(Vector3D.Normalize(searchMatrix.Forward + searchMatrix.Left));
                searchDirections.Add(Vector3D.Normalize(searchMatrix.Forward + searchMatrix.Right));
                searchDirections.Add(Vector3D.Normalize(searchMatrix.Backward + searchMatrix.Left));
                searchDirections.Add(Vector3D.Normalize(searchMatrix.Backward + searchMatrix.Right));
            }

            int debugSpawnPointAttempts = 0;
            int searchDirectionAttempts = 0;

            foreach (var searchDirection in searchDirections)
            {
                searchDirectionAttempts++;
                double searchIncrement = startDist;

                while (searchIncrement < endDist)
                {
                    debugSpawnPointAttempts++;
                    var checkCoords   = searchDirection * searchIncrement + startCoords;
                    var surfaceCoords = SpawnResources.GetNearestSurfacePoint(checkCoords, planet);

                    if (SpawnResources.IsPositionNearEntity(surfaceCoords, Settings.PlanetaryInstallations.MinimumSpawnDistanceFromOtherGrids) == true || SpawnResources.IsPositionInSafeZone(surfaceCoords) == true)
                    {
                        searchIncrement += Settings.PlanetaryInstallations.SearchPathIncrement;
                        continue;
                    }

                    var checkUpDir      = Vector3D.Normalize(surfaceCoords - planetEntity.GetPosition());
                    var checkForwardDir = Vector3D.Normalize(MyUtils.GetRandomPerpendicularVector(ref checkUpDir));
                    var checkMatrix     = MatrixD.CreateWorld(surfaceCoords, checkForwardDir, checkUpDir);

                    var checkDirections = new List <Vector3D>();
                    checkDirections.Add(checkMatrix.Forward);
                    checkDirections.Add(checkMatrix.Backward);
                    checkDirections.Add(checkMatrix.Left);
                    checkDirections.Add(checkMatrix.Right);

                    if (Settings.PlanetaryInstallations.AggressiveTerrainCheck == true)
                    {
                        checkDirections.Add(Vector3D.Normalize(checkMatrix.Forward + checkMatrix.Left));
                        checkDirections.Add(Vector3D.Normalize(checkMatrix.Forward + checkMatrix.Right));
                        checkDirections.Add(Vector3D.Normalize(checkMatrix.Backward + checkMatrix.Left));
                        checkDirections.Add(Vector3D.Normalize(checkMatrix.Backward + checkMatrix.Right));
                    }

                    var  distToCore  = Vector3D.Distance(surfaceCoords, planetEntity.GetPosition());
                    bool badPosition = false;

                    if (spawnGroup.SkipTerrainCheck == false)
                    {
                        foreach (var checkDirection in checkDirections)
                        {
                            double terrainCheckIncrement = 0;

                            while (terrainCheckIncrement < terrainVarianceCheckTarget)
                            {
                                var checkTerrainCoords        = checkDirection * terrainCheckIncrement + surfaceCoords;
                                var checkTerrainSurfaceCoords = SpawnResources.GetNearestSurfacePoint(checkTerrainCoords, planet);
                                var checkDistToCore           = Vector3D.Distance(checkTerrainSurfaceCoords, planetEntity.GetPosition());
                                var elevationDiff             = checkDistToCore - distToCore;

                                if (elevationDiff < Settings.PlanetaryInstallations.MinimumTerrainVariance || elevationDiff > Settings.PlanetaryInstallations.MaximumTerrainVariance)
                                {
                                    badPosition = true;
                                    break;
                                }

                                terrainCheckIncrement += Settings.PlanetaryInstallations.TerrainCheckIncrementDistance;
                            }

                            if (badPosition == true)
                            {
                                break;
                            }
                        }
                    }



                    if (badPosition == false)
                    {
                        spawnCoords = surfaceCoords;
                        Logger.AddMsg("Found Installation Site After: " + debugSpawnPointAttempts.ToString() + " Attempts", true);
                        Logger.AddMsg("Search Directions Used: " + searchDirectionAttempts.ToString(), true);
                        return(true);
                    }

                    searchIncrement += Settings.PlanetaryInstallations.SearchPathIncrement;
                }
            }

            Logger.AddMsg("Could Not Find Installation Site After: " + debugSpawnPointAttempts.ToString() + " Attempts", true);
            return(false);
        }
        public static bool GetSpawnCoords(ImprovedSpawnGroup spawnGroup, Vector3D startCoords, out Vector3D spawnCoords)
        {
            spawnCoords = Vector3D.Zero;
            SpawnResources.RefreshEntityLists();
            MyPlanet planet = SpawnResources.GetNearestPlanet(spawnCoords);

            for (int i = 0; i < Settings.RandomEncounters.SpawnAttempts; i++)
            {
                var spawnDir        = Vector3D.Normalize(MyUtils.GetRandomVector3D());
                var randDist        = (double)SpawnResources.rnd.Next((int)Settings.RandomEncounters.MinSpawnDistanceFromPlayer, (int)Settings.RandomEncounters.MaxSpawnDistanceFromPlayer);
                var tempSpawnCoords = spawnDir * randDist + startCoords;

                if (SpawnResources.IsPositionInGravity(tempSpawnCoords, planet) == true)
                {
                    spawnDir       *= -1;
                    tempSpawnCoords = spawnDir * randDist + startCoords;

                    if (SpawnResources.IsPositionInGravity(tempSpawnCoords, planet) == true)
                    {
                        continue;
                    }
                }

                var tempMatrix = MatrixD.CreateWorld(tempSpawnCoords);
                var badPath    = false;

                foreach (var prefab in spawnGroup.SpawnGroup.Prefabs)
                {
                    var prefabCoords = Vector3D.Transform((Vector3D)prefab.Position, tempMatrix);
                    planet = SpawnResources.GetNearestPlanet(prefabCoords);

                    foreach (var entity in SpawnResources.EntityList)
                    {
                        if (Vector3D.Distance(entity.GetPosition(), prefabCoords) < Settings.RandomEncounters.MinDistanceFromOtherEntities)
                        {
                            badPath = true;
                            break;
                        }
                    }

                    if (SpawnResources.IsPositionInSafeZone(prefabCoords) == true || SpawnResources.IsPositionInGravity(prefabCoords, planet) == true)
                    {
                        badPath = true;
                        break;
                    }

                    if (badPath == true)
                    {
                        break;
                    }
                }

                if (badPath == true)
                {
                    continue;
                }

                spawnCoords = tempSpawnCoords;
                return(true);
            }

            return(false);
        }
示例#8
0
        public static void InitNpcStoreBlock(IMyCubeGrid cubeGrid, ImprovedSpawnGroup spawnGroup)
        {
            var errorLog = new StringBuilder();

            errorLog.Append("Starting Store Block Init For Grid").AppendLine();

            try {
                errorLog.Append(" - Check if Grid Exists").AppendLine();
                if (cubeGrid == null || MyAPIGateway.Entities.Exist(cubeGrid) == false)
                {
                    return;
                }

                errorLog.Append(" - Check if Grid Is Active NPC").AppendLine();
                if (NPCWatcher.ActiveNPCs.ContainsKey(cubeGrid) == false)
                {
                    return;
                }

                errorLog.Append(" - Get Blocks From Grid: " + cubeGrid.CustomName).AppendLine();
                var blockList      = new List <IMySlimBlock>();
                var storeBlockList = new List <IMyStoreBlock>();
                var containerList  = new List <IMyCargoContainer>();
                var gastankList    = new List <IMyGasTank>();
                cubeGrid.GetBlocks(blockList);

                foreach (var block in blockList.Where(x => x.FatBlock != null))
                {
                    var storeBlock = block.FatBlock as IMyStoreBlock;
                    var cargo      = block.FatBlock as IMyCargoContainer;
                    var gasTank    = block.FatBlock as IMyGasTank;

                    if (storeBlock != null)
                    {
                        errorLog.Append("   - Found Store Block " + storeBlock.EntityId.ToString()).AppendLine();
                        storeBlockList.Add(storeBlock);
                    }

                    if (cargo != null)
                    {
                        errorLog.Append("   - Found Container Block " + cargo.EntityId.ToString()).AppendLine();
                        containerList.Add(cargo);
                    }

                    /*
                     * if(gasTank != null) {
                     *
                     *  gastankList.Add(gasTank);
                     *
                     * }
                     */
                }

                var usedCargoContainers = new List <IMyCargoContainer>();
                //var usedTanks = new List<IMyGasTank>();

                errorLog.Append(" - Processing Store Blocks").AppendLine();

                //Process Stores
                foreach (var store in storeBlockList)
                {
                    try{
                        errorLog.Append("   - Check Store For Existing Items And Remove " + store.EntityId.ToString()).AppendLine();
                        var ob = (MyObjectBuilder_StoreBlock)store.SlimBlock.GetObjectBuilder();

                        errorLog.Append("      - Check If ObjectBuilder Null" + store.EntityId.ToString()).AppendLine();
                        if (ob != null)
                        {
                            var existingIdList = new List <long>();

                            if (ob.PlayerItems != null)
                            {
                                foreach (var item in ob.PlayerItems.ToList())
                                {
                                    store.CancelStoreItem(item.Id);
                                }
                            }
                        }
                    }catch (Exception exc) {
                        errorLog.Append("      - Exception Encountered, Probably One Of Those Troublesome ATMs" + store.EntityId.ToString()).AppendLine();
                    }

                    var itemsAvailable = new Dictionary <MyDefinitionId, int>();
                    var gasAvailable   = new Dictionary <MyDefinitionId, int>();
                    var storeInv       = store.GetInventory();
                    var storeitemList  = storeInv.GetItems();

                    errorLog.Append("   - Check Items In Store Inventory To Sell").AppendLine();

                    foreach (var item in storeitemList)
                    {
                        var itemDefId = new MyDefinitionId(item.Content.TypeId, item.Content.SubtypeId);
                        //Logger.AddMsg("Item: " + itemDefId.ToString(), true);

                        if (itemDefId.SubtypeName == "SpaceCredit")
                        {
                            continue;
                        }

                        var amount        = (float)item.Amount;
                        int amountRounded = (int)Math.Floor(amount);

                        if (itemsAvailable.ContainsKey(itemDefId) == false)
                        {
                            itemsAvailable.Add(itemDefId, amountRounded);
                        }
                        else
                        {
                            itemsAvailable[itemDefId] += amountRounded;
                        }
                    }

                    //Get Gas

                    /*
                     * double hydrogen = 100000;
                     * double oxygen = 100000;
                     *
                     * foreach(var tank in gastankList) {
                     *
                     *  if(usedTanks.Contains(tank) == true) {
                     *
                     *      continue;
                     *
                     *  }
                     *
                     *  usedTanks.Add(tank);
                     *
                     *  if(tank.IsWorking == false || tank.IsFunctional == false) {
                     *
                     *      continue;
                     *
                     *  }
                     *
                     *  var tankDef = (MyGasTankDefinition)tank.SlimBlock.BlockDefinition;
                     *  var tankInv = tank.GetInventory();
                     *
                     *  if(tankInv.IsConnectedTo(storeInv) == false || tank.IsSameConstructAs(store) == false) {
                     *
                     *      continue;
                     *
                     *  }
                     *
                     *  if(tankDef.StoredGasId.SubtypeName == "Hydrogen") {
                     *
                     *      hydrogen += tank.Capacity * tank.FilledRatio;
                     *
                     *  }
                     *
                     *  if(tankDef.StoredGasId.SubtypeName == "Oxygen") {
                     *
                     *      oxygen += tank.Capacity * tank.FilledRatio;
                     *
                     *  }
                     *
                     * }
                     *
                     * hydrogen = Math.Floor(hydrogen / 1000);
                     * oxygen = Math.Floor(oxygen / 1000);
                     */

                    errorLog.Append("   - Check Items in Attached Cargo Containers To Sell").AppendLine();

                    //Get Items For Offers
                    foreach (var cargo in containerList)
                    {
                        //Logger.AddMsg("Checking Cargo Container On: " + cargo.CubeGrid.CustomName);

                        if (usedCargoContainers.Contains(cargo))
                        {
                            continue;
                        }

                        var cargoInv = cargo.GetInventory();

                        if (cargoInv.IsConnectedTo(storeInv) == false || cargo.IsSameConstructAs(store) == false)
                        {
                            continue;
                        }

                        usedCargoContainers.Add(cargo);

                        var itemList = cargoInv.GetItems();

                        foreach (var item in itemList)
                        {
                            var itemDefId = new MyDefinitionId(item.Content.TypeId, item.Content.SubtypeId);
                            //Logger.AddMsg("Item: " + itemDefId.ToString(), true);

                            if (itemDefId.SubtypeName == "SpaceCredit")
                            {
                                continue;
                            }

                            var amount        = (float)item.Amount;
                            int amountRounded = (int)Math.Floor(amount);

                            if (itemsAvailable.ContainsKey(itemDefId) == false)
                            {
                                itemsAvailable.Add(itemDefId, amountRounded);
                            }
                            else
                            {
                                itemsAvailable[itemDefId] += amountRounded;
                            }
                        }
                    }

                    if (Logger.LoggerDebugMode == true)
                    {
                        foreach (var item in itemsAvailable.Keys)
                        {
                            Logger.AddMsg("Item For StoreBlock: " + item.ToString() + " - " + itemsAvailable[item], true);
                        }
                    }

                    /*
                     * errorLog.Append("   - Populate Store With Offers").AppendLine();
                     * //TODO: Populate Store With Offers
                     *
                     * IMyPlayer dummyPlayer = null;
                     * var playerList = new List<IMyPlayer>();
                     * MyAPIGateway.Players.GetPlayers(playerList);
                     * var storecube = (store as IMyEntity) as MyCubeBlock;
                     * long originalOwner = store.OwnerId;
                     * long originalPlayerBalance = 0;
                     *
                     * errorLog.Append("   - Search For A Player To Use A Temp Dummy, Since We Cannot Add Credits To NPC Identities To Cover The List Fee").AppendLine();
                     * foreach(var player in playerList) {
                     *
                     *  errorLog.Append("   - Changing Ownership To Player: " + player.DisplayName).AppendLine();
                     *  dummyPlayer = player;
                     *  dummyPlayer.TryGetBalanceInfo(out originalPlayerBalance);
                     *  dummyPlayer.RequestChangeBalance(1000000);
                     *  storecube.ChangeOwner(dummyPlayer.IdentityId, MyOwnershipShareModeEnum.Faction);
                     *  break;
                     *
                     * }
                     */
                    /*
                     * if(hydrogen > 0) {
                     *
                     *  MyStoreItemData gasData = new MyStoreItemData(new MyDefinitionId(typeof(MyObjectBuilder_GasProperties), "Hydrogen"), (int)hydrogen, 150, null, null);
                     *  long gasorderResult = 0;
                     *  var storeAddResult = store.InsertOffer(gasData, out gasorderResult);
                     *  Logger.AddMsg("Hydrogen Add To Store Result: " + storeAddResult.ToString(), true);
                     *
                     * }
                     *
                     * if(oxygen > 0) {
                     *
                     *  MyStoreItemData gasData = new MyStoreItemData(new MyDefinitionId(typeof(MyObjectBuilder_GasProperties), "Oxygen"), (int)hydrogen, 150, null, null);
                     *  long gasorderResult = 0;
                     *  var storeAddResult = store.InsertOffer(gasData, out gasorderResult);
                     *  Logger.AddMsg("Oxygen Add To Store Result: " + storeAddResult.ToString(), true);
                     *
                     * }
                     */

                    errorLog.Append("   - Add Each Item To The Store Block").AppendLine();
                    foreach (var item in itemsAvailable.Keys)
                    {
                        errorLog.Append("     - Checking Item: " + item.ToString()).AppendLine();
                        if (ItemsWithBadValue.Contains(item) || MinimumValuesMaster.ContainsKey(item) == false)
                        {
                            errorLog.Append("     - Item Has Bad Value According To Economy Helper").AppendLine();
                            Logger.AddMsg(item.ToString() + " has invalid economy value or was not in master reference", true);
                            continue;
                        }


                        double          markup         = 1.2; //TODO: Figure out how reputation affects this
                        int             itemValue      = (int)Math.Floor((double)MinimumValuesMaster[item] * markup);
                        MyStoreItemData orderData      = new MyStoreItemData(item, itemsAvailable[item], itemValue, OnSaleComplete, null);
                        long            orderResult    = 0;
                        var             storeAddResult = store.InsertOffer(orderData, out orderResult);
                        errorLog.Append("     - Added Item To Store With Result: " + storeAddResult.ToString()).AppendLine();
                        Logger.AddMsg(item.ToString() + " Add To Store Result: " + storeAddResult.ToString(), true);
                    }

                    /*
                     * if(dummyPlayer != null) {
                     *
                     *  errorLog.Append("   - Changing Owner Back To Original NPC Identity").AppendLine();
                     *  storecube.ChangeOwner(originalOwner, MyOwnershipShareModeEnum.Faction);
                     *  long newPlayerBalance = 0;
                     *  dummyPlayer.TryGetBalanceInfo(out newPlayerBalance);
                     *  var balanceDifference = newPlayerBalance - originalPlayerBalance;
                     *  dummyPlayer.RequestChangeBalance(-balanceDifference);
                     *
                     * }
                     */

                    //Populate Store With Orders

                    if (spawnGroup != null)
                    {
                        if (spawnGroup.ContainerTypesForStoreOrders.Count > 0)
                        {
                            var containerString = spawnGroup.ContainerTypesForStoreOrders[SpawnResources.rnd.Next(0, spawnGroup.ContainerTypesForStoreOrders.Count)];
                            var containerDef    = MyDefinitionManager.Static.GetContainerTypeDefinition(containerString);

                            if (containerDef != null)
                            {
                                foreach (var item in containerDef.Items)
                                {
                                    if (ItemsWithBadValue.Contains(item.DefinitionId) || MinimumValuesMaster.ContainsKey(item.DefinitionId) == false)
                                    {
                                        continue;
                                    }

                                    double          markup         = 1.2;
                                    int             itemCount      = SpawnResources.rnd.Next((int)item.AmountMin, (int)item.AmountMax);
                                    int             itemValue      = (int)Math.Floor((double)MinimumValuesMaster[item.DefinitionId] * markup);
                                    MyStoreItemData orderData      = new MyStoreItemData(item.DefinitionId, itemCount, itemValue, null, null);
                                    long            orderResult    = 0;
                                    var             storeAddResult = store.InsertOrder(orderData, out orderResult);

                                    if (storeAddResult == Sandbox.ModAPI.Ingame.MyStoreInsertResults.Success && SpawnResources.IsIdentityNPC(store.OwnerId) == true)
                                    {
                                        MyAPIGateway.Players.RequestChangeBalance(store.OwnerId, itemCount * itemValue);
                                    }

                                    errorLog.Append("     - Added Item To Store With Result: " + storeAddResult.ToString()).AppendLine();
                                    Logger.AddMsg(item.ToString() + " Add To Store Result: " + storeAddResult.ToString(), true);
                                }
                            }
                        }
                    }
                }
            } catch (Exception e) {
                Logger.AddMsg("Init Store Blocks for NPC Grid Failed. Please Provide The Log File To The Modular Encounters Spawner Mod Author:");
                Logger.AddMsg(errorLog.ToString());
            }
        }
        public static void AttemptSpawn(SpawnRequestMES spawnData)
        {
            if (Settings.General.UseMaxNpcGrids == true)
            {
                var totalNPCs = NPCWatcher.ActiveNPCs.Count;

                if (totalNPCs >= Settings.General.MaxGlobalNpcGrids)
                {
                    Logger.AddMsg("Spawning Aborted. Max Global NPCs Limit Reached.", true);
                    return;
                }
            }

            ImprovedSpawnGroup spawnGroup = null;

            foreach (var spawngroupItem in SpawnGroupManager.SpawnGroups)
            {
                if (spawngroupItem.SpawnGroupName == spawnData.SpawnGroupName)
                {
                    spawnGroup = spawngroupItem;
                    break;
                }
            }

            if (spawnGroup == null)
            {
                Logger.AddMsg("SpawnGroup with Name: " + spawnData.SpawnGroupName + " Not Found.", true);
                return;
            }

            //Get Directions
            var    spawnForwardDir = spawnData.SpawnDirectionForward;
            var    spawnUpDir      = spawnData.SpawnDirectionUp;
            var    spawnMatrix     = MatrixD.CreateWorld(spawnData.SpawnCoordinates, spawnForwardDir, spawnUpDir);
            string factionTag      = spawnGroup.FactionOwner;
            long   gridOwner       = 0;

            if (spawnData.FactionTagOverride != "")
            {
                factionTag = spawnData.FactionTagOverride;
            }

            if (NPCWatcher.NPCFactionTagToFounder.ContainsKey(factionTag) == true)
            {
                gridOwner = NPCWatcher.NPCFactionTagToFounder[factionTag];
            }
            else
            {
                Logger.AddMsg("Could Not Find Faction Founder For: " + factionTag);
            }

            foreach (var prefab in spawnGroup.SpawnGroup.Prefabs)
            {
                var options       = SpawnGroupManager.CreateSpawningOptions(spawnGroup, prefab);
                var spawnPosition = Vector3D.Transform((Vector3D)prefab.Position, spawnMatrix);
                var speedL        = (Vector3)spawnData.LinearVelocity;
                var speedA        = Vector3.Zero;
                var gridList      = new List <IMyCubeGrid>();

                //Grid Manipulation
                GridBuilderManipulation.ProcessPrefabForManipulation(prefab.SubtypeId, spawnGroup, "OtherNPC", prefab.Behaviour);

                try{
                    MyAPIGateway.PrefabManager.SpawnPrefab(gridList, prefab.SubtypeId, spawnPosition, spawnForwardDir, spawnUpDir, speedL, speedA, prefab.BeaconText, options, gridOwner);
                }catch (Exception exc) {
                    Logger.AddMsg("Something Went Wrong With Prefab Spawn Manager.", true);
                }

                var pendingNPC = new ActiveNPC();
                pendingNPC.SpawnGroup            = spawnGroup;
                pendingNPC.Name                  = prefab.SubtypeId;
                pendingNPC.InitialFaction        = factionTag;
                pendingNPC.faction               = MyAPIGateway.Session.Factions.TryGetFactionByTag(pendingNPC.InitialFaction);
                pendingNPC.GridName              = MyDefinitionManager.Static.GetPrefabDefinition(prefab.SubtypeId).CubeGrids[0].DisplayName;
                pendingNPC.SpawnType             = "OtherNPC";
                pendingNPC.CleanupIgnore         = spawnGroup.IgnoreCleanupRules;
                pendingNPC.ForceStaticGrid       = spawnGroup.ForceStaticGrid;
                pendingNPC.KeenAiName            = prefab.Behaviour;
                pendingNPC.KeenAiTriggerDistance = prefab.BehaviourActivationDistance;

                if (string.IsNullOrEmpty(pendingNPC.KeenAiName) == false)
                {
                    Logger.AddMsg("Stock AI Detected In Prefab: " + prefab.SubtypeId + " in SpawnGroup: " + spawnGroup.SpawnGroup.Id.SubtypeName, true);
                }

                if (spawnGroup.RandomizeWeapons == true)
                {
                    pendingNPC.ReplenishedSystems = false;
                    pendingNPC.ReplacedWeapons    = true;
                }
                else if ((MES_SessionCore.NPCWeaponUpgradesModDetected == true || Settings.General.EnableGlobalNPCWeaponRandomizer == true) && spawnGroup.IgnoreWeaponRandomizerMod == false)
                {
                    pendingNPC.ReplenishedSystems = false;
                    pendingNPC.ReplacedWeapons    = true;
                }
                else if (spawnGroup.ReplenishSystems == true)
                {
                    pendingNPC.ReplenishedSystems = false;
                }

                NPCWatcher.PendingNPCs.Add(pendingNPC);
            }

            Logger.AddMsg("Spawning Group - " + spawnGroup.SpawnGroup.Id.SubtypeName);
            return;
        }
示例#10
0
        public static string EligibleSpawnGroupsAtPosition(Vector3D coords)
        {
            var sb            = new StringBuilder();
            var validFactions = new Dictionary <string, List <string> >();

            //Spawn Data Near Player
            var selectedSpawnGroup = new ImprovedSpawnGroup();

            SpawnResources.RefreshEntityLists();
            SpawnResources.LastThreatRefresh = SpawnResources.GameStartTime;
            var threatLevel = SpawnResources.GetThreatLevel(selectedSpawnGroup, coords);
            var pcuLevel    = SpawnResources.GetPCULevel(selectedSpawnGroup, coords);

            sb.Append("::: Spawn Data Near Player :::").AppendLine();
            sb.Append(" - Threat Score: ").Append(threatLevel.ToString()).AppendLine();
            sb.Append(" - PCU Score:    ").Append(pcuLevel.ToString()).AppendLine();

            sb.AppendLine();

            //Environment Data Near Player
            var environment = new EnvironmentEvaluation(coords);

            sb.Append("::: Environment Data Near Player :::").AppendLine();
            sb.Append(" - Distance From World Center:  ").Append(environment.DistanceFromWorldCenter.ToString()).AppendLine();
            sb.Append(" - Direction From World Center: ").Append(environment.DirectionFromWorldCenter.ToString()).AppendLine();
            sb.Append(" - Is On Planet:                ").Append(environment.IsOnPlanet.ToString()).AppendLine();
            sb.Append(" - Planet Name:                 ").Append(environment.IsOnPlanet ? environment.NearestPlanetName : "N/A").AppendLine();
            sb.Append(" - Planet Diameter:             ").Append(environment.IsOnPlanet ? environment.PlanetDiameter.ToString() : "N/A").AppendLine();
            sb.Append(" - Oxygen At Position:          ").Append(environment.IsOnPlanet ? environment.OxygenAtPosition.ToString() : "N/A").AppendLine();
            sb.Append(" - Atmosphere At Position:      ").Append(environment.IsOnPlanet ? environment.AtmosphereAtPosition.ToString() : "N/A").AppendLine();
            sb.Append(" - Gravity At Position:         ").Append(environment.IsOnPlanet ? environment.GravityAtPosition.ToString() : "N/A").AppendLine();
            sb.Append(" - Altitude At Position:        ").Append(environment.IsOnPlanet ? environment.AltitudeAtPosition.ToString() : "N/A").AppendLine();
            sb.Append(" - Is Night At Position:        ").Append(environment.IsOnPlanet ? environment.IsNight.ToString() : "N/A").AppendLine();
            sb.Append(" - Weather At Position:         ").Append(environment.IsOnPlanet && !string.IsNullOrWhiteSpace(environment.WeatherAtPosition) ? environment.WeatherAtPosition.ToString() : "N/A").AppendLine();
            sb.Append(" - Common Terrain At Position:  ").Append(environment.IsOnPlanet ? environment.CommonTerrainAtPosition.ToString() : "N/A").AppendLine();

            sb.AppendLine();

            //Space Cargo Ship
            sb.Append("::: Space / Lunar Cargo Ship Eligible Spawns :::").AppendLine();
            var spaceCargoList = SpaceCargoShipSpawner.GetSpaceCargoShips(coords, null, out validFactions);

            foreach (var sgroup in spaceCargoList.Distinct().ToList())
            {
                sb.Append(" - ").Append(sgroup.SpawnGroupName).AppendLine();
            }

            sb.AppendLine();

            //Random Encounter
            sb.Append("::: Random Encounter Eligible Spawns :::").AppendLine().AppendLine();
            var randEncounterList = RandomEncounterSpawner.GetRandomEncounters(coords, null, out validFactions);

            foreach (var sgroup in randEncounterList.Distinct().ToList())
            {
                sb.Append(" - ").Append(sgroup.SpawnGroupName).AppendLine();
            }

            sb.AppendLine();

            //Planetary Cargo Ship
            sb.Append("::: Planetary Cargo Ship Eligible Spawns :::").AppendLine().AppendLine();
            var planetCargoList = PlanetaryCargoShipSpawner.GetPlanetaryCargoShips(coords, null, out validFactions);

            foreach (var sgroup in planetCargoList.Distinct().ToList())
            {
                sb.Append(" - ").Append(sgroup.SpawnGroupName).AppendLine();
            }

            sb.AppendLine();

            //Planetary Installation
            sb.Append("::: Planetary Installation Eligible Spawns :::").AppendLine().AppendLine();
            var smallList         = new List <ImprovedSpawnGroup>();
            var mediumList        = new List <ImprovedSpawnGroup>();
            var largeList         = new List <ImprovedSpawnGroup>();
            var planetStationList = PlanetaryInstallationSpawner.GetPlanetaryInstallations(coords, null, out smallList, out mediumList, out largeList, out validFactions);

            foreach (var sgroup in planetStationList.Distinct().ToList())
            {
                sb.Append(" - ").Append(sgroup.SpawnGroupName).AppendLine();
            }

            sb.AppendLine();

            //Boss Encounter
            sb.Append("::: Boss Encounter Eligible Spawns :::").AppendLine().AppendLine();

            var spawnCoords = Vector3D.Zero;

            if (BossEncounterSpawner.GetInitialSpawnCoords(coords, out spawnCoords) == true)
            {
                var bossList = BossEncounterSpawner.GetBossEncounters(coords, spawnCoords, null);

                foreach (var sgroup in bossList.Distinct().ToList())
                {
                    sb.Append(" - ").Append(sgroup.SpawnGroupName).AppendLine();
                }
            }

            return(sb.ToString());
        }
示例#11
0
        public static void ServerChatProcessing(SyncData receivedData)
        {
            if (receivedData.ChatMessage.StartsWith("/MES.SSCS") == true)
            {
                receivedData.ChatMessage = receivedData.ChatMessage.Replace("/MES.SSCS", "/MES.Spawn.SpaceCargoShip");
            }

            if (receivedData.ChatMessage.StartsWith("/MES.SRE") == true)
            {
                receivedData.ChatMessage = receivedData.ChatMessage.Replace("/MES.SRE", "/MES.Spawn.RandomEncounter");
            }

            if (receivedData.ChatMessage.StartsWith("/MES.SPCS") == true)
            {
                receivedData.ChatMessage = receivedData.ChatMessage.Replace("/MES.SPCS", "/MES.Spawn.PlanetaryCargoShip");
            }

            if (receivedData.ChatMessage.StartsWith("/MES.SPI") == true)
            {
                receivedData.ChatMessage = receivedData.ChatMessage.Replace("/MES.SPI", "/MES.Spawn.PlanetaryInstallation");
            }

            if (receivedData.ChatMessage.StartsWith("/MES.SBE") == true)
            {
                receivedData.ChatMessage = receivedData.ChatMessage.Replace("/MES.SBE", "/MES.Spawn.BossEncounter");
            }

            //Debug Commands
            if (receivedData.ChatMessage.StartsWith("/MES.") == true)
            {
                //Enable Debug Mode
                if (receivedData.ChatMessage.StartsWith("/MES.EnableDebugMode.") == true)
                {
                    var msgSplit = receivedData.ChatMessage.Split('.');

                    if (msgSplit.Length != 3)
                    {
                        MyVisualScriptLogicProvider.ShowNotification("Invalid Command Received", 5000, "White", receivedData.PlayerId);
                        return;
                    }

                    bool mode = false;

                    if (bool.TryParse(msgSplit[2], out mode) == false)
                    {
                        MyVisualScriptLogicProvider.ShowNotification("Invalid Command Received", 5000, "White", receivedData.PlayerId);
                        return;
                    }

                    Logger.LoggerDebugMode = mode;
                    MyVisualScriptLogicProvider.ShowNotification("Debug Mode Enabled: " + mode.ToString(), 5000, "White", receivedData.PlayerId);
                    return;
                }

                //Debug: InitStoreBlocks
                if (receivedData.ChatMessage.StartsWith("/MES.Debug.InitStoreBlocks") == true)
                {
                    Debug.InitStoreBlocks();
                }

                if (receivedData.ChatMessage.StartsWith("/MES.Debug.Reputation.") == true)
                {
                    Debug.ReputationCheck(receivedData);
                }

                if (receivedData.ChatMessage.StartsWith("/MES.Debug.MoreEcMad") == true)
                {
                    var player = SpawnResources.GetPlayerById(receivedData.PlayerId);

                    if (player != null)
                    {
                        foreach (var faction in MyAPIGateway.Session.Factions.Factions.Keys)
                        {
                            var npcFaction = MyAPIGateway.Session.Factions.Factions[faction];
                            MyAPIGateway.Session.Factions.SetReputationBetweenPlayerAndFaction(player.IdentityId, npcFaction.FactionId, -501);
                        }
                    }
                }

                if (receivedData.ChatMessage.StartsWith("/MES.Debug.MoreEcHostile") == true)
                {
                    var player = SpawnResources.GetPlayerById(receivedData.PlayerId);

                    if (player != null)
                    {
                        foreach (var faction in MyAPIGateway.Session.Factions.Factions.Keys)
                        {
                            var npcFaction = MyAPIGateway.Session.Factions.Factions[faction];
                            MyAPIGateway.Session.Factions.SetReputationBetweenPlayerAndFaction(player.IdentityId, npcFaction.FactionId, -1500);
                        }
                    }
                }

                if (receivedData.ChatMessage.StartsWith("/MES.Debug.MoreEcNeutral") == true)
                {
                    var player = SpawnResources.GetPlayerById(receivedData.PlayerId);

                    if (player != null)
                    {
                        foreach (var faction in MyAPIGateway.Session.Factions.Factions.Keys)
                        {
                            var npcFaction = MyAPIGateway.Session.Factions.Factions[faction];
                            MyAPIGateway.Session.Factions.SetReputationBetweenPlayerAndFaction(player.IdentityId, npcFaction.FactionId, 0);
                        }
                    }
                }

                //Debug.CheckNight
                if (receivedData.ChatMessage.StartsWith("/MES.Debug.CheckNight") == true)
                {
                    MyVisualScriptLogicProvider.ShowNotification("Is Night: " + SpawnResources.IsNight(MyAPIGateway.Session.LocalHumanPlayer.GetPosition()).ToString(), 5000, "White", receivedData.PlayerId);
                    MyVisualScriptLogicProvider.ShowNotification("Time: " + MyAPIGateway.Session.GameDateTime.ToString(), 5000, "White", receivedData.PlayerId);
                    var gameTime = MyAPIGateway.Session.GameDateTime - new DateTime(2081, 1, 1, 0, 0, 0, DateTimeKind.Utc);
                    MyVisualScriptLogicProvider.ShowNotification("Seconds: " + gameTime.TotalSeconds.ToString(), 5000, "White", receivedData.PlayerId);
                }

                //Debug.CheckRemovalStatus
                if (receivedData.ChatMessage.StartsWith("/MES.Debug.CheckRemovalStatus") == true)
                {
                    MyVisualScriptLogicProvider.ShowNotification("Number Of Pending Deletions: " + NPCWatcher.DeleteGridList.Count.ToString(), 5000, "White", receivedData.PlayerId);
                    MyVisualScriptLogicProvider.ShowNotification("Deletion Process Status: " + NPCWatcher.DeleteGrids.ToString(), 5000, "White", receivedData.PlayerId);
                }

                //Debug.Debug.CreateKPL
                if (receivedData.ChatMessage.StartsWith("/MES.Debug.CreateKPL") == true)
                {
                    KnownPlayerLocationManager.AddKnownPlayerLocation(MyAPIGateway.Session.LocalHumanPlayer.GetPosition(), "SPRT", 200, 1, -1);
                }

                //Joke: ComeAtMeBro
                if (receivedData.ChatMessage.StartsWith("/MES.ComeAtMeBro") == true)
                {
                    var playerList = new List <IMyPlayer>();
                    MyAPIGateway.Players.GetPlayers(playerList);
                    IMyPlayer thisPlayer = null;

                    foreach (var player in playerList)
                    {
                        if (player.IdentityId == receivedData.PlayerId)
                        {
                            thisPlayer = player;
                            break;
                        }
                    }

                    if (thisPlayer == null)
                    {
                        return;
                    }

                    int bros = 0;

                    foreach (var cubeGrid in NPCWatcher.ActiveNPCs.Keys.ToList())
                    {
                        if (cubeGrid == null || MyAPIGateway.Entities.Exist(cubeGrid) == false)
                        {
                            continue;
                        }

                        if (cubeGrid.Physics == null)
                        {
                            continue;
                        }

                        if (NPCWatcher.ActiveNPCs[cubeGrid].SpawnType == "SpaceCargoShip")
                        {
                            cubeGrid.Physics.LinearVelocity = Vector3D.Normalize(thisPlayer.GetPosition() - cubeGrid.GetPosition()) * 100;
                            bros++;
                        }
                    }

                    MyVisualScriptLogicProvider.ShowNotification(bros.ToString() + " Bros Coming At You!", 5000, "Red", thisPlayer.IdentityId);
                }

                //RemoveAllNPCs
                if (receivedData.ChatMessage.StartsWith("/MES.RemoveAllNPCs") == true)
                {
                    foreach (var cubeGrid in NPCWatcher.ActiveNPCs.Keys.ToList())
                    {
                        if (cubeGrid == null || MyAPIGateway.Entities.Exist(cubeGrid) == false)
                        {
                            continue;
                        }

                        if (cubeGrid.Physics == null)
                        {
                            continue;
                        }

                        if (NPCWatcher.ActiveNPCs[cubeGrid].CleanupIgnore == false)
                        {
                            NPCWatcher.ActiveNPCs[cubeGrid].FlagForDespawn = true;
                        }
                    }

                    MyVisualScriptLogicProvider.ShowNotification("All Eligible NPC Grids Processed For Removal", 5000, "White", receivedData.PlayerId);
                }

                //Settings
                if (receivedData.ChatMessage.StartsWith("/MES.Settings.") == true)
                {
                    var result = SettingsEditor.EditSettings(receivedData.ChatMessage);
                    MyVisualScriptLogicProvider.ShowNotification(result, 5000, "White", receivedData.PlayerId);
                    return;
                }

                //TryRandomSpawn
                if (receivedData.ChatMessage.StartsWith("/MES.Spawn.") == true)
                {
                    var playerList = new List <IMyPlayer>();
                    MyAPIGateway.Players.GetPlayers(playerList);
                    IMyPlayer thisPlayer = null;

                    foreach (var player in playerList)
                    {
                        if (player.IdentityId == receivedData.PlayerId)
                        {
                            thisPlayer = player;
                            break;
                        }
                    }

                    if (thisPlayer == null)
                    {
                        MyVisualScriptLogicProvider.ShowNotification("Could Not Spawn Encounter: Player Not In Watch List", 5000, "White", receivedData.PlayerId);
                        return;
                    }

                    bool success = false;

                    if (receivedData.ChatMessage.Contains("SpaceCargoShip") == true || receivedData.ChatMessage.Contains("AllSpawns") == true)
                    {
                        if (MES_SessionCore.playerWatchList.ContainsKey(thisPlayer) == true)
                        {
                            SpawnGroupManager.AdminSpawnGroup  = SpecificSpawnGroupRequest(receivedData.ChatMessage, "SpaceCargoShip");
                            MES_SessionCore.PlayerWatcherTimer = 0;
                            MES_SessionCore.playerWatchList[thisPlayer].SpaceCargoShipTimer = 0;
                            MyVisualScriptLogicProvider.ShowNotification("Attempting Random Spawn: Space Cargo Ship", 5000, "White", receivedData.PlayerId);
                            success = true;
                        }
                    }

                    if (receivedData.ChatMessage.Contains("PlanetaryCargoShip") == true)
                    {
                        if (MES_SessionCore.playerWatchList.ContainsKey(thisPlayer) == true)
                        {
                            SpawnGroupManager.AdminSpawnGroup = SpecificSpawnGroupRequest(receivedData.ChatMessage, "PlanetaryCargoShip");
                            MES_SessionCore.playerWatchList[thisPlayer].AtmoCargoShipTimer = 0;
                            MES_SessionCore.PlayerWatcherTimer = 0;
                            MyVisualScriptLogicProvider.ShowNotification("Attempting Random Spawn: Planetary Cargo Ship", 5000, "White", receivedData.PlayerId);
                            success = true;
                        }
                    }

                    if (receivedData.ChatMessage.Contains("RandomEncounter") == true)
                    {
                        if (MES_SessionCore.playerWatchList.ContainsKey(thisPlayer) == true)
                        {
                            SpawnGroupManager.AdminSpawnGroup = SpecificSpawnGroupRequest(receivedData.ChatMessage, "RandomEncounter");

                            MES_SessionCore.PlayerWatcherTimer = 0;
                            MES_SessionCore.playerWatchList[thisPlayer].RandomEncounterCheckTimer    = 0;
                            MES_SessionCore.playerWatchList[thisPlayer].RandomEncounterCoolDownTimer = 0;
                            var fakeDistance = Settings.RandomEncounters.PlayerTravelDistance + 1000;
                            MES_SessionCore.playerWatchList[thisPlayer].RandomEncounterDistanceCoordCheck = fakeDistance * Vector3D.Up + thisPlayer.GetPosition();
                            MyVisualScriptLogicProvider.ShowNotification("Attempting Random Spawn: Random Encounter", 5000, "White", receivedData.PlayerId);
                            success = true;
                        }
                    }

                    if (receivedData.ChatMessage.Contains("PlanetaryInstallation") == true)
                    {
                        if (MES_SessionCore.playerWatchList.ContainsKey(thisPlayer) == true)
                        {
                            SpawnGroupManager.AdminSpawnGroup = SpecificSpawnGroupRequest(receivedData.ChatMessage, "PlanetaryInstallation");

                            MES_SessionCore.PlayerWatcherTimer = 0;
                            MES_SessionCore.playerWatchList[thisPlayer].PlanetaryInstallationCheckTimer    = 0;
                            MES_SessionCore.playerWatchList[thisPlayer].PlanetaryInstallationCooldownTimer = 0;

                            var fakeDistance = Settings.PlanetaryInstallations.PlayerDistanceSpawnTrigger + 1000;
                            var randomDir    = SpawnResources.GetRandomCompassDirection(thisPlayer.GetPosition(), SpawnResources.GetNearestPlanet(thisPlayer.GetPosition()));

                            MES_SessionCore.playerWatchList[thisPlayer].InstallationDistanceCoordCheck = fakeDistance * randomDir + thisPlayer.GetPosition();
                            MyVisualScriptLogicProvider.ShowNotification("Attempting Random Spawn: Planetary Installation", 5000, "White", receivedData.PlayerId);
                            success = true;
                        }
                    }

                    if (receivedData.ChatMessage.Contains("BossEncounter") == true)
                    {
                        if (BossEncounterSpawner.IsPlayerInBossEncounter(thisPlayer.IdentityId) == true)
                        {
                            MyVisualScriptLogicProvider.ShowNotification("Boss Encounter Already Active", 5000, "White", receivedData.PlayerId);
                        }

                        if (MES_SessionCore.playerWatchList.ContainsKey(thisPlayer) == true)
                        {
                            SpawnGroupManager.AdminSpawnGroup = SpecificSpawnGroupRequest(receivedData.ChatMessage, "BossEncounter");

                            MES_SessionCore.PlayerWatcherTimer = 0;
                            MES_SessionCore.playerWatchList[thisPlayer].BossEncounterCooldownTimer = 0;
                            MES_SessionCore.playerWatchList[thisPlayer].BossEncounterCheckTimer    = 0;
                            MyVisualScriptLogicProvider.ShowNotification("Attempting Random Spawn: Boss Encounter", 5000, "White", receivedData.PlayerId);
                            success = true;
                        }
                    }

                    if (success == false)
                    {
                        MyVisualScriptLogicProvider.ShowNotification("Could Not Spawn Encounter: Player Not In Watch List", 5000, "White", receivedData.PlayerId);
                    }

                    return;
                }

                //WaveSpawner
                if (receivedData.ChatMessage.StartsWith("/MES.WaveSpawner.") == true)
                {
                    bool success = false;

                    if (receivedData.ChatMessage.Contains("SpaceCargoShip") == true && Settings.SpaceCargoShips.EnableWaveSpawner == true)
                    {
                        MyVisualScriptLogicProvider.ShowNotification("Wave Spawner (Space Cargo Ship) Activated.", 5000, "White", receivedData.PlayerId);
                        MES_SessionCore.SpaceCargoShipWaveSpawner.CurrentWaveTimer = Settings.SpaceCargoShips.MaxWaveSpawnTime;
                        success = true;
                    }

                    if (success == false)
                    {
                        MyVisualScriptLogicProvider.ShowNotification("Wave Spawner Could Not Be Triggered. Please Enable In Configuration.", 5000, "White", receivedData.PlayerId);
                    }
                }

                //Enable Territory
                if (receivedData.ChatMessage.StartsWith("/MES.EnableTerritory.") == true)
                {
                    var messageReplace = receivedData.ChatMessage.Replace("/MES.EnableTerritory.", "");

                    if (messageReplace == "")
                    {
                        MyVisualScriptLogicProvider.ShowNotification("Invalid Command Received: No Territory Name Provided", 5000, "White", receivedData.PlayerId);
                        return;
                    }

                    MyAPIGateway.Utilities.SetVariable <bool>("MES-Territory-" + messageReplace, true);
                    TerritoryManager.TerritoryRefresh();
                    MyVisualScriptLogicProvider.ShowNotification("Territory Enabled: " + messageReplace, 5000, "White", receivedData.PlayerId);
                    return;
                }

                //Disable Territory
                if (receivedData.ChatMessage.StartsWith("/MES.DisableTerritory.") == true)
                {
                    var messageReplace = receivedData.ChatMessage.Replace("/MES.DisableTerritory.", "");

                    if (messageReplace == "")
                    {
                        MyVisualScriptLogicProvider.ShowNotification("Invalid Command Received: No Territory Name Provided", 5000, "White", receivedData.PlayerId);
                        return;
                    }

                    MyAPIGateway.Utilities.SetVariable <bool>("MES-Territory-" + messageReplace, false);
                    TerritoryManager.TerritoryRefresh();
                    MyVisualScriptLogicProvider.ShowNotification("Territory Disabled: " + messageReplace, 5000, "White", receivedData.PlayerId);
                    return;
                }

                //Get SpawnGroups
                if (receivedData.ChatMessage.StartsWith("/MES.GetSpawnGroups") == true)
                {
                    var syncData = receivedData;
                    syncData.Instruction       = "MESClipboard";
                    syncData.ClipboardContents = Logger.SpawnGroupResults();
                    var  sendData   = MyAPIGateway.Utilities.SerializeToBinary <SyncData>(syncData);
                    bool sendStatus = MyAPIGateway.Multiplayer.SendMessageTo(8877, sendData, receivedData.SteamUserId);
                    MyVisualScriptLogicProvider.ShowNotification("Spawn Group Data To Clipboard. Success: " + sendStatus.ToString(), 5000, "White", receivedData.PlayerId);
                    return;
                }

                //Get Active NPCs
                if (receivedData.ChatMessage.StartsWith("/MES.GetActiveNPCs") == true)
                {
                    var syncData = receivedData;
                    syncData.Instruction       = "MESClipboard";
                    syncData.ClipboardContents = Logger.GetActiveNPCs();
                    var  sendData   = MyAPIGateway.Utilities.SerializeToBinary <SyncData>(syncData);
                    bool sendStatus = MyAPIGateway.Multiplayer.SendMessageTo(8877, sendData, receivedData.SteamUserId);
                    MyVisualScriptLogicProvider.ShowNotification("Active NPC Data To Clipboard. Success: " + sendStatus.ToString(), 5000, "White", receivedData.PlayerId);
                    return;
                }

                //Get Block Definition Info
                if (receivedData.ChatMessage.StartsWith("/MES.GetBlockDefinitions") == true)
                {
                    var syncData = receivedData;
                    syncData.Instruction       = "MESClipboard";
                    syncData.ClipboardContents = Logger.GetBlockDefinitionInfo();
                    var  sendData   = MyAPIGateway.Utilities.SerializeToBinary <SyncData>(syncData);
                    bool sendStatus = MyAPIGateway.Multiplayer.SendMessageTo(8877, sendData, receivedData.SteamUserId);
                    MyVisualScriptLogicProvider.ShowNotification("Block Data To Clipboard. Success: " + sendStatus.ToString(), 5000, "White", receivedData.PlayerId);
                    return;
                }

                //Get Block Definition Info
                if (receivedData.ChatMessage.StartsWith("/MES.GetColorsFromGrid") == true)
                {
                    var syncData = receivedData;
                    syncData.Instruction       = "MESClipboard";
                    syncData.ClipboardContents = Logger.GetColorListFromGrid(SpawnResources.GetPlayerById(syncData.PlayerId));
                    var  sendData   = MyAPIGateway.Utilities.SerializeToBinary <SyncData>(syncData);
                    bool sendStatus = MyAPIGateway.Multiplayer.SendMessageTo(8877, sendData, receivedData.SteamUserId);
                    return;
                }

                //Get Player Watch Lists
                if (receivedData.ChatMessage.StartsWith("/MES.GetPlayerWatchList") == true)
                {
                    var syncData = receivedData;
                    syncData.Instruction       = "MESClipboard";
                    syncData.ClipboardContents = Logger.GetPlayerWatcherData();
                    var  sendData   = MyAPIGateway.Utilities.SerializeToBinary <SyncData>(syncData);
                    bool sendStatus = MyAPIGateway.Multiplayer.SendMessageTo(8877, sendData, receivedData.SteamUserId);
                    MyVisualScriptLogicProvider.ShowNotification("Player Watch Data To Clipboard. Success: " + sendStatus.ToString(), 5000, "White", receivedData.PlayerId);
                    return;
                }

                //Get Local Threat Score
                if (receivedData.ChatMessage.StartsWith("/MES.GetThreatScore") == true || receivedData.ChatMessage.StartsWith("/MES.GTS") == true)
                {
                    var messageReplace = receivedData.ChatMessage.Replace("/MES.GetThreatScore.", "");
                    ImprovedSpawnGroup selectedSpawnGroup = null;

                    if (messageReplace == "")
                    {
                        MyVisualScriptLogicProvider.ShowNotification("Default Threat Check Range Of 5000 Used. Spawngroup Not Provided or Detected.", 5000, "White", receivedData.PlayerId);
                        //return;
                        selectedSpawnGroup = new ImprovedSpawnGroup();
                    }

                    var playerList = new List <IMyPlayer>();
                    MyAPIGateway.Players.GetPlayers(playerList);
                    IMyPlayer thisPlayer = null;

                    foreach (var player in playerList)
                    {
                        if (player.IdentityId == receivedData.PlayerId)
                        {
                            thisPlayer = player;
                            break;
                        }
                    }

                    if (thisPlayer == null)
                    {
                        MyVisualScriptLogicProvider.ShowNotification("Command Failed: Apparently you don't exist?", 5000, "White", receivedData.PlayerId);
                        return;
                    }

                    if (selectedSpawnGroup == null)
                    {
                        foreach (var spawnGroup in SpawnGroupManager.SpawnGroups)
                        {
                            if (spawnGroup.SpawnGroup.Id.SubtypeName == messageReplace)
                            {
                                selectedSpawnGroup = spawnGroup;
                                break;
                            }
                        }
                    }

                    if (selectedSpawnGroup == null)
                    {
                        MyVisualScriptLogicProvider.ShowNotification("Default Threat Check Range Of 5000 Used. Spawngroup Not Provided or Detected.", 5000, "White", receivedData.PlayerId);
                        //return;
                        selectedSpawnGroup = new ImprovedSpawnGroup();
                    }

                    SpawnResources.RefreshEntityLists();
                    SpawnResources.LastThreatRefresh = SpawnResources.GameStartTime;
                    var threatLevel = SpawnResources.GetThreatLevel(selectedSpawnGroup, thisPlayer.GetPosition());

                    MyVisualScriptLogicProvider.ShowNotification("Threat Level Score Near You: " + threatLevel.ToString(), 5000, "White", receivedData.PlayerId);
                    return;
                }

                //Reset Active Territories
                if (receivedData.ChatMessage.StartsWith("/MES.ResetActiveTerritories") == true)
                {
                    TerritoryManager.TerritoryRefresh(true);

                    var syncData = receivedData;
                    syncData.Instruction = "MESResetActiveTerritories";
                    var  sendData   = MyAPIGateway.Utilities.SerializeToBinary <SyncData>(syncData);
                    bool sendStatus = MyAPIGateway.Multiplayer.SendMessageTo(8877, sendData, receivedData.SteamUserId);
                    MyVisualScriptLogicProvider.ShowNotification("Active Territories Reset To Default Values.", 5000, "White", receivedData.PlayerId);
                    return;
                }

                //Get Spawned Unique Encounters
                if (receivedData.ChatMessage.StartsWith("/MES.GetSpawnedUniqueEncounters") == true)
                {
                    var syncData = receivedData;
                    syncData.Instruction       = "MESClipboard";
                    syncData.ClipboardContents = Logger.GetSpawnedUniqueEncounters();
                    var  sendData   = MyAPIGateway.Utilities.SerializeToBinary <SyncData>(syncData);
                    bool sendStatus = MyAPIGateway.Multiplayer.SendMessageTo(8877, sendData, receivedData.SteamUserId);
                    MyVisualScriptLogicProvider.ShowNotification("Spawned Unique Encounters List Sent To Clipboard. Success: " + sendStatus.ToString(), 5000, "White", receivedData.PlayerId);
                    return;
                }

                //Get Spawn Group Eligibility At Position
                if (receivedData.ChatMessage.StartsWith("/MES.GetEligibleSpawnsAtPosition") == true || receivedData.ChatMessage.StartsWith("/MES.GESAP") == true)
                {
                    var syncData = receivedData;
                    syncData.Instruction       = "MESClipboard";
                    syncData.ClipboardContents = Logger.EligibleSpawnGroupsAtPosition(receivedData.PlayerPosition);
                    var  sendData   = MyAPIGateway.Utilities.SerializeToBinary <SyncData>(syncData);
                    bool sendStatus = MyAPIGateway.Multiplayer.SendMessageTo(8877, sendData, receivedData.SteamUserId);
                    MyVisualScriptLogicProvider.ShowNotification("List of Eligible Spawn Groups At Position Sent To Clipboard. Success: " + sendStatus.ToString(), 5000, "White", receivedData.PlayerId);
                    return;
                }

                //Get Planet Direction At Position
                if (receivedData.ChatMessage.StartsWith("/MES.GetDirectionFromPlanetCore") == true)
                {
                    var syncData = receivedData;
                    syncData.Instruction = "MESClipboard";

                    var planet = SpawnResources.GetNearestPlanet(receivedData.PlayerPosition);

                    if (planet != null)
                    {
                        var planetEntity = planet as IMyEntity;
                        var dir          = Vector3D.Normalize(receivedData.PlayerPosition - planetEntity.GetPosition());
                        var sb           = new StringBuilder();
                        sb.Append("Direction Vector For ").Append(planet.Generator.Id.SubtypeName).Append(" At Position ").Append(planetEntity.GetPosition().ToString()).AppendLine();
                        sb.Append("X: ").Append(dir.X.ToString()).AppendLine();
                        sb.Append("Y: ").Append(dir.Y.ToString()).AppendLine();
                        sb.Append("Z: ").Append(dir.Z.ToString()).AppendLine();
                        syncData.ClipboardContents = sb.ToString();
                    }
                    else
                    {
                        syncData.ClipboardContents = "No Planets In Game World.";
                    }


                    var  sendData   = MyAPIGateway.Utilities.SerializeToBinary <SyncData>(syncData);
                    bool sendStatus = MyAPIGateway.Multiplayer.SendMessageTo(8877, sendData, receivedData.SteamUserId);
                    MyVisualScriptLogicProvider.ShowNotification("Direction From Planet Core Values Sent To Clipboard. Success: " + sendStatus.ToString(), 5000, "White", receivedData.PlayerId);
                    return;
                }
            }

            //Settings Commands
        }
示例#12
0
        public static bool CheckCommonConditions(ImprovedSpawnGroup spawnGroup, Vector3D playerCoords, MyPlanet planet, bool specificSpawnRequest)
        {
            string planetName = "";

            if (planet != null)
            {
                planetName = planet.Generator.Id.SubtypeName;
            }

            if (spawnGroup.SpawnGroupEnabled == false)
            {
                if (spawnGroup.AdminSpawnOnly == false)
                {
                    return(false);
                }
            }

            if (CheckDefinitionProperties(spawnGroup.SpawnGroup) == false)
            {
                return(false);
            }

            if (spawnGroup.RandomNumberRoll > 1 && specificSpawnRequest == false)
            {
                var roll = rnd.Next(0, spawnGroup.RandomNumberRoll);

                if (roll != 0)
                {
                    return(false);
                }
            }

            if (SpawnGroupManager.ModRestrictionCheck(spawnGroup) == false)
            {
                return(false);
            }

            if (SpawnGroupManager.IsSpawnGroupInBlacklist(spawnGroup.SpawnGroup.Id.SubtypeName) == true)
            {
                return(false);
            }

            if (spawnGroup.UniqueEncounter == true && SpawnGroupManager.UniqueGroupsSpawned.Contains(spawnGroup.SpawnGroup.Id.SubtypeName) == true)
            {
                return(false);
            }

            if (SpawnGroupManager.DistanceFromCenterCheck(spawnGroup, playerCoords) == false)
            {
                return(false);
            }

            if (planetName != "")
            {
                if (SpawnGroupManager.CheckSpawnGroupPlanetLists(spawnGroup, planet) == false)
                {
                    return(false);
                }
            }

            if (CheckSandboxVariables(spawnGroup.SandboxVariables, spawnGroup.FalseSandboxVariables) == false)
            {
                return(false);
            }

            if (spawnGroup.ModBlockExists.Count > 0)
            {
                foreach (var modID in spawnGroup.ModBlockExists)
                {
                    if (string.IsNullOrEmpty(modID) == true)
                    {
                        continue;
                    }

                    if (BlockDefinitionIdList.Contains(modID) == false)
                    {
                        return(false);
                    }
                }
            }

            if (TerritoryValidation(spawnGroup, playerCoords) == false)
            {
                return(false);
            }

            if (spawnGroup.RequiredPlayersOnline.Count > 0)
            {
                foreach (var playerSteamId in spawnGroup.RequiredPlayersOnline)
                {
                    if (playerSteamId == 0)
                    {
                        continue;
                    }

                    bool foundPlayer = false;

                    foreach (var player in MES_SessionCore.PlayerList)
                    {
                        if (player.SteamUserId == playerSteamId)
                        {
                            foundPlayer = true;
                            break;
                        }
                    }

                    if (foundPlayer == false)
                    {
                        return(false);
                    }
                }
            }

            if (spawnGroup.UsePlayerCountCheck == true)
            {
                int totalPlayers = 0;

                foreach (var player in MES_SessionCore.PlayerList)
                {
                    if (player.IsBot || player.Character == null)
                    {
                        continue;
                    }

                    if (Vector3D.Distance(playerCoords, player.GetPosition()) < spawnGroup.PlayerCountCheckRadius || spawnGroup.PlayerCountCheckRadius < 0)
                    {
                        totalPlayers++;
                    }
                }

                if (totalPlayers < spawnGroup.MinimumPlayers && spawnGroup.MinimumPlayers > 0)
                {
                    return(false);
                }

                if (totalPlayers > spawnGroup.MaximumPlayers && spawnGroup.MaximumPlayers > 0)
                {
                    return(false);
                }

                return(true);
            }

            if (spawnGroup.UsePCUCheck == true)
            {
                var pcuLevel = GetPCULevel(spawnGroup, playerCoords);

                if (pcuLevel < (float)spawnGroup.PCUMinimum && (float)spawnGroup.PCUMinimum > 0)
                {
                    return(false);
                }

                if (pcuLevel > (float)spawnGroup.PCUMaximum && (float)spawnGroup.PCUMaximum > 0)
                {
                    return(false);
                }
            }

            if (spawnGroup.UseThreatLevelCheck == true)
            {
                var threatLevel = GetThreatLevel(spawnGroup, playerCoords);
                threatLevel -= (float)Settings.General.ThreatReductionHandicap;

                if (threatLevel < (float)spawnGroup.ThreatScoreMinimum && (float)spawnGroup.ThreatScoreMinimum > 0)
                {
                    return(false);
                }

                if (threatLevel > (float)spawnGroup.ThreatScoreMaximum && (float)spawnGroup.ThreatScoreMaximum > 0)
                {
                    return(false);
                }
            }

            if (spawnGroup.UsePlayerCredits == true)
            {
                long          totalCredits         = 0;
                long          highestPlayerCredits = 0;
                List <string> CheckedFactions      = new List <string>();

                foreach (var player in MES_SessionCore.PlayerList)
                {
                    if (player.IsBot == true || player.Character == null)
                    {
                        continue;
                    }

                    if (Vector3D.Distance(player.GetPosition(), playerCoords) > spawnGroup.PlayerCreditsCheckRadius)
                    {
                        continue;
                    }

                    IMyFaction faction        = null;
                    long       factionBalance = 0;

                    if (spawnGroup.IncludeFactionBalance == true)
                    {
                        faction = MyAPIGateway.Session.Factions.TryGetPlayerFaction(player.IdentityId);

                        if (faction != null)
                        {
                        }
                    }

                    long playerBalance = 0;
                    player.TryGetBalanceInfo(out playerBalance);

                    if (spawnGroup.IncludeAllPlayersInRadius == false)
                    {
                        if (factionBalance + playerBalance > totalCredits)
                        {
                            totalCredits = factionBalance + playerBalance;
                        }
                    }
                    else
                    {
                        if (faction != null)
                        {
                            if (CheckedFactions.Contains(faction.Tag) == false)
                            {
                                totalCredits += factionBalance;
                                CheckedFactions.Add(faction.Tag);
                            }

                            totalCredits += playerBalance;
                        }
                    }
                }

                if (totalCredits < spawnGroup.MinimumPlayerCredits && spawnGroup.MinimumPlayerCredits != -1)
                {
                    return(false);
                }

                if (totalCredits > spawnGroup.MaximumPlayerCredits && spawnGroup.MaximumPlayerCredits != -1)
                {
                    return(false);
                }
            }

            return(true);
        }
示例#13
0
        public static bool TerritoryValidation(ImprovedSpawnGroup spawnGroup, Vector3D position)
        {
            List <Territory> inPositionTerritories = new List <Territory>();

            foreach (var territory in TerritoryManager.TerritoryList)
            {
                if (territory.TerritoryDefinition.BadTerritory == true || territory.Active == false)
                {
                    Logger.AddMsg(spawnGroup.SpawnGroupName + " - Inactive Or Bad", true);
                    continue;
                }

                double distanceFromCenter = Vector3D.Distance(position, territory.Position);

                if (distanceFromCenter < territory.Radius)
                {
                    if (territory.NoSpawnZone == true)
                    {
                        Logger.AddMsg(spawnGroup.SpawnGroupName + " - No Spawn Zone Territory", true);
                        return(false);
                    }

                    if (spawnGroup.Territory != "" && territory.Name != spawnGroup.Territory)
                    {
                        continue;
                    }

                    if (spawnGroup.MinDistanceFromTerritoryCenter > 0 && distanceFromCenter < spawnGroup.MinDistanceFromTerritoryCenter)
                    {
                        continue;
                    }

                    if (spawnGroup.MaxDistanceFromTerritoryCenter > 0 && distanceFromCenter > spawnGroup.MaxDistanceFromTerritoryCenter)
                    {
                        continue;
                    }

                    inPositionTerritories.Add(territory);
                }
            }

            if (inPositionTerritories.Count == 0 && spawnGroup.Territory == "")
            {
                return(true);
            }

            if (inPositionTerritories.Count == 0 && spawnGroup.Territory != "")
            {
                return(false);
            }

            bool territoryPass = false;
            bool strictPass    = false;
            bool strictFail    = false;
            bool whitelistPass = false;
            bool whitelistFail = false;
            bool blacklistPass = false;
            bool blacklistFail = false;

            foreach (var territory in inPositionTerritories)
            {
                if (spawnGroup.Territory == territory.Name)
                {
                    territoryPass = true;
                }

                if (territory.StrictTerritory == true && spawnGroup.Territory != territory.Name)
                {
                    strictFail = true;
                }

                if (territory.StrictTerritory == true && spawnGroup.Territory == territory.Name)
                {
                    strictPass = true;
                }

                /*
                 * if(territory.FactionTagWhitelist != new List<string>() && territory.FactionTagWhitelist.Contains(spawnGroup.FactionOwner) == true){
                 *
                 *      whitelistPass = true;
                 *
                 * }
                 *
                 * if(territory.FactionTagWhitelist != new List<string>() && territory.FactionTagWhitelist.Contains(spawnGroup.FactionOwner) == false){
                 *
                 *      whitelistFail = true;
                 *
                 * }
                 *
                 * if(territory.FactionTagBlacklist != new List<string>() && territory.FactionTagBlacklist.Contains(spawnGroup.FactionOwner) == true){
                 *
                 *      blacklistPass = true;
                 *
                 * }
                 *
                 * if(territory.FactionTagBlacklist != new List<string>() && territory.FactionTagBlacklist.Contains(spawnGroup.FactionOwner) == false){
                 *
                 *      blacklistFail = true;
                 *
                 * }
                 */
            }

            bool strictConflict    = false;
            bool whitelistConflict = false;
            bool blacklistConflict = false;

            if (strictPass == true && strictFail == true)
            {
                strictConflict = true;
            }

            /*
             * if(blacklistPass == true && blacklistFail == true){
             *
             *      blacklistConflict = true;
             *
             * }
             *
             * if(whitelistPass == true && whitelistFail == true){
             *
             *      whitelistConflict = true;
             *
             * }
             */

            if (territoryPass == false && spawnGroup.Territory != "")
            {
                return(false);
            }

            if (strictFail == true && strictConflict == false)
            {
                return(false);
            }

            /*
             * if(whitelistFail == true && whitelistConflict == false){
             *
             *      Logger.AddMsg("Whitelist Fail", true);
             *      return false;
             *
             * }
             *
             * if(blacklistFail == true && blacklistConflict == false){
             *
             *      Logger.AddMsg("Blacklist Fail", true);
             *      return false;
             *
             * }
             */

            return(true);
        }
示例#14
0
        public static List <string> ValidNpcFactions(ImprovedSpawnGroup spawnGroup, Vector3D coords)
        {
            var resultList  = new List <string>();
            var factionList = new List <IMyFaction>();

            if (spawnGroup.UseRandomBuilderFaction == false && spawnGroup.UseRandomMinerFaction == false && spawnGroup.UseRandomTraderFaction == false)
            {
                var initialFaction = MyAPIGateway.Session.Factions.TryGetFactionByTag(spawnGroup.FactionOwner);

                if (initialFaction != null)
                {
                    factionList.Add(initialFaction);
                }
                else
                {
                    if (spawnGroup.FactionOwner == "Nobody")
                    {
                        resultList.Add("Nobody");
                    }

                    return(resultList);
                }
            }

            if (spawnGroup.UseRandomBuilderFaction == true)
            {
                var tempList = factionList.Concat(NpcBuilderFactions);
                factionList = new List <IMyFaction>(tempList.ToList());
            }

            if (spawnGroup.UseRandomMinerFaction == true)
            {
                var tempList = factionList.Concat(NpcMinerFactions);
                factionList = new List <IMyFaction>(tempList.ToList());
            }

            if (spawnGroup.UseRandomTraderFaction == true)
            {
                var tempList = factionList.Concat(NpcTraderFactions);
                factionList = new List <IMyFaction>(tempList.ToList());
            }

            if (factionList.Count == 0)
            {
                var defaultFaction = MyAPIGateway.Session.Factions.TryGetFactionByTag(spawnGroup.FactionOwner);

                if (defaultFaction != null)
                {
                    factionList.Add(defaultFaction);
                }
            }

            if (spawnGroup.UsePlayerFactionReputation == true)
            {
                foreach (var faction in factionList.ToList())
                {
                    bool validFaction         = false;
                    bool specificFactionCheck = false;

                    IMyFaction checkFaction = faction;

                    if (string.IsNullOrWhiteSpace(spawnGroup.CheckReputationAgainstOtherNPCFaction) == false)
                    {
                        var factionOvr = MyAPIGateway.Session.Factions.TryGetFactionByTag(spawnGroup.CheckReputationAgainstOtherNPCFaction);

                        if (factionOvr != null)
                        {
                            if (NPCWatcher.NPCFactionTags.Contains(factionOvr.Tag) == false)
                            {
                                continue;
                            }

                            checkFaction         = factionOvr;
                            specificFactionCheck = true;
                        }
                    }

                    foreach (var player in MES_SessionCore.PlayerList)
                    {
                        if (player.IsBot == true || player.Character == null)
                        {
                            continue;
                        }

                        if (Vector3D.Distance(player.GetPosition(), coords) > spawnGroup.PlayerReputationCheckRadius)
                        {
                            continue;
                        }

                        var playerFaction = MyAPIGateway.Session.Factions.TryGetPlayerFaction(player.IdentityId);

                        int rep = 0;
                        rep = MyAPIGateway.Session.Factions.GetReputationBetweenPlayerAndFaction(player.IdentityId, checkFaction.FactionId);

                        /*
                         * if(playerFaction != null) {
                         *
                         *  rep = MyAPIGateway.Session.Factions.GetReputationBetweenFactions(playerFaction.FactionId, checkFaction.FactionId);
                         *
                         * } else {
                         *
                         *  rep = MyAPIGateway.Session.Factions.GetReputationBetweenPlayerAndFaction(player.IdentityId, checkFaction.FactionId);
                         *
                         * }
                         */

                        if (rep < spawnGroup.MinimumReputation && spawnGroup.MinimumReputation > -1501)
                        {
                            continue;
                        }

                        if (rep > spawnGroup.MaximumReputation && spawnGroup.MaximumReputation < 1501)
                        {
                            continue;
                        }

                        validFaction = true;
                        break;
                    }

                    if (validFaction == false)
                    {
                        factionList.Remove(faction);

                        if (specificFactionCheck == true)
                        {
                            factionList.Clear();
                            break;
                        }

                        continue;
                    }
                }
            }

            foreach (var faction in factionList)
            {
                if (resultList.Contains(faction.Tag) == false)
                {
                    resultList.Add(faction.Tag);
                }
            }

            return(resultList);
        }