示例#1
0
        public static bool CheckBuildConditionsFast()
        {
            var actionBuild = GameMain.data.mainPlayer.controller.actionBuild;

            bool flag = true;

            foreach (var buildPreview in actionBuild.buildPreviews)
            {
                if (buildPreview.condition != EBuildCondition.Ok)
                {
                    flag = false;
                    if (!actionBuild.cursorWarning)
                    {
                        actionBuild.cursorWarning = true;
                        actionBuild.cursorText    = buildPreview.conditionText;
                    }
                }
            }
            if (flag && actionBuild.waitConfirm)
            {
                actionBuild.cursorText = "点击鼠标建造".Translate();
            }
            if (!flag && !VFInput.onGUI)
            {
                UICursor.SetCursor(ECursor.Ban);
            }

            return(flag);
        }
        public static void CheckBuildConditions_Postfix(PlayerAction_Build __instance, ref bool __result)
        {
            var ci = cachedInserters;

            if (CopyInserters.copyEnabled && ci.Count > 0)
            {
                __instance.cursorText        = __instance.prepareCursorText;
                __instance.prepareCursorText = string.Empty;
                __instance.cursorWarning     = false;
                UICursor.SetCursor(ECursor.Default);
                var flag = true;
                for (int i = 0; i < __instance.buildPreviews.Count; i++)
                {
                    BuildPreview buildPreview = __instance.buildPreviews[i];
                    bool         isInserter   = buildPreview.desc.isInserter;
                    bool         isConnected  = buildPreview.inputObjId != 0 || buildPreview.outputObjId != 0;
                    if (isInserter && (
                            buildPreview.condition == EBuildCondition.TooFar ||
                            buildPreview.condition == EBuildCondition.TooClose ||
                            buildPreview.condition == EBuildCondition.OutOfReach ||
                            // the following fix an incompatibility with AdvanceBuildDestruct where inserter are tagged ascolliding even if they are not
                            (buildPreview.condition == EBuildCondition.Collide && isConnected)
                            ))
                    {
                        buildPreview.condition = EBuildCondition.Ok;
                    }

                    if (buildPreview.condition != EBuildCondition.Ok)
                    {
                        flag = false;
                        if (!__instance.cursorWarning)
                        {
                            __instance.cursorWarning = true;
                            __instance.cursorText    = buildPreview.conditionText;
                        }
                    }
                }

                if (!flag && !VFInput.onGUI)
                {
                    UICursor.SetCursor(ECursor.Ban);
                }

                __result = flag;
            }
        }
示例#3
0
            public static void PlayerAction_BuildCheckBuildConditionsPostfix(PlayerAction_Build __instance, ref bool __result)
            {
                var ci = PatchCopyInserters.cachedInserters;

                if (CopyInserters.copyEnabled && ci.Count > 0)
                {
                    __instance.cursorText        = __instance.prepareCursorText;
                    __instance.prepareCursorText = string.Empty;
                    __instance.cursorWarning     = false;
                    UICursor.SetCursor(ECursor.Default);
                    var flag = true;
                    for (int i = 0; i < __instance.buildPreviews.Count; i++)
                    {
                        BuildPreview buildPreview = __instance.buildPreviews[i];
                        bool         isInserter   = buildPreview.desc.isInserter;

                        if (isInserter && buildPreview.ignoreCollider && (
                                buildPreview.condition == EBuildCondition.TooFar ||
                                buildPreview.condition == EBuildCondition.TooClose ||
                                buildPreview.condition == EBuildCondition.OutOfReach))
                        {
                            buildPreview.condition = EBuildCondition.Ok;
                        }

                        if (buildPreview.condition != EBuildCondition.Ok)
                        {
                            flag = false;
                            if (!__instance.cursorWarning)
                            {
                                __instance.cursorWarning = true;
                                __instance.cursorText    = buildPreview.conditionText;
                            }
                        }
                    }

                    if (!flag && !VFInput.onGUI)
                    {
                        UICursor.SetCursor(ECursor.Ban);
                    }

                    __result = flag;
                }
            }
