use of com.ldtteam.structures.blueprints.v1.Blueprint in project Structurize by ldtteam.
the class GenerateAndSaveMessage method onExecute.
@Override
public void onExecute(NetworkEvent.Context ctxIn, boolean isLogicalServer) {
if (isLogicalServer) {
final Blueprint blueprint = Manager.getStructureFromFormula(width, length, height, frequency, equation, shape, block, block2, hollow);
blueprint.rotateWithMirror(BlockPosUtil.getRotationFromRotations(rotation), mirror ? Mirror.FRONT_BACK : Mirror.NONE, ctxIn.getSender().level);
// in an ideal world, we'd save the original shape and rotate only after the fact.
// but the client only has a pre-rotated blueprint to calculate the MD5 from...
final ByteArrayOutputStream stream = new ByteArrayOutputStream();
BlueprintUtil.writeToStream(stream, blueprint);
Structures.handleSaveSchematicMessage(stream.toByteArray(), true);
}
}
use of com.ldtteam.structures.blueprints.v1.Blueprint in project minecolonies by ldtteam.
the class WorkerUtil method findFirstLevelSign.
/**
* Find the first level in a structure and return it.
*
* @param structure the structure to scan.
* @return the position of the sign.
*/
@Nullable
public static BlockPos findFirstLevelSign(final Blueprint structure, final BlockPos pos) {
for (int j = 0; j < structure.getSizeY(); j++) {
for (int k = 0; k < structure.getSizeZ(); k++) {
for (int i = 0; i < structure.getSizeX(); i++) {
@NotNull final BlockPos localPos = new BlockPos(i, j, k);
final BlockInfo te = structure.getBlockInfoAsMap().get(localPos);
if (te != null) {
final CompoundNBT teData = te.getTileEntityData();
if (teData != null && teData.getString(LEVEL_SIGN_FIRST_ROW).equals(LEVEL_SIGN_TEXT)) {
// try to make an anchor in 0,0,0 instead of the middle of the structure
return pos.subtract(structure.getPrimaryBlockOffset()).offset(localPos);
}
}
}
}
}
return null;
}
use of com.ldtteam.structures.blueprints.v1.Blueprint in project minecolonies by ldtteam.
the class EventStructureManager method spawnTemporaryStructure.
/**
* Spawns the given structure at the blockpos and saves a backup for the previous blocks.
*
* @param structure the structure to spawn.
* @param eventID the id of the event.
*/
@Override
public boolean spawnTemporaryStructure(final Blueprint structure, final String schematicPath, final BlockPos targetSpawnPoint, final int eventID, final int rotations, final Mirror mirror) {
if (eventManager.getEventByID(eventID) == null) {
return false;
}
final World world = colony.getWorld();
final int y = BlueprintTagUtils.getNumberOfGroundLevels(structure, 4) - 1;
final BlockPos spawnPos = targetSpawnPoint.offset(0, -y, 0).offset(structure.getPrimaryBlockOffset());
final BlockPos zeroPos = spawnPos.subtract(structure.getPrimaryBlockOffset());
final BlockPos cornerPos = new BlockPos(zeroPos.getX() + structure.getSizeX() - 1, zeroPos.getY() + structure.getSizeY(), zeroPos.getZ() + structure.getSizeZ() - 1);
final BlockPos anchor = new BlockPos(zeroPos.getX() + structure.getSizeX() / 2, zeroPos.getY(), zeroPos.getZ() + structure.getSizeZ() / 2);
final String backupPath = Structures.SCHEMATICS_PREFIX + "/" + STRUCTURE_BACKUP_FOLDER + "/" + colony.getID() + "/" + colony.getDimension().location().getNamespace() + colony.getDimension().location().getPath() + "/" + anchor;
if (!ItemScanTool.saveStructureOnServer(world, zeroPos, cornerPos, backupPath, false)) {
// No structure spawn if we didn't successfully save the surroundings before
Log.getLogger().info("Failed to save schematics for event");
return false;
}
backupSchematics.put(anchor, eventID);
CreativeRaiderStructureHandler.loadAndPlaceStructureWithRotation(world, schematicPath, spawnPos, BlockPosUtil.getRotationFromRotations(rotations), mirror, true, colony.getID(), (IColonyRaidEvent) eventManager.getEventByID(eventID), null);
return true;
}
use of com.ldtteam.structures.blueprints.v1.Blueprint in project minecolonies by ldtteam.
the class ClientEventHandler method handleRenderBuildTool.
/**
* Renders building bounding boxes into the client
*
* @param event The caught event
* @param world The world in which to render
* @param player The player for which to render
*/
private static void handleRenderBuildTool(@NotNull final RenderWorldLastEvent event, final ClientWorld world, final PlayerEntity player) {
if (Settings.instance.getActiveStructure() == null) {
return;
}
final IColonyView colony = IColonyManager.getInstance().getClosestColonyView(world, new BlockPos(player.position()));
if (colony == null) {
return;
}
final BlockPos activePosition = Settings.instance.getPosition();
final Map<BlockPos, Triple<Blueprint, BlockPos, BlockPos>> newCache = new HashMap<>();
for (final IBuildingView buildingView : colony.getBuildings()) {
if (MinecoloniesAPIProxy.getInstance().getConfig().getClient().neighborbuildingrendering.get()) {
if (buildingView.getBuildingType() == ModBuildings.postBox || buildingView.getBuildingType() == ModBuildings.stash) {
continue;
}
final BlockPos currentPosition = buildingView.getPosition();
if (activePosition.closerThan(currentPosition, PREVIEW_RANGE)) {
if (blueprintCache.containsKey(currentPosition)) {
newCache.put(currentPosition, blueprintCache.get(currentPosition));
continue;
}
final TileEntity tile = world.getBlockEntity(buildingView.getID());
String schematicName = buildingView.getSchematicName();
if (tile instanceof IBlueprintDataProvider) {
if (!((IBlueprintDataProvider) tile).getSchematicName().isEmpty()) {
schematicName = ((IBlueprintDataProvider) tile).getSchematicName().replaceAll("\\d$", "");
}
}
final StructureName sn = new StructureName(Structures.SCHEMATICS_PREFIX, buildingView.getStyle(), schematicName + buildingView.getBuildingMaxLevel());
final String structureName = sn.toString();
final String md5 = Structures.getMD5(structureName);
final IStructureHandler wrapper = new LoadOnlyStructureHandler(world, buildingView.getID(), structureName, new PlacementSettings(), true);
if (!wrapper.hasBluePrint() || !wrapper.isCorrectMD5(md5)) {
if (alreadyRequestedStructures.contains(structureName)) {
continue;
}
alreadyRequestedStructures.add(structureName);
Log.getLogger().error("Couldn't find schematic: " + structureName + " requesting to server if possible.");
if (ServerLifecycleHooks.getCurrentServer() == null) {
Network.getNetwork().sendToServer(new SchematicRequestMessage(structureName));
}
continue;
}
final Blueprint blueprint = wrapper.getBluePrint();
final Mirror mirror = buildingView.isMirrored() ? Mirror.FRONT_BACK : Mirror.NONE;
blueprint.rotateWithMirror(BlockPosUtil.getRotationFromRotations(buildingView.getRotation()), mirror, world);
final BlockPos primaryOffset = blueprint.getPrimaryBlockOffset();
final BlockPos boxStartPos = currentPosition.subtract(primaryOffset);
final BlockPos size = new BlockPos(blueprint.getSizeX(), blueprint.getSizeY(), blueprint.getSizeZ());
final BlockPos boxEndPos = boxStartPos.offset(size).subtract(new BlockPos(1, 1, 1));
blueprint.setRenderSource(buildingView.getID());
if (buildingView.getBuildingLevel() < buildingView.getBuildingMaxLevel()) {
newCache.put(currentPosition, new Triple(blueprint, boxStartPos, boxEndPos));
} else {
newCache.put(currentPosition, new Triple<>(null, boxStartPos, boxEndPos));
}
}
}
}
blueprintCache = newCache;
for (final Map.Entry<BlockPos, Triple<Blueprint, BlockPos, BlockPos>> nearbyBuilding : blueprintCache.entrySet()) {
final Triple<Blueprint, BlockPos, BlockPos> buildingData = nearbyBuilding.getValue();
final BlockPos position = nearbyBuilding.getKey();
if (buildingData.a != null) {
StructureClientHandler.renderStructureAtPos(buildingData.a, event.getPartialTicks(), position, event.getMatrixStack());
}
RenderUtils.renderBox(buildingData.b, buildingData.c, 0, 0, 1, 1.0F, 0.002D, event.getMatrixStack(), linesWithCullAndDepth.get());
}
}
use of com.ldtteam.structures.blueprints.v1.Blueprint in project minecolonies by ldtteam.
the class AbstractSchematicProvider method getRotation.
@Override
public int getRotation() {
if (cachedRotation != -1) {
return cachedRotation;
}
final StructureName structureName = new StructureName(Structures.SCHEMATICS_PREFIX, style, this.getSchematicName() + Math.max(1, buildingLevel));
try {
final LoadOnlyStructureHandler structure = new LoadOnlyStructureHandler(colony.getWorld(), getPosition(), structureName.toString(), new PlacementSettings(), true);
final Blueprint blueprint = structure.getBluePrint();
if (blueprint != null) {
final BlockState structureState = structure.getBluePrint().getBlockInfoAsMap().get(structure.getBluePrint().getPrimaryBlockOffset()).getState();
if (structureState != null) {
if (!(structureState.getBlock() instanceof AbstractBlockHut) || !(colony.getWorld().getBlockState(this.location).getBlock() instanceof AbstractBlockHut)) {
Log.getLogger().error(String.format("Schematic %s doesn't have a correct Primary Offset", structureName.toString()));
return 0;
}
final int structureRotation = structureState.getValue(AbstractBlockHut.FACING).get2DDataValue();
final int worldRotation = colony.getWorld().getBlockState(this.location).getValue(AbstractBlockHut.FACING).get2DDataValue();
if (structureRotation <= worldRotation) {
cachedRotation = worldRotation - structureRotation;
} else {
cachedRotation = 4 + worldRotation - structureRotation;
}
return cachedRotation;
}
}
} catch (Exception e) {
Log.getLogger().error(String.format("Failed to get rotation for %s: ", structureName.toString()), e);
return 0;
}
return 0;
}
Aggregations