public static bool GetReformIndexForPosition(ref PlatformSystem __instance, Vector3 pos, ref int __result) { pos.Normalize(); var num1 = Mathf.Asin(pos.y); var num2 = Mathf.Atan2(pos.x, -pos.z); //float f1 = num1 / (2* (float)Math.PI) * (float) __instance.segment; var f1 = num1 / 6.283185f * __instance.segment; float longitudeSegmentCount = PlatformSystem.DetermineLongitudeSegmentCount(Mathf.FloorToInt(Mathf.Abs(f1)), __instance.segment); // float f2 = num2 / (2* (float)Math.PI) * longitudeSegmentCount; var f2 = num2 / 6.283185f * longitudeSegmentCount; var f3 = Mathf.Round(f1 * 10f); var f4 = Mathf.Round(f2 * 10f); var num3 = Mathf.Abs(f3); var num4 = Mathf.Abs(f4); if (num3 % 2.0 != 1.0) { num3 = Mathf.FloorToInt(Mathf.Abs(f1) * 10f); if (num3 % 2.0 != 1.0) { ++num3; } } var num5 = (double)f3 < 0.0 ? -num3 : num3; if (num4 % 2.0 != 1.0) { num4 = Mathf.FloorToInt(Mathf.Abs(f2) * 10f); if (num4 % 2.0 != 1.0) { ++num4; } } var num6 = (double)f4 < 0.0 ? -num4 : num4; var _latitudeSeg = num5 / 10f; var _longitudeSeg = num6 / 10f; float num7 = __instance.latitudeCount / 10; __result = (double)_latitudeSeg >= (double)num7 || (double)_latitudeSeg <= -(double)num7 ? -1 : __instance.GetReformIndexForSegment(_latitudeSeg, _longitudeSeg); Patch.Debug("PlatformSystem - __result --> " + __result, LogLevel.Debug, true); return(false); }
public static bool ReformSnapTo( ref PlanetGrid __instance, Vector3 pos, int reformSize, int reformType, int reformColor, Vector3[] reformPoints, int[] reformIndices, PlatformSystem platform, out Vector3 reformCenter, ref int __result) { pos.Normalize(); var num1 = Mathf.Asin(pos.y); var num2 = Mathf.Atan2(pos.x, -pos.z); //float f1 = num1 / ( 2 * (float)Math.PI) * (float) __instance.segment; var f1 = num1 / 6.283185f * __instance.segment; var longitudeSegmentCount = PlanetGrid.DetermineLongitudeSegmentCount(Mathf.RoundToInt(Mathf.Abs(f1)), __instance.segment); float num3 = longitudeSegmentCount; var f2 = num2 / 6.283185f * num3; //float f2 = num2 / ( 2 * (float)Math.PI) * num3; var f3 = Mathf.Round(f1 * 10f); var f4 = Mathf.Round(f2 * 10f); var num4 = Mathf.Abs(f3); var num5 = Mathf.Abs(f4); var num6 = reformSize % 2; if (num4 % 2.0 != num6) { num4 = Mathf.FloorToInt(Mathf.Abs(f1) * 10f); if (num4 % 2.0 != num6) { ++num4; } } var num7 = (double)f3 < 0.0 ? -num4 : num4; if (num5 % 2.0 != num6) { num5 = Mathf.FloorToInt(Mathf.Abs(f2) * 10f); if (num5 % 2.0 != num6) { ++num5; } } var num8 = (double)f4 < 0.0 ? -num5 : num5; // float f5 = (float) ((double) num7 / 10.0 / (double) __instance.segment * 2 * (float)Math.PI); // float f6 = (float) ((double) num8 / 10.0 / (double) num3 * 2 * (float)Math.PI); var f5 = (float)(num7 / 10.0 / __instance.segment * 6.28318548202515); var f6 = (float)(num8 / 10.0 / num3 * 6.28318548202515); var y1 = Mathf.Sin(f5); var num9 = Mathf.Cos(f5); var num10 = Mathf.Sin(f6); var num11 = Mathf.Cos(f6); reformCenter = new Vector3(num9 * num10, y1, num9 * -num11); var num12 = 1 - reformSize; var num13 = 1 - reformSize; var index1 = 0; var num14 = 0; float num15 = platform.latitudeCount / 10; for (var index2 = 0; index2 < reformSize * reformSize; ++index2) { ++num14; var num16 = (float)((num7 + (double)num12) / 10.0); var _longitudeSeg = (float)((num8 + (double)num13) / 10.0); num13 += 2; if (num14 % reformSize == 0) { num13 = 1 - reformSize; num12 += 2; } if (num16 >= (double)num15 || num16 <= -(double)num15) { reformIndices[index2] = -1; } else { var latitudeIndex = Mathf.RoundToInt(Mathf.Abs(num16)); if (longitudeSegmentCount != PlanetGrid.DetermineLongitudeSegmentCount(latitudeIndex, __instance.segment)) { reformIndices[index2] = -1; } else { var reformIndexForSegment = platform.GetReformIndexForSegment(num16, _longitudeSeg); reformIndices[index2] = reformIndexForSegment; var reformType1 = platform.GetReformType(reformIndexForSegment); var reformColor1 = platform.GetReformColor(reformIndexForSegment); if (!platform.IsTerrainReformed(reformType1) && (reformType1 != reformType || reformColor1 != reformColor)) { var f7 = (float)(num16 / (double)__instance.segment * 6.28318548202515); // float f7 = (float) ((double) num16 / (double) __instance.segment * ( 2 * (float)Math.PI)); var f8 = (float)(_longitudeSeg / (double)num3 * 6.28318548202515); //float f8 = (float) ((double) _longitudeSeg / (double) num3 * ( 2 * (float)Math.PI)); var y2 = Mathf.Sin(f7); var num17 = Mathf.Cos(f7); var num18 = Mathf.Sin(f8); var num19 = Mathf.Cos(f8); reformPoints[index1] = new Vector3(num17 * num18, y2, num17 * -num19); ++index1; } } } } __result = index1; return(false); }
public static void OnUpdate(BuildTool_BlueprintPaste __instance) { if (!BlueprintCopyExtension.isEnabled) { return; } if (reformPreviews.Count <= 0) { return; } if (__instance.cannotBuild) { return; } tickCounter++; if (tickCounter >= 30) { tickCounter = 0; Vector3 center = Vector3.zero; tmpPoints.Clear(); PlatformSystem platformSystem = __instance.factory.platformSystem; foreach (ReformData preview in reformPreviews) { ReformBPUtils.GetSegmentCount(preview.latitude, preview.longitude, out float latCount, out float longCount, out int segmentCount); longCount = Mathf.Repeat(longCount, segmentCount); int reformIndex = platformSystem.GetReformIndexForSegment(latCount, longCount); if (reformIndex < 0) { continue; } int type = platformSystem.GetReformType(reformIndex); if (platformSystem.IsTerrainReformed(type)) { continue; } Vector3 pos = BlueprintUtils.GetDir(preview.longitude, preview.latitude); pos *= GameMain.localPlanet.realRadius + 0.2f; tmpPoints.Add(pos); center += pos; } lastCost = ReformBPUtils.ComputeFlattenTerrainReform(__instance.factory, tmpPoints, center); } string message = ""; int playerFoundationCount = __instance.player.package.GetItemCount(PlatformSystem.REFORM_ID); if (playerFoundationCount < tmpPoints.Count) { message = Format("NotEnoughFoundationsMessage".Translate(), tmpPoints.Count - playerFoundationCount) + "\n"; } else { message = Format("FoundCountMessage".Translate(), tmpPoints.Count) + "\n"; } if (__instance.cursorValid && !VFInput.onGUIOperate) { if (lastCost > 0) { __instance.actionBuild.model.cursorText = $"{message}{"沙土消耗".Translate()} {lastCost} {"个沙土".Translate()}"; } else if (lastCost == 0) { __instance.actionBuild.model.cursorText = $"{message}"; } else { int num2 = -lastCost; __instance.actionBuild.model.cursorText = $"{message}{"沙土获得".Translate()} {num2} {"个沙土".Translate()}"; } } }
public static bool CalculatePositions(BuildTool_BlueprintPaste tool, List <ReformData> reforms, Color[] colors) { ReformBPUtils.currentGrid = tool.factory.planet.aux.mainGrid; PlanetData planet = tool.factory.planet; PlatformSystem platformSystem = tool.factory.platformSystem; Vector3 center = Vector3.zero; tmpPoints.Clear(); foreach (ReformData preview in reforms) { ReformBPUtils.GetSegmentCount(preview.latitude, preview.longitude, out float latCount, out float longCount, out int segmentCount); longCount = Mathf.Repeat(longCount, segmentCount); int reformIndex = platformSystem.GetReformIndexForSegment(latCount, longCount); if (reformIndex < 0) { continue; } int type = platformSystem.GetReformType(reformIndex); if (platformSystem.IsTerrainReformed(type)) { continue; } Vector3 pos = BlueprintUtils.GetDir(preview.longitude, preview.latitude); pos *= planet.realRadius + 0.2f; tmpPoints.Add(pos); center += pos; } int cost = ReformBPUtils.ComputeFlattenTerrainReform(tool.factory, tmpPoints, center); if (NebulaModAPI.IsMultiplayerActive) { IMultiplayerSession session = NebulaModAPI.MultiplayerSession; if (!session.Factories.IsIncomingRequest.Value && !CheckItems(tool, cost, tmpPoints.Count)) { return(false); } if (session.LocalPlayer.IsHost) { int planetId = session.Factories.EventFactory?.planetId ?? GameMain.localPlanet?.id ?? -1; session.Network.SendPacketToStar(new ReformPasteEventPacket(planetId, reforms, colors, session.Factories.PacketAuthor == NebulaModAPI.AUTHOR_NONE ? session.LocalPlayer.Id : session.Factories.PacketAuthor), GameMain.galaxy.PlanetById(planetId).star.id); } //If client builds, he need to first send request to the host and wait for reply if (!session.LocalPlayer.IsHost && !session.Factories.IsIncomingRequest.Value) { session.Network.SendPacket(new ReformPasteEventPacket(GameMain.localPlanet?.id ?? -1, reforms, colors, session.Factories.PacketAuthor == NebulaModAPI.AUTHOR_NONE ? session.LocalPlayer.Id : session.Factories.PacketAuthor)); return(true); } } else { if (!CheckItems(tool, cost, tmpPoints.Count)) { return(false); } } if (colors != null && colors.Length > 0) { ApplyColors(tool, colors); } ReformBPUtils.FlattenTerrainReform(tool.factory, tmpPoints, center); VFAudio.Create("reform-terrain", null, center, true, 4); foreach (ReformData preview in reforms) { ReformBPUtils.GetSegmentCount(preview.latitude, preview.longitude, out float latCount, out float longCount, out int segmentCount); longCount = Mathf.Repeat(longCount, segmentCount); int reformIndex = platformSystem.GetReformIndexForSegment(latCount, longCount); if (reformIndex < 0) { continue; } int reformType = platformSystem.GetReformType(reformIndex); int reformColor = platformSystem.GetReformColor(reformIndex); if (reformType == preview.type && reformColor == preview.color) { continue; } platformSystem.SetReformType(reformIndex, preview.type); platformSystem.SetReformColor(reformIndex, preview.color); } return(true); }
public static void ItterateOnReform(BuildTool_BlueprintCopy __instance, BPGratBox box, Action <int, ReformData> action, bool fullCircle = false) { if (Mathf.Abs(box.y - box.w) < 0.005f) { return; } PlatformSystem platform = __instance.factory.platformSystem; if (platform == null) { return; } platform.EnsureReformData(); GetSegmentCount(box.startLatitudeRad, box.startLongitudeRad, out float startLatCount, out float startLongCount, out int startCount); GetSegmentCount(box.endLatitudeRad, box.endLongitudeRad, out float endLatCount, out float endLongCount, out int endCount); startLatCount = GridSnappingPatches.Snap(startLatCount); startLongCount = GridSnappingPatches.Snap(startLongCount); endLatCount = GridSnappingPatches.Snap(endLatCount); endLongCount = GridSnappingPatches.Snap(endLongCount); startLatCount = Mathf.Round(startLatCount * 10f); endLatCount = Mathf.Round(endLatCount * 10f); startLongCount = Mathf.Round(startLongCount * 10f); endLongCount = Mathf.Round(endLongCount * 10f); float latDelta = endLatCount - startLatCount; int segmentCount; float longDelta; if (startCount != endCount) { Vector2 center = GetSphericalCenter(box.startLatitudeRad, box.startLongitudeRad, box.endLatitudeRad, box.endLongitudeRad); GetSegmentCount(center.x, center.y, out float _, out float _, out int midCount); segmentCount = midCount; if (startCount == midCount) { GetSegmentCount(box.startLatitudeRad, box.endLongitudeRad, out float _, out float nlongCount); nlongCount = Mathf.Round(nlongCount * 10f); longDelta = nlongCount - startLongCount; } else { GetSegmentCount(box.endLatitudeRad, box.startLongitudeRad, out float _, out float nlongCount); nlongCount = Mathf.Round(nlongCount * 10f); longDelta = endLongCount - nlongCount; startLongCount = nlongCount; } } else { segmentCount = startCount; longDelta = endLongCount - startLongCount; } if (fullCircle) { longDelta = segmentCount * 10; } if (longDelta < 0) { longDelta = segmentCount * 10 + longDelta; } int latSize = Mathf.RoundToInt(latDelta) / 2; int longSize = Mathf.RoundToInt(longDelta) / 2; if (latSize == 0) { latSize = 1; } if (longSize == 0) { longSize = 1; } startLatCount += 1; startLongCount += 1; int latOffset = 0; int longOffset = 0; int longCounter = 0; float latCount = platform.latitudeCount / 10f; for (int i = 0; i < longSize * latSize; i++) { longCounter++; float currentLat = (startLatCount + latOffset) / 10f; float currentLong = (startLongCount + longOffset) / 10f; currentLong = Mathf.Repeat(currentLong, segmentCount); float latRad = (currentLat + 0.1f) / currentGrid.segment * 6.2831855f; float longRad = (currentLong + 0.1f) / segmentCount * 6.2831855f; longOffset += 2; if (longCounter % longSize == 0) { longOffset = 0; latOffset += 2; } if (currentLat >= latCount || currentLat <= -latCount) { continue; } int reformIndex = platform.GetReformIndexForSegment(currentLat, currentLong); int reformType = platform.GetReformType(reformIndex); int reformColor = platform.GetReformColor(reformIndex); if (!platform.IsTerrainReformed(reformType)) { continue; } ReformData reform = new ReformData { latitude = latRad, longitude = longRad, type = reformType, color = reformColor }; action(reformIndex, reform); } }
public static void Update(UIBuildingGrid __instance) { if (!BlueprintCopyExtension.isEnabled) { return; } Player mainPlayer = GameMain.mainPlayer; PlanetFactory planetFactory = GameMain.localPlanet?.factory; if (planetFactory == null) { return; } if (GameMain.localPlanet.type == EPlanetType.Gas) { return; } PlayerAction_Build actionBuild = mainPlayer?.controller.actionBuild; if (actionBuild == null) { return; } if (__instance.reformCursorMap == null) { return; } int maxLen = __instance.reformCursorMap.Length; PlatformSystem system = planetFactory.platformSystem; if (system == null) { return; } system.EnsureReformData(); if (actionBuild.blueprintMode == EBlueprintMode.None) { __instance.material.SetColor(cursorColor, Color.white); return; } float realRadius = GameMain.localPlanet.realRadius; __instance.displayScale = (realRadius + 0.2f) * 2f; if (currentFactory == null || currentFactory.index != planetFactory.index) { currentFactory = planetFactory; fakeReformData = new byte[system.maxReformCount]; Array.Copy(system.reformData, fakeReformData, system.maxReformCount); } if (actionBuild.blueprintMode == EBlueprintMode.Copy) { bool any = false; if (BlueprintCopyExtension.reformSelection.Count > 0) { __instance.material.SetColor(cursorColor, displayColor); foreach (var kv in BlueprintCopyExtension.reformSelection) { int index = kv.Key; if (index >= 0 && index < maxLen) { if (BlueprintCopyExtension.reformPreSelection.Count == 0) { fakeReformData[index] = 0; } __instance.reformCursorMap[index] = 1; } } any = true; } if (BlueprintCopyExtension.reformPreSelection.Count > 0) { __instance.material.SetColor(cursorColor, selectColor); foreach (var kv in BlueprintCopyExtension.reformPreSelection) { int index = kv.Key; if (index >= 0 && index < maxLen) { fakeReformData[index] = 0; __instance.reformCursorMap[index] = 1; } } any = true; } if (any) { __instance.material.SetColor(tintColor, Color.clear); __instance.gridRnd.enabled = true; __instance.material.SetFloat(reformMode, 1f); __instance.material.SetFloat(zMin, -1.5f); __instance.reformCursorBuffer.SetData(__instance.reformCursorMap); __instance.material.SetBuffer(cursorBuffer, __instance.reformCursorBuffer); ComputeBuffer reformDataBuffer = system.reformDataBuffer; reformDataBuffer.SetData(fakeReformData); __instance.material.SetBuffer(dataBuffer, reformDataBuffer); foreach (var kv in BlueprintCopyExtension.reformSelection) { int index = kv.Key; if (index >= 0 && index < maxLen) { if (BlueprintCopyExtension.reformPreSelection.Count == 0) { fakeReformData[index] = system.reformData[index]; } __instance.reformCursorMap[index] = 0; } } foreach (var kv in BlueprintCopyExtension.reformPreSelection) { int index = kv.Key; if (index >= 0 && index < maxLen) { fakeReformData[index] = system.reformData[index]; __instance.reformCursorMap[index] = 0; } } } } if (actionBuild.blueprintMode == EBlueprintMode.Paste) { ReformBPUtils.currentGrid = GameMain.localPlanet.aux.mainGrid; __instance.material.SetColor(cursorColor, displayColor); __instance.gridRnd.enabled = true; PlatformSystem platformSystem = __instance.reformMapPlanet.factory.platformSystem; if (BlueprintPasteExtension.reformPreviews.Count > 0) { foreach (ReformData reformPreview in BlueprintPasteExtension.reformPreviews) { ReformBPUtils.GetSegmentCount(reformPreview.latitude, reformPreview.longitude, out float latCount, out float longCount, out int segmentCount); longCount = Mathf.Repeat(longCount, segmentCount); int index = platformSystem.GetReformIndexForSegment(latCount, longCount); if (index >= 0 && index < maxLen) { __instance.reformCursorMap[index] = 1; } } __instance.material.SetColor(tintColor, Color.clear); __instance.material.SetFloat(reformMode, 1f); __instance.material.SetFloat(zMin, -1.5f); __instance.reformCursorBuffer.SetData(__instance.reformCursorMap); __instance.material.SetBuffer(cursorBuffer, __instance.reformCursorBuffer); foreach (ReformData reformPreview in BlueprintPasteExtension.reformPreviews) { ReformBPUtils.GetSegmentCount(reformPreview.latitude, reformPreview.longitude, out float latCount, out float longCount, out int segmentCount); longCount = Mathf.Repeat(longCount, segmentCount); int index = platformSystem.GetReformIndexForSegment(latCount, longCount); if (index >= 0 && index < maxLen) { __instance.reformCursorMap[index] = 0; } } } } }