示例#4
0
            public static bool DetermineDestructPreviewsPatch(PlayerAction_Build __instance,
                                                              ref NearColliderLogic ___nearcdLogic,
                                                              ref PlanetFactory ___factory)
            {
                if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.LeftControl))
                {
                    if (!VFInput.onGUI)
                    {
                        UICursor.SetCursor(ECursor.Delete);
                    }
                }
                else
                {
                    return(true);
                }

                if (!Utils.CheckIfInBuildDistance(__instance.cursorTarget))
                {
                    // Out of reach
                    UnityEngine.Debug.Log("out of reach");
                    return(true);
                }

                List <EntityData> deleteEntitiesList = new List <EntityData>();
                ItemProto         itemProto          = Traverse.Create(__instance).Method(
                    "GetItemProto", __instance.castObjId).GetValue <ItemProto>();

                __instance.ClearBuildPreviews();

                if (VFInput.reformMinusKey.onDown)
                {
                    if (__instance.reformSize >= 0)
                    {
                        __instance.reformSize--;
                    }
                }

                if (VFInput.reformPlusKey.onDown)
                {
                    if (__instance.reformSize < _configDisassemblingRadiusMax.Value)
                    {
                        __instance.reformSize++;
                    }
                }

                // Management of the sphere delete
                if (Input.GetKey(KeyCode.LeftControl))
                {
                    int[] buildingIdsToDelete = new int[_maxArrayOfBuildingSize.Value];
                    if (itemProto != null)
                    {
                        ___nearcdLogic.GetBuildingsInAreaNonAlloc(__instance.castObjPos, __instance.reformSize, buildingIdsToDelete);
                    }
                    else
                    {
                        ___nearcdLogic.GetBuildingsInAreaNonAlloc(__instance.cursorTarget, __instance.reformSize, buildingIdsToDelete);
                    }

                    List <int> listBuildingIdsToDelete = new List <int>();

                    foreach (var id in buildingIdsToDelete)
                    {
                        if (id != 0)
                        {
                            listBuildingIdsToDelete.Add(id);
                        }
                    }

                    foreach (var item in listBuildingIdsToDelete)
                    {
                        deleteEntitiesList.Add(___factory.entityPool[item]);
                    }

                    // Management of both
                    if (Input.GetKey(KeyCode.LeftShift))
                    {
                        if (itemProto != null)
                        {
                            deleteEntitiesList = Utils.GetEntitySortedByTypeAndRadius(itemProto, deleteEntitiesList,
                                                                                      __instance.castObjPos, __instance.reformSize);
                        }
                    }
                }

                // Management of the Mass Item delete
                if (Input.GetKey(KeyCode.LeftShift) && !Input.GetKey(KeyCode.LeftControl))
                {
                    __instance.previewPose.position = Vector3.zero;
                    __instance.previewPose.rotation = Quaternion.identity;
                    if ((uint)__instance.castObjId > 0U)
                    {
                        if (itemProto != null)
                        {
                            if ((uint)___factory.entityPool[__instance.castObjId].beltId > 0U)
                            {
                                CargoPath pathByBeltId = Utils.GetPathWithBeltId(___factory,
                                                                                 ___factory.entityPool[__instance.castObjId].beltId);
                                deleteEntitiesList = Utils.GetBeltsEntitiesByCargoPathBuildRange(___factory, pathByBeltId);
                            }
                            else
                            {
                                // deleteEntitiesList = Utils.GetEntitiesByProtoBuildRange(___factory, itemProto);
                                return(true);
                            }
                        }
                    }
                }


                foreach (var entityData in deleteEntitiesList)
                {
                    __instance.AddBuildPreview(new BuildPreview());
                }

                // Common Code
                for (int index = 0; index < __instance.buildPreviews.Count; ++index)
                {
                    BuildPreview buildPreview = __instance.buildPreviews[index];
                    ItemProto    itemProto2   = Traverse.Create(__instance).Method(
                        "GetItemProto", deleteEntitiesList[index].id).GetValue <ItemProto>();
                    buildPreview.item  = itemProto2;
                    buildPreview.desc  = itemProto2.prefabDesc;
                    buildPreview.lpos  = deleteEntitiesList[index].pos;
                    buildPreview.lrot  = deleteEntitiesList[index].rot;
                    buildPreview.objId = deleteEntitiesList[index].id;
                    int num = buildPreview.desc.lodCount <= 0
                        ? 0
                        : ((Object)buildPreview.desc.lodMeshes[0] != (Object)null ? 1 : 0);
                    buildPreview.needModel  = num != 0;
                    buildPreview.isConnNode = true;
                    if (buildPreview.desc.isInserter)
                    {
                        Pose pose = Traverse.Create(__instance).Method("GetObjectPose2", buildPreview.objId)
                                    .GetValue <Pose>();
                        buildPreview.lpos2 = pose.position;
                        buildPreview.lrot2 = pose.rotation;
                    }

                    if ((buildPreview.lpos - __instance.player.position).sqrMagnitude >
                        __instance.player.mecha.buildArea *
                        __instance.player.mecha.buildArea)
                    {
                        buildPreview.condition   = EBuildCondition.OutOfReach;
                        __instance.cursorText    = "目标超出范围".Translate();
                        __instance.cursorWarning = true;
                    }
                    else
                    {
                        buildPreview.condition = EBuildCondition.Ok;
                        __instance.cursorText  = "拆除".Translate() + buildPreview.item.name;
                    }

                    if (buildPreview.desc.multiLevel)
                    {
                        ___factory.ReadObjectConn(buildPreview.objId, 15, out bool _, out int otherObjId,
                                                  out int _);
                        if ((uint)otherObjId > 0U)
                        {
                            buildPreview.condition = EBuildCondition.Covered;
                            __instance.cursorText  = buildPreview.conditionText;
                        }
                    }
                }


                return(false);
            }
