Get ready to convert the schematics
- Simplified code to have a single blockstate loop and made everything simpler - Palette no longer contains unused IDs such as sandstone or door default blockstates - Schematics use placeholders for doors and monolith to make updating them not require changing all the schematics - Fixed bug where book wasn't being translated - Make a library with default destinations and link properties - Remove translateIdCrude, since the schematic conversion code won't be run from outside the dev environment anymore - Looked at net.minecraft.util.datafix to check if there were any updates that needed to be done - Added error checking code to make sure everything is being converted correctly - Removed schematic info generator, that will be added to a separate tool that can run on the new schematics (once the old ones are replaced) - Manually checked the NBT to make sure everything is ok - Fixed the schematic containing sandstone at y=0 (it was obvious it needed to be ancient fabric) - Changed door item ids from "dimensional_door" to "iron_dimensional_door" and from "warp_dimensional_door" to "oak_dimensional_door" to match vanilla (we might want to implement more/all wood types in the future, so it's better to do it now rather than have to convert all schematics) and renamed "rift" - Added "powered" to note blocks NBT (checked which were powered before) - Added "CookTimeTotal" to furnace NBT - Fix the_nexus having SenseiKiwi's hideout door being converted to a dimensional door
|
@ -1,72 +0,0 @@
|
|||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package org.dimdev.ddutils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Robijnvogel
|
||||
*/
|
||||
public final class StringUtils {
|
||||
|
||||
public static int simpleSearch(String[] array, String searchKey) {
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
String entry = array[i];
|
||||
if (entry.equals(searchKey)) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public static char flipCase(char in) {
|
||||
if (Character.isUpperCase(in)) {
|
||||
return Character.toLowerCase(in);
|
||||
} else {
|
||||
return Character.toUpperCase(in);
|
||||
}
|
||||
}
|
||||
|
||||
public static List<String> getAsStringList(Integer[] integers) {
|
||||
List< String> list = new ArrayList<>();
|
||||
for (int integer : integers) {
|
||||
list.add(String.valueOf(integer));
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public static List<String> getMatchingStrings(String template, List<String> comparables, boolean caseSensitive) {
|
||||
if (template.equals("")) {
|
||||
return comparables;
|
||||
}
|
||||
List< String> results = new ArrayList<>();
|
||||
for (String comparable : comparables) {
|
||||
if (isStartOfString(template, comparable, caseSensitive)) {
|
||||
results.add(comparable);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
public static boolean isStartOfString(String template, String comparable, boolean caseSensitive) {
|
||||
if (comparable.length() < template.length()) {
|
||||
return false;
|
||||
} else if (template.equals("")) {
|
||||
return true;
|
||||
}
|
||||
for (int i = 0; i < template.length(); i++) {
|
||||
char tChar = template.charAt(i);
|
||||
char cChar = comparable.charAt(i);
|
||||
if (tChar != cChar && !caseSensitive && flipCase(tChar) == cChar) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -5,15 +5,8 @@ import net.minecraft.nbt.*;
|
|||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import org.dimdev.ddutils.StringUtils;
|
||||
|
||||
public final class NBTUtils {
|
||||
|
||||
public final static int NBT_COMPOUND_TAG_ID = StringUtils.simpleSearch(NBTTagCompound.NBT_TYPES, "COMPOUND");
|
||||
public final static int STRING_TAG_ID = StringUtils.simpleSearch(NBTTagCompound.NBT_TYPES, "STRING");
|
||||
//Arrays.binarySearch(NBTTagCompound.NBT_TYPES, "COMPOUND", new StringComparator()); does not seem to work?;
|
||||
//netiher does Arrays.binarySearch(NBTTagCompound.NBT_TYPES, "COMPOUND", String::compareTo);
|
||||
|
||||
public static NBTTagCompound writeToNBT(Object obj, NBTTagCompound nbt) {
|
||||
try {
|
||||
Class<?> callingClass = Class.forName(new Exception().getStackTrace()[1].getClassName());
|
||||
|
|
|
@ -60,7 +60,7 @@ public class Schematic {
|
|||
this.width = width;
|
||||
this.height = height;
|
||||
this.length = length;
|
||||
blockData = new short[width][length][height];
|
||||
blockData = new short[width][height][length];
|
||||
palette.add(Blocks.AIR.getDefaultState());
|
||||
paletteMax++;
|
||||
creationDate = System.currentTimeMillis();
|
||||
|
@ -87,6 +87,8 @@ public class Schematic {
|
|||
|
||||
if (nbt.hasKey("Date")) { //Date is not required
|
||||
schematic.creationDate = metadataCompound.getLong("Date");
|
||||
} else {
|
||||
schematic.creationDate = -1;
|
||||
}
|
||||
if (nbt.hasKey("RequiredMods")) { //RequiredMods is not required (ironically)
|
||||
NBTTagList requiredModsTagList = (NBTTagList) metadataCompound.getTag("RequiredMods");
|
||||
|
@ -175,7 +177,7 @@ public class Schematic {
|
|||
NBTTagCompound metadataCompound = new NBTTagCompound();
|
||||
if (author != null) metadataCompound.setString("Author", author); // Author is not required
|
||||
metadataCompound.setString("Name", name);
|
||||
metadataCompound.setLong("Date", creationDate);
|
||||
if (creationDate != -1) metadataCompound.setLong("Date", creationDate);
|
||||
NBTTagList requiredModsTagList = new NBTTagList();
|
||||
for (String requiredMod : requiredMods) {
|
||||
requiredModsTagList.appendTag(new NBTTagString(requiredMod));
|
||||
|
@ -366,10 +368,15 @@ public class Schematic {
|
|||
adjustedEntityNBT.setUniqueId("UUID", UUID.randomUUID());
|
||||
|
||||
Entity entity = EntityList.createEntityFromNBT(adjustedEntityNBT, world);
|
||||
// TODO: check if it is in pocket bounds
|
||||
world.spawnEntity(entity);
|
||||
}
|
||||
}
|
||||
|
||||
public IBlockState getBlockState(int x, int y, int z) {
|
||||
return palette.get(blockData[x][y][z]);
|
||||
}
|
||||
|
||||
public void setBlockState(int x, int y, int z, IBlockState state) {
|
||||
if (palette.contains(state)) {
|
||||
blockData[x][y][z] = (short) palette.indexOf(state); // TODO: optimize this (there must be some efficient list implementations)
|
||||
|
|
|
@ -14,7 +14,7 @@ import java.util.Random;
|
|||
|
||||
public class BlockDimensionalDoorIron extends BlockDimensionalDoor {
|
||||
|
||||
public static final String ID = "dimensional_door";
|
||||
public static final String ID = "iron_dimensional_door";
|
||||
|
||||
public BlockDimensionalDoorIron() {
|
||||
super(Material.IRON);
|
||||
|
|
|
@ -15,7 +15,7 @@ import java.util.Random;
|
|||
|
||||
public class BlockDimensionalDoorWood extends BlockDimensionalDoor {
|
||||
|
||||
public static final String ID = "warp_dimensional_door";
|
||||
public static final String ID = "oak_dimensional_door";
|
||||
|
||||
public BlockDimensionalDoorWood() {
|
||||
super(Material.WOOD);
|
||||
|
|
|
@ -25,6 +25,6 @@ public class ItemDimensionalDoorIron extends ItemDimensionalDoor {
|
|||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void addInformation(ItemStack stack, World world, List<String> tooltip, ITooltipFlag flagIn) {
|
||||
tooltip.addAll(I18nUtils.translateMultiline("info.dimensional_door"));
|
||||
tooltip.addAll(I18nUtils.translateMultiline("info.iron_dimensional_door"));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,6 +25,6 @@ public class ItemDimensionalDoorWarp extends ItemDimensionalDoor {
|
|||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void addInformation(ItemStack stack, World world, List<String> tooltip, ITooltipFlag flagIn) {
|
||||
tooltip.addAll(I18nUtils.translateMultiline("info.warp_dimensional_door"));
|
||||
tooltip.addAll(I18nUtils.translateMultiline("info.oak_dimensional_door"));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,6 @@ public class ItemDimensionalTrapdoorWood extends ItemDimensionalTrapdoor {
|
|||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void addInformation(ItemStack stack, World world, List<String> tooltip, ITooltipFlag flag) {
|
||||
tooltip.addAll(I18nUtils.translateMultiline("info.wood_dimensional_trapdoor"));
|
||||
tooltip.addAll(I18nUtils.translateMultiline("info.dimensional_trapdoor"));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,67 @@
|
|||
package org.dimdev.dimdoors.shared.pockets;
|
||||
|
||||
import org.dimdev.dimdoors.shared.rifts.RiftDestination;
|
||||
import org.dimdev.dimdoors.shared.rifts.destinations.AvailableLinkDestination;
|
||||
import org.dimdev.dimdoors.shared.rifts.destinations.PocketEntranceMarker;
|
||||
import org.dimdev.dimdoors.shared.rifts.destinations.PocketExitMarker;
|
||||
import org.dimdev.dimdoors.shared.rifts.registry.LinkProperties;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
|
||||
public final class DefaultDungeonDestinations { // TODO: lower weights?
|
||||
|
||||
public static final LinkProperties pocketLinkProperties = LinkProperties.builder()
|
||||
.groups(new HashSet<>(Arrays.asList(0, 1)))
|
||||
.linksRemaining(1).build();
|
||||
|
||||
public static final LinkProperties overworldLinkProperties = LinkProperties.builder()
|
||||
.groups(new HashSet<>(Arrays.asList(0, 1)))
|
||||
.entranceWeight(50)
|
||||
.linksRemaining(1).build();
|
||||
|
||||
public static final RiftDestination deeperDungeonDestination = AvailableLinkDestination.builder()
|
||||
.acceptedGroups(Collections.singleton(0))
|
||||
.coordFactor(1)
|
||||
.negativeDepthFactor(10000)
|
||||
.positiveDepthFactor(160)
|
||||
.weightMaximum(100)
|
||||
.newRiftWeight(1).build();
|
||||
|
||||
public static final RiftDestination shallowerDungeonDestination = AvailableLinkDestination.builder()
|
||||
.acceptedGroups(Collections.singleton(0))
|
||||
.coordFactor(1)
|
||||
.negativeDepthFactor(160)
|
||||
.positiveDepthFactor(10000)
|
||||
.weightMaximum(100)
|
||||
.newRiftWeight(1).build();
|
||||
|
||||
public static final RiftDestination overworldDestination = AvailableLinkDestination.builder()
|
||||
.acceptedGroups(Collections.singleton(0))
|
||||
.coordFactor(1)
|
||||
.negativeDepthFactor(0.00000000001) // The division result is cast to an int, so Double.MIN_VALUE would cause an overflow
|
||||
.positiveDepthFactor(Double.POSITIVE_INFINITY)
|
||||
.weightMaximum(100)
|
||||
.newRiftWeight(1).build();
|
||||
|
||||
public static final RiftDestination twoWayPocketEntrance = PocketEntranceMarker.builder()
|
||||
.weight(1)
|
||||
.ifDestination(PocketExitMarker.builder().build())
|
||||
.otherwiseDestination(AvailableLinkDestination.builder()
|
||||
.acceptedGroups(Collections.singleton(0))
|
||||
.coordFactor(1)
|
||||
.negativeDepthFactor(80)
|
||||
.positiveDepthFactor(10000)
|
||||
.weightMaximum(100)
|
||||
.newRiftWeight(1).build()).build();
|
||||
|
||||
public static final RiftDestination gatewayDestination = AvailableLinkDestination.builder()
|
||||
.acceptedGroups(Collections.singleton(0))
|
||||
.coordFactor(1) // TODO: lower value?
|
||||
.negativeDepthFactor(Double.POSITIVE_INFINITY)
|
||||
.positiveDepthFactor(160) // TODO: lower value?
|
||||
.weightMaximum(300) // Link further away
|
||||
.newRiftWeight(1)
|
||||
.build();
|
||||
}
|
|
@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
|
|||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
@ -19,6 +20,7 @@ import org.dimdev.ddutils.WorldUtils;
|
|||
import org.dimdev.ddutils.math.MathUtils;
|
||||
import org.dimdev.ddutils.schem.Schematic;
|
||||
import org.dimdev.dimdoors.DimDoors;
|
||||
import org.dimdev.dimdoors.shared.entities.EntityMonolith;
|
||||
import org.dimdev.dimdoors.shared.rifts.RiftDestination;
|
||||
import org.dimdev.dimdoors.shared.rifts.TileEntityRift;
|
||||
import org.dimdev.dimdoors.shared.rifts.destinations.PocketEntranceMarker;
|
||||
|
@ -29,9 +31,7 @@ import org.dimdev.dimdoors.shared.tileentities.TileEntityEntranceRift;
|
|||
import org.dimdev.pocketlib.Pocket;
|
||||
import org.dimdev.pocketlib.PocketRegistry;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @author Robijnvogel
|
||||
|
@ -57,6 +57,95 @@ public class PocketTemplate {
|
|||
}
|
||||
}
|
||||
|
||||
public void replacePlaceholders() { // TODO: it should be possible to place a schematic without replacing placeholders
|
||||
// Replace placeholders (some schematics will contain them)
|
||||
List<NBTTagCompound> tileEntities = new ArrayList<>();
|
||||
for (NBTTagCompound tileEntityNBT : schematic.tileEntities) {
|
||||
if (tileEntityNBT.hasKey("placeholder")) {
|
||||
int x = tileEntityNBT.getInteger("x");
|
||||
int y = tileEntityNBT.getInteger("y");
|
||||
int z = tileEntityNBT.getInteger("z");
|
||||
|
||||
IBlockState state = schematic.palette.get(schematic.blockData[x][y][z]);
|
||||
|
||||
NBTTagCompound newNBT;
|
||||
switch (tileEntityNBT.getString("placeholder")) {
|
||||
case "deeper_depth_door":
|
||||
TileEntityEntranceRift rift = (TileEntityEntranceRift) state.getBlock().createTileEntity(null, state);
|
||||
rift.setPos(new BlockPos(x, y, z));
|
||||
rift.setProperties(DefaultDungeonDestinations.pocketLinkProperties);
|
||||
rift.setDestination(DefaultDungeonDestinations.deeperDungeonDestination);
|
||||
newNBT = rift.serializeNBT();
|
||||
break;
|
||||
case "shallower_depth_door":
|
||||
/*TileEntityEntranceRift*/ rift = (TileEntityEntranceRift) state.getBlock().createTileEntity(null, state);
|
||||
rift.setPos(new BlockPos(x, y, z));
|
||||
rift.setProperties(DefaultDungeonDestinations.pocketLinkProperties);
|
||||
rift.setDestination(DefaultDungeonDestinations.shallowerDungeonDestination);
|
||||
newNBT = rift.serializeNBT();
|
||||
break;
|
||||
case "overworld_door":
|
||||
/*TileEntityEntranceRift*/ rift = (TileEntityEntranceRift) state.getBlock().createTileEntity(null, state);
|
||||
rift.setPos(new BlockPos(x, y, z));
|
||||
rift.setProperties(DefaultDungeonDestinations.pocketLinkProperties);
|
||||
rift.setDestination(DefaultDungeonDestinations.overworldDestination);
|
||||
newNBT = rift.serializeNBT();
|
||||
break;
|
||||
case "pocket_entrance_door":
|
||||
/*TileEntityEntranceRift*/ rift = (TileEntityEntranceRift) state.getBlock().createTileEntity(null, state);
|
||||
rift.setPos(new BlockPos(x, y, z));
|
||||
rift.setProperties(DefaultDungeonDestinations.pocketLinkProperties);
|
||||
rift.setDestination(DefaultDungeonDestinations.twoWayPocketEntrance);
|
||||
newNBT = rift.serializeNBT();
|
||||
break;
|
||||
case "gateway_portal":
|
||||
/*TileEntityEntranceRift*/ rift = (TileEntityEntranceRift) state.getBlock().createTileEntity(null, state);
|
||||
rift.setPos(new BlockPos(x, y, z));
|
||||
rift.setProperties(DefaultDungeonDestinations.overworldLinkProperties);
|
||||
rift.setDestination(DefaultDungeonDestinations.gatewayDestination);
|
||||
rift.setCloseAfterPassThrough(true);
|
||||
newNBT = rift.serializeNBT();
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Unknown tile entity placeholder: " + tileEntityNBT.getString("placeholder"));
|
||||
}
|
||||
// TODO: allow overriding some placeholder properties by copying other properties (not placeholder and x/y/z) to the new nbt
|
||||
tileEntities.add(newNBT);
|
||||
} else {
|
||||
tileEntities.add(tileEntityNBT);
|
||||
}
|
||||
}
|
||||
schematic.tileEntities = tileEntities;
|
||||
|
||||
|
||||
List<NBTTagCompound> entities = new ArrayList<>();
|
||||
for (NBTTagCompound entitiesNBT : schematic.entities) {
|
||||
if (entitiesNBT.hasKey("placeholder")) {
|
||||
double x = entitiesNBT.getDouble("x");
|
||||
double y = entitiesNBT.getDouble("y");
|
||||
double z = entitiesNBT.getDouble("z");
|
||||
float yaw = entitiesNBT.getFloat("yaw");
|
||||
float pitch = entitiesNBT.getFloat("pitch");
|
||||
|
||||
NBTTagCompound newNBT;
|
||||
switch (entitiesNBT.getString("placeholder")) {
|
||||
case "monolith":
|
||||
EntityMonolith monolith = new EntityMonolith(null);
|
||||
monolith.setLocationAndAngles(x, y, z, yaw, pitch);
|
||||
newNBT = monolith.serializeNBT();
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Unknown entity placeholder: " + entitiesNBT.getString("placeholder"));
|
||||
}
|
||||
// TODO: allow overriding some placeholder properties by copying other properties (not placeholder and x/y/z) to the new nbt
|
||||
entities.add(newNBT);
|
||||
} else {
|
||||
entities.add(entitiesNBT);
|
||||
}
|
||||
}
|
||||
schematic.entities = entities;
|
||||
}
|
||||
|
||||
public void place(Pocket pocket) {
|
||||
pocket.setSize(size);
|
||||
int gridSize = PocketRegistry.instance(pocket.getDim()).getGridSize();
|
||||
|
@ -79,8 +168,8 @@ public class PocketTemplate {
|
|||
int yBase = 0;
|
||||
int zBase = pocket.getZ() * gridSize * 16;
|
||||
|
||||
// Fill chests and make rift list
|
||||
List<TileEntityRift> rifts = new ArrayList<>();
|
||||
|
||||
for (NBTTagCompound tileEntityNBT : schematic.tileEntities) {
|
||||
BlockPos pos = new BlockPos(
|
||||
xBase + tileEntityNBT.getInteger("x"),
|
||||
|
|
|
@ -82,7 +82,9 @@ public class SchematicHandler { // TODO: parts of this should be moved to the or
|
|||
if (file.isDirectory() || !file.getName().endsWith(".schem")) continue;
|
||||
try {
|
||||
Schematic schematic = Schematic.loadFromNBT(CompressedStreamTools.readCompressed(new FileInputStream(file)));
|
||||
templates.add(new PocketTemplate(SAVED_POCKETS_GROUP_NAME, file.getName(), null, null, null, schematic, -1, 0));
|
||||
PocketTemplate template = new PocketTemplate(SAVED_POCKETS_GROUP_NAME, file.getName(), null, null, null, schematic, -1, 0);
|
||||
template.replacePlaceholders();
|
||||
templates.add(template);
|
||||
} catch (IOException e) {
|
||||
DimDoors.log.error("Error reading schematic " + file.getName() + ": " + e);
|
||||
}
|
||||
|
@ -149,7 +151,7 @@ public class SchematicHandler { // TODO: parts of this should be moved to the or
|
|||
try {
|
||||
schematicNBT = CompressedStreamTools.readCompressed(schematicDataStream);
|
||||
if (!schematicNBT.hasKey("Version")) {
|
||||
schematic = SchematicConverter.convertSchematic(schematicNBT, template.getId(), template.getName(), template.getAuthor());
|
||||
schematic = SchematicConverter.convertSchematic(schematicNBT, template.getId(), template.getAuthor());
|
||||
} else {
|
||||
schematic = Schematic.loadFromNBT(schematicNBT);
|
||||
}
|
||||
|
@ -171,6 +173,7 @@ public class SchematicHandler { // TODO: parts of this should be moved to the or
|
|||
DimDoors.log.warn("Schematic " + template.getId() + " was bigger than specified in its json file and therefore wasn't loaded");
|
||||
}
|
||||
template.setSchematic(schematic);
|
||||
template.replacePlaceholders();
|
||||
}
|
||||
return validTemplates;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
package org.dimdev.dimdoors.shared.tools;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.init.Bootstrap;
|
||||
import net.minecraftforge.event.RegistryEvent;
|
||||
import net.minecraftforge.fml.common.DummyModContainer;
|
||||
import net.minecraftforge.fml.common.Loader;
|
||||
import net.minecraftforge.fml.common.ModContainer;
|
||||
import net.minecraftforge.fml.common.ModMetadata;
|
||||
import net.minecraftforge.registries.GameData;
|
||||
import net.minecraftforge.registries.RegistryManager;
|
||||
import org.dimdev.dimdoors.DimDoors;
|
||||
import org.dimdev.dimdoors.server.ServerProxy;
|
||||
import org.dimdev.dimdoors.shared.blocks.ModBlocks;
|
||||
|
||||
public final class Initializer {
|
||||
public static void initialize() {
|
||||
Bootstrap.register();
|
||||
ModMetadata md = new ModMetadata();
|
||||
md.modId = DimDoors.MODID;
|
||||
ModContainer mc = new DummyModContainer(md);
|
||||
Loader.instance().setupTestHarness(mc);
|
||||
Loader.instance().setActiveModContainer(mc);
|
||||
ModBlocks.registerBlocks(new RegistryEvent.Register<Block>(GameData.BLOCKS, RegistryManager.ACTIVE.getRegistry(GameData.BLOCKS)));
|
||||
new ServerProxy().registerTileEntities();
|
||||
new ServerProxy().registerRiftDestinations();
|
||||
Loader.instance().setActiveModContainer(null);
|
||||
}
|
||||
}
|
|
@ -11,128 +11,41 @@ import net.minecraft.nbt.NBTTagCompound;
|
|||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.nbt.NBTTagString;
|
||||
import net.minecraft.tileentity.*;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3i;
|
||||
import net.minecraft.util.text.ITextComponent;
|
||||
import net.minecraft.util.text.TextComponentString;
|
||||
import org.dimdev.ddutils.nbt.NBTUtils;
|
||||
import net.minecraftforge.common.util.Constants;
|
||||
import org.dimdev.ddutils.schem.Schematic;
|
||||
import org.dimdev.dimdoors.DimDoors;
|
||||
import org.dimdev.dimdoors.shared.blocks.BlockDimensionalDoor;
|
||||
import org.dimdev.dimdoors.shared.blocks.BlockDimensionalDoorWood;
|
||||
import org.dimdev.dimdoors.shared.blocks.ModBlocks;
|
||||
import org.dimdev.dimdoors.shared.entities.EntityMonolith;
|
||||
import org.dimdev.dimdoors.shared.items.ModItems;
|
||||
import org.dimdev.dimdoors.shared.rifts.destinations.AvailableLinkDestination;
|
||||
import org.dimdev.dimdoors.shared.rifts.destinations.PocketEntranceMarker;
|
||||
import org.dimdev.dimdoors.shared.rifts.destinations.PocketExitMarker;
|
||||
import org.dimdev.dimdoors.shared.rifts.registry.LinkProperties;
|
||||
import org.dimdev.dimdoors.shared.tileentities.TileEntityEntranceRift;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Robijnvogel
|
||||
*/
|
||||
public final class SchematicConverter {
|
||||
|
||||
private final static int LOCKED_CHEST_ID = 95;
|
||||
private final static int POTION_ID = 373;
|
||||
private final static int WRITTEN_BOOK_ID = 387;
|
||||
|
||||
private final static int NBT_COMPOUND_TAG_ID = NBTUtils.NBT_COMPOUND_TAG_ID;
|
||||
private final static int STRING_TAG_ID = NBTUtils.NBT_COMPOUND_TAG_ID;
|
||||
private static final boolean GENERATE_DUNGEON_INFO = true;
|
||||
public static Schematic convertSchematic(NBTTagCompound nbt, String schematicId, String author) {
|
||||
Schematic schematic = new Schematic(nbt.getShort("Width"), nbt.getShort("Height"), nbt.getShort("Length"));
|
||||
|
||||
public static Schematic convertSchematic(NBTTagCompound nbt, String schematicId, String name, String author) {
|
||||
Schematic schematic = new Schematic();
|
||||
|
||||
schematic.version = 1; //already the default value
|
||||
schematic.name = schematicId;
|
||||
schematic.author = author;
|
||||
schematic.name = name; // This is passed as an argument by the SchematicHandler. The name is taken from the JSONs
|
||||
schematic.creationDate = System.currentTimeMillis();
|
||||
schematic.creationDate = -1; // Old schematics had no creation date
|
||||
schematic.requiredMods = new String[]{DimDoors.MODID};
|
||||
|
||||
schematic.width = nbt.getShort("Width");
|
||||
schematic.height = nbt.getShort("Height");
|
||||
schematic.length = nbt.getShort("Length");
|
||||
schematic.offset = new int[]{0, 0, 0};
|
||||
|
||||
// Schematic info
|
||||
int ironDimDoors = 0;
|
||||
int warpDoors = 0;
|
||||
int monoliths = 0;
|
||||
int chests = 0;
|
||||
int dispensers = 0;
|
||||
int allPistonBases = 0;
|
||||
int tnt = 0;
|
||||
int diamondBlocks = 0;
|
||||
int goldBlocks = 0;
|
||||
int ironBlocks = 0;
|
||||
|
||||
byte[] blockIdArray = nbt.getByteArray("Blocks");
|
||||
byte[] addId = nbt.getByteArray("AddBlocks");
|
||||
Map<Integer, Byte> palletteMap = new HashMap<>(); // block ID -> palette index
|
||||
byte currentPalletteIndex = 0;
|
||||
for (int i = 0; i < blockIdArray.length; i++) {
|
||||
int id;
|
||||
if (i >> 1 >= addId.length) {
|
||||
id = (short) (blockIdArray[i] & 0xFF);
|
||||
} else if ((i & 1) == 0) {
|
||||
id = (short) (((addId[i >> 1] & 0x0F) << 8) + (blockIdArray[i] & 0xFF));
|
||||
} else {
|
||||
id = (short) (((addId[i >> 1] & 0xF0) << 4) + (blockIdArray[i] & 0xFF));
|
||||
}
|
||||
if (palletteMap.containsKey(id)) {
|
||||
blockIdArray[i] = palletteMap.get(id);
|
||||
} else {
|
||||
|
||||
IBlockState block = Blocks.AIR.getDefaultState(); //air is the default
|
||||
if (id <= 159 && id != LOCKED_CHEST_ID) {
|
||||
block = Block.getBlockById(id).getDefaultState();
|
||||
} else {
|
||||
switch (id) {
|
||||
case 1973:
|
||||
block = ModBlocks.FABRIC.getDefaultState();
|
||||
break;
|
||||
case 1975:
|
||||
block = ModBlocks.WARP_DIMENSIONAL_DOOR.getDefaultState();
|
||||
break;
|
||||
case 1970:
|
||||
block = ModBlocks.DIMENSIONAL_DOOR.getDefaultState();
|
||||
break;
|
||||
case 1979:
|
||||
block = ModBlocks.DIMENSIONAL_PORTAL.getDefaultState();
|
||||
break;
|
||||
case 220:
|
||||
block = ModBlocks.ANCIENT_FABRIC.getDefaultState();
|
||||
break;
|
||||
case LOCKED_CHEST_ID: // Locked chest's ID was replaced with stained glass in 1.7.2
|
||||
DimDoors.log.error("Schematic contained a locked chest, which was removed in 1.7.2.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (id != 0 && block.getBlock().getRegistryName().toString().equals("minecraft:air")) {
|
||||
throw new RuntimeException("Unknown ID " + id + " in schematic " + schematicId);
|
||||
}
|
||||
if (block.equals(Blocks.IRON_DOOR)) {
|
||||
block = ModBlocks.DIMENSIONAL_DOOR.getDefaultState();
|
||||
}
|
||||
if (block.equals(Blocks.OAK_DOOR)) {
|
||||
block = ModBlocks.WARP_DIMENSIONAL_DOOR.getDefaultState();
|
||||
}
|
||||
schematic.palette.add(block);
|
||||
palletteMap.put(id, currentPalletteIndex);
|
||||
blockIdArray[i] = currentPalletteIndex;
|
||||
currentPalletteIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
// <editor-fold desc="Tile entities">
|
||||
List<Vec3i> tileEntityPositions = new ArrayList<>();
|
||||
if (nbt.hasKey("TileEntities")) {
|
||||
NBTTagList tileEntitiesNBT = nbt.getTagList("TileEntities", NBT_COMPOUND_TAG_ID);
|
||||
NBTTagList tileEntitiesNBT = nbt.getTagList("TileEntities", Constants.NBT.TAG_COMPOUND);
|
||||
if (!tileEntitiesNBT.hasNoTags()) {
|
||||
for (int i = 0; i < tileEntitiesNBT.tagCount(); i++) {
|
||||
NBTTagCompound tileEntityNBT = tileEntitiesNBT.getCompoundTagAt(i);
|
||||
|
@ -144,12 +57,13 @@ public final class SchematicConverter {
|
|||
switch (tileEntityNBT.getString("id")) {
|
||||
case "TileEntityDimDoor":
|
||||
case "TileEntityRift":
|
||||
continue; // remove all Rifts from the Doors. These will get added back later
|
||||
continue; // Remove all Rifts from the Doors. These will get added back later
|
||||
case "Furnace":
|
||||
tileEntityNBT.setInteger("CookTimeTotal", 0);
|
||||
case "Chest":
|
||||
case "Trap":
|
||||
case "Hopper":
|
||||
case "Furnace": //there aren't any other kinds of inventories in the old schematics. At least not with contents
|
||||
NBTTagList items = tileEntityNBT.getTagList("Items", NBT_COMPOUND_TAG_ID);
|
||||
case "Hopper": // There aren't any other kinds of inventories in the old schematics.
|
||||
NBTTagList items = tileEntityNBT.getTagList("Items", Constants.NBT.TAG_COMPOUND);
|
||||
for (int j = 0; j < items.tagCount(); j++) {
|
||||
NBTTagCompound itemTag = items.getCompoundTagAt(j);
|
||||
int oldID = itemTag.getInteger("id");
|
||||
|
@ -187,7 +101,7 @@ public final class SchematicConverter {
|
|||
case WRITTEN_BOOK_ID:
|
||||
item = Item.getItemById(oldID);
|
||||
NBTTagCompound subTag = itemTag.getCompoundTag("tag");
|
||||
NBTTagList oldPages = subTag.getTagList("pages", STRING_TAG_ID);
|
||||
NBTTagList oldPages = subTag.getTagList("pages", Constants.NBT.TAG_STRING);
|
||||
//DimDoors.log.info("Written book has " + oldPages.tagCount() + " pages." + (oldPages.tagCount() == 0 ? " STRING_TAG_ID is " + STRING_TAG_ID : ""));
|
||||
NBTTagList newPages = new NBTTagList();
|
||||
for (NBTBase pageNBTBase : oldPages) {
|
||||
|
@ -197,7 +111,7 @@ public final class SchematicConverter {
|
|||
String newPage = ITextComponent.Serializer.componentToJson(new TextComponentString(oldPage)); //substitutes paragraph break characters with "\n"
|
||||
NBTTagString newPageNBT = new NBTTagString(newPage); //this HAS to be created new, because a change doesn't propagate up to pageNBTBase completely. Only the first word gets read from the tag list eventually. I don't know why, but it does.
|
||||
newPages.appendTag(newPageNBT);
|
||||
//DimDoors.log.info("Converted written book page: \n{ " + oldPage + "\n into: \n" + newPageNBT.getString() + "\n.");
|
||||
DimDoors.log.info("Converted written book page: \n{ " + oldPage + "\n into: \n" + newPageNBT.getString() + "\n.");
|
||||
}
|
||||
subTag.setTag("pages", newPages);
|
||||
break;
|
||||
|
@ -212,12 +126,11 @@ public final class SchematicConverter {
|
|||
}
|
||||
}
|
||||
|
||||
itemTag.removeTag("id"); //not sure if needed, but just to be sure...
|
||||
String newID = item.getRegistryName().toString(); //item.getItemStackDisplayName(ItemStack.EMPTY);
|
||||
itemTag.setString("id", newID);
|
||||
itemTag.setString("id", item.getRegistryName().toString()); //item.getItemStackDisplayName(ItemStack.EMPTY);
|
||||
if (oldMeta != newMeta) {
|
||||
itemTag.setInteger("Damage", newMeta);
|
||||
}
|
||||
DimDoors.log.info("Item: " + item.getRegistryName());
|
||||
//DimDoors.log.info("ID of itemstack in inventory set from " + oldID + " to '" + newID + "'.");
|
||||
}
|
||||
break;
|
||||
|
@ -227,223 +140,188 @@ public final class SchematicConverter {
|
|||
tileEntityNBT.setString("Text3", ITextComponent.Serializer.componentToJson(new TextComponentString(tileEntityNBT.getString("Text3"))));
|
||||
tileEntityNBT.setString("Text4", ITextComponent.Serializer.componentToJson(new TextComponentString(tileEntityNBT.getString("Text4"))));
|
||||
break;
|
||||
case "Note":
|
||||
tileEntityNBT.setBoolean("powered", false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
String oldID = tileEntityNBT.getString("id");
|
||||
String newID = translateId(oldID);
|
||||
String newID = translateId(oldID).toString();
|
||||
tileEntityNBT.setString("id", newID);
|
||||
schematic.tileEntities.add(tileEntityNBT);
|
||||
}
|
||||
}
|
||||
}
|
||||
// </editor-fold>
|
||||
|
||||
byte[] dataIntArray = nbt.getByteArray("Data");
|
||||
schematic.blockData = new short[schematic.width][schematic.height][schematic.length];
|
||||
// <editor-fold desc="Blocks">
|
||||
byte[] idArray = nbt.getByteArray("Blocks");
|
||||
byte[] addIdArray = nbt.getByteArray("AddBlocks");
|
||||
byte[] metaArray = nbt.getByteArray("Data");
|
||||
IBlockState lastWasSandstone;
|
||||
int entranceCount = 0;
|
||||
for (int x = 0; x < schematic.width; x++) {
|
||||
for (int y = 0; y < schematic.height; y++) {
|
||||
for (int z = 0; z < schematic.length; z++) {
|
||||
int blockInt = blockIdArray[x + z * schematic.width + y * schematic.width * schematic.length]; //according to the documentation on https://github.com/SpongePowered/Schematic-Specification/blob/master/versions/schematic-1.md
|
||||
int metadata = dataIntArray[x + z * schematic.width + y * schematic.width * schematic.length]; //according to the documentation on https://github.com/SpongePowered/Schematic-Specification/blob/master/versions/schematic-1.md
|
||||
|
||||
IBlockState baseState = schematic.palette.get(blockInt); //this is the default blockstate except for ancient fabric
|
||||
if (baseState == baseState.getBlock().getDefaultState() || baseState.getBlock().equals(ModBlocks.FABRIC) || baseState.getBlock().equals(ModBlocks.ANCIENT_FABRIC)) { //should only be false if {@code baseState} is ancient fabric
|
||||
IBlockState blockState;
|
||||
if (baseState.getBlock().equals(ModBlocks.FABRIC) || baseState.getBlock().equals(ModBlocks.ANCIENT_FABRIC)) {
|
||||
blockState = baseState;
|
||||
} else {
|
||||
//noinspection deprecation
|
||||
blockState = baseState.getBlock().getStateFromMeta(metadata);
|
||||
}
|
||||
if (schematic.palette.contains(blockState)) { //check whether or not this blockstate is already in the list
|
||||
blockInt = schematic.palette.indexOf(blockState);
|
||||
} else {
|
||||
schematic.palette.add(blockState);
|
||||
//DimDoors.log.info("New blockstate detected. Original blockInt = " + blockInt + " and blockState is " + blockState);
|
||||
blockInt = schematic.palette.size() - 1;
|
||||
}
|
||||
Block block = blockState.getBlock();
|
||||
|
||||
//counting blocks and features
|
||||
if (block.equals(Blocks.DIAMOND_BLOCK)) {
|
||||
diamondBlocks++;
|
||||
} else if (block.equals(Blocks.GOLD_BLOCK)) {
|
||||
goldBlocks++;
|
||||
} else if (block.equals(Blocks.IRON_BLOCK)) {
|
||||
ironBlocks++;
|
||||
} else if (block.equals(Blocks.PISTON) || block.equals(Blocks.STICKY_PISTON)) {
|
||||
allPistonBases++;
|
||||
} else if (block.equals(Blocks.TNT)) {
|
||||
tnt++;
|
||||
} else if (block.equals(Blocks.CHEST)) {
|
||||
chests++;
|
||||
} else if (block.equals(Blocks.DISPENSER)) {
|
||||
dispensers++;
|
||||
} else if (block.equals(Blocks.END_PORTAL_FRAME)) {
|
||||
monoliths++;
|
||||
} else if (block.equals(ModBlocks.DIMENSIONAL_DOOR)) {
|
||||
ironDimDoors++;
|
||||
} else if (block.equals(ModBlocks.WARP_DIMENSIONAL_DOOR)) {
|
||||
warpDoors++;
|
||||
}
|
||||
|
||||
//Monoliths, Rifts and missing TileEntities
|
||||
if (block.equals(Blocks.END_PORTAL_FRAME)) {
|
||||
// I think it's safe to assume that air is present
|
||||
blockInt = schematic.palette.indexOf(Blocks.AIR.getDefaultState());
|
||||
EntityMonolith monolith = new EntityMonolith(null);
|
||||
EnumFacing facing = blockState.getValue(BlockEndPortalFrame.FACING);
|
||||
monolith.setLocationAndAngles(x + 0.5d, y, z + 0.5d, facing.getHorizontalAngle(), 0);
|
||||
schematic.entities.add(monolith.serializeNBT());
|
||||
} else if (block.equals(ModBlocks.DIMENSIONAL_DOOR) || block.equals(ModBlocks.WARP_DIMENSIONAL_DOOR) || block.equals(ModBlocks.DIMENSIONAL_PORTAL)) {
|
||||
//DimDoors.log.info("Door found: " + block.getUnlocalizedName());
|
||||
if (blockState.getProperties().get(BlockDoor.HALF).equals(BlockDoor.EnumDoorHalf.LOWER)) { //LOWER? seriously Runemoro? Fuck you. XD
|
||||
TileEntityEntranceRift rift = (TileEntityEntranceRift) block.createTileEntity(null, blockState);
|
||||
rift.setPos(new BlockPos(x, y, z));
|
||||
|
||||
rift.setProperties(LinkProperties.builder()
|
||||
.groups(new HashSet<>(Arrays.asList(0, 1)))
|
||||
.linksRemaining(1).build());
|
||||
|
||||
if (block.equals(ModBlocks.DIMENSIONAL_DOOR)) {
|
||||
rift.setDestination(AvailableLinkDestination.builder()
|
||||
.acceptedGroups(Collections.singleton(0))
|
||||
.coordFactor(1)
|
||||
.negativeDepthFactor(10000)
|
||||
.positiveDepthFactor(80)
|
||||
.weightMaximum(100)
|
||||
.newRiftWeight(1).build());
|
||||
} else if (block.equals(ModBlocks.WARP_DIMENSIONAL_DOOR)) {
|
||||
IBlockState stateBelow = schematic.palette.get(schematic.blockData[x][y - 1][z]);
|
||||
if (stateBelow.getBlock().equals(Blocks.SANDSTONE)) {
|
||||
rift.setProperties(null); // TODO: this should be removed once the linking equations are made symmetric
|
||||
rift.setDestination(AvailableLinkDestination.builder()
|
||||
.acceptedGroups(Collections.singleton(0))
|
||||
.coordFactor(1)
|
||||
.negativeDepthFactor(0.00000000001) // The division result is cast to an int, so Double.MIN_VALUE would cause an overflow
|
||||
.positiveDepthFactor(Double.POSITIVE_INFINITY)
|
||||
.weightMaximum(100)
|
||||
.newRiftWeight(1).build());
|
||||
//change the sandstone to the block below it.
|
||||
if (y >= 2) {
|
||||
schematic.blockData[x][y - 1][z] = schematic.blockData[x][y - 2][z];
|
||||
} else {
|
||||
//this only happens for one of the old schematics
|
||||
schematic.blockData[x][y - 1][z] = schematic.blockData[x + 1][y][z];
|
||||
//DimDoors.log.error("Someone placed a door on a sandstone block at the bottom of a schematic. This causes problems and should be remedied. Schematic name: " + schematicId);
|
||||
}
|
||||
} else {
|
||||
rift.setDestination(PocketEntranceMarker.builder()
|
||||
.weight(1)
|
||||
.ifDestination(PocketExitMarker.builder().build())
|
||||
.otherwiseDestination(AvailableLinkDestination.builder()
|
||||
.acceptedGroups(Collections.singleton(0))
|
||||
.coordFactor(1)
|
||||
.negativeDepthFactor(80)
|
||||
.positiveDepthFactor(10000)
|
||||
.weightMaximum(100)
|
||||
.newRiftWeight(1).build()).build());
|
||||
}
|
||||
} else if (block.equals(ModBlocks.DIMENSIONAL_PORTAL)) {
|
||||
rift.setProperties(LinkProperties.builder()
|
||||
.groups(new HashSet<>(Arrays.asList(0, 1)))
|
||||
.entranceWeight(50)
|
||||
.linksRemaining(1).build());
|
||||
rift.setDestination(AvailableLinkDestination.builder()
|
||||
.acceptedGroups(Collections.singleton(0))
|
||||
.coordFactor(1) // TODO: lower value?
|
||||
.negativeDepthFactor(Double.POSITIVE_INFINITY)
|
||||
.positiveDepthFactor(80) // TODO: lower value?
|
||||
.weightMaximum(300) // Link further away
|
||||
.newRiftWeight(1)
|
||||
.build());
|
||||
rift.setCloseAfterPassThrough(true);
|
||||
}
|
||||
rift.markStateChanged();
|
||||
|
||||
schematic.tileEntities.add(rift.serializeNBT());
|
||||
}
|
||||
} else if (block.hasTileEntity(blockState) && !tileEntityPositions.contains(new Vec3i(x, y, z))) {
|
||||
TileEntity tileEntity = block.createTileEntity(null, blockState);
|
||||
tileEntity.setPos(new BlockPos(x, y, z));
|
||||
//tileEntitiesNBT.appendTag(tileEntity.serializeNBT());
|
||||
schematic.tileEntities.add(tileEntity.serializeNBT());
|
||||
//DimDoors.log.info("Adding missing tile entity at " + new Vec3i(x, y, z) + " (state = " + blockState + ")");
|
||||
}
|
||||
} else { // if this is ancient fabric
|
||||
blockInt = schematic.palette.indexOf(baseState);
|
||||
for (int z = 0; z < schematic.length; z++) {
|
||||
lastWasSandstone = null;
|
||||
for (int y = 0; y < schematic.height; y++) {
|
||||
// Get the ID and meta at that position. See https://minecraft.gamepedia.com/Schematic_file_format
|
||||
int index = x + z * schematic.width + y * schematic.width * schematic.length;
|
||||
int id;
|
||||
if (index >> 1 >= addIdArray.length) {
|
||||
id = (short) (idArray[index] & 0xFF);
|
||||
} else if ((index & 1) == 0) {
|
||||
id = (short) (((addIdArray[index >> 1] & 0x0F) << 8) + (idArray[index] & 0xFF));
|
||||
} else {
|
||||
id = (short) (((addIdArray[index >> 1] & 0xF0) << 4) + (idArray[index] & 0xFF));
|
||||
}
|
||||
int meta = metaArray[index];
|
||||
|
||||
IBlockState state = getState(id, meta);
|
||||
Block block = state.getBlock();
|
||||
|
||||
// Monoliths
|
||||
if (block == Blocks.END_PORTAL_FRAME) {
|
||||
NBTTagCompound monolithPlaceholder = new NBTTagCompound();
|
||||
monolithPlaceholder.setString("placeholder", "monolith");
|
||||
monolithPlaceholder.setDouble("x", x + 0.5d);
|
||||
monolithPlaceholder.setDouble("y", y);
|
||||
monolithPlaceholder.setDouble("z", x + 0.5d);
|
||||
|
||||
monolithPlaceholder.setFloat("yaw", state.getValue(BlockEndPortalFrame.FACING).getHorizontalAngle());
|
||||
monolithPlaceholder.setFloat("pitch", 0);
|
||||
|
||||
schematic.entities.add(monolithPlaceholder);
|
||||
state = Blocks.AIR.getDefaultState();
|
||||
block = Blocks.AIR;
|
||||
}
|
||||
|
||||
// Fix for the_nexus having a second door (SenseiKiwi's hideout) being an entrance
|
||||
if (schematicId.equals("the_nexus") && y > 10 && block instanceof BlockDimensionalDoorWood) {
|
||||
block = Blocks.OAK_DOOR;
|
||||
//noinspection deprecation
|
||||
state = block.getStateFromMeta(meta);
|
||||
}
|
||||
|
||||
// Doors
|
||||
if (block instanceof BlockDimensionalDoor && state.getValue(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.LOWER) {
|
||||
NBTTagCompound riftPlaceholder = new NBTTagCompound();
|
||||
riftPlaceholder.setInteger("x", x);
|
||||
riftPlaceholder.setInteger("y", y);
|
||||
riftPlaceholder.setInteger("z", z);
|
||||
|
||||
if (block == ModBlocks.DIMENSIONAL_DOOR) {
|
||||
riftPlaceholder.setString("placeholder", "deeper_depth_door");
|
||||
} else if (block == ModBlocks.WARP_DIMENSIONAL_DOOR) {
|
||||
if (lastWasSandstone != null) {
|
||||
riftPlaceholder.setString("placeholder", "overworld_door");
|
||||
} else {
|
||||
riftPlaceholder.setString("placeholder", "pocket_entrance_door");
|
||||
entranceCount++;
|
||||
}
|
||||
} else if (block == ModBlocks.DIMENSIONAL_PORTAL) {
|
||||
riftPlaceholder.setString("placeholder", "gateway_portal");
|
||||
}
|
||||
|
||||
schematic.tileEntities.add(riftPlaceholder);
|
||||
} else if (block.hasTileEntity(state) && !tileEntityPositions.contains(new Vec3i(x, y, z))) {
|
||||
TileEntity tileEntity = block.createTileEntity(null, state);
|
||||
tileEntity.setPos(new BlockPos(x, y, z));
|
||||
schematic.tileEntities.add(tileEntity.serializeNBT());
|
||||
// DimDoors.log.info("Adding missing tile entity at " + new Vec3i(x, y, z) + " (state = " + state + ")");
|
||||
}
|
||||
|
||||
if (lastWasSandstone != null) {
|
||||
if (state.getBlock() == ModBlocks.WARP_DIMENSIONAL_DOOR) {
|
||||
if (y >= 2) {
|
||||
schematic.setBlockState(x, y - 1, z, schematic.getBlockState(x, y - 2, z));
|
||||
} else {
|
||||
DimDoors.log.error("Sandstone under warp door found at y = 0 in schematic " + schematicId);
|
||||
if (schematicId.equals("small_rotunda_with_exit")) {
|
||||
schematic.setBlockState(x, y - 1, z, ModBlocks.FABRIC.getDefaultState());
|
||||
} else {
|
||||
schematic.setBlockState(x, y - 1, z, lastWasSandstone);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
schematic.setBlockState(x, y - 1, z, lastWasSandstone);
|
||||
}
|
||||
}
|
||||
|
||||
// There aren't any non-default sandstone blocks
|
||||
if (block == Blocks.SANDSTONE) {
|
||||
lastWasSandstone = state;
|
||||
} else {
|
||||
lastWasSandstone = null;
|
||||
try {
|
||||
schematic.setBlockState(x, y, z, state);
|
||||
} catch (IndexOutOfBoundsException e) {
|
||||
DimDoors.log.error("...", e);
|
||||
}
|
||||
}
|
||||
assert blockInt >= 0;
|
||||
schematic.blockData[x][y][z] = (short) blockInt;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!nbt.getTag("Entities").hasNoTags()) {
|
||||
throw new RuntimeException("Schematic contains entities, but those aren't implemented in the conversion code");
|
||||
}
|
||||
schematic.paletteMax = schematic.palette.size() - 1;
|
||||
// </editor-fold>
|
||||
|
||||
if (GENERATE_DUNGEON_INFO) {
|
||||
DimDoors.log.info(schematicId + "," + ironDimDoors + "," + warpDoors + "," + monoliths + "," + chests + ","
|
||||
+ dispensers + "," + allPistonBases + "," + tnt + "," + diamondBlocks + "," + goldBlocks + "," + ironBlocks);
|
||||
if (!nbt.getTag("Entities").hasNoTags()) {
|
||||
throw new RuntimeException("Schematic contains entities, but those aren't implemented in the conversion code.");
|
||||
}
|
||||
|
||||
return schematic;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private static String translateId(String id) { // TODO
|
||||
ResourceLocation location;
|
||||
switch (id) {
|
||||
case "Sign":
|
||||
location = TileEntity.getKey(TileEntitySign.class);
|
||||
break;
|
||||
case "Music":
|
||||
location = TileEntity.getKey(TileEntityNote.class);
|
||||
break;
|
||||
case "Trap":
|
||||
location = TileEntity.getKey(TileEntityDispenser.class);
|
||||
break;
|
||||
case "Comparator":
|
||||
location = TileEntity.getKey(TileEntityComparator.class);
|
||||
break;
|
||||
case "Hopper":
|
||||
location = TileEntity.getKey(TileEntityHopper.class);
|
||||
break;
|
||||
case "Furnace":
|
||||
location = TileEntity.getKey(TileEntityFurnace.class);
|
||||
break;
|
||||
case "Chest":
|
||||
location = TileEntity.getKey(TileEntityChest.class);
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Tile entity ID " + id + " not supported by conversion code");
|
||||
private static IBlockState getState(int id, int meta) {
|
||||
Block block = Blocks.AIR;
|
||||
if (id <= 159 && id != LOCKED_CHEST_ID) {
|
||||
block = Block.getBlockById(id);
|
||||
} else {
|
||||
switch (id) {
|
||||
case 1973:
|
||||
return ModBlocks.FABRIC.getDefaultState();
|
||||
case 1975:
|
||||
return ModBlocks.WARP_DIMENSIONAL_DOOR.getStateFromMeta(meta);
|
||||
case 1970:
|
||||
return ModBlocks.DIMENSIONAL_DOOR.getStateFromMeta(meta);
|
||||
case 1979:
|
||||
return ModBlocks.DIMENSIONAL_PORTAL.getStateFromMeta(meta);
|
||||
case 220:
|
||||
return ModBlocks.ANCIENT_FABRIC.getDefaultState();
|
||||
case LOCKED_CHEST_ID: // Locked chest's ID was replaced with stained glass in 1.7.2
|
||||
DimDoors.log.error("Schematic contained a locked chest, which was removed in 1.7.2.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (location == null) {
|
||||
DimDoors.log.error("Resourcelocation of TileEntity with old ID: " + id + " was null. If you want to complain about log spam; " + (id.equals("Hopper") ? "it is very likely that it's FoamFix causing this. Please update it to at least version 0.9.0-1.12.2!" : "we have no idea what causes this, so please report it."));
|
||||
location = translateIdCrude(id);
|
||||
|
||||
if (id != 0 && block.getRegistryName().toString().equals("minecraft:air")) {
|
||||
throw new RuntimeException("Unknown ID " + id + " in schematic");
|
||||
}
|
||||
return location.toString();
|
||||
|
||||
if (block.equals(Blocks.IRON_DOOR)) return ModBlocks.DIMENSIONAL_DOOR.getStateFromMeta(meta);
|
||||
if (block.equals(Blocks.OAK_DOOR)) return ModBlocks.WARP_DIMENSIONAL_DOOR.getStateFromMeta(meta);
|
||||
//noinspection deprecation
|
||||
return block.getStateFromMeta(meta);
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private static ResourceLocation translateIdCrude(String id) {
|
||||
private static ResourceLocation translateId(String id) {
|
||||
switch (id) {
|
||||
case "Sign":
|
||||
return new ResourceLocation("minecraft:sign");
|
||||
return TileEntity.getKey(TileEntitySign.class);
|
||||
case "Music":
|
||||
return new ResourceLocation("minecraft:noteblock");
|
||||
return TileEntity.getKey(TileEntityNote.class);
|
||||
case "Trap":
|
||||
return new ResourceLocation("minecraft:dispenser");
|
||||
return TileEntity.getKey(TileEntityDispenser.class);
|
||||
case "Comparator":
|
||||
return new ResourceLocation("minecraft:comparator");
|
||||
return TileEntity.getKey(TileEntityComparator.class);
|
||||
case "Hopper":
|
||||
return new ResourceLocation("minecraft:hopper");
|
||||
return TileEntity.getKey(TileEntityHopper.class);
|
||||
case "Furnace":
|
||||
return new ResourceLocation("minecraft:furnace");
|
||||
return TileEntity.getKey(TileEntityFurnace.class);
|
||||
case "Chest":
|
||||
return TileEntity.getKey(TileEntityChest.class);
|
||||
default:
|
||||
return new ResourceLocation("minecraft:chest");
|
||||
throw new RuntimeException("Tile entity ID " + id + " not supported by conversion code");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,22 +1,12 @@
|
|||
package org.dimdev.dimdoors.shared.tools;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockDoor;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.init.Bootstrap;
|
||||
import net.minecraft.item.EnumDyeColor;
|
||||
import net.minecraft.nbt.CompressedStreamTools;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraftforge.event.RegistryEvent;
|
||||
import net.minecraftforge.fml.common.DummyModContainer;
|
||||
import net.minecraftforge.fml.common.Loader;
|
||||
import net.minecraftforge.fml.common.ModContainer;
|
||||
import net.minecraftforge.fml.common.ModMetadata;
|
||||
import net.minecraftforge.registries.GameData;
|
||||
import net.minecraftforge.registries.RegistryManager;
|
||||
import org.dimdev.ddutils.schem.Schematic;
|
||||
import org.dimdev.dimdoors.DimDoors;
|
||||
import org.dimdev.dimdoors.server.ServerProxy;
|
||||
import org.dimdev.dimdoors.shared.blocks.BlockDimensionalDoor;
|
||||
import org.dimdev.dimdoors.shared.blocks.BlockFabric;
|
||||
import org.dimdev.dimdoors.shared.blocks.BlockFabricAncient;
|
||||
|
@ -37,25 +27,11 @@ import java.util.Arrays;
|
|||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Robijnvogel
|
||||
*/
|
||||
public final class PocketSchematicGenerator {
|
||||
public final class SchematicGenerator {
|
||||
|
||||
// Run "gradlew generatePocketSchematics" to generate the pocket schematics
|
||||
@SuppressWarnings("UseOfSystemOutOrSystemErr")
|
||||
public static void main(String... args) throws IOException, NoSuchMethodException, NoSuchFieldException, IllegalAccessException {
|
||||
// Register blocks and tile entities to be able to run this without starting Minecraft
|
||||
Bootstrap.register();
|
||||
ModMetadata md = new ModMetadata();
|
||||
md.modId = DimDoors.MODID;
|
||||
ModContainer mc = new DummyModContainer(md);
|
||||
Loader.instance().setupTestHarness(mc);
|
||||
Loader.instance().setActiveModContainer(mc);
|
||||
ModBlocks.registerBlocks(new RegistryEvent.Register<Block>(GameData.BLOCKS, RegistryManager.ACTIVE.getRegistry(GameData.BLOCKS)));
|
||||
new ServerProxy().registerTileEntities();
|
||||
new ServerProxy().registerRiftDestinations();
|
||||
Loader.instance().setActiveModContainer(null);
|
||||
public static void main(String... args) throws IOException {
|
||||
|
||||
// Parse arguments
|
||||
File schematicDir;
|
||||
|
@ -72,6 +48,9 @@ public final class PocketSchematicGenerator {
|
|||
schematicDir = new File("schematics/");
|
||||
}
|
||||
|
||||
// Register blocks and tile entities to be able to run this without starting Minecraft
|
||||
Initializer.initialize();
|
||||
|
||||
// Generate the schematics
|
||||
List<Schematic> schematics = generatePocketSchematics();
|
||||
|
||||
|
@ -116,16 +95,19 @@ public final class PocketSchematicGenerator {
|
|||
PrivatePocketExitDestination.builder().build(),// exit rift destination
|
||||
null));
|
||||
|
||||
schematics.add(generateBlank("blank_pocket",
|
||||
schematics.add(generateBlank(
|
||||
"blank_pocket",
|
||||
pocketSize,
|
||||
ModBlocks.ANCIENT_FABRIC.getDefaultState(),
|
||||
ModBlocks.FABRIC.getDefaultState()));
|
||||
|
||||
schematics.add(generateFrame("void_pocket",
|
||||
schematics.add(generateFrame(
|
||||
"void_pocket",
|
||||
pocketSize,
|
||||
ModBlocks.FABRIC.getDefaultState().withProperty(BlockFabric.COLOR, EnumDyeColor.LIGHT_BLUE)));
|
||||
|
||||
schematics.add(generateResizableFrame("resizable_pocket",
|
||||
schematics.add(generateResizableFrame(
|
||||
"resizable_pocket",
|
||||
pocketSize,
|
||||
ModBlocks.FABRIC.getDefaultState().withProperty(BlockFabric.COLOR, EnumDyeColor.ORANGE)));
|
||||
}
|
||||
|
@ -137,7 +119,7 @@ public final class PocketSchematicGenerator {
|
|||
|
||||
// Set schematic info
|
||||
Schematic schematic = new Schematic(baseName + "_" + pocketSize, "DimDoors", size, size, size);
|
||||
schematic.requiredMods = new String[] { DimDoors.MODID };
|
||||
schematic.requiredMods = new String[]{DimDoors.MODID};
|
||||
|
||||
// Set block data
|
||||
for (int x = 0; x < size; x++) {
|
||||
|
@ -189,7 +171,7 @@ public final class PocketSchematicGenerator {
|
|||
|
||||
// Set schematic info
|
||||
Schematic schematic = new Schematic(baseName + "_" + chunkSize, "DimDoors", size, size, size);
|
||||
schematic.requiredMods = new String[] { DimDoors.MODID };
|
||||
schematic.requiredMods = new String[]{DimDoors.MODID};
|
||||
|
||||
// Set block data
|
||||
for (int x = 0; x < size; x++) {
|
||||
|
@ -215,7 +197,7 @@ public final class PocketSchematicGenerator {
|
|||
|
||||
// Set schematic info
|
||||
Schematic schematic = new Schematic(baseName + "_" + chunkSize, "DimDoors", size, size, size);
|
||||
schematic.requiredMods = new String[] { DimDoors.MODID };
|
||||
schematic.requiredMods = new String[]{DimDoors.MODID};
|
||||
|
||||
// Set block data
|
||||
for (int x = 0; x < size; x++) {
|
|
@ -35,7 +35,7 @@ public abstract class BaseSchematicGateway extends BaseGateway {
|
|||
if (streamOpened) {
|
||||
try {
|
||||
schematicNBT = CompressedStreamTools.readCompressed(schematicDataStream);
|
||||
schematic = SchematicConverter.convertSchematic(schematicNBT, id, null, null);
|
||||
schematic = SchematicConverter.convertSchematic(schematicNBT, id, null);
|
||||
schematicDataStream.close();
|
||||
} catch (IOException ex) {
|
||||
DimDoors.log.error("Schematic file for " + id + " could not be read as a valid schematic NBT file.", ex);
|
||||
|
|
|
@ -1,36 +1,36 @@
|
|||
{
|
||||
"variants": {
|
||||
"facing=east,half=lower,hinge=left,open=false": { "model": "dimdoors:warp_dimensional_door_bottom" },
|
||||
"facing=south,half=lower,hinge=left,open=false": { "model": "dimdoors:warp_dimensional_door_bottom", "y": 90 },
|
||||
"facing=west,half=lower,hinge=left,open=false": { "model": "dimdoors:warp_dimensional_door_bottom", "y": 180 },
|
||||
"facing=north,half=lower,hinge=left,open=false": { "model": "dimdoors:warp_dimensional_door_bottom", "y": 270 },
|
||||
"facing=east,half=lower,hinge=right,open=false": { "model": "dimdoors:warp_dimensional_door_bottom_rh" },
|
||||
"facing=south,half=lower,hinge=right,open=false": { "model": "dimdoors:warp_dimensional_door_bottom_rh", "y": 90 },
|
||||
"facing=west,half=lower,hinge=right,open=false": { "model": "dimdoors:warp_dimensional_door_bottom_rh", "y": 180 },
|
||||
"facing=north,half=lower,hinge=right,open=false": { "model": "dimdoors:warp_dimensional_door_bottom_rh", "y": 270 },
|
||||
"facing=east,half=lower,hinge=left,open=true": { "model": "dimdoors:warp_dimensional_door_bottom_rh", "y": 90 },
|
||||
"facing=south,half=lower,hinge=left,open=true": { "model": "dimdoors:warp_dimensional_door_bottom_rh", "y": 180 },
|
||||
"facing=west,half=lower,hinge=left,open=true": { "model": "dimdoors:warp_dimensional_door_bottom_rh", "y": 270 },
|
||||
"facing=north,half=lower,hinge=left,open=true": { "model": "dimdoors:warp_dimensional_door_bottom_rh" },
|
||||
"facing=east,half=lower,hinge=right,open=true": { "model": "dimdoors:warp_dimensional_door_bottom", "y": 270 },
|
||||
"facing=south,half=lower,hinge=right,open=true": { "model": "dimdoors:warp_dimensional_door_bottom" },
|
||||
"facing=west,half=lower,hinge=right,open=true": { "model": "dimdoors:warp_dimensional_door_bottom", "y": 90 },
|
||||
"facing=north,half=lower,hinge=right,open=true": { "model": "dimdoors:warp_dimensional_door_bottom", "y": 180 },
|
||||
"facing=east,half=upper,hinge=left,open=false": { "model": "dimdoors:warp_dimensional_door_top" },
|
||||
"facing=south,half=upper,hinge=left,open=false": { "model": "dimdoors:warp_dimensional_door_top", "y": 90 },
|
||||
"facing=west,half=upper,hinge=left,open=false": { "model": "dimdoors:warp_dimensional_door_top", "y": 180 },
|
||||
"facing=north,half=upper,hinge=left,open=false": { "model": "dimdoors:warp_dimensional_door_top", "y": 270 },
|
||||
"facing=east,half=upper,hinge=right,open=false": { "model": "dimdoors:warp_dimensional_door_top_rh" },
|
||||
"facing=south,half=upper,hinge=right,open=false": { "model": "dimdoors:warp_dimensional_door_top_rh", "y": 90 },
|
||||
"facing=west,half=upper,hinge=right,open=false": { "model": "dimdoors:warp_dimensional_door_top_rh", "y": 180 },
|
||||
"facing=north,half=upper,hinge=right,open=false": { "model": "dimdoors:warp_dimensional_door_top_rh", "y": 270 },
|
||||
"facing=east,half=upper,hinge=left,open=true": { "model": "dimdoors:warp_dimensional_door_top_rh", "y": 90 },
|
||||
"facing=south,half=upper,hinge=left,open=true": { "model": "dimdoors:warp_dimensional_door_top_rh", "y": 180 },
|
||||
"facing=west,half=upper,hinge=left,open=true": { "model": "dimdoors:warp_dimensional_door_top_rh", "y": 270 },
|
||||
"facing=north,half=upper,hinge=left,open=true": { "model": "dimdoors:warp_dimensional_door_top_rh" },
|
||||
"facing=east,half=upper,hinge=right,open=true": { "model": "dimdoors:warp_dimensional_door_top", "y": 270 },
|
||||
"facing=south,half=upper,hinge=right,open=true": { "model": "dimdoors:warp_dimensional_door_top" },
|
||||
"facing=west,half=upper,hinge=right,open=true": { "model": "dimdoors:warp_dimensional_door_top", "y": 90 },
|
||||
"facing=north,half=upper,hinge=right,open=true": { "model": "dimdoors:warp_dimensional_door_top", "y": 180 }
|
||||
"facing=east,half=lower,hinge=left,open=false": { "model": "dimdoors:iron_dimensional_door_bottom" },
|
||||
"facing=south,half=lower,hinge=left,open=false": { "model": "dimdoors:iron_dimensional_door_bottom", "y": 90 },
|
||||
"facing=west,half=lower,hinge=left,open=false": { "model": "dimdoors:iron_dimensional_door_bottom", "y": 180 },
|
||||
"facing=north,half=lower,hinge=left,open=false": { "model": "dimdoors:iron_dimensional_door_bottom", "y": 270 },
|
||||
"facing=east,half=lower,hinge=right,open=false": { "model": "dimdoors:iron_dimensional_door_bottom_rh" },
|
||||
"facing=south,half=lower,hinge=right,open=false": { "model": "dimdoors:iron_dimensional_door_bottom_rh", "y": 90 },
|
||||
"facing=west,half=lower,hinge=right,open=false": { "model": "dimdoors:iron_dimensional_door_bottom_rh", "y": 180 },
|
||||
"facing=north,half=lower,hinge=right,open=false": { "model": "dimdoors:iron_dimensional_door_bottom_rh", "y": 270 },
|
||||
"facing=east,half=lower,hinge=left,open=true": { "model": "dimdoors:iron_dimensional_door_bottom_rh", "y": 90 },
|
||||
"facing=south,half=lower,hinge=left,open=true": { "model": "dimdoors:iron_dimensional_door_bottom_rh", "y": 180 },
|
||||
"facing=west,half=lower,hinge=left,open=true": { "model": "dimdoors:iron_dimensional_door_bottom_rh", "y": 270 },
|
||||
"facing=north,half=lower,hinge=left,open=true": { "model": "dimdoors:iron_dimensional_door_bottom_rh" },
|
||||
"facing=east,half=lower,hinge=right,open=true": { "model": "dimdoors:iron_dimensional_door_bottom", "y": 270 },
|
||||
"facing=south,half=lower,hinge=right,open=true": { "model": "dimdoors:iron_dimensional_door_bottom" },
|
||||
"facing=west,half=lower,hinge=right,open=true": { "model": "dimdoors:iron_dimensional_door_bottom", "y": 90 },
|
||||
"facing=north,half=lower,hinge=right,open=true": { "model": "dimdoors:iron_dimensional_door_bottom", "y": 180 },
|
||||
"facing=east,half=upper,hinge=left,open=false": { "model": "dimdoors:iron_dimensional_door_top" },
|
||||
"facing=south,half=upper,hinge=left,open=false": { "model": "dimdoors:iron_dimensional_door_top", "y": 90 },
|
||||
"facing=west,half=upper,hinge=left,open=false": { "model": "dimdoors:iron_dimensional_door_top", "y": 180 },
|
||||
"facing=north,half=upper,hinge=left,open=false": { "model": "dimdoors:iron_dimensional_door_top", "y": 270 },
|
||||
"facing=east,half=upper,hinge=right,open=false": { "model": "dimdoors:iron_dimensional_door_top_rh" },
|
||||
"facing=south,half=upper,hinge=right,open=false": { "model": "dimdoors:iron_dimensional_door_top_rh", "y": 90 },
|
||||
"facing=west,half=upper,hinge=right,open=false": { "model": "dimdoors:iron_dimensional_door_top_rh", "y": 180 },
|
||||
"facing=north,half=upper,hinge=right,open=false": { "model": "dimdoors:iron_dimensional_door_top_rh", "y": 270 },
|
||||
"facing=east,half=upper,hinge=left,open=true": { "model": "dimdoors:iron_dimensional_door_top_rh", "y": 90 },
|
||||
"facing=south,half=upper,hinge=left,open=true": { "model": "dimdoors:iron_dimensional_door_top_rh", "y": 180 },
|
||||
"facing=west,half=upper,hinge=left,open=true": { "model": "dimdoors:iron_dimensional_door_top_rh", "y": 270 },
|
||||
"facing=north,half=upper,hinge=left,open=true": { "model": "dimdoors:iron_dimensional_door_top_rh" },
|
||||
"facing=east,half=upper,hinge=right,open=true": { "model": "dimdoors:iron_dimensional_door_top", "y": 270 },
|
||||
"facing=south,half=upper,hinge=right,open=true": { "model": "dimdoors:iron_dimensional_door_top" },
|
||||
"facing=west,half=upper,hinge=right,open=true": { "model": "dimdoors:iron_dimensional_door_top", "y": 90 },
|
||||
"facing=north,half=upper,hinge=right,open=true": { "model": "dimdoors:iron_dimensional_door_top", "y": 180 }
|
||||
}
|
||||
}
|
|
@ -1,36 +1,36 @@
|
|||
{
|
||||
"variants": {
|
||||
"facing=east,half=lower,hinge=left,open=false": { "model": "dimdoors:dimensional_door_bottom" },
|
||||
"facing=south,half=lower,hinge=left,open=false": { "model": "dimdoors:dimensional_door_bottom", "y": 90 },
|
||||
"facing=west,half=lower,hinge=left,open=false": { "model": "dimdoors:dimensional_door_bottom", "y": 180 },
|
||||
"facing=north,half=lower,hinge=left,open=false": { "model": "dimdoors:dimensional_door_bottom", "y": 270 },
|
||||
"facing=east,half=lower,hinge=right,open=false": { "model": "dimdoors:dimensional_door_bottom_rh" },
|
||||
"facing=south,half=lower,hinge=right,open=false": { "model": "dimdoors:dimensional_door_bottom_rh", "y": 90 },
|
||||
"facing=west,half=lower,hinge=right,open=false": { "model": "dimdoors:dimensional_door_bottom_rh", "y": 180 },
|
||||
"facing=north,half=lower,hinge=right,open=false": { "model": "dimdoors:dimensional_door_bottom_rh", "y": 270 },
|
||||
"facing=east,half=lower,hinge=left,open=true": { "model": "dimdoors:dimensional_door_bottom_rh", "y": 90 },
|
||||
"facing=south,half=lower,hinge=left,open=true": { "model": "dimdoors:dimensional_door_bottom_rh", "y": 180 },
|
||||
"facing=west,half=lower,hinge=left,open=true": { "model": "dimdoors:dimensional_door_bottom_rh", "y": 270 },
|
||||
"facing=north,half=lower,hinge=left,open=true": { "model": "dimdoors:dimensional_door_bottom_rh" },
|
||||
"facing=east,half=lower,hinge=right,open=true": { "model": "dimdoors:dimensional_door_bottom", "y": 270 },
|
||||
"facing=south,half=lower,hinge=right,open=true": { "model": "dimdoors:dimensional_door_bottom" },
|
||||
"facing=west,half=lower,hinge=right,open=true": { "model": "dimdoors:dimensional_door_bottom", "y": 90 },
|
||||
"facing=north,half=lower,hinge=right,open=true": { "model": "dimdoors:dimensional_door_bottom", "y": 180 },
|
||||
"facing=east,half=upper,hinge=left,open=false": { "model": "dimdoors:dimensional_door_top" },
|
||||
"facing=south,half=upper,hinge=left,open=false": { "model": "dimdoors:dimensional_door_top", "y": 90 },
|
||||
"facing=west,half=upper,hinge=left,open=false": { "model": "dimdoors:dimensional_door_top", "y": 180 },
|
||||
"facing=north,half=upper,hinge=left,open=false": { "model": "dimdoors:dimensional_door_top", "y": 270 },
|
||||
"facing=east,half=upper,hinge=right,open=false": { "model": "dimdoors:dimensional_door_top_rh" },
|
||||
"facing=south,half=upper,hinge=right,open=false": { "model": "dimdoors:dimensional_door_top_rh", "y": 90 },
|
||||
"facing=west,half=upper,hinge=right,open=false": { "model": "dimdoors:dimensional_door_top_rh", "y": 180 },
|
||||
"facing=north,half=upper,hinge=right,open=false": { "model": "dimdoors:dimensional_door_top_rh", "y": 270 },
|
||||
"facing=east,half=upper,hinge=left,open=true": { "model": "dimdoors:dimensional_door_top_rh", "y": 90 },
|
||||
"facing=south,half=upper,hinge=left,open=true": { "model": "dimdoors:dimensional_door_top_rh", "y": 180 },
|
||||
"facing=west,half=upper,hinge=left,open=true": { "model": "dimdoors:dimensional_door_top_rh", "y": 270 },
|
||||
"facing=north,half=upper,hinge=left,open=true": { "model": "dimdoors:dimensional_door_top_rh" },
|
||||
"facing=east,half=upper,hinge=right,open=true": { "model": "dimdoors:dimensional_door_top", "y": 270 },
|
||||
"facing=south,half=upper,hinge=right,open=true": { "model": "dimdoors:dimensional_door_top" },
|
||||
"facing=west,half=upper,hinge=right,open=true": { "model": "dimdoors:dimensional_door_top", "y": 90 },
|
||||
"facing=north,half=upper,hinge=right,open=true": { "model": "dimdoors:dimensional_door_top", "y": 180 }
|
||||
"facing=east,half=lower,hinge=left,open=false": { "model": "dimdoors:oak_dimensional_door_bottom" },
|
||||
"facing=south,half=lower,hinge=left,open=false": { "model": "dimdoors:oak_dimensional_door_bottom", "y": 90 },
|
||||
"facing=west,half=lower,hinge=left,open=false": { "model": "dimdoors:oak_dimensional_door_bottom", "y": 180 },
|
||||
"facing=north,half=lower,hinge=left,open=false": { "model": "dimdoors:oak_dimensional_door_bottom", "y": 270 },
|
||||
"facing=east,half=lower,hinge=right,open=false": { "model": "dimdoors:oak_dimensional_door_bottom_rh" },
|
||||
"facing=south,half=lower,hinge=right,open=false": { "model": "dimdoors:oak_dimensional_door_bottom_rh", "y": 90 },
|
||||
"facing=west,half=lower,hinge=right,open=false": { "model": "dimdoors:oak_dimensional_door_bottom_rh", "y": 180 },
|
||||
"facing=north,half=lower,hinge=right,open=false": { "model": "dimdoors:oak_dimensional_door_bottom_rh", "y": 270 },
|
||||
"facing=east,half=lower,hinge=left,open=true": { "model": "dimdoors:oak_dimensional_door_bottom_rh", "y": 90 },
|
||||
"facing=south,half=lower,hinge=left,open=true": { "model": "dimdoors:oak_dimensional_door_bottom_rh", "y": 180 },
|
||||
"facing=west,half=lower,hinge=left,open=true": { "model": "dimdoors:oak_dimensional_door_bottom_rh", "y": 270 },
|
||||
"facing=north,half=lower,hinge=left,open=true": { "model": "dimdoors:oak_dimensional_door_bottom_rh" },
|
||||
"facing=east,half=lower,hinge=right,open=true": { "model": "dimdoors:oak_dimensional_door_bottom", "y": 270 },
|
||||
"facing=south,half=lower,hinge=right,open=true": { "model": "dimdoors:oak_dimensional_door_bottom" },
|
||||
"facing=west,half=lower,hinge=right,open=true": { "model": "dimdoors:oak_dimensional_door_bottom", "y": 90 },
|
||||
"facing=north,half=lower,hinge=right,open=true": { "model": "dimdoors:oak_dimensional_door_bottom", "y": 180 },
|
||||
"facing=east,half=upper,hinge=left,open=false": { "model": "dimdoors:oak_dimensional_door_top" },
|
||||
"facing=south,half=upper,hinge=left,open=false": { "model": "dimdoors:oak_dimensional_door_top", "y": 90 },
|
||||
"facing=west,half=upper,hinge=left,open=false": { "model": "dimdoors:oak_dimensional_door_top", "y": 180 },
|
||||
"facing=north,half=upper,hinge=left,open=false": { "model": "dimdoors:oak_dimensional_door_top", "y": 270 },
|
||||
"facing=east,half=upper,hinge=right,open=false": { "model": "dimdoors:oak_dimensional_door_top_rh" },
|
||||
"facing=south,half=upper,hinge=right,open=false": { "model": "dimdoors:oak_dimensional_door_top_rh", "y": 90 },
|
||||
"facing=west,half=upper,hinge=right,open=false": { "model": "dimdoors:oak_dimensional_door_top_rh", "y": 180 },
|
||||
"facing=north,half=upper,hinge=right,open=false": { "model": "dimdoors:oak_dimensional_door_top_rh", "y": 270 },
|
||||
"facing=east,half=upper,hinge=left,open=true": { "model": "dimdoors:oak_dimensional_door_top_rh", "y": 90 },
|
||||
"facing=south,half=upper,hinge=left,open=true": { "model": "dimdoors:oak_dimensional_door_top_rh", "y": 180 },
|
||||
"facing=west,half=upper,hinge=left,open=true": { "model": "dimdoors:oak_dimensional_door_top_rh", "y": 270 },
|
||||
"facing=north,half=upper,hinge=left,open=true": { "model": "dimdoors:oak_dimensional_door_top_rh" },
|
||||
"facing=east,half=upper,hinge=right,open=true": { "model": "dimdoors:oak_dimensional_door_top", "y": 270 },
|
||||
"facing=south,half=upper,hinge=right,open=true": { "model": "dimdoors:oak_dimensional_door_top" },
|
||||
"facing=west,half=upper,hinge=right,open=true": { "model": "dimdoors:oak_dimensional_door_top", "y": 90 },
|
||||
"facing=north,half=upper,hinge=right,open=true": { "model": "dimdoors:oak_dimensional_door_top", "y": 180 }
|
||||
}
|
||||
}
|
|
@ -3,11 +3,11 @@ itemGroup.dimensional_doors_creative_tab=Dimensional Doors: Items
|
|||
tile.gold_door.name=Goldtür
|
||||
tile.quartz_door.name=Quarztür
|
||||
|
||||
tile.dimensional_door.name=Dimensionaltür
|
||||
tile.iron_dimensional_door.name=Dimensionaltür
|
||||
tile.gold_dimensional_door.name=Goldene Dimensionaltür
|
||||
tile.quartz_dimensional_door.name=Persönliche Dimensionaltür
|
||||
tile.chaos_dimensional_door.name=Instabile Tür
|
||||
tile.warp_dimensional_door.name=Warp-Tür
|
||||
tile.oak_dimensional_door.name=Warp-Tür
|
||||
tile.dimensional_trapdoor.name=Transdimensionale Falltür
|
||||
tile.dimensional_portal.name=Vergängliche Tür
|
||||
|
||||
|
@ -21,11 +21,11 @@ tile.rift.name=Spalt
|
|||
item.gold_door.name=Goldtür
|
||||
item.quartz_door.name=Quarztür
|
||||
|
||||
item.dimensional_door.name=Dimensionaltür
|
||||
item.iron_dimensional_door.name=Dimensionaltür
|
||||
item.gold_dimensional_door.name=Goldene Dimensionaltür
|
||||
item.quartz_dimensional_door.name=Persönliche Dimensionaltür
|
||||
item.chaos_dimensional_door.name=Instabile Tür
|
||||
item.warp_dimensional_door.name=Warp-Tür
|
||||
item.oak_dimensional_door.name=Warp-Tür
|
||||
|
||||
item.rift_key=Spaltschlüssel
|
||||
item.rift_signature.name=Spaltsignatur
|
||||
|
@ -40,10 +40,10 @@ item.stable_fabric.name=Stabiler Stoff
|
|||
info.rift_key.bound=Gebunden
|
||||
info.rift_key.unbound=Nicht gebunden
|
||||
|
||||
info.dimensional_door0=Platziere auf dem Block unterhalb eines Spalts,
|
||||
info.dimensional_door1=um diesen Spalt zu aktivieren, oder
|
||||
info.dimensional_door2=irgendwo anders, um eine
|
||||
info.dimensional_door3=kleine Dimension to erschaffen.
|
||||
info.iron_dimensional_door0=Platziere auf dem Block unterhalb eines Spalts,
|
||||
info.iron_dimensional_door1=um diesen Spalt zu aktivieren, oder
|
||||
info.iron_dimensional_door2=irgendwo anders, um eine
|
||||
info.iron_dimensional_door3=kleine Dimension to erschaffen.
|
||||
|
||||
info.gold_dimensional_door0=Ähnlich einer Dimensionaltür,
|
||||
info.gold_dimensional_door1=aber hält die kleine Dimension geladen,
|
||||
|
@ -71,9 +71,9 @@ info.stabilized_rift_signature.unbound2=die erste und die aktuelle Position verb
|
|||
|
||||
info.chaos_dimensional_door=Vorsicht: Führt zu einem zufälligen Ziel
|
||||
|
||||
info.warp_dimensional_door0=Platziere auf dem Block unterhalb eines
|
||||
info.warp_dimensional_door1=Spalts, um ein Portal zu erstellen,
|
||||
info.warp_dimensional_door2=oder platziere irgendwo in einer
|
||||
info.warp_dimensional_door3=kleinen Dimension, um sie zu verlassen.
|
||||
info.oak_dimensional_door0=Platziere auf dem Block unterhalb eines
|
||||
info.oak_dimensional_door1=Spalts, um ein Portal zu erstellen,
|
||||
info.oak_dimensional_door2=oder platziere irgendwo in einer
|
||||
info.oak_dimensional_door3=kleinen Dimension, um sie zu verlassen.
|
||||
|
||||
entity.dimdoors.monolith.name=Monolith
|
||||
|
|
|
@ -3,11 +3,11 @@ itemGroup.dimensional_doors_creative_tab=Dimensional Doors Items
|
|||
tile.gold_door.name=Golden Door
|
||||
tile.quartz_door.name=Quartz Door
|
||||
|
||||
tile.dimensional_door.name=Dimensional Door
|
||||
tile.iron_dimensional_door.name=Dimensional Door
|
||||
tile.gold_dimensional_door.name=Golden Dimensional Door
|
||||
tile.quartz_dimensional_door.name=Personal Dimensional Door
|
||||
tile.chaos_dimensional_door.name=Chaos Door
|
||||
tile.warp_dimensional_door.name=Warp Door
|
||||
tile.oak_dimensional_door.name=Warp Door
|
||||
tile.dimensional_trapdoor.name=Transdimensional Trapdoor
|
||||
tile.dimensional_portal.name=Transient Portal
|
||||
|
||||
|
@ -52,11 +52,11 @@ tile.rift.name=Rift Scar
|
|||
item.gold_door.name=Golden Door
|
||||
item.quartz_door.name=Quartz Door
|
||||
|
||||
item.dimensional_door.name=Dimensional Door
|
||||
item.iron_dimensional_door.name=Dimensional Door
|
||||
item.gold_dimensional_door.name=Golden Dimensional Door
|
||||
item.quartz_dimensional_door.name=Personal Dimensional Door
|
||||
item.chaos_dimensional_door.name=Chaos Door
|
||||
item.warp_dimensional_door.name=Warp Door
|
||||
item.oak_dimensional_door.name=Warp Door
|
||||
|
||||
item.rift_key=Rift Key
|
||||
item.rift_signature.name=Rift Signature
|
||||
|
@ -81,10 +81,10 @@ item.chestplate_woven_world_thread.name=Woven World Thread Chestplate
|
|||
info.rift_key.bound=Bound
|
||||
info.rift_key.unbound=Unbound
|
||||
|
||||
info.dimensional_door0=Place on the block under a rift
|
||||
info.dimensional_door1=to activate that rift or place
|
||||
info.dimensional_door2=anywhere else to create a
|
||||
info.dimensional_door3=pocket dimension.
|
||||
info.iron_dimensional_door0=Place on the block under a rift
|
||||
info.iron_dimensional_door1=to activate that rift or place
|
||||
info.iron_dimensional_door2=anywhere else to create a
|
||||
info.iron_dimensional_door3=pocket dimension.
|
||||
|
||||
info.gold_dimensional_door0=Similar to a Dimensional Door
|
||||
info.gold_dimensional_door1=but keeps a pocket dimension
|
||||
|
@ -112,7 +112,7 @@ info.stabilized_rift_signature.unbound2=the first and last locations together.
|
|||
|
||||
info.chaos_dimensional_door=Caution: Leads to random destination
|
||||
|
||||
info.warp_dimensional_door0=Place on the block under a rift to create a portal, or place anywhere in a pocket dimension to exit.
|
||||
info.oak_dimensional_door0=Place on the block under a rift to create a portal, or place anywhere in a pocket dimension to exit.
|
||||
|
||||
entity.dimdoors.monolith.name=Monolith
|
||||
|
||||
|
|
|
@ -3,11 +3,11 @@ itemGroup.dimensional_doors_creative_tab=Objets Dimensional Doors
|
|||
tile.gold_door.name=Porte dorée
|
||||
tile.quartz_door.name=Porte de quartz
|
||||
|
||||
tile.dimensional_door.name=Porte dimensionnelle
|
||||
tile.iron_dimensional_door.name=Porte dimensionnelle
|
||||
tile.gold_dimensional_door.name=Porte dorée dimensionnelle
|
||||
tile.quartz_dimensional_door.name=Porte dimensionnelle personnelle
|
||||
tile.chaos_dimensional_door.name=Porte instable
|
||||
tile.warp_dimensional_door.name=Porte-raccourci
|
||||
tile.oak_dimensional_door.name=Porte-raccourci
|
||||
tile.dimensional_trapdoor.name=Trappe transdimensionnelle
|
||||
tile.dimensional_portal.name=Portail dimensionel
|
||||
|
||||
|
@ -38,11 +38,11 @@ tile.rift.name=Fissure
|
|||
item.gold_door.name=Porte dorée
|
||||
item.quartz_door.name=Porte de quartz
|
||||
|
||||
item.dimensional_door.name=Porte dimensionnelle
|
||||
item.iron_dimensional_door.name=Porte dimensionnelle
|
||||
item.gold_dimensional_door.name=Porte dorée dimensionnelle
|
||||
item.quartz_dimensional_door.name=Porte dimensionnelle personnelle
|
||||
item.chaos_dimensional_door.name=Porte instable
|
||||
item.warp_dimensional_door.name=Porte-raccourci
|
||||
item.oak_dimensional_door.name=Porte-raccourci
|
||||
|
||||
item.rift_key=Clé de fissure
|
||||
item.rift_signature.name=Signature de fissure
|
||||
|
@ -57,10 +57,10 @@ item.stable_fabric.name=Étoffe stable
|
|||
info.rift_key.bound=Liée
|
||||
info.rift_key.unbound=Non liée
|
||||
|
||||
info.dimensional_door0=Placez sur le bloc sous une fissure
|
||||
info.dimensional_door1=pour activer cette fissure ou placez
|
||||
info.dimensional_door2=n'importe où ailleurs pour créer une
|
||||
info.dimensional_door3=dimension de poche.
|
||||
info.iron_dimensional_door0=Placez sur le bloc sous une fissure
|
||||
info.iron_dimensional_door1=pour activer cette fissure ou placez
|
||||
info.iron_dimensional_door2=n'importe où ailleurs pour créer une
|
||||
info.iron_dimensional_door3=dimension de poche.
|
||||
|
||||
info.gold_dimensional_door0=Similaire à une porte dimensionnelle
|
||||
info.gold_dimensional_door1=mais garde une dimension de poche
|
||||
|
@ -88,9 +88,9 @@ info.stabilized_rift_signature.unbound2=le premier et les derniers emplacements
|
|||
|
||||
info.chaos_dimensional_door=Attention : mène vers une destination aléatoire
|
||||
|
||||
info.warp_dimensional_door0=Placez sur le bloc sous une
|
||||
info.warp_dimensional_door1=fissure pour créer un portail,
|
||||
info.warp_dimensional_door2=ou placez n'importe où dans une
|
||||
info.warp_dimensional_door3=dimension de poche pour sortir.
|
||||
info.oak_dimensional_door0=Placez sur le bloc sous une
|
||||
info.oak_dimensional_door1=fissure pour créer un portail,
|
||||
info.oak_dimensional_door2=ou placez n'importe où dans une
|
||||
info.oak_dimensional_door3=dimension de poche pour sortir.
|
||||
|
||||
entity.dimdoors.monolith.name=Monolithe
|
||||
|
|
|
@ -3,11 +3,11 @@ itemGroup.dimensional_doors_creative_tab=Dimensional Doors oggetti
|
|||
tile.gold_door.name=Porta d'oro
|
||||
tile.quartz_door.name=Porta di quarzo
|
||||
|
||||
tile.dimensional_door.name=Porta dimensionale
|
||||
tile.iron_dimensional_door.name=Porta dimensionale
|
||||
tile.gold_dimensional_door.name=Porta d'oro dimensionale
|
||||
tile.quartz_dimensional_door.name=Porta dimensionale personale
|
||||
tile.chaos_dimensional_door.name=Porta instabile
|
||||
tile.warp_dimensional_door.name=Porta distorta
|
||||
tile.oak_dimensional_door.name=Porta distorta
|
||||
tile.dimensional_trapdoor.name=Botola transdimensionale
|
||||
tile.dimensional_portal.name=Porta transitoria
|
||||
|
||||
|
@ -21,11 +21,11 @@ tile.rift.name=Frattura
|
|||
item.gold_door.name=Porta d'oro
|
||||
item.quartz_door.name=Porta di quarzo
|
||||
|
||||
item.dimensional_door.name=Porta dimensionale
|
||||
item.iron_dimensional_door.name=Porta dimensionale
|
||||
item.gold_dimensional_door.name=Porta d'oro dimensionale
|
||||
item.quartz_dimensional_door.name=Porta dimensionale personale
|
||||
item.chaos_dimensional_door.name=Porta instabile
|
||||
item.warp_dimensional_door.name=Porta distorta
|
||||
item.oak_dimensional_door.name=Porta distorta
|
||||
|
||||
item.rift_key=Chiave per frattura
|
||||
item.rift_signature.name=Segno di frattura
|
||||
|
@ -40,10 +40,10 @@ item.stable_fabric.name=Tessuto stabile
|
|||
info.rift_key.bound=Legato
|
||||
info.rift_key.unbound=Non legato
|
||||
|
||||
info.dimensional_door0=Piazzalo sul blocco sotto una
|
||||
info.dimensional_door1=frattura per attivarla o piazzalo
|
||||
info.dimensional_door2=da qualunque altra parte per creare
|
||||
info.dimensional_door3=una dimensione tascabile.
|
||||
info.iron_dimensional_door0=Piazzalo sul blocco sotto una
|
||||
info.iron_dimensional_door1=frattura per attivarla o piazzalo
|
||||
info.iron_dimensional_door2=da qualunque altra parte per creare
|
||||
info.iron_dimensional_door3=una dimensione tascabile.
|
||||
|
||||
info.gold_dimensional_door0=Simile a una Porta dimensionale
|
||||
info.gold_dimensional_door1=ma tiene la dimensione tascabile
|
||||
|
@ -71,9 +71,9 @@ info.stabilized_rift_signature.unbound2=collegano la prima e ultima posizione.
|
|||
|
||||
info.chaos_dimensional_door=Attenziione: Porta a una destinazione casuale
|
||||
|
||||
info.warp_dimensional_door0=Piazzalo sul blocco sotto una
|
||||
info.warp_dimensional_door1=frattura per creare un portale,
|
||||
info.warp_dimensional_door2=o piazzalo da qualunque altra parte
|
||||
info.warp_dimensional_door3=in una dimensione tascabile per uscire.
|
||||
info.oak_dimensional_door0=Piazzalo sul blocco sotto una
|
||||
info.oak_dimensional_door1=frattura per creare un portale,
|
||||
info.oak_dimensional_door2=o piazzalo da qualunque altra parte
|
||||
info.oak_dimensional_door3=in una dimensione tascabile per uscire.
|
||||
|
||||
entity.dimdoors.monolith.name=Monolito
|
||||
|
|
|
@ -3,11 +3,11 @@ itemGroup.dimensional_doors_creative_tab=Dimensional Doors Voorwerpen
|
|||
tile.gold_door.name=Gouden Deur
|
||||
tile.quartz_door.name=Kwartsen Deur
|
||||
|
||||
tile.dimensional_door.name=Dimensiedeur
|
||||
tile.iron_dimensional_door.name=Dimensiedeur
|
||||
tile.gold_dimensional_door.name=Gouden Dimensiedeur
|
||||
tile.quartz_dimensional_door.name=Persoonlijke Dimensiedeur
|
||||
tile.chaos_dimensional_door.name=Chaos Deur
|
||||
tile.warp_dimensional_door.name=Verdraaideur
|
||||
tile.oak_dimensional_door.name=Verdraaideur
|
||||
tile.dimensional_trapdoor.name=Transdimensionale Valdeur
|
||||
tile.dimensional_portal.name=Vergankelijk Portaal
|
||||
|
||||
|
@ -52,11 +52,11 @@ tile.rift.name=Scheur Wond
|
|||
item.gold_door.name=Gouden Deur
|
||||
item.quartz_door.name=Kwartsen Deur
|
||||
|
||||
item.dimensional_door.name=Dimensiedeur
|
||||
item.iron_dimensional_door.name=Dimensiedeur
|
||||
item.gold_dimensional_door.name=Gouden Dimensiedeur
|
||||
item.quartz_dimensional_door.name=Persoonlijke Dimensiedeur
|
||||
item.chaos_dimensional_door.name=Chaos Deur
|
||||
item.warp_dimensional_door.name=Verdraaideur
|
||||
item.oak_dimensional_door.name=Verdraaideur
|
||||
|
||||
item.rift_key=Scheur Sleutel
|
||||
item.rift_signature.name=Scheurtekening
|
||||
|
@ -71,10 +71,10 @@ item.stable_fabric.name=Stabiel Weefsel
|
|||
info.rift_key.bound=Gebonden
|
||||
info.rift_key.unbound=Ontbonden
|
||||
|
||||
info.dimensional_door0=Plaats op het blok onder een scheur
|
||||
info.dimensional_door1=om deze scheur te activeren of
|
||||
info.dimensional_door2=op een andere plaats om een
|
||||
info.dimensional_door3=publieke broekzak-dimensie te creëren.
|
||||
info.iron_dimensional_door0=Plaats op het blok onder een scheur
|
||||
info.iron_dimensional_door1=om deze scheur te activeren of
|
||||
info.iron_dimensional_door2=op een andere plaats om een
|
||||
info.iron_dimensional_door3=publieke broekzak-dimensie te creëren.
|
||||
|
||||
info.gold_dimensional_door0=Net als een Dimensiedeur, maar houdt
|
||||
info.gold_dimensional_door1=een broekzak dimensie geladen als
|
||||
|
@ -102,9 +102,9 @@ info.stabilized_rift_signature.unbound2=en laatste locaties met elkaar verbinden
|
|||
|
||||
info.chaos_dimensional_door=Pas op: Leidt naar een willekeurige bestemming
|
||||
|
||||
info.warp_dimensional_door0=Plaats op het blok onder een scheur
|
||||
info.warp_dimensional_door1=om een portaal te creëren,
|
||||
info.warp_dimensional_door2=of plaats het ergens in een
|
||||
info.warp_dimensional_door3=broekzak dimensie om deze te verlaten.
|
||||
info.oak_dimensional_door0=Plaats op het blok onder een scheur
|
||||
info.oak_dimensional_door1=om een portaal te creëren,
|
||||
info.oak_dimensional_door2=of plaats het ergens in een
|
||||
info.oak_dimensional_door3=broekzak dimensie om deze te verlaten.
|
||||
|
||||
entity.dimdoors.monolith.name=Monoliet
|
||||
|
|
|
@ -3,11 +3,11 @@ itemGroup.dimensional_doors_creative_tab=Obiecte Dimensional Doors
|
|||
tile.gold_door.name=Ușă de aur
|
||||
tile.quartz_door.name=Ușă de cuarț
|
||||
|
||||
tile.dimensional_door.name=Ușă dimensională
|
||||
tile.iron_dimensional_door.name=Ușă dimensională
|
||||
tile.gold_dimensional_door.name=Ușă dimensională de aur
|
||||
tile.quartz_dimensional_door.name=Ușă dimensională de cuarț
|
||||
tile.chaos_dimensional_door.name=Ușă instabilă
|
||||
tile.warp_dimensional_door.name=Ușă de distorsiune
|
||||
tile.oak_dimensional_door.name=Ușă de distorsiune
|
||||
tile.dimensional_trapdoor.name=Trapă transdimensională
|
||||
tile.dimensional_portal.name=Portal dimensional
|
||||
|
||||
|
@ -38,11 +38,11 @@ tile.rift.name=Fisură
|
|||
item.gold_door.name=Ușă de aur
|
||||
item.quartz_door.name=Ușă de cuarț
|
||||
|
||||
item.dimensional_door.name=Ușă dimensională
|
||||
item.iron_dimensional_door.name=Ușă dimensională
|
||||
item.gold_dimensional_door.name=Ușă dimensională de aur
|
||||
item.quartz_dimensional_door.name=Ușă dimensională de cuarț
|
||||
item.chaos_dimensional_door.name=Ușă instabilă
|
||||
item.warp_dimensional_door.name=Ușă de distorsiune
|
||||
item.oak_dimensional_door.name=Ușă de distorsiune
|
||||
|
||||
item.rift_key=Cheie de fisură
|
||||
item.rift_signature.name=Semnătură de fisură
|
||||
|
@ -57,10 +57,10 @@ item.stable_fabric.name=Ață stabilă
|
|||
info.rift_key.bound=Legat
|
||||
info.rift_key.unbound=Dezlegat
|
||||
|
||||
info.dimensional_door0=Plasează pe blocul de sub o fisură
|
||||
info.dimensional_door1=pentru a activa acea fisură sau
|
||||
info.dimensional_door2=oriunde altundeva pentru a crea
|
||||
info.dimensional_door3=o dimensiune de buzunar.
|
||||
info.iron_dimensional_door0=Plasează pe blocul de sub o fisură
|
||||
info.iron_dimensional_door1=pentru a activa acea fisură sau
|
||||
info.iron_dimensional_door2=oriunde altundeva pentru a crea
|
||||
info.iron_dimensional_door3=o dimensiune de buzunar.
|
||||
|
||||
info.gold_dimensional_door0=Similară la o ușă dimensională
|
||||
info.gold_dimensional_door1=doar că păstrează o dimensiune
|
||||
|
@ -89,9 +89,9 @@ info.stabilized_rift_signature.unbound2=prima și ultima conectiuni împreună.
|
|||
|
||||
info.chaos_dimensional_door=Atenție: Duce la o destinație aleatorie
|
||||
|
||||
info.warp_dimensional_door0=Plasează pe blocul sub o fisură
|
||||
info.warp_dimensional_door1=pentru a crea un portal sau
|
||||
info.warp_dimensional_door2=plasează ori unde într-o dimensiune
|
||||
info.warp_dimensional_door3=de buzunar pentru a ieșii.
|
||||
info.oak_dimensional_door0=Plasează pe blocul sub o fisură
|
||||
info.oak_dimensional_door1=pentru a crea un portal sau
|
||||
info.oak_dimensional_door2=plasează ori unde într-o dimensiune
|
||||
info.oak_dimensional_door3=de buzunar pentru a ieșii.
|
||||
|
||||
entity.dimdoors.monolith.name=Monolit
|
||||
|
|
|
@ -3,11 +3,11 @@ itemGroup.dimensional_doors_creative_tab=Dimensional Doors: Предметы
|
|||
tile.gold_door.name=Золотая дверь
|
||||
tile.quartz_door.name=Кварцевая дверь
|
||||
|
||||
tile.dimensional_door.name=Пространственная дверь
|
||||
tile.iron_dimensional_door.name=Пространственная дверь
|
||||
tile.gold_dimensional_door.name=Золотая пространственная дверь
|
||||
tile.quartz_dimensional_door.name=Личная пространственная дверь
|
||||
tile.chaos_dimensional_door.name=Нестабильная дверь
|
||||
tile.warp_dimensional_door.name=Дверь искажения
|
||||
tile.oak_dimensional_door.name=Дверь искажения
|
||||
tile.dimensional_trapdoor.name=Межпространственный люк
|
||||
tile.dimensional_portal.name=Временная дверь
|
||||
|
||||
|
@ -21,11 +21,11 @@ tile.rift.name=Разлом
|
|||
item.gold_door.name=Золотая дверь
|
||||
item.quartz_door.name=Кварцевая дверь
|
||||
|
||||
item.dimensional_door.name=Пространственная дверь
|
||||
item.iron_dimensional_door.name=Пространственная дверь
|
||||
item.gold_dimensional_door.name=Золотая пространственная дверь
|
||||
item.quartz_dimensional_door.name=Личная пространственная дверь
|
||||
item.chaos_dimensional_door.name=Нестабильная дверь
|
||||
item.warp_dimensional_door.name=Дверь искажения
|
||||
item.oak_dimensional_door.name=Дверь искажения
|
||||
|
||||
item.rift_key=Ключ разлома
|
||||
item.rift_signature.name=Подписыватель разлома
|
||||
|
@ -40,10 +40,10 @@ item.stable_fabric.name=Стабильная ткань
|
|||
info.rift_key.bound=Связан
|
||||
info.rift_key.unbound=Не связан
|
||||
|
||||
info.dimensional_door0=Поставьте на блок под разломом,
|
||||
info.dimensional_door1=чтобы активировать этот разлом или
|
||||
info.dimensional_door2=поставьте куда угодно, чтобы создать
|
||||
info.dimensional_door3=карманное измерение.
|
||||
info.iron_dimensional_door0=Поставьте на блок под разломом,
|
||||
info.iron_dimensional_door1=чтобы активировать этот разлом или
|
||||
info.iron_dimensional_door2=поставьте куда угодно, чтобы создать
|
||||
info.iron_dimensional_door3=карманное измерение.
|
||||
|
||||
info.gold_dimensional_door0=Схожа с пространственной дверью,
|
||||
info.gold_dimensional_door1=но она также держит карманное измерение
|
||||
|
@ -71,9 +71,9 @@ info.stabilized_rift_signature.unbound2=первое и последнее ра
|
|||
|
||||
info.chaos_dimensional_door=Внимание: Ведёт неизвестно куда
|
||||
|
||||
info.warp_dimensional_door0=Поставьте на блок под
|
||||
info.warp_dimensional_door1=разломом, чтобы создать портал
|
||||
info.warp_dimensional_door2=или поставьте куда угодно в
|
||||
info.warp_dimensional_door3=карманном измерении, чтобы выйти из него.
|
||||
info.oak_dimensional_door0=Поставьте на блок под
|
||||
info.oak_dimensional_door1=разломом, чтобы создать портал
|
||||
info.oak_dimensional_door2=или поставьте куда угодно в
|
||||
info.oak_dimensional_door3=карманном измерении, чтобы выйти из него.
|
||||
|
||||
entity.dimdoors.monolith.name=Монолит
|
||||
|
|
|
@ -3,11 +3,11 @@ itemGroup.dimensional_doors_creative_tab=次元门物品
|
|||
tile.gold_door.name=金门
|
||||
tile.quartz_door.name=石英门
|
||||
|
||||
tile.dimensional_door.name=次元门
|
||||
tile.iron_dimensional_door.name=次元门
|
||||
tile.gold_dimensional_door.name=金制次元门
|
||||
tile.quartz_dimensional_door.name=私人次元门
|
||||
tile.chaos_dimensional_door.name=不稳定的门
|
||||
tile.warp_dimensional_door.name=扭曲之门
|
||||
tile.oak_dimensional_door.name=扭曲之门
|
||||
tile.dimensional_trapdoor.name=空间活板门
|
||||
tile.dimensional_portal.name=瞬息之门
|
||||
|
||||
|
@ -21,11 +21,11 @@ tile.rift.name=裂痕
|
|||
item.gold_door.name=金门
|
||||
item.quartz_door.name=石英门
|
||||
|
||||
item.dimensional_door.name=次元门
|
||||
item.iron_dimensional_door.name=次元门
|
||||
item.gold_dimensional_door.name=金制次元门
|
||||
item.quartz_dimensional_door.name=私人次元门
|
||||
item.chaos_dimensional_door.name=不稳定的门
|
||||
item.warp_dimensional_door.name=扭曲之门
|
||||
item.oak_dimensional_door.name=扭曲之门
|
||||
|
||||
item.rift_key=裂痕钥匙
|
||||
item.rift_signature.name=裂痕印记
|
||||
|
@ -40,10 +40,10 @@ item.stable_fabric.name=稳定构造
|
|||
info.rift_key.bound=绑定
|
||||
info.rift_key.unbound=取消绑定
|
||||
|
||||
info.dimensional_door0=放在裂痕下方的方块上
|
||||
info.dimensional_door1=来激活裂痕
|
||||
info.dimensional_door2=或放在任意地点生成
|
||||
info.dimensional_door3=一个口袋次元.
|
||||
info.iron_dimensional_door0=放在裂痕下方的方块上
|
||||
info.iron_dimensional_door1=来激活裂痕
|
||||
info.iron_dimensional_door2=或放在任意地点生成
|
||||
info.iron_dimensional_door3=一个口袋次元.
|
||||
|
||||
info.gold_dimensional_door0=类似于次元门
|
||||
info.gold_dimensional_door1=但它放在次元内部时
|
||||
|
@ -71,9 +71,9 @@ info.stabilized_rift_signature.unbound2=裂痕.
|
|||
|
||||
info.chaos_dimensional_door=注意: 将会随机传送
|
||||
|
||||
info.warp_dimensional_door0=放在裂痕下方的方块上
|
||||
info.warp_dimensional_door1=来制造传送门,
|
||||
info.warp_dimensional_door2=放在口袋次元中
|
||||
info.warp_dimensional_door3=以退出空间.
|
||||
info.oak_dimensional_door0=放在裂痕下方的方块上
|
||||
info.oak_dimensional_door1=来制造传送门,
|
||||
info.oak_dimensional_door2=放在口袋次元中
|
||||
info.oak_dimensional_door3=以退出空间.
|
||||
|
||||
entity.dimdoors.monolith.name=巨石
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
{
|
||||
"parent": "block/door_bottom",
|
||||
"textures": {
|
||||
"bottom": "dimdoors:blocks/dimensional_door_lower",
|
||||
"top": "dimdoors:blocks/dimensional_door_upper"
|
||||
}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
{
|
||||
"parent": "block/door_bottom_rh",
|
||||
"textures": {
|
||||
"bottom": "dimdoors:blocks/dimensional_door_lower",
|
||||
"top": "dimdoors:blocks/dimensional_door_upper"
|
||||
}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
{
|
||||
"parent": "block/door_top",
|
||||
"textures": {
|
||||
"bottom": "dimdoors:blocks/dimensional_door_lower",
|
||||
"top": "dimdoors:blocks/dimensional_door_upper"
|
||||
}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
{
|
||||
"parent": "block/door_top_rh",
|
||||
"textures": {
|
||||
"bottom": "dimdoors:blocks/dimensional_door_lower",
|
||||
"top": "dimdoors:blocks/dimensional_door_upper"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"parent": "block/door_bottom",
|
||||
"textures": {
|
||||
"bottom": "dimdoors:blocks/iron_dimensional_door_lower",
|
||||
"top": "dimdoors:blocks/iron_dimensional_door_upper"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"parent": "block/door_bottom_rh",
|
||||
"textures": {
|
||||
"bottom": "dimdoors:blocks/iron_dimensional_door_lower",
|
||||
"top": "dimdoors:blocks/iron_dimensional_door_upper"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"parent": "block/door_top",
|
||||
"textures": {
|
||||
"bottom": "dimdoors:blocks/iron_dimensional_door_lower",
|
||||
"top": "dimdoors:blocks/iron_dimensional_door_upper"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"parent": "block/door_top_rh",
|
||||
"textures": {
|
||||
"bottom": "dimdoors:blocks/iron_dimensional_door_lower",
|
||||
"top": "dimdoors:blocks/iron_dimensional_door_upper"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"parent": "block/door_bottom",
|
||||
"textures": {
|
||||
"bottom": "dimdoors:blocks/oak_dimensional_door_lower",
|
||||
"top": "dimdoors:blocks/oak_dimensional_door_upper"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"parent": "block/door_bottom_rh",
|
||||
"textures": {
|
||||
"bottom": "dimdoors:blocks/oak_dimensional_door_lower",
|
||||
"top": "dimdoors:blocks/oak_dimensional_door_upper"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"parent": "block/door_top",
|
||||
"textures": {
|
||||
"bottom": "dimdoors:blocks/oak_dimensional_door_lower",
|
||||
"top": "dimdoors:blocks/oak_dimensional_door_upper"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"parent": "block/door_top_rh",
|
||||
"textures": {
|
||||
"bottom": "dimdoors:blocks/oak_dimensional_door_lower",
|
||||
"top": "dimdoors:blocks/oak_dimensional_door_upper"
|
||||
}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
{
|
||||
"parent": "block/door_bottom",
|
||||
"textures": {
|
||||
"bottom": "dimdoors:blocks/warp_dimensional_door_lower",
|
||||
"top": "dimdoors:blocks/warp_dimensional_door_upper"
|
||||
}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
{
|
||||
"parent": "block/door_bottom_rh",
|
||||
"textures": {
|
||||
"bottom": "dimdoors:blocks/warp_dimensional_door_lower",
|
||||
"top": "dimdoors:blocks/warp_dimensional_door_upper"
|
||||
}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
{
|
||||
"parent": "block/door_top",
|
||||
"textures": {
|
||||
"bottom": "dimdoors:blocks/warp_dimensional_door_lower",
|
||||
"top": "dimdoors:blocks/warp_dimensional_door_upper"
|
||||
}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
{
|
||||
"parent": "block/door_top_rh",
|
||||
"textures": {
|
||||
"bottom": "dimdoors:blocks/warp_dimensional_door_lower",
|
||||
"top": "dimdoors:blocks/warp_dimensional_door_upper"
|
||||
}
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"parent": "item/generated",
|
||||
"textures": {
|
||||
"layer0": "dimdoors:items/warp_dimensional_door"
|
||||
"layer0": "dimdoors:items/iron_dimensional_door"
|
||||
}
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"parent": "item/generated",
|
||||
"textures": {
|
||||
"layer0": "dimdoors:items/dimensional_door"
|
||||
"layer0": "dimdoors:items/oak_dimensional_door"
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 429 B After Width: | Height: | Size: 429 B |
Before Width: | Height: | Size: 449 B After Width: | Height: | Size: 449 B |
Before Width: | Height: | Size: 398 B After Width: | Height: | Size: 398 B |
Before Width: | Height: | Size: 401 B After Width: | Height: | Size: 401 B |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |