public static PastedEntity ConcurrentPasteBelt(int threadIndex, BeltCopy belt, Vector2 targetSpr, float yaw, int pasteIndex) { var actionBuild = _abs[threadIndex]; int pasteId = PASTE_INDEX_MULTIPLIER * pasteIndex + belt.originalId; if (!BlueprintManager.pastedEntities.TryGetValue(pasteId, out PastedEntity pastedEntity)) { BuildPreview bp = BuildPreview.CreateSingle(belt.itemProto, belt.itemProto.prefabDesc, false); pastedEntity = new PastedEntity() { pasteIndex = pasteIndex, pasteId = pasteId, status = EPastedStatus.NEW, type = EPastedType.BELT, sourceBelt = belt, buildPreview = bp, }; BlueprintManager.pastedEntities.TryAdd(pasteId, pastedEntity); lock (actionBuild.buildPreviews) { actionBuild.buildPreviews.Add(bp); } } else { pastedEntity.status = EPastedStatus.UPDATE; } Vector2 newRelative = belt.cursorRelativePos.Rotate(yaw * Mathf.Deg2Rad, belt.originalSegmentCount); Vector2 sprPos = newRelative + targetSpr; int newSegmentCount = Util.GetSegmentsCount(sprPos); float sizeDeviation = belt.originalSegmentCount / (float)newSegmentCount; sprPos = new Vector2(newRelative.x, newRelative.y * sizeDeviation) + targetSpr; Vector3 absoluteBeltPos = sprPos.SnapToGrid(belt.altitude * 1.3333333f / 2); // belts have always 0 yaw Quaternion absoluteBeltRot = Maths.SphericalRotation(absoluteBeltPos, 0f); Pose pose = new Pose(absoluteBeltPos, absoluteBeltRot); pastedEntity.objId = InserterPoses.AddOverride(pose, belt.itemProto); pastedEntity.pose = pose; pastedEntity.buildPreview.lpos = absoluteBeltPos; pastedEntity.buildPreview.lrot = absoluteBeltRot; pastedEntity.buildPreview.condition = EBuildCondition.Ok; return(pastedEntity); }
public static void PasteBelt(int index, BeltCopy belt, Vector2 targetSpr, float yaw) { Vector2 newRelative = belt.cursorRelativePos.Rotate(yaw * Mathf.Deg2Rad, belt.originalSegmentCount); Vector2 sprPos = newRelative + targetSpr; float rawLatitudeIndex = (sprPos.x - Mathf.PI / 2) / 6.2831855f * 200; int latitudeIndex = Mathf.FloorToInt(Mathf.Max(0f, Mathf.Abs(rawLatitudeIndex) - 0.1f)); int newSegmentCount = PlanetGrid.DetermineLongitudeSegmentCount(latitudeIndex, 200); float sizeDeviation = belt.originalSegmentCount / (float)newSegmentCount; sprPos = new Vector2(newRelative.x, newRelative.y * sizeDeviation) + targetSpr; Vector3 absoluteBeltPos = sprPos.SnapToGrid(belt.altitude * 1.3333333f / 2); // belts have always 0 yaw Quaternion absoluteBeltRot = Maths.SphericalRotation(absoluteBeltPos, 0f); BuildPreview bp = BuildPreview.CreateSingle(belt.itemProto, belt.itemProto.prefabDesc, false); bp.lpos = absoluteBeltPos; bp.lrot = absoluteBeltRot; bp.outputToSlot = -1; bp.outputFromSlot = 0; bp.inputFromSlot = -1; bp.inputToSlot = 1; bp.outputOffset = 0; bp.inputOffset = 0; Pose pose = new Pose(absoluteBeltPos, absoluteBeltRot); int objId = InserterPoses.AddOverride(pose, belt.itemProto); pastedEntities.Add(belt.originalId, new PastedEntity() { type = EPastedType.BELT, index = index, pose = pose, objId = objId, buildPreview = bp, }); previews.Add(bp); }
public static BeltCopy CopyBelt(EntityData sourceEntity, EntityData referenceEntity) { PlanetFactory factory = GameMain.data.localPlanet.factory; ItemProto sourceEntityProto = LDB.items.Select(sourceEntity.protoId); if (!sourceEntityProto.prefabDesc.isBelt) { return(null); } BeltComponent belt = factory.cargoTraffic.beltPool[sourceEntity.beltId]; Vector2 sourceSprPos = sourceEntity.pos.ToSpherical(); BeltCopy copiedBelt = new BeltCopy() { originalId = sourceEntity.id, protoId = sourceEntityProto.ID, itemProto = sourceEntityProto, altitude = Mathf.RoundToInt(2 * (sourceEntity.pos.magnitude - GameMain.localPlanet.realRadius - 0.2f) / 1.3333333f), backInputId = factory.cargoTraffic.beltPool[belt.backInputId].entityId, leftInputId = factory.cargoTraffic.beltPool[belt.leftInputId].entityId, rightInputId = factory.cargoTraffic.beltPool[belt.rightInputId].entityId, outputId = factory.cargoTraffic.beltPool[belt.outputId].entityId, }; factory.ReadObjectConn(sourceEntity.id, 0, out bool isOutput, out int otherId, out int otherSlot); if (otherId > 0 && factory.entityPool[otherId].beltId == 0) { copiedBelt.connectedBuildingId = otherId; copiedBelt.connectedBuildingIsOutput = isOutput; copiedBelt.connectedBuildingSlot = otherSlot; } factory.ReadObjectConn(sourceEntity.id, 1, out isOutput, out otherId, out otherSlot); if (otherId > 0 && factory.entityPool[otherId].beltId == 0) { copiedBelt.connectedBuildingId = otherId; copiedBelt.connectedBuildingIsOutput = isOutput; copiedBelt.connectedBuildingSlot = otherSlot; } if (sourceEntity.id == referenceEntity.id) { data.referencePos = sourceSprPos; } else { copiedBelt.originalSegmentCount = sourceSprPos.GetSegmentsCount(); copiedBelt.cursorRelativePos = (sourceSprPos - data.referencePos).Clamp(); } data.copiedBelts.Add(copiedBelt); factory.ReadObjectConn(sourceEntity.id, 4, out _, out otherId, out _); if (otherId != 0) { // only copy belt to belt inserter if both belts are part fo the blueprint factory.ReadObjectConn(otherId, 0, out _, out int endId, out _); factory.ReadObjectConn(otherId, 1, out _, out int startId, out _); int idToFind = sourceEntity.id == endId ? startId : endId; if (data.copiedBelts.FindIndex(x => x.originalId == idToFind) != -1) { EntityData inserterEntity = factory.entityPool[otherId]; CopyInserter(inserterEntity, sourceEntity); } } hasData = true; return(copiedBelt); }