示例#5
0
        public static bool DetermineBuildPreviewsPrefix(ref PlayerAction_Build __instance)
        {
            CommandState cmd = __instance.controller.cmd;
            //__instance.waitConfirm = false;
            bool flag  = false;
            bool flag2 = false;

            if (__instance.handPrefabDesc == null)
            {
                if (cmd.mode == 4)
                {
                    int[] consumeRegister = GameMain.statistics.production.factoryStatPool[__instance.factory.index].consumeRegister;
                    if (__instance.reformSize < 1)
                    {
                        __instance.reformSize = 1;
                    }
                    else if (__instance.reformSize > 30)
                    {
                        __instance.reformSize = 30;
                    }
                    if ((__instance.reformCenterPoint - __instance.player.position).sqrMagnitude > __instance.player.mecha.buildArea * __instance.player.mecha.buildArea)
                    {
                        if (!VFInput.onGUI)
                        {
                            __instance.cursorText    = "目标超出范围".Translate();
                            __instance.cursorWarning = true;
                            UICursor.SetCursor(ECursor.Ban);
                        }
                    }
                    else
                    {
                        if (!VFInput.onGUI)
                        {
                            UICursor.SetCursor(ECursor.Reform);
                        }
                        bool flag24 = false;
                        if (VFInput._reformPlusKey.onDown)
                        {
                            if (__instance.reformSize < 30)
                            {
                                __instance.reformSize++;
                                flag24 = true;
                                for (int num61 = 0; num61 < __instance.reformSize * __instance.reformSize; num61++)
                                {
                                    __instance.reformIndices[num61] = -1;
                                }
                            }
                        }
                        else if (VFInput._reformMinusKey.onDown && __instance.reformSize > 1)
                        {
                            __instance.reformSize--;
                            flag24 = true;
                        }
                        float radius = 0.99094594f * (float)__instance.reformSize;
                        int   num62  = __instance.factory.ComputeFlattenTerrainReform(__instance.reformPoints, __instance.reformCenterPoint, radius, __instance.reformPointsCount, 3f, 1f);
                        if (__instance.cursorValid && !VFInput.onGUI)
                        {
                            if (num62 > 0)
                            {
                                string soilCount = num62.ToString();

                                if (FreeFoundationsFreeSoilPlugin.freeSoilEnabled)
                                {
                                    soilCount = "0";
                                }
                                //Debug.Log("IF");
                                __instance.cursorText = string.Concat(new string[]
                                {
                                    "沙土消耗".Translate(),
                                    " ",
                                    soilCount,
                                    " ",
                                    "个沙土".Translate(),
                                    "\n",
                                    "改造大小".Translate(),
                                    __instance.reformSize.ToString(),
                                    "x",
                                    __instance.reformSize.ToString(),
                                    (FreeFoundationsFreeSoilPlugin.freeSoilEnabled) ?       "\n       (Free Soil is Enabled)" : string.Empty,
                                    (FreeFoundationsFreeSoilPlugin.freeFoundationEnabled) ? "\n(Free Foundations is Enabled)" : string.Empty
                                });
                            }
                            else if (num62 == 0)
                            {
                                __instance.cursorText = "改造大小".Translate() + __instance.reformSize.ToString() + "x" + __instance.reformSize.ToString() +
                                                        ((FreeFoundationsFreeSoilPlugin.freeSoilEnabled) ?       "\n       (Free Soil is Enabled)" : string.Empty) +
                                                        ((FreeFoundationsFreeSoilPlugin.freeFoundationEnabled) ? "\n(Free Foundations is Enabled)" : string.Empty);
                            }
                            else
                            {
                                int num63 = -num62;



                                string soilCount = num63.ToString();

                                if (!FreeFoundationsFreeSoilPlugin.collectSoilEnabled)
                                {
                                    soilCount = "0";
                                }
                                //Debug.Log("ELSE");



                                __instance.cursorText = string.Concat(new string[]
                                {
                                    "沙土获得".Translate(),
                                    " ",
                                    soilCount,
                                    " ",
                                    "个沙土".Translate(),
                                    "\n",
                                    "改造大小".Translate(),
                                    __instance.reformSize.ToString(),
                                    "x",
                                    __instance.reformSize.ToString(),
                                    (FreeFoundationsFreeSoilPlugin.freeSoilEnabled) ?       "\n       (Free Soil is Enabled)" : string.Empty,
                                    (FreeFoundationsFreeSoilPlugin.freeFoundationEnabled) ? "\n(Free Foundations is Enabled)" : string.Empty
                                });
                            }
                            if (VFInput._buildConfirm.pressing)
                            {
                                bool flag25 = false;
                                if (VFInput._buildConfirm.onDown)
                                {
                                    flag25 = true;
                                    __instance.reformMouseOnDown = true;
                                }
                                if (__instance.reformMouseOnDown)
                                {
                                    __instance.inReformOperation = true;
                                    if (__instance.reformChangedPoint.x != __instance.reformCenterPoint.x || __instance.reformChangedPoint.y != __instance.reformCenterPoint.y || __instance.reformChangedPoint.z != __instance.reformCenterPoint.z || flag24)
                                    {
                                        bool doItFoundation = true;
                                        if (FreeFoundationsFreeSoilPlugin.freeFoundationEnabled)
                                        {
                                            doItFoundation = __instance.handItem.BuildMode == 4;
                                        }
                                        else
                                        {
                                            doItFoundation = __instance.handItem.BuildMode == 4 && __instance.player.package.GetItemCount(__instance.handItem.ID) + __instance.player.inhandItemCount >= __instance.reformPointsCount;
                                        }
                                        if (doItFoundation)
                                        {
                                            bool doItSoil = false;

                                            if (FreeFoundationsFreeSoilPlugin.freeSoilEnabled || !FreeFoundationsFreeSoilPlugin.collectSoilEnabled)
                                            {
                                                doItSoil = __instance.player.sandCount >= 0;
                                            }
                                            else
                                            {
                                                doItSoil = __instance.player.sandCount - num62 >= 0;
                                            }
                                            //num64 = 100000;
                                            if (doItSoil)
                                            {
                                                //Debug.Log(num62);
                                                __instance.factory.FlattenTerrainReform(__instance.reformCenterPoint, radius, __instance.reformSize, __instance.veinBuried, 3f);
                                                VFAudio.Create("reform-terrain", null, __instance.reformCenterPoint, true);

                                                if (num62 < 0)
                                                {
                                                    if (FreeFoundationsFreeSoilPlugin.collectSoilEnabled)
                                                    {
                                                        __instance.player.SetSandCount(__instance.player.sandCount - num62);
                                                    }
                                                    else
                                                    {
                                                        __instance.player.SetSandCount(__instance.player.sandCount);
                                                    }
                                                }
                                                else
                                                {
                                                    if (FreeFoundationsFreeSoilPlugin.freeSoilEnabled)
                                                    {
                                                        __instance.player.SetSandCount(__instance.player.sandCount);
                                                    }
                                                    else
                                                    {
                                                        __instance.player.SetSandCount(__instance.player.sandCount - num62);
                                                    }
                                                }

                                                int num65 = __instance.reformSize * __instance.reformSize;
                                                for (int num66 = 0; num66 < num65; num66++)
                                                {
                                                    int            num67          = __instance.reformIndices[num66];
                                                    PlatformSystem platformSystem = __instance.factory.platformSystem;
                                                    if (num67 >= 0)
                                                    {
                                                        int num68 = platformSystem.GetReformType(num67);
                                                        int num69 = platformSystem.GetReformColor(num67);
                                                        if (num68 != __instance.reformType || num69 != __instance.reformColor)
                                                        {
                                                            __instance.factory.platformSystem.SetReformType(num67, __instance.reformType);
                                                            __instance.factory.platformSystem.SetReformColor(num67, __instance.reformColor);
                                                        }
                                                    }
                                                }
                                                int num70 = __instance.reformPointsCount;
                                                if (__instance.player.inhandItemCount > 0)
                                                {
                                                    int num71 = (__instance.reformPointsCount >= __instance.player.inhandItemCount) ? __instance.player.inhandItemCount : __instance.reformPointsCount;
                                                    __instance.player.UseHandItems(num71);
                                                    num70 -= num71;
                                                }
                                                int id = __instance.handItem.ID;
                                                consumeRegister[id] += __instance.reformPointsCount;
                                                __instance.player.package.TakeTailItems(ref id, ref num70, false);
                                                GameMain.gameScenario.NotifyOnBuild(__instance.player.planetId, __instance.handItem.ID, 0);
                                            }
                                            else if (flag25)
                                            {
                                                //Debug.Log("No1");
                                                UIRealtimeTip.Popup("沙土不足".Translate(), true, 0);
                                            }
                                        }
                                        else if (flag25)
                                        {
                                            //Debug.Log("No2");
                                            UIRealtimeTip.Popup("物品不足".Translate(), true, 1);
                                        }
                                    }
                                }
                                else
                                {
                                    __instance.inReformOperation = false;
                                }
                                __instance.reformChangedPoint = __instance.reformCenterPoint;
                            }
                            else
                            {
                                __instance.inReformOperation  = false;
                                __instance.reformChangedPoint = Vector3.zero;
                                __instance.reformMouseOnDown  = false;
                            }
                        }
                    }
                }
                else
                {
                    // Just do original code instead
                    return(true);
                }
                __instance.ClearBuildPreviews();
            }
            else
            {
                return(true);
            }
            if (!flag)
            {
                UIRoot.instance.uiGame.CloseInserterBuildTip();
            }
            if (!flag2)
            {
                UIRoot.instance.uiGame.beltBuildTip.SetOutputEntity(0, -1);
                UIRoot.instance.uiGame.CloseBeltBuildTip();
            }


            // Don't execute original put original above instead?
            return(false);
        }
