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
This commit is contained in:
Runemoro 2018-01-27 04:22:33 -05:00
parent ad3bbe4a3f
commit 9350b913ff
49 changed files with 605 additions and 629 deletions

View file

@ -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;
}
}

View file

@ -5,15 +5,8 @@ import net.minecraft.nbt.*;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import org.dimdev.ddutils.StringUtils;
public final class NBTUtils { 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) { public static NBTTagCompound writeToNBT(Object obj, NBTTagCompound nbt) {
try { try {
Class<?> callingClass = Class.forName(new Exception().getStackTrace()[1].getClassName()); Class<?> callingClass = Class.forName(new Exception().getStackTrace()[1].getClassName());

View file

@ -60,7 +60,7 @@ public class Schematic {
this.width = width; this.width = width;
this.height = height; this.height = height;
this.length = length; this.length = length;
blockData = new short[width][length][height]; blockData = new short[width][height][length];
palette.add(Blocks.AIR.getDefaultState()); palette.add(Blocks.AIR.getDefaultState());
paletteMax++; paletteMax++;
creationDate = System.currentTimeMillis(); creationDate = System.currentTimeMillis();
@ -87,6 +87,8 @@ public class Schematic {
if (nbt.hasKey("Date")) { //Date is not required if (nbt.hasKey("Date")) { //Date is not required
schematic.creationDate = metadataCompound.getLong("Date"); schematic.creationDate = metadataCompound.getLong("Date");
} else {
schematic.creationDate = -1;
} }
if (nbt.hasKey("RequiredMods")) { //RequiredMods is not required (ironically) if (nbt.hasKey("RequiredMods")) { //RequiredMods is not required (ironically)
NBTTagList requiredModsTagList = (NBTTagList) metadataCompound.getTag("RequiredMods"); NBTTagList requiredModsTagList = (NBTTagList) metadataCompound.getTag("RequiredMods");
@ -175,7 +177,7 @@ public class Schematic {
NBTTagCompound metadataCompound = new NBTTagCompound(); NBTTagCompound metadataCompound = new NBTTagCompound();
if (author != null) metadataCompound.setString("Author", author); // Author is not required if (author != null) metadataCompound.setString("Author", author); // Author is not required
metadataCompound.setString("Name", name); metadataCompound.setString("Name", name);
metadataCompound.setLong("Date", creationDate); if (creationDate != -1) metadataCompound.setLong("Date", creationDate);
NBTTagList requiredModsTagList = new NBTTagList(); NBTTagList requiredModsTagList = new NBTTagList();
for (String requiredMod : requiredMods) { for (String requiredMod : requiredMods) {
requiredModsTagList.appendTag(new NBTTagString(requiredMod)); requiredModsTagList.appendTag(new NBTTagString(requiredMod));
@ -366,10 +368,15 @@ public class Schematic {
adjustedEntityNBT.setUniqueId("UUID", UUID.randomUUID()); adjustedEntityNBT.setUniqueId("UUID", UUID.randomUUID());
Entity entity = EntityList.createEntityFromNBT(adjustedEntityNBT, world); Entity entity = EntityList.createEntityFromNBT(adjustedEntityNBT, world);
// TODO: check if it is in pocket bounds
world.spawnEntity(entity); 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) { public void setBlockState(int x, int y, int z, IBlockState state) {
if (palette.contains(state)) { if (palette.contains(state)) {
blockData[x][y][z] = (short) palette.indexOf(state); // TODO: optimize this (there must be some efficient list implementations) blockData[x][y][z] = (short) palette.indexOf(state); // TODO: optimize this (there must be some efficient list implementations)

View file

@ -14,7 +14,7 @@ import java.util.Random;
public class BlockDimensionalDoorIron extends BlockDimensionalDoor { public class BlockDimensionalDoorIron extends BlockDimensionalDoor {
public static final String ID = "dimensional_door"; public static final String ID = "iron_dimensional_door";
public BlockDimensionalDoorIron() { public BlockDimensionalDoorIron() {
super(Material.IRON); super(Material.IRON);

View file

@ -15,7 +15,7 @@ import java.util.Random;
public class BlockDimensionalDoorWood extends BlockDimensionalDoor { public class BlockDimensionalDoorWood extends BlockDimensionalDoor {
public static final String ID = "warp_dimensional_door"; public static final String ID = "oak_dimensional_door";
public BlockDimensionalDoorWood() { public BlockDimensionalDoorWood() {
super(Material.WOOD); super(Material.WOOD);

View file

@ -25,6 +25,6 @@ public class ItemDimensionalDoorIron extends ItemDimensionalDoor {
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, World world, List<String> tooltip, ITooltipFlag flagIn) { 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"));
} }
} }

View file

@ -25,6 +25,6 @@ public class ItemDimensionalDoorWarp extends ItemDimensionalDoor {
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, World world, List<String> tooltip, ITooltipFlag flagIn) { 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"));
} }
} }

View file

@ -26,6 +26,6 @@ public class ItemDimensionalTrapdoorWood extends ItemDimensionalTrapdoor {
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, World world, List<String> tooltip, ITooltipFlag flag) { 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"));
} }
} }

View file

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

View file

@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.Setter; import lombok.Setter;
import net.minecraft.block.state.IBlockState;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
@ -19,6 +20,7 @@ import org.dimdev.ddutils.WorldUtils;
import org.dimdev.ddutils.math.MathUtils; import org.dimdev.ddutils.math.MathUtils;
import org.dimdev.ddutils.schem.Schematic; import org.dimdev.ddutils.schem.Schematic;
import org.dimdev.dimdoors.DimDoors; 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.RiftDestination;
import org.dimdev.dimdoors.shared.rifts.TileEntityRift; import org.dimdev.dimdoors.shared.rifts.TileEntityRift;
import org.dimdev.dimdoors.shared.rifts.destinations.PocketEntranceMarker; 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.Pocket;
import org.dimdev.pocketlib.PocketRegistry; import org.dimdev.pocketlib.PocketRegistry;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
/** /**
* @author Robijnvogel * @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) { public void place(Pocket pocket) {
pocket.setSize(size); pocket.setSize(size);
int gridSize = PocketRegistry.instance(pocket.getDim()).getGridSize(); int gridSize = PocketRegistry.instance(pocket.getDim()).getGridSize();
@ -79,8 +168,8 @@ public class PocketTemplate {
int yBase = 0; int yBase = 0;
int zBase = pocket.getZ() * gridSize * 16; int zBase = pocket.getZ() * gridSize * 16;
// Fill chests and make rift list
List<TileEntityRift> rifts = new ArrayList<>(); List<TileEntityRift> rifts = new ArrayList<>();
for (NBTTagCompound tileEntityNBT : schematic.tileEntities) { for (NBTTagCompound tileEntityNBT : schematic.tileEntities) {
BlockPos pos = new BlockPos( BlockPos pos = new BlockPos(
xBase + tileEntityNBT.getInteger("x"), xBase + tileEntityNBT.getInteger("x"),

View file

@ -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; if (file.isDirectory() || !file.getName().endsWith(".schem")) continue;
try { try {
Schematic schematic = Schematic.loadFromNBT(CompressedStreamTools.readCompressed(new FileInputStream(file))); 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) { } catch (IOException e) {
DimDoors.log.error("Error reading schematic " + file.getName() + ": " + 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 { try {
schematicNBT = CompressedStreamTools.readCompressed(schematicDataStream); schematicNBT = CompressedStreamTools.readCompressed(schematicDataStream);
if (!schematicNBT.hasKey("Version")) { if (!schematicNBT.hasKey("Version")) {
schematic = SchematicConverter.convertSchematic(schematicNBT, template.getId(), template.getName(), template.getAuthor()); schematic = SchematicConverter.convertSchematic(schematicNBT, template.getId(), template.getAuthor());
} else { } else {
schematic = Schematic.loadFromNBT(schematicNBT); 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"); DimDoors.log.warn("Schematic " + template.getId() + " was bigger than specified in its json file and therefore wasn't loaded");
} }
template.setSchematic(schematic); template.setSchematic(schematic);
template.replacePlaceholders();
} }
return validTemplates; return validTemplates;
} }

View file

@ -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);
}
}

View file

@ -11,128 +11,41 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagString; import net.minecraft.nbt.NBTTagString;
import net.minecraft.tileentity.*; import net.minecraft.tileentity.*;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3i; import net.minecraft.util.math.Vec3i;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentString; 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.ddutils.schem.Schematic;
import org.dimdev.dimdoors.DimDoors; 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.blocks.ModBlocks;
import org.dimdev.dimdoors.shared.entities.EntityMonolith;
import org.dimdev.dimdoors.shared.items.ModItems; 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 javax.annotation.Nonnull;
import java.util.*; import java.util.ArrayList;
import java.util.List;
/**
* @author Robijnvogel
*/
public final class SchematicConverter { public final class SchematicConverter {
private final static int LOCKED_CHEST_ID = 95; private final static int LOCKED_CHEST_ID = 95;
private final static int POTION_ID = 373; private final static int POTION_ID = 373;
private final static int WRITTEN_BOOK_ID = 387; private final static int WRITTEN_BOOK_ID = 387;
private final static int NBT_COMPOUND_TAG_ID = NBTUtils.NBT_COMPOUND_TAG_ID; public static Schematic convertSchematic(NBTTagCompound nbt, String schematicId, String author) {
private final static int STRING_TAG_ID = NBTUtils.NBT_COMPOUND_TAG_ID; Schematic schematic = new Schematic(nbt.getShort("Width"), nbt.getShort("Height"), nbt.getShort("Length"));
private static final boolean GENERATE_DUNGEON_INFO = true;
public static Schematic convertSchematic(NBTTagCompound nbt, String schematicId, String name, String author) { schematic.name = schematicId;
Schematic schematic = new Schematic();
schematic.version = 1; //already the default value
schematic.author = author; schematic.author = author;
schematic.name = name; // This is passed as an argument by the SchematicHandler. The name is taken from the JSONs schematic.creationDate = -1; // Old schematics had no creation date
schematic.creationDate = System.currentTimeMillis();
schematic.requiredMods = new String[]{DimDoors.MODID}; schematic.requiredMods = new String[]{DimDoors.MODID};
schematic.width = nbt.getShort("Width"); // <editor-fold desc="Tile entities">
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++;
}
}
List<Vec3i> tileEntityPositions = new ArrayList<>(); List<Vec3i> tileEntityPositions = new ArrayList<>();
if (nbt.hasKey("TileEntities")) { 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()) { if (!tileEntitiesNBT.hasNoTags()) {
for (int i = 0; i < tileEntitiesNBT.tagCount(); i++) { for (int i = 0; i < tileEntitiesNBT.tagCount(); i++) {
NBTTagCompound tileEntityNBT = tileEntitiesNBT.getCompoundTagAt(i); NBTTagCompound tileEntityNBT = tileEntitiesNBT.getCompoundTagAt(i);
@ -144,12 +57,13 @@ public final class SchematicConverter {
switch (tileEntityNBT.getString("id")) { switch (tileEntityNBT.getString("id")) {
case "TileEntityDimDoor": case "TileEntityDimDoor":
case "TileEntityRift": 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 "Chest":
case "Trap": case "Trap":
case "Hopper": case "Hopper": // There aren't any other kinds of inventories in the old schematics.
case "Furnace": //there aren't any other kinds of inventories in the old schematics. At least not with contents NBTTagList items = tileEntityNBT.getTagList("Items", Constants.NBT.TAG_COMPOUND);
NBTTagList items = tileEntityNBT.getTagList("Items", NBT_COMPOUND_TAG_ID);
for (int j = 0; j < items.tagCount(); j++) { for (int j = 0; j < items.tagCount(); j++) {
NBTTagCompound itemTag = items.getCompoundTagAt(j); NBTTagCompound itemTag = items.getCompoundTagAt(j);
int oldID = itemTag.getInteger("id"); int oldID = itemTag.getInteger("id");
@ -187,7 +101,7 @@ public final class SchematicConverter {
case WRITTEN_BOOK_ID: case WRITTEN_BOOK_ID:
item = Item.getItemById(oldID); item = Item.getItemById(oldID);
NBTTagCompound subTag = itemTag.getCompoundTag("tag"); 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 : "")); //DimDoors.log.info("Written book has " + oldPages.tagCount() + " pages." + (oldPages.tagCount() == 0 ? " STRING_TAG_ID is " + STRING_TAG_ID : ""));
NBTTagList newPages = new NBTTagList(); NBTTagList newPages = new NBTTagList();
for (NBTBase pageNBTBase : oldPages) { 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" 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. 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); 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); subTag.setTag("pages", newPages);
break; break;
@ -212,12 +126,11 @@ public final class SchematicConverter {
} }
} }
itemTag.removeTag("id"); //not sure if needed, but just to be sure... itemTag.setString("id", item.getRegistryName().toString()); //item.getItemStackDisplayName(ItemStack.EMPTY);
String newID = item.getRegistryName().toString(); //item.getItemStackDisplayName(ItemStack.EMPTY);
itemTag.setString("id", newID);
if (oldMeta != newMeta) { if (oldMeta != newMeta) {
itemTag.setInteger("Damage", newMeta); itemTag.setInteger("Damage", newMeta);
} }
DimDoors.log.info("Item: " + item.getRegistryName());
//DimDoors.log.info("ID of itemstack in inventory set from " + oldID + " to '" + newID + "'."); //DimDoors.log.info("ID of itemstack in inventory set from " + oldID + " to '" + newID + "'.");
} }
break; break;
@ -227,223 +140,188 @@ public final class SchematicConverter {
tileEntityNBT.setString("Text3", ITextComponent.Serializer.componentToJson(new TextComponentString(tileEntityNBT.getString("Text3")))); tileEntityNBT.setString("Text3", ITextComponent.Serializer.componentToJson(new TextComponentString(tileEntityNBT.getString("Text3"))));
tileEntityNBT.setString("Text4", ITextComponent.Serializer.componentToJson(new TextComponentString(tileEntityNBT.getString("Text4")))); tileEntityNBT.setString("Text4", ITextComponent.Serializer.componentToJson(new TextComponentString(tileEntityNBT.getString("Text4"))));
break; break;
case "Note":
tileEntityNBT.setBoolean("powered", false);
break;
default: default:
break; break;
} }
String oldID = tileEntityNBT.getString("id"); String oldID = tileEntityNBT.getString("id");
String newID = translateId(oldID); String newID = translateId(oldID).toString();
tileEntityNBT.setString("id", newID); tileEntityNBT.setString("id", newID);
schematic.tileEntities.add(tileEntityNBT); schematic.tileEntities.add(tileEntityNBT);
} }
} }
} }
// </editor-fold>
byte[] dataIntArray = nbt.getByteArray("Data"); // <editor-fold desc="Blocks">
schematic.blockData = new short[schematic.width][schematic.height][schematic.length]; 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 x = 0; x < schematic.width; x++) {
for (int y = 0; y < schematic.height; y++) {
for (int z = 0; z < schematic.length; z++) { 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 lastWasSandstone = null;
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 for (int y = 0; y < schematic.height; y++) {
// Get the ID and meta at that position. See https://minecraft.gamepedia.com/Schematic_file_format
IBlockState baseState = schematic.palette.get(blockInt); //this is the default blockstate except for ancient fabric int index = x + z * schematic.width + y * schematic.width * schematic.length;
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 int id;
IBlockState blockState; if (index >> 1 >= addIdArray.length) {
if (baseState.getBlock().equals(ModBlocks.FABRIC) || baseState.getBlock().equals(ModBlocks.ANCIENT_FABRIC)) { id = (short) (idArray[index] & 0xFF);
blockState = baseState; } else if ((index & 1) == 0) {
id = (short) (((addIdArray[index >> 1] & 0x0F) << 8) + (idArray[index] & 0xFF));
} else { } 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 //noinspection deprecation
blockState = baseState.getBlock().getStateFromMeta(metadata); state = block.getStateFromMeta(meta);
} }
if (schematic.palette.contains(blockState)) { //check whether or not this blockstate is already in the list
blockInt = schematic.palette.indexOf(blockState); // 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 { } else {
schematic.palette.add(blockState); riftPlaceholder.setString("placeholder", "pocket_entrance_door");
//DimDoors.log.info("New blockstate detected. Original blockInt = " + blockInt + " and blockState is " + blockState); entranceCount++;
blockInt = schematic.palette.size() - 1;
} }
Block block = blockState.getBlock(); } else if (block == ModBlocks.DIMENSIONAL_PORTAL) {
riftPlaceholder.setString("placeholder", "gateway_portal");
//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 schematic.tileEntities.add(riftPlaceholder);
if (block.equals(Blocks.END_PORTAL_FRAME)) { } else if (block.hasTileEntity(state) && !tileEntityPositions.contains(new Vec3i(x, y, z))) {
// I think it's safe to assume that air is present TileEntity tileEntity = block.createTileEntity(null, state);
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)); tileEntity.setPos(new BlockPos(x, y, z));
//tileEntitiesNBT.appendTag(tileEntity.serializeNBT());
schematic.tileEntities.add(tileEntity.serializeNBT()); schematic.tileEntities.add(tileEntity.serializeNBT());
//DimDoors.log.info("Adding missing tile entity at " + new Vec3i(x, y, z) + " (state = " + blockState + ")"); // DimDoors.log.info("Adding missing tile entity at " + new Vec3i(x, y, z) + " (state = " + state + ")");
} }
} else { // if this is ancient fabric
blockInt = schematic.palette.indexOf(baseState);
}
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;
if (GENERATE_DUNGEON_INFO) { if (lastWasSandstone != null) {
DimDoors.log.info(schematicId + "," + ironDimDoors + "," + warpDoors + "," + monoliths + "," + chests + "," if (state.getBlock() == ModBlocks.WARP_DIMENSIONAL_DOOR) {
+ dispensers + "," + allPistonBases + "," + tnt + "," + diamondBlocks + "," + goldBlocks + "," + ironBlocks); 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);
}
}
}
}
}
// </editor-fold>
if (!nbt.getTag("Entities").hasNoTags()) {
throw new RuntimeException("Schematic contains entities, but those aren't implemented in the conversion code.");
} }
return schematic; return schematic;
} }
@Nonnull private static IBlockState getState(int id, int meta) {
private static String translateId(String id) { // TODO Block block = Blocks.AIR;
ResourceLocation location; if (id <= 159 && id != LOCKED_CHEST_ID) {
block = Block.getBlockById(id);
} else {
switch (id) { switch (id) {
case "Sign": case 1973:
location = TileEntity.getKey(TileEntitySign.class); 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; 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");
} }
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);
} }
return location.toString();
if (id != 0 && block.getRegistryName().toString().equals("minecraft:air")) {
throw new RuntimeException("Unknown ID " + id + " in schematic");
}
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 @Nonnull
private static ResourceLocation translateIdCrude(String id) { private static ResourceLocation translateId(String id) {
switch (id) { switch (id) {
case "Sign": case "Sign":
return new ResourceLocation("minecraft:sign"); return TileEntity.getKey(TileEntitySign.class);
case "Music": case "Music":
return new ResourceLocation("minecraft:noteblock"); return TileEntity.getKey(TileEntityNote.class);
case "Trap": case "Trap":
return new ResourceLocation("minecraft:dispenser"); return TileEntity.getKey(TileEntityDispenser.class);
case "Comparator": case "Comparator":
return new ResourceLocation("minecraft:comparator"); return TileEntity.getKey(TileEntityComparator.class);
case "Hopper": case "Hopper":
return new ResourceLocation("minecraft:hopper"); return TileEntity.getKey(TileEntityHopper.class);
case "Furnace": case "Furnace":
return new ResourceLocation("minecraft:furnace"); return TileEntity.getKey(TileEntityFurnace.class);
case "Chest": case "Chest":
return TileEntity.getKey(TileEntityChest.class);
default: default:
return new ResourceLocation("minecraft:chest"); throw new RuntimeException("Tile entity ID " + id + " not supported by conversion code");
} }
} }

View file

@ -1,22 +1,12 @@
package org.dimdev.dimdoors.shared.tools; package org.dimdev.dimdoors.shared.tools;
import net.minecraft.block.Block;
import net.minecraft.block.BlockDoor; import net.minecraft.block.BlockDoor;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Bootstrap;
import net.minecraft.item.EnumDyeColor; import net.minecraft.item.EnumDyeColor;
import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTTagCompound; 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.ddutils.schem.Schematic;
import org.dimdev.dimdoors.DimDoors; import org.dimdev.dimdoors.DimDoors;
import org.dimdev.dimdoors.server.ServerProxy;
import org.dimdev.dimdoors.shared.blocks.BlockDimensionalDoor; import org.dimdev.dimdoors.shared.blocks.BlockDimensionalDoor;
import org.dimdev.dimdoors.shared.blocks.BlockFabric; import org.dimdev.dimdoors.shared.blocks.BlockFabric;
import org.dimdev.dimdoors.shared.blocks.BlockFabricAncient; import org.dimdev.dimdoors.shared.blocks.BlockFabricAncient;
@ -37,25 +27,11 @@ import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
/** public final class SchematicGenerator {
* @author Robijnvogel
*/
public final class PocketSchematicGenerator {
// Run "gradlew generatePocketSchematics" to generate the pocket schematics // Run "gradlew generatePocketSchematics" to generate the pocket schematics
@SuppressWarnings("UseOfSystemOutOrSystemErr") @SuppressWarnings("UseOfSystemOutOrSystemErr")
public static void main(String... args) throws IOException, NoSuchMethodException, NoSuchFieldException, IllegalAccessException { public static void main(String... args) throws IOException {
// 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);
// Parse arguments // Parse arguments
File schematicDir; File schematicDir;
@ -72,6 +48,9 @@ public final class PocketSchematicGenerator {
schematicDir = new File("schematics/"); schematicDir = new File("schematics/");
} }
// Register blocks and tile entities to be able to run this without starting Minecraft
Initializer.initialize();
// Generate the schematics // Generate the schematics
List<Schematic> schematics = generatePocketSchematics(); List<Schematic> schematics = generatePocketSchematics();
@ -116,16 +95,19 @@ public final class PocketSchematicGenerator {
PrivatePocketExitDestination.builder().build(),// exit rift destination PrivatePocketExitDestination.builder().build(),// exit rift destination
null)); null));
schematics.add(generateBlank("blank_pocket", schematics.add(generateBlank(
"blank_pocket",
pocketSize, pocketSize,
ModBlocks.ANCIENT_FABRIC.getDefaultState(), ModBlocks.ANCIENT_FABRIC.getDefaultState(),
ModBlocks.FABRIC.getDefaultState())); ModBlocks.FABRIC.getDefaultState()));
schematics.add(generateFrame("void_pocket", schematics.add(generateFrame(
"void_pocket",
pocketSize, pocketSize,
ModBlocks.FABRIC.getDefaultState().withProperty(BlockFabric.COLOR, EnumDyeColor.LIGHT_BLUE))); ModBlocks.FABRIC.getDefaultState().withProperty(BlockFabric.COLOR, EnumDyeColor.LIGHT_BLUE)));
schematics.add(generateResizableFrame("resizable_pocket", schematics.add(generateResizableFrame(
"resizable_pocket",
pocketSize, pocketSize,
ModBlocks.FABRIC.getDefaultState().withProperty(BlockFabric.COLOR, EnumDyeColor.ORANGE))); ModBlocks.FABRIC.getDefaultState().withProperty(BlockFabric.COLOR, EnumDyeColor.ORANGE)));
} }

View file

@ -35,7 +35,7 @@ public abstract class BaseSchematicGateway extends BaseGateway {
if (streamOpened) { if (streamOpened) {
try { try {
schematicNBT = CompressedStreamTools.readCompressed(schematicDataStream); schematicNBT = CompressedStreamTools.readCompressed(schematicDataStream);
schematic = SchematicConverter.convertSchematic(schematicNBT, id, null, null); schematic = SchematicConverter.convertSchematic(schematicNBT, id, null);
schematicDataStream.close(); schematicDataStream.close();
} catch (IOException ex) { } catch (IOException ex) {
DimDoors.log.error("Schematic file for " + id + " could not be read as a valid schematic NBT file.", ex); DimDoors.log.error("Schematic file for " + id + " could not be read as a valid schematic NBT file.", ex);

View file

@ -1,36 +1,36 @@
{ {
"variants": { "variants": {
"facing=east,half=lower,hinge=left,open=false": { "model": "dimdoors:warp_dimensional_door_bottom" }, "facing=east,half=lower,hinge=left,open=false": { "model": "dimdoors:iron_dimensional_door_bottom" },
"facing=south,half=lower,hinge=left,open=false": { "model": "dimdoors:warp_dimensional_door_bottom", "y": 90 }, "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:warp_dimensional_door_bottom", "y": 180 }, "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:warp_dimensional_door_bottom", "y": 270 }, "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:warp_dimensional_door_bottom_rh" }, "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:warp_dimensional_door_bottom_rh", "y": 90 }, "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:warp_dimensional_door_bottom_rh", "y": 180 }, "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:warp_dimensional_door_bottom_rh", "y": 270 }, "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:warp_dimensional_door_bottom_rh", "y": 90 }, "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:warp_dimensional_door_bottom_rh", "y": 180 }, "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:warp_dimensional_door_bottom_rh", "y": 270 }, "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:warp_dimensional_door_bottom_rh" }, "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:warp_dimensional_door_bottom", "y": 270 }, "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:warp_dimensional_door_bottom" }, "facing=south,half=lower,hinge=right,open=true": { "model": "dimdoors:iron_dimensional_door_bottom" },
"facing=west,half=lower,hinge=right,open=true": { "model": "dimdoors:warp_dimensional_door_bottom", "y": 90 }, "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:warp_dimensional_door_bottom", "y": 180 }, "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:warp_dimensional_door_top" }, "facing=east,half=upper,hinge=left,open=false": { "model": "dimdoors:iron_dimensional_door_top" },
"facing=south,half=upper,hinge=left,open=false": { "model": "dimdoors:warp_dimensional_door_top", "y": 90 }, "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:warp_dimensional_door_top", "y": 180 }, "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:warp_dimensional_door_top", "y": 270 }, "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:warp_dimensional_door_top_rh" }, "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:warp_dimensional_door_top_rh", "y": 90 }, "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:warp_dimensional_door_top_rh", "y": 180 }, "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:warp_dimensional_door_top_rh", "y": 270 }, "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:warp_dimensional_door_top_rh", "y": 90 }, "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:warp_dimensional_door_top_rh", "y": 180 }, "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:warp_dimensional_door_top_rh", "y": 270 }, "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:warp_dimensional_door_top_rh" }, "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:warp_dimensional_door_top", "y": 270 }, "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:warp_dimensional_door_top" }, "facing=south,half=upper,hinge=right,open=true": { "model": "dimdoors:iron_dimensional_door_top" },
"facing=west,half=upper,hinge=right,open=true": { "model": "dimdoors:warp_dimensional_door_top", "y": 90 }, "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:warp_dimensional_door_top", "y": 180 } "facing=north,half=upper,hinge=right,open=true": { "model": "dimdoors:iron_dimensional_door_top", "y": 180 }
} }
} }

View file

@ -1,36 +1,36 @@
{ {
"variants": { "variants": {
"facing=east,half=lower,hinge=left,open=false": { "model": "dimdoors:dimensional_door_bottom" }, "facing=east,half=lower,hinge=left,open=false": { "model": "dimdoors:oak_dimensional_door_bottom" },
"facing=south,half=lower,hinge=left,open=false": { "model": "dimdoors:dimensional_door_bottom", "y": 90 }, "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:dimensional_door_bottom", "y": 180 }, "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:dimensional_door_bottom", "y": 270 }, "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:dimensional_door_bottom_rh" }, "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:dimensional_door_bottom_rh", "y": 90 }, "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:dimensional_door_bottom_rh", "y": 180 }, "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:dimensional_door_bottom_rh", "y": 270 }, "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:dimensional_door_bottom_rh", "y": 90 }, "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:dimensional_door_bottom_rh", "y": 180 }, "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:dimensional_door_bottom_rh", "y": 270 }, "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:dimensional_door_bottom_rh" }, "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:dimensional_door_bottom", "y": 270 }, "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:dimensional_door_bottom" }, "facing=south,half=lower,hinge=right,open=true": { "model": "dimdoors:oak_dimensional_door_bottom" },
"facing=west,half=lower,hinge=right,open=true": { "model": "dimdoors:dimensional_door_bottom", "y": 90 }, "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:dimensional_door_bottom", "y": 180 }, "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:dimensional_door_top" }, "facing=east,half=upper,hinge=left,open=false": { "model": "dimdoors:oak_dimensional_door_top" },
"facing=south,half=upper,hinge=left,open=false": { "model": "dimdoors:dimensional_door_top", "y": 90 }, "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:dimensional_door_top", "y": 180 }, "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:dimensional_door_top", "y": 270 }, "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:dimensional_door_top_rh" }, "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:dimensional_door_top_rh", "y": 90 }, "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:dimensional_door_top_rh", "y": 180 }, "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:dimensional_door_top_rh", "y": 270 }, "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:dimensional_door_top_rh", "y": 90 }, "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:dimensional_door_top_rh", "y": 180 }, "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:dimensional_door_top_rh", "y": 270 }, "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:dimensional_door_top_rh" }, "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:dimensional_door_top", "y": 270 }, "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:dimensional_door_top" }, "facing=south,half=upper,hinge=right,open=true": { "model": "dimdoors:oak_dimensional_door_top" },
"facing=west,half=upper,hinge=right,open=true": { "model": "dimdoors:dimensional_door_top", "y": 90 }, "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:dimensional_door_top", "y": 180 } "facing=north,half=upper,hinge=right,open=true": { "model": "dimdoors:oak_dimensional_door_top", "y": 180 }
} }
} }

