public static bool IsOnEdgeOfGratBox(this BPGratBox box, Vector3 pos, int segmentCount) { pos.Normalize(); float num = pos.y; if (num > 0.999999f) { return(box.w >= 1.5707864f); } if (num < -0.999999f) { return(box.y <= -1.5707864f); } float latitudeRad = Mathf.Asin(num); float longitudeRad = Mathf.Atan2(pos.x, -pos.z); return(box.IsOnEdgeOfGratBox(longitudeRad, latitudeRad, segmentCount)); }
public void DetermineAddSelection() { int segmentCnt = 200; if (GameMain.localPlanet?.aux?.activeGrid != null) { segmentCnt = GameMain.localPlanet.aux.activeGrid.segment; } selectObjIds.Clear(); edgeObjIds.Clear(); if (Mathf.Abs(selectArcBox.x - selectArcBox.z) < 0.01f && Mathf.Abs(selectArcBox.y - selectArcBox.w) < 0.01f && castObjectId != 0) { if (ShouldAddObject(castObjectId)) { selectObjIds.Add(castObjectId); } } else { EntityData[] entityPool = factory.entityPool; int entityCursor = factory.entityCursor; for (int i = 1; i < entityCursor; i++) { int item = i; if (entityPool[i].id == i && selectGratBox.InGratBox(entityPool[i].pos)) { if (ShouldAddObject(item)) { selectObjIds.Add(item); if (selectGratBox.IsOnEdgeOfGratBox(entityPool[i].pos, segmentCnt)) { edgeObjIds.Add(item); } } } } PrebuildData[] prebuildPool = factory.prebuildPool; int prebuildCursor = factory.prebuildCursor; for (int i = 1; i < prebuildCursor; i++) { int item = -i; if (prebuildPool[i].id == i && selectGratBox.InGratBox(prebuildPool[i].pos)) { if (ShouldAddObject(item)) { selectObjIds.Add(item); if (selectGratBox.IsOnEdgeOfGratBox(prebuildPool[i].pos, segmentCnt)) { edgeObjIds.Add(item); } } } } } DetermineChainSelection(); DeterminePreviews(); }
public static void SwitchDelete(PlanetFactory factory, List <int> objectIds) { if (objectIds.Count <= 0) { return; } if (NebulaModAPI.IsMultiplayerActive) { IMultiplayerSession session = NebulaModAPI.MultiplayerSession; int planetId = session.Factories.TargetPlanet != NebulaModAPI.PLANET_NONE ? session.Factories.TargetPlanet : factory.planet?.id ?? -1; if (session.LocalPlayer.IsHost || !session.Factories.IsIncomingRequest.Value) { session.Network.SendPacket(new FastRemoveRequestPacket(planetId, objectIds.ToArray(), Array.Empty <int>(), session.Factories.PacketAuthor == NebulaModAPI.AUTHOR_NONE ? session.LocalPlayer.Id : session.Factories.PacketAuthor, false)); } if (!session.LocalPlayer.IsHost && !session.Factories.IsIncomingRequest.Value) { return; } } if (objectIds.Count < 25) { RegularDeleteEntities(factory, objectIds); return; } if (BlueprintTweaksPlugin.useFastDismantle.Value) { var player = GameMain.mainPlayer; PlayerAction_Build actionBuild = player.controller.actionBuild; float divLine = GetDivideLine(factory, actionBuild, objectIds); BPGratBox boundingBox = BlueprintUtils.GetBoundingRange(factory.planet, factory.planet.aux, objectIds.ToArray(), objectIds.Count, divLine); HashSet <int> edgeObjIds = new HashSet <int>(); int segmentCnt = 200; if (GameMain.localPlanet?.aux?.activeGrid != null) { segmentCnt = GameMain.localPlanet.aux.activeGrid.segment; } foreach (int objectId in objectIds) { if (objectId <= 0 || factory.entityPool[objectId].id != objectId) { continue; } if (boundingBox.IsOnEdgeOfGratBox(factory.entityPool[objectId].pos, segmentCnt)) { edgeObjIds.Add(objectId); } } if (edgeObjIds.Count == 0) { foreach (int objectId in objectIds) { if (objectId <= 0 || factory.entityPool[objectId].beltId <= 0) { continue; } RegularDeleteEntities(factory, objectIds); return; } } FastDeleteEntities(factory, objectIds, edgeObjIds.ToList()); } else { RegularDeleteEntities(factory, objectIds); } }