示例#6
0
        public static bool DestructMainLogic_Prefix(ref PlayerAction_Build __instance)
        {
            if (__instance.player.planetData.type == EPlanetType.Gas)
            {
                multiDestructPossible = false;
            }
            else
            {
                multiDestructPossible = true;
            }

            if (IsMultiDestructAvailable() && multiDestructEnabled)
            {
                if (circleGizmo == null)
                {
                    circleGizmo = CircleGizmo.Create(1, __instance.groundTestPos, area);

                    circleGizmo.fadeOutScale = circleGizmo.fadeInScale = 1.8f;
                    circleGizmo.fadeOutTime  = circleGizmo.fadeInTime = 0.15f;
                    circleGizmo.color        = DESTRUCT_GIZMO_COLOR;
                    circleGizmo.autoRefresh  = true;
                    circleGizmo.Open();
                }

                circleGizmo.position = __instance.groundTestPos;
                circleGizmo.radius   = 1.2f * area;


                if (!VFInput.onGUI)
                {
                    UICursor.SetCursor(ECursor.Delete);
                }
                __instance.ClearBuildPreviews();
                int found = __instance.nearcdLogic.GetBuildingsInAreaNonAlloc(__instance.groundTestPos, area, _nearObjectIds);

                var ids = new HashSet <int>();
                for (int x = 0; x < found; x++)
                {
                    var objId = _nearObjectIds[x];
                    if (ids.Contains(objId))
                    {
                        continue;
                    }

                    ids.Add(objId);
                    ItemProto  itemProto = __instance.GetItemProto(objId);
                    PrefabDesc desc      = itemProto.prefabDesc;
                    if (
                        (itemProto.prefabDesc.isBelt && filter == EDestructFilter.Buildings) ||
                        (!itemProto.prefabDesc.isBelt && filter == EDestructFilter.Belts))
                    {
                        continue;
                    }

                    Pose objectPose = __instance.GetObjectPose(objId);

                    BuildPreview buildPreview = new BuildPreview
                    {
                        item       = itemProto,
                        desc       = itemProto.prefabDesc,
                        lpos       = objectPose.position,
                        lrot       = objectPose.rotation,
                        objId      = objId,
                        needModel  = desc.lodCount > 0 && desc.lodMeshes[0] != null,
                        isConnNode = true
                    };

                    bool isInserter = buildPreview.desc.isInserter;
                    if (isInserter)
                    {
                        Pose objectPose2 = __instance.GetObjectPose2(buildPreview.objId);
                        buildPreview.lpos2 = objectPose2.position;
                        buildPreview.lrot2 = objectPose2.rotation;
                    }

                    if (buildPreview.desc.multiLevel)
                    {
                        bool flag;
                        int  num;
                        int  num2;
                        __instance.factory.ReadObjectConn(buildPreview.objId, 15, out flag, out num, out num2);
                        if (num != 0)
                        {
                            _nearObjectIds[found++] = num;
                        }
                    }

                    __instance.AddBuildPreview(buildPreview);
                }

                // reverse list so the building on 'top' are deleted first
                __instance.buildPreviews.Reverse();
                __instance.DetermineMoreDestructionTargets();
                __instance.UpdatePreviews();
                __instance.UpdateGizmos();

                if ((VFInput._buildConfirm.onDown || VFInput._buildConfirm.pressing) && __instance.buildPreviews.Count > 0)
                {
                    Destruct(__instance);
                }

                return(false);
            }
            else
            {
                if (circleGizmo != null)
                {
                    circleGizmo.Close();
                    circleGizmo = null;
                }
                return(true);
            }
        }
        public static bool DetermineDestructPreviewsPatch(PlayerAction_Build __instance)
        {
            if (!Input.GetKey(KeyCode.LeftShift))
            {
                return(true);
            }
            var           _this   = __instance;
            PlanetFactory factory = Traverse.Create(_this).Field("factory").GetValue <PlanetFactory>();

            if (!VFInput.onGUI)
            {
                UICursor.SetCursor(ECursor.Delete);
            }
            _this.previewPose.position = Vector3.zero;
            _this.previewPose.rotation = Quaternion.identity;
            if (_this.castObjId > 0)
            {
                ItemProto itemProto = Traverse.Create(_this).Method("GetItemProto", _this.castObjId).GetValue <ItemProto>();
                if (itemProto != null)
                {
                    _this.ClearBuildPreviews();
                    List <EntityData> entityList;
                    if (factory.entityPool[_this.castObjId].beltId != 0)
                    {
                        var path = GetPathByBeltId(factory, factory.entityPool[_this.castObjId].beltId);
                        entityList = GetEntitysByPath(factory, path);
                    }
                    else
                    {
                        entityList = GetEntitysByProto(factory, itemProto, _this.castObjPos);
                    }
                    for (int i = 0; i < entityList.Count; i++)
                    {
                        _this.AddBuildPreview(new BuildPreview());
                    }
                    for (int i = 0; i < _this.buildPreviews.Count; i++)
                    {
                        BuildPreview buildPreview = _this.buildPreviews[i];
                        ItemProto    proto        = Traverse.Create(_this).Method("GetItemProto", entityList[i].id).GetValue <ItemProto>();
                        buildPreview.item  = proto;
                        buildPreview.desc  = proto.prefabDesc;
                        buildPreview.lpos  = entityList[i].pos;
                        buildPreview.lrot  = entityList[i].rot;
                        buildPreview.objId = entityList[i].id;
                        if (buildPreview.desc.lodCount > 0 && buildPreview.desc.lodMeshes[0] != null)
                        {
                            buildPreview.needModel = true;
                        }
                        else
                        {
                            buildPreview.needModel = false;
                        }
                        buildPreview.isConnNode = true;
                        bool isInserter = buildPreview.desc.isInserter;
                        if (isInserter)
                        {
                            Pose objectPose2 = Traverse.Create(_this).Method("GetObjectPose2", buildPreview.objId).GetValue <Pose>();
                            buildPreview.lpos2 = objectPose2.position;
                            buildPreview.lrot2 = objectPose2.rotation;
                        }
                        if ((buildPreview.lpos - _this.castObjPos).sqrMagnitude > DestructArea.Value * DestructArea.Value)
                        {
                            buildPreview.condition = EBuildCondition.OutOfReach;
                            _this.cursorText       = "目标超出范围".Translate();
                            _this.cursorWarning    = true;
                        }
                        else
                        {
                            buildPreview.condition = EBuildCondition.Ok;
                            _this.cursorText       = "拆除".Translate() + buildPreview.item.name;
                        }
                        if (buildPreview.desc.multiLevel)
                        {
                            bool flag;
                            int  num;
                            int  num2;
                            factory.ReadObjectConn(buildPreview.objId, 15, out flag, out num, out num2);
                            if (num != 0)
                            {
                                buildPreview.condition = EBuildCondition.Covered;
                                _this.cursorText       = buildPreview.conditionText;
                            }
                        }
                    }
                }
                else
                {
                    _this.ClearBuildPreviews();
                }
            }
            else
            {
                _this.ClearBuildPreviews();
            }
            return(false);
        }