View file

@ -3,11 +3,11 @@ itemGroup.dimensional_doors_creative_tab=Dimensional Doors: Items
tile.gold_door.name=Goldtür tile.gold_door.name=Goldtür
tile.quartz_door.name=Quarztü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.gold_dimensional_door.name=Goldene Dimensionaltür
tile.quartz_dimensional_door.name=Persönliche Dimensionaltür tile.quartz_dimensional_door.name=Persönliche Dimensionaltür
tile.chaos_dimensional_door.name=Instabile Tü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_trapdoor.name=Transdimensionale Falltür
tile.dimensional_portal.name=Vergängliche Tür tile.dimensional_portal.name=Vergängliche Tür
@ -21,11 +21,11 @@ tile.rift.name=Spalt
item.gold_door.name=Goldtür item.gold_door.name=Goldtür
item.quartz_door.name=Quarztü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.gold_dimensional_door.name=Goldene Dimensionaltür
item.quartz_dimensional_door.name=Persönliche Dimensionaltür item.quartz_dimensional_door.name=Persönliche Dimensionaltür
item.chaos_dimensional_door.name=Instabile Tü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_key=Spaltschlüssel
item.rift_signature.name=Spaltsignatur item.rift_signature.name=Spaltsignatur
@ -40,10 +40,10 @@ item.stable_fabric.name=Stabiler Stoff
info.rift_key.bound=Gebunden info.rift_key.bound=Gebunden
info.rift_key.unbound=Nicht gebunden info.rift_key.unbound=Nicht gebunden
info.dimensional_door0=Platziere auf dem Block unterhalb eines Spalts, info.iron_dimensional_door0=Platziere auf dem Block unterhalb eines Spalts,
info.dimensional_door1=um diesen Spalt zu aktivieren, oder info.iron_dimensional_door1=um diesen Spalt zu aktivieren, oder
info.dimensional_door2=irgendwo anders, um eine info.iron_dimensional_door2=irgendwo anders, um eine
info.dimensional_door3=kleine Dimension to erschaffen. info.iron_dimensional_door3=kleine Dimension to erschaffen.
info.gold_dimensional_door0=Ähnlich einer Dimensionaltür, info.gold_dimensional_door0=Ähnlich einer Dimensionaltür,
info.gold_dimensional_door1=aber hält die kleine Dimension geladen, 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.chaos_dimensional_door=Vorsicht: Führt zu einem zufälligen Ziel
info.warp_dimensional_door0=Platziere auf dem Block unterhalb eines info.oak_dimensional_door0=Platziere auf dem Block unterhalb eines
info.warp_dimensional_door1=Spalts, um ein Portal zu erstellen, info.oak_dimensional_door1=Spalts, um ein Portal zu erstellen,
info.warp_dimensional_door2=oder platziere irgendwo in einer info.oak_dimensional_door2=oder platziere irgendwo in einer
info.warp_dimensional_door3=kleinen Dimension, um sie zu verlassen. info.oak_dimensional_door3=kleinen Dimension, um sie zu verlassen.
entity.dimdoors.monolith.name=Monolith entity.dimdoors.monolith.name=Monolith

