コード例 #1
0
ファイル: Extensions.cs プロジェクト: kremnev8/DSP-Mods
        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));
        }
コード例 #2
0
        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();
        }
コード例 #3
0
        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);
            }
        }