示例#8
0
        public static bool CheckBuildConditionsFast()
        {
            var actionBuild = GameMain.data.mainPlayer.controller.actionBuild;

            var maxThreads        = Environment.ProcessorCount - 1;
            var runningThreads    = 0;
            var next              = -1;
            ManualResetEvent done = new ManualResetEvent(false);


            for (int i = 0; i < maxThreads; i++)
            {
                var threadId = i;
                ThreadPool.QueueUserWorkItem(_ =>
                {
                    int index;
                    Interlocked.Increment(ref runningThreads);
                    try
                    {
                        PlayerAction_Build ab = ClonePlayerAction_Build(actionBuild);
                        while ((index = Interlocked.Increment(ref next)) < actionBuild.buildPreviews.Count)
                        {
                            CheckBuildConditionsWorker(ab, actionBuild.buildPreviews[index]);
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.ToString());
                    }
                    finally
                    {
                        if (Interlocked.Decrement(ref runningThreads) == 0)
                        {
                            done.Set();
                        }
                    }
                });
            }

            // wait for all threadPool workers to terminate.
            done.WaitOne();

            bool flag = true;

            foreach (var buildPreview in actionBuild.buildPreviews)
            {
                if (buildPreview.condition != EBuildCondition.Ok)
                {
                    flag = false;
                    if (!actionBuild.cursorWarning)
                    {
                        actionBuild.cursorWarning = true;
                        actionBuild.cursorText    = buildPreview.conditionText;
                    }
                }
            }
            if (flag && actionBuild.waitConfirm)
            {
                actionBuild.cursorText = "点击鼠标建造".Translate();
            }
            if (!flag && !VFInput.onGUI)
            {
                UICursor.SetCursor(ECursor.Ban);
            }

            return(flag);
        }
        public static bool DetermineDestructPreviews(PlayerAction_Build __instance)
        {
            if (!Input.GetKey(AdvancedBuildDestruct.DestructKey.Value))
            {
                entityIdList.Clear();
                return(true);
            }
            var _this = __instance;

            if (!VFInput.onGUI)
            {
                UICursor.SetCursor(ECursor.Delete);
            }
            _this.previewPose.position = Vector3.zero;
            _this.previewPose.rotation = Quaternion.identity;
            if (_this.castObjId > 0)
            {
                ItemProto itemProto = _this.GetItemProto(_this.castObjId);
                if (itemProto.prefabDesc.isBelt)
                {
                    return(true);                             // 如果是传送带,则调用原版函数
                }
                if (itemProto != null)
                {
                    _this.ClearBuildPreviews();
                    FindEntitysByProto(_this.factory, itemProto, _this.castObjId);
                    for (int i = 0; i < entityList.Count; i++)
                    {
                        _this.AddBuildPreview(new BuildPreview());
                    }
                    int index = 0;
                    foreach (var entity in entityList)
                    {
                        BuildPreview buildPreview = _this.buildPreviews[index];
                        buildPreview.item  = itemProto;
                        buildPreview.desc  = itemProto.prefabDesc;
                        buildPreview.lpos  = entity.pos;
                        buildPreview.lrot  = entity.rot;
                        buildPreview.objId = entity.id;
                        if (buildPreview.desc.lodCount > 0 && buildPreview.desc.lodMeshes[0] != null)
                        {
                            buildPreview.needModel = true;
                        }
                        else
                        {
                            buildPreview.needModel = false;
                        }
                        buildPreview.isConnNode = true;
                        bool isInserter = buildPreview.desc.isInserter;
                        if (isInserter)
                        {
                            Pose objectPose2 = _this.GetObjectPose2(buildPreview.objId);
                            buildPreview.lpos2 = objectPose2.position;
                            buildPreview.lrot2 = objectPose2.rotation;
                        }
                        PlanetData planetData = _this.player.planetData;
                        Vector3    vector     = _this.player.position;
                        if (planetData.type == EPlanetType.Gas)
                        {
                            vector  = vector.normalized;
                            vector *= planetData.realRadius;
                        }
                        else
                        {
                            buildPreview.condition = EBuildCondition.Ok;
                            _this.cursorText       = "拆除".Translate() + buildPreview.item.name + "\r\n" + "连锁拆除提示".Translate();
                        }
                        if (buildPreview.desc.multiLevel)
                        {
                            bool flag;
                            int  num;
                            int  num2;
                            _this.factory.ReadObjectConn(buildPreview.objId, 15, out flag, out num, out num2);
                            if (num != 0)
                            {
                                buildPreview.condition = EBuildCondition.Covered;
                                _this.cursorText       = buildPreview.conditionText;
                            }
                        }
                        index++;
                    }
                }
                else
                {
                    _this.ClearBuildPreviews();
                }
            }
            else
            {
                _this.ClearBuildPreviews();
            }
            return(false);
        }
示例#10
0
            /// <summary>
            /// Orignal PlayerAction_Build::DetermineDestructPreviews
            /// </summary>
            public static void CreateEntityUpgradePreview(
                PlayerAction_Build __instance,
                List <int> idList,
                List <EObjectType> typeList,
                DeterminePreviews.PreviewsFilter filter
                )
            {
                if (!VFInput.onGUI)
                {
                    if (__instance.upgradeLevel == 1)
                    {
                        UICursor.SetCursor(ECursor.Upgrade);
                    }
                    else if (__instance.upgradeLevel == -1)
                    {
                        UICursor.SetCursor(ECursor.Downgrade);
                    }
                }

                __instance.previewPose.position = Vector3.zero;
                __instance.previewPose.rotation = Quaternion.identity;

                __instance.ClearBuildPreviews();
                foreach (int entityId in idList)
                {
                    ItemProto itemProto  = (ItemProto)Traverse.Create(__instance).Method("GetItemProto", entityId).GetValue();
                    Pose      objectPose = (Pose)Traverse.Create(__instance).Method("GetObjectPose", entityId).GetValue();

                    bool flag = false;
                    if (itemProto != null && itemProto.Grade > 0 && itemProto.Upgrades.Length > 0)
                    {
                        flag = true;
                    }

                    if (flag &&
                        filter(itemProto) == false)
                    {
                        __instance.AddBuildPreview(new BuildPreview());

                        BuildPreview buildPreview = __instance.buildPreviews[__instance.buildPreviews.Count - 1];
                        buildPreview.item  = itemProto;
                        buildPreview.desc  = itemProto.prefabDesc;
                        buildPreview.lpos  = objectPose.position;
                        buildPreview.lrot  = objectPose.rotation;
                        buildPreview.objId = entityId;

                        if (buildPreview.desc.lodCount > 0 && buildPreview.desc.lodMeshes[0] != null)
                        {
                            buildPreview.needModel = true;
                        }
                        else
                        {
                            buildPreview.needModel = false;
                        }
                        buildPreview.isConnNode = true;

                        if (buildPreview.desc.isInserter)
                        {
                            Pose objectPose2 = (Pose)Traverse.Create(__instance).Method("GetObjectPose2", buildPreview.objId).GetValue();
                            //Oringal pose objectPose2 = __instance.GetObjectPose2(buildPreview.objId);
                            buildPreview.lpos2 = objectPose2.position;
                            buildPreview.lrot2 = objectPose2.rotation;
                        }
                        if ((double)(buildPreview.lpos - __instance.player.position).sqrMagnitude > (double)__instance.player.mecha.buildArea * (double)__instance.player.mecha.buildArea)
                        {
                            buildPreview.condition   = EBuildCondition.OutOfReach;
                            __instance.cursorText    = "目标超出范围".Translate();
                            __instance.cursorWarning = true;
                        }
                        else
                        {
                            buildPreview.condition = EBuildCondition.Ok;
                            __instance.cursorText  = "升级".Translate() + buildPreview.item.name + "\r\n" + "连锁升级提示".Translate();
                        }
                    }
                }
            }