View file

@ -3,11 +3,11 @@ itemGroup.dimensional_doors_creative_tab=Dimensional Doors Items
tile.gold_door.name=Golden Door tile.gold_door.name=Golden Door
tile.quartz_door.name=Quartz 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.gold_dimensional_door.name=Golden Dimensional Door
tile.quartz_dimensional_door.name=Personal Dimensional Door tile.quartz_dimensional_door.name=Personal Dimensional Door
tile.chaos_dimensional_door.name=Chaos 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_trapdoor.name=Transdimensional Trapdoor
tile.dimensional_portal.name=Transient Portal tile.dimensional_portal.name=Transient Portal
@ -52,11 +52,11 @@ tile.rift.name=Rift Scar
item.gold_door.name=Golden Door item.gold_door.name=Golden Door
item.quartz_door.name=Quartz 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.gold_dimensional_door.name=Golden Dimensional Door
item.quartz_dimensional_door.name=Personal Dimensional Door item.quartz_dimensional_door.name=Personal Dimensional Door
item.chaos_dimensional_door.name=Chaos 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_key=Rift Key
item.rift_signature.name=Rift Signature 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.bound=Bound
info.rift_key.unbound=Unbound info.rift_key.unbound=Unbound
info.dimensional_door0=Place on the block under a rift info.iron_dimensional_door0=Place on the block under a rift
info.dimensional_door1=to activate that rift or place info.iron_dimensional_door1=to activate that rift or place
info.dimensional_door2=anywhere else to create a info.iron_dimensional_door2=anywhere else to create a
info.dimensional_door3=pocket dimension. info.iron_dimensional_door3=pocket dimension.
info.gold_dimensional_door0=Similar to a Dimensional Door info.gold_dimensional_door0=Similar to a Dimensional Door
info.gold_dimensional_door1=but keeps a pocket dimension 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.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 entity.dimdoors.monolith.name=Monolith

View file

