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; } }
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); }
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; }
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()); }
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 }
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); }
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); }
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); }