示例#11
0
            /// <summary>
            /// Orignal PlayerAction_Build::DetermineDestructPreviews
            /// </summary>
            public static void CreateEntityDestructPreview(
                PlayerAction_Build __instance,
                List <int> idList,
                List <EObjectType> typeList,
                DeterminePreviews.PreviewsFilter filter
                )
            {
                if (!VFInput.onGUI)
                {
                    UICursor.SetCursor(ECursor.Delete);
                }

                __instance.previewPose.position = Vector3.zero;
                __instance.previewPose.rotation = Quaternion.identity;

                __instance.ClearBuildPreviews();

                foreach (int entityId in idList)
                {
                    //int entityId = typeList[index] != EObjectType.Entity ? -entityIdList[index] : entityIdList[index];

                    ItemProto itemProto  = (ItemProto)Traverse.Create(__instance).Method("GetItemProto", entityId).GetValue();
                    Pose      objectPose = (Pose)Traverse.Create(__instance).Method("GetObjectPose", entityId).GetValue();

                    if (itemProto != null &&
                        filter(itemProto) == false)
                    {
                        //Add Build Preview
                        __instance.AddBuildPreview(new BuildPreview());

                        BuildPreview buildPreview = __instance.buildPreviews[__instance.buildPreviews.Count - 1];
                        buildPreview.item  = itemProto;
                        buildPreview.desc  = itemProto.prefabDesc;
                        buildPreview.lpos  = objectPose.position;
                        buildPreview.lrot  = objectPose.rotation;
                        buildPreview.objId = entityId;

                        int num = buildPreview.desc.lodCount <= 0 ? 0 : ((Object)buildPreview.desc.lodMeshes[0] != (Object)null ? 1 : 0);
                        buildPreview.needModel  = num != 0;
                        buildPreview.isConnNode = true;

                        if (buildPreview.desc.isInserter)
                        {
                            Pose objectPose2 = (Pose)Traverse.Create(__instance).Method("GetObjectPose2", buildPreview.objId).GetValue();
                            buildPreview.lpos2 = objectPose2.position;
                            buildPreview.lrot2 = objectPose2.rotation;
                        }

                        PlanetData planetData = __instance.player.planetData;
                        Vector3    vector3_1  = __instance.player.position;

                        if (planetData.type == EPlanetType.Gas)
                        {
                            vector3_1 = vector3_1.normalized;
                            Vector3 vector3_2 = vector3_1 * planetData.realRadius;
                        }
                        else
                        {
                            buildPreview.condition = EBuildCondition.Ok;
                            __instance.cursorText  = "拆除".Translate() + buildPreview.item.name + "\r\n" + "连锁拆除提示".Translate();
                        }

                        if (buildPreview.desc.multiLevel)
                        {
                            int           otherObjId;
                            PlanetFactory factory = Traverse.Create((object)__instance).Field("factory").GetValue <PlanetFactory>();
                            factory.ReadObjectConn(buildPreview.objId, 15, out bool _, out otherObjId, out int _);
                            if ((uint)otherObjId > 0U)
                            {
                                buildPreview.condition = EBuildCondition.Covered;
                                __instance.cursorText  = buildPreview.conditionText;
                            }
                        }
                    }
                }
            }