@ -3,11 +3,11 @@ itemGroup.dimensional_doors_creative_tab=Objets Dimensional Doors
tile.gold_door.name=Porte dorée tile.gold_door.name=Porte dorée
tile.quartz_door.name=Porte de quartz 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.gold_dimensional_door.name=Porte dorée dimensionnelle
tile.quartz_dimensional_door.name=Porte dimensionnelle personnelle tile.quartz_dimensional_door.name=Porte dimensionnelle personnelle
tile.chaos_dimensional_door.name=Porte instable 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_trapdoor.name=Trappe transdimensionnelle
tile.dimensional_portal.name=Portail dimensionel tile.dimensional_portal.name=Portail dimensionel
@ -38,11 +38,11 @@ tile.rift.name=Fissure
item.gold_door.name=Porte dorée item.gold_door.name=Porte dorée
item.quartz_door.name=Porte de quartz 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.gold_dimensional_door.name=Porte dorée dimensionnelle
item.quartz_dimensional_door.name=Porte dimensionnelle personnelle item.quartz_dimensional_door.name=Porte dimensionnelle personnelle
item.chaos_dimensional_door.name=Porte instable 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_key=Clé de fissure
item.rift_signature.name=Signature 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.bound=Liée
info.rift_key.unbound=Non liée info.rift_key.unbound=Non liée
info.dimensional_door0=Placez sur le bloc sous une fissure info.iron_dimensional_door0=Placez sur le bloc sous une fissure
info.dimensional_door1=pour activer cette fissure ou placez info.iron_dimensional_door1=pour activer cette fissure ou placez
info.dimensional_door2=n'importe où ailleurs pour créer une info.iron_dimensional_door2=n'importe où ailleurs pour créer une
info.dimensional_door3=dimension de poche. info.iron_dimensional_door3=dimension de poche.
info.gold_dimensional_door0=Similaire à une porte dimensionnelle info.gold_dimensional_door0=Similaire à une porte dimensionnelle
info.gold_dimensional_door1=mais garde une dimension de poche 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.chaos_dimensional_door=Attention : mène vers une destination aléatoire
info.warp_dimensional_door0=Placez sur le bloc sous une info.oak_dimensional_door0=Placez sur le bloc sous une
info.warp_dimensional_door1=fissure pour créer un portail, info.oak_dimensional_door1=fissure pour créer un portail,
info.warp_dimensional_door2=ou placez n'importe où dans une info.oak_dimensional_door2=ou placez n'importe où dans une
info.warp_dimensional_door3=dimension de poche pour sortir. info.oak_dimensional_door3=dimension de poche pour sortir.
entity.dimdoors.monolith.name=Monolithe entity.dimdoors.monolith.name=Monolithe

View file

@ -3,11 +3,11 @@ itemGroup.dimensional_doors_creative_tab=Dimensional Doors oggetti
tile.gold_door.name=Porta d'oro tile.gold_door.name=Porta d'oro
tile.quartz_door.name=Porta di quarzo 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.gold_dimensional_door.name=Porta d'oro dimensionale
tile.quartz_dimensional_door.name=Porta dimensionale personale tile.quartz_dimensional_door.name=Porta dimensionale personale
tile.chaos_dimensional_door.name=Porta instabile 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_trapdoor.name=Botola transdimensionale
tile.dimensional_portal.name=Porta transitoria tile.dimensional_portal.name=Porta transitoria
@ -21,11 +21,11 @@ tile.rift.name=Frattura
item.gold_door.name=Porta d'oro item.gold_door.name=Porta d'oro
item.quartz_door.name=Porta di quarzo 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.gold_dimensional_door.name=Porta d'oro dimensionale
item.quartz_dimensional_door.name=Porta dimensionale personale item.quartz_dimensional_door.name=Porta dimensionale personale
item.chaos_dimensional_door.name=Porta instabile 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_key=Chiave per frattura
item.rift_signature.name=Segno di 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.bound=Legato
info.rift_key.unbound=Non legato info.rift_key.unbound=Non legato
info.dimensional_door0=Piazzalo sul blocco sotto una info.iron_dimensional_door0=Piazzalo sul blocco sotto una
info.dimensional_door1=frattura per attivarla o piazzalo info.iron_dimensional_door1=frattura per attivarla o piazzalo
info.dimensional_door2=da qualunque altra parte per creare info.iron_dimensional_door2=da qualunque altra parte per creare
info.dimensional_door3=una dimensione tascabile. info.iron_dimensional_door3=una dimensione tascabile.
info.gold_dimensional_door0=Simile a una Porta dimensionale info.gold_dimensional_door0=Simile a una Porta dimensionale
info.gold_dimensional_door1=ma tiene la dimensione tascabile 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.chaos_dimensional_door=Attenziione: Porta a una destinazione casuale
info.warp_dimensional_door0=Piazzalo sul blocco sotto una info.oak_dimensional_door0=Piazzalo sul blocco sotto una
info.warp_dimensional_door1=frattura per creare un portale, info.oak_dimensional_door1=frattura per creare un portale,
info.warp_dimensional_door2=o piazzalo da qualunque altra parte info.oak_dimensional_door2=o piazzalo da qualunque altra parte
info.warp_dimensional_door3=in una dimensione tascabile per uscire. info.oak_dimensional_door3=in una dimensione tascabile per uscire.
entity.dimdoors.monolith.name=Monolito entity.dimdoors.monolith.name=Monolito

View file

@ -3,11 +3,11 @@ itemGroup.dimensional_doors_creative_tab=Dimensional Doors Voorwerpen
tile.gold_door.name=Gouden Deur tile.gold_door.name=Gouden Deur
tile.quartz_door.name=Kwartsen 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.gold_dimensional_door.name=Gouden Dimensiedeur
tile.quartz_dimensional_door.name=Persoonlijke Dimensiedeur tile.quartz_dimensional_door.name=Persoonlijke Dimensiedeur
tile.chaos_dimensional_door.name=Chaos Deur 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_trapdoor.name=Transdimensionale Valdeur
tile.dimensional_portal.name=Vergankelijk Portaal tile.dimensional_portal.name=Vergankelijk Portaal
@ -52,11 +52,11 @@ tile.rift.name=Scheur Wond
item.gold_door.name=Gouden Deur item.gold_door.name=Gouden Deur
item.quartz_door.name=Kwartsen 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.gold_dimensional_door.name=Gouden Dimensiedeur
item.quartz_dimensional_door.name=Persoonlijke Dimensiedeur item.quartz_dimensional_door.name=Persoonlijke Dimensiedeur
item.chaos_dimensional_door.name=Chaos Deur 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_key=Scheur Sleutel
item.rift_signature.name=Scheurtekening item.rift_signature.name=Scheurtekening
@ -71,10 +71,10 @@ item.stable_fabric.name=Stabiel Weefsel
info.rift_key.bound=Gebonden info.rift_key.bound=Gebonden
info.rift_key.unbound=Ontbonden info.rift_key.unbound=Ontbonden
info.dimensional_door0=Plaats op het blok onder een scheur info.iron_dimensional_door0=Plaats op het blok onder een scheur
info.dimensional_door1=om deze scheur te activeren of info.iron_dimensional_door1=om deze scheur te activeren of
info.dimensional_door2=op een andere plaats om een info.iron_dimensional_door2=op een andere plaats om een
info.dimensional_door3=publieke broekzak-dimensie te creëren. info.iron_dimensional_door3=publieke broekzak-dimensie te creëren.
info.gold_dimensional_door0=Net als een Dimensiedeur, maar houdt info.gold_dimensional_door0=Net als een Dimensiedeur, maar houdt
info.gold_dimensional_door1=een broekzak dimensie geladen als 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.chaos_dimensional_door=Pas op: Leidt naar een willekeurige bestemming
info.warp_dimensional_door0=Plaats op het blok onder een scheur info.oak_dimensional_door0=Plaats op het blok onder een scheur
info.warp_dimensional_door1=om een portaal te creëren, info.oak_dimensional_door1=om een portaal te creëren,
info.warp_dimensional_door2=of plaats het ergens in een info.oak_dimensional_door2=of plaats het ergens in een
info.warp_dimensional_door3=broekzak dimensie om deze te verlaten. info.oak_dimensional_door3=broekzak dimensie om deze te verlaten.
entity.dimdoors.monolith.name=Monoliet entity.dimdoors.monolith.name=Monoliet

View file

