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