@ -3,11 +3,11 @@ itemGroup.dimensional_doors_creative_tab=Obiecte Dimensional Doors
tile.gold_door.name=Ușă de aur tile.gold_door.name=Ușă de aur
tile.quartz_door.name=Ușă de cuarț 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.gold_dimensional_door.name=Ușă dimensională de aur
tile.quartz_dimensional_door.name=Ușă dimensională de cuarț tile.quartz_dimensional_door.name=Ușă dimensională de cuarț
tile.chaos_dimensional_door.name=Ușă instabilă 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_trapdoor.name=Trapă transdimensională
tile.dimensional_portal.name=Portal dimensional tile.dimensional_portal.name=Portal dimensional
@ -38,11 +38,11 @@ tile.rift.name=Fisură
item.gold_door.name=Ușă de aur item.gold_door.name=Ușă de aur
item.quartz_door.name=Ușă de cuarț 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.gold_dimensional_door.name=Ușă dimensională de aur
item.quartz_dimensional_door.name=Ușă dimensională de cuarț item.quartz_dimensional_door.name=Ușă dimensională de cuarț
item.chaos_dimensional_door.name=Ușă instabilă 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_key=Cheie de fisură
item.rift_signature.name=Semnătură 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.bound=Legat
info.rift_key.unbound=Dezlegat info.rift_key.unbound=Dezlegat
info.dimensional_door0=Plasează pe blocul de sub o fisură info.iron_dimensional_door0=Plasează pe blocul de sub o fisură
info.dimensional_door1=pentru a activa acea fisură sau info.iron_dimensional_door1=pentru a activa acea fisură sau
info.dimensional_door2=oriunde altundeva pentru a crea info.iron_dimensional_door2=oriunde altundeva pentru a crea
info.dimensional_door3=o dimensiune de buzunar. info.iron_dimensional_door3=o dimensiune de buzunar.
info.gold_dimensional_door0=Similară la o ușă dimensională info.gold_dimensional_door0=Similară la o ușă dimensională
info.gold_dimensional_door1=doar că păstrează o dimensiune 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.chaos_dimensional_door=Atenție: Duce la o destinație aleatorie
info.warp_dimensional_door0=Plasează pe blocul sub o fisură info.oak_dimensional_door0=Plasează pe blocul sub o fisură
info.warp_dimensional_door1=pentru a crea un portal sau info.oak_dimensional_door1=pentru a crea un portal sau
info.warp_dimensional_door2=plasează ori unde într-o dimensiune info.oak_dimensional_door2=plasează ori unde într-o dimensiune
info.warp_dimensional_door3=de buzunar pentru a ieșii. info.oak_dimensional_door3=de buzunar pentru a ieșii.
entity.dimdoors.monolith.name=Monolit entity.dimdoors.monolith.name=Monolit

View file

@ -3,11 +3,11 @@ itemGroup.dimensional_doors_creative_tab=Dimensional Doors: Предметы
tile.gold_door.name=Золотая дверь tile.gold_door.name=Золотая дверь
tile.quartz_door.name=Кварцевая дверь tile.quartz_door.name=Кварцевая дверь
tile.dimensional_door.name=Пространственная дверь tile.iron_dimensional_door.name=Пространственная дверь
tile.gold_dimensional_door.name=Золотая пространственная дверь tile.gold_dimensional_door.name=Золотая пространственная дверь
tile.quartz_dimensional_door.name=Личная пространственная дверь tile.quartz_dimensional_door.name=Личная пространственная дверь
tile.chaos_dimensional_door.name=Нестабильная дверь tile.chaos_dimensional_door.name=Нестабильная дверь
tile.warp_dimensional_door.name=Дверь искажения tile.oak_dimensional_door.name=Дверь искажения
tile.dimensional_trapdoor.name=Межпространственный люк tile.dimensional_trapdoor.name=Межпространственный люк
tile.dimensional_portal.name=Временная дверь tile.dimensional_portal.name=Временная дверь
@ -21,11 +21,11 @@ tile.rift.name=Разлом
item.gold_door.name=Золотая дверь item.gold_door.name=Золотая дверь
item.quartz_door.name=Кварцевая дверь item.quartz_door.name=Кварцевая дверь
item.dimensional_door.name=Пространственная дверь item.iron_dimensional_door.name=Пространственная дверь
item.gold_dimensional_door.name=Золотая пространственная дверь item.gold_dimensional_door.name=Золотая пространственная дверь
item.quartz_dimensional_door.name=Личная пространственная дверь item.quartz_dimensional_door.name=Личная пространственная дверь
item.chaos_dimensional_door.name=Нестабильная дверь item.chaos_dimensional_door.name=Нестабильная дверь
item.warp_dimensional_door.name=Дверь искажения item.oak_dimensional_door.name=Дверь искажения
item.rift_key=Ключ разлома item.rift_key=Ключ разлома
item.rift_signature.name=Подписыватель разлома item.rift_signature.name=Подписыватель разлома
@ -40,10 +40,10 @@ item.stable_fabric.name=Стабильная ткань
info.rift_key.bound=Связан info.rift_key.bound=Связан
info.rift_key.unbound=Не связан info.rift_key.unbound=Не связан
info.dimensional_door0=Поставьте на блок под разломом, info.iron_dimensional_door0=Поставьте на блок под разломом,
info.dimensional_door1=чтобы активировать этот разлом или info.iron_dimensional_door1=чтобы активировать этот разлом или
info.dimensional_door2=поставьте куда угодно, чтобы создать info.iron_dimensional_door2=поставьте куда угодно, чтобы создать
info.dimensional_door3=карманное измерение. info.iron_dimensional_door3=карманное измерение.
info.gold_dimensional_door0=Схожа с пространственной дверью, info.gold_dimensional_door0=Схожа с пространственной дверью,
info.gold_dimensional_door1=но она также держит карманное измерение info.gold_dimensional_door1=но она также держит карманное измерение
@ -71,9 +71,9 @@ info.stabilized_rift_signature.unbound2=первое и последнее ра
info.chaos_dimensional_door=Внимание: Ведёт неизвестно куда info.chaos_dimensional_door=Внимание: Ведёт неизвестно куда
info.warp_dimensional_door0=Поставьте на блок под info.oak_dimensional_door0=Поставьте на блок под
info.warp_dimensional_door1=разломом, чтобы создать портал info.oak_dimensional_door1=разломом, чтобы создать портал
info.warp_dimensional_door2=или поставьте куда угодно в info.oak_dimensional_door2=или поставьте куда угодно в
info.warp_dimensional_door3=карманном измерении, чтобы выйти из него. info.oak_dimensional_door3=карманном измерении, чтобы выйти из него.
entity.dimdoors.monolith.name=Монолит entity.dimdoors.monolith.name=Монолит

View file

@ -3,11 +3,11 @@ itemGroup.dimensional_doors_creative_tab=次元门物品
tile.gold_door.name=金门 tile.gold_door.name=金门
tile.quartz_door.name=石英门 tile.quartz_door.name=石英门
tile.dimensional_door.name=次元门 tile.iron_dimensional_door.name=次元门
tile.gold_dimensional_door.name=金制次元门 tile.gold_dimensional_door.name=金制次元门
tile.quartz_dimensional_door.name=私人次元门 tile.quartz_dimensional_door.name=私人次元门
tile.chaos_dimensional_door.name=不稳定的门 tile.chaos_dimensional_door.name=不稳定的门
tile.warp_dimensional_door.name=扭曲之门 tile.oak_dimensional_door.name=扭曲之门
tile.dimensional_trapdoor.name=空间活板门 tile.dimensional_trapdoor.name=空间活板门
tile.dimensional_portal.name=瞬息之门 tile.dimensional_portal.name=瞬息之门
@ -21,11 +21,11 @@ tile.rift.name=裂痕
item.gold_door.name=金门 item.gold_door.name=金门
item.quartz_door.name=石英门 item.quartz_door.name=石英门
item.dimensional_door.name=次元门 item.iron_dimensional_door.name=次元门
item.gold_dimensional_door.name=金制次元门 item.gold_dimensional_door.name=金制次元门
item.quartz_dimensional_door.name=私人次元门 item.quartz_dimensional_door.name=私人次元门
item.chaos_dimensional_door.name=不稳定的门 item.chaos_dimensional_door.name=不稳定的门
item.warp_dimensional_door.name=扭曲之门 item.oak_dimensional_door.name=扭曲之门
item.rift_key=裂痕钥匙 item.rift_key=裂痕钥匙
item.rift_signature.name=裂痕印记 item.rift_signature.name=裂痕印记
@ -40,10 +40,10 @@ item.stable_fabric.name=稳定构造
info.rift_key.bound=绑定 info.rift_key.bound=绑定
info.rift_key.unbound=取消绑定 info.rift_key.unbound=取消绑定
info.dimensional_door0=放在裂痕下方的方块上 info.iron_dimensional_door0=放在裂痕下方的方块上
info.dimensional_door1=来激活裂痕 info.iron_dimensional_door1=来激活裂痕
info.dimensional_door2=或放在任意地点生成 info.iron_dimensional_door2=或放在任意地点生成
info.dimensional_door3=一个口袋次元. info.iron_dimensional_door3=一个口袋次元.
info.gold_dimensional_door0=类似于次元门 info.gold_dimensional_door0=类似于次元门
info.gold_dimensional_door1=但它放在次元内部时 info.gold_dimensional_door1=但它放在次元内部时
@ -71,9 +71,9 @@ info.stabilized_rift_signature.unbound2=裂痕.
info.chaos_dimensional_door=注意: 将会随机传送 info.chaos_dimensional_door=注意: 将会随机传送
info.warp_dimensional_door0=放在裂痕下方的方块上 info.oak_dimensional_door0=放在裂痕下方的方块上
info.warp_dimensional_door1=来制造传送门, info.oak_dimensional_door1=来制造传送门,
info.warp_dimensional_door2=放在口袋次元中 info.oak_dimensional_door2=放在口袋次元中
info.warp_dimensional_door3=以退出空间. info.oak_dimensional_door3=以退出空间.
entity.dimdoors.monolith.name=巨石 entity.dimdoors.monolith.name=巨石

View file

@ -1,7 +0,0 @@
{
"parent": "block/door_bottom",
"textures": {
"bottom": "dimdoors:blocks/dimensional_door_lower",
"top": "dimdoors:blocks/dimensional_door_upper"
}
}

View file

@ -1,7 +0,0 @@
{
"parent": "block/door_bottom_rh",
"textures": {
"bottom": "dimdoors:blocks/dimensional_door_lower",
"top": "dimdoors:blocks/dimensional_door_upper"
}
}

View file

@ -1,7 +0,0 @@
{
"parent": "block/door_top",
"textures": {
"bottom": "dimdoors:blocks/dimensional_door_lower",
"top": "dimdoors:blocks/dimensional_door_upper"
}
}

View file

@ -1,7 +0,0 @@
{
"parent": "block/door_top_rh",
"textures": {
"bottom": "dimdoors:blocks/dimensional_door_lower",
"top": "dimdoors:blocks/dimensional_door_upper"
}
}

View file

@ -0,0 +1,7 @@
{
"parent": "block/door_bottom",
"textures": {
"bottom": "dimdoors:blocks/iron_dimensional_door_lower",
"top": "dimdoors:blocks/iron_dimensional_door_upper"
}
}

View file

@ -0,0 +1,7 @@
{
"parent": "block/door_bottom_rh",
"textures": {
"bottom": "dimdoors:blocks/iron_dimensional_door_lower",
"top": "dimdoors:blocks/iron_dimensional_door_upper"
}
}

View file

@ -0,0 +1,7 @@
{
"parent": "block/door_top",
"textures": {
"bottom": "dimdoors:blocks/iron_dimensional_door_lower",
"top": "dimdoors:blocks/iron_dimensional_door_upper"
}
}

View file

@ -0,0 +1,7 @@
{
"parent": "block/door_top_rh",
"textures": {
"bottom": "dimdoors:blocks/iron_dimensional_door_lower",
"top": "dimdoors:blocks/iron_dimensional_door_upper"
}
}

View file

@ -0,0 +1,7 @@
{
"parent": "block/door_bottom",
"textures": {
"bottom": "dimdoors:blocks/oak_dimensional_door_lower",
"top": "dimdoors:blocks/oak_dimensional_door_upper"
}
}

View file

@ -0,0 +1,7 @@
{
"parent": "block/door_bottom_rh",
"textures": {
"bottom": "dimdoors:blocks/oak_dimensional_door_lower",
"top": "dimdoors:blocks/oak_dimensional_door_upper"
}
}

View file

@ -0,0 +1,7 @@
{
"parent": "block/door_top",
"textures": {
"bottom": "dimdoors:blocks/oak_dimensional_door_lower",
"top": "dimdoors:blocks/oak_dimensional_door_upper"
}
}

View file

@ -0,0 +1,7 @@
{
"parent": "block/door_top_rh",
"textures": {
"bottom": "dimdoors:blocks/oak_dimensional_door_lower",
"top": "dimdoors:blocks/oak_dimensional_door_upper"
}
}

View file

@ -1,7 +0,0 @@
{
"parent": "block/door_bottom",
"textures": {
"bottom": "dimdoors:blocks/warp_dimensional_door_lower",
"top": "dimdoors:blocks/warp_dimensional_door_upper"
}
}

View file

@ -1,7 +0,0 @@
{
"parent": "block/door_bottom_rh",
"textures": {
"bottom": "dimdoors:blocks/warp_dimensional_door_lower",
"top": "dimdoors:blocks/warp_dimensional_door_upper"
}
}

View file

@ -1,7 +0,0 @@
{
"parent": "block/door_top",
"textures": {
"bottom": "dimdoors:blocks/warp_dimensional_door_lower",
"top": "dimdoors:blocks/warp_dimensional_door_upper"
}
}

View file

@ -1,7 +0,0 @@
{
"parent": "block/door_top_rh",
"textures": {
"bottom": "dimdoors:blocks/warp_dimensional_door_lower",
"top": "dimdoors:blocks/warp_dimensional_door_upper"
}
}

View file

@ -1,6 +1,6 @@
{ {
"parent": "item/generated", "parent": "item/generated",
"textures": { "textures": {
"layer0": "dimdoors:items/warp_dimensional_door" "layer0": "dimdoors:items/iron_dimensional_door"
} }
} }

View file

@ -1,6 +1,6 @@
{ {
"parent": "item/generated", "parent": "item/generated",
"textures": { "textures": {
"layer0": "dimdoors:items/dimensional_door" "layer0": "dimdoors:items/oak_dimensional_door"
} }
} }