Config localization and tile entity simplification
This commit is contained in:
parent
8cd3b8606c
commit
31c0f9c676
18 changed files with 163 additions and 129 deletions
|
@ -76,6 +76,6 @@ public class Location implements Serializable {
|
|||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return pos.hashCode() * 31 + dim; // TODO
|
||||
return pos.hashCode() * 31 + dim;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -243,6 +243,10 @@ public class Schematic {
|
|||
}
|
||||
}
|
||||
if (value != null) {
|
||||
// property is IProperty<?>, value is Comparable<?>, and the ?s refer to the same type because
|
||||
// IProperty<T>.getAllowedValues() returns Collection<T>, but the compiler doesn't keep track of
|
||||
// this, so casting to raw types:
|
||||
//noinspection unchecked,RedundantCast,rawtypes
|
||||
chosenState = chosenState.withProperty((IProperty) property, (Comparable) value);
|
||||
}
|
||||
}
|
||||
|
@ -368,7 +372,6 @@ public class Schematic {
|
|||
adjustedEntityNBT.setUniqueId("UUID", UUID.randomUUID());
|
||||
|
||||
Entity entity = EntityList.createEntityFromNBT(adjustedEntityNBT, world);
|
||||
// TODO: check if it is in pocket bounds
|
||||
world.spawnEntity(entity);
|
||||
}
|
||||
}
|
||||
|
@ -425,8 +428,6 @@ public class Schematic {
|
|||
}
|
||||
setTime += System.nanoTime() - setStart;
|
||||
long relightStart = System.nanoTime();
|
||||
// TODO: It's possible to relight a whole region at once, and immediately using this, according
|
||||
// TODO: to Foghrye4: https://hastebin.com/hociqufabe.java
|
||||
cube.setInitialLightingDone(false);
|
||||
relightTime += System.nanoTime() - relightStart;
|
||||
cube.markDirty();
|
||||
|
|
|
@ -33,13 +33,12 @@ public class DimDoors {
|
|||
public static final String MODNAME = "Dimensional Doors";
|
||||
public static final String MCVERSIONS = "[1.12,1.13)";
|
||||
public static final String VERSION = "${version}";
|
||||
// TODO: make the forge version here change depending on a field in build.gradle
|
||||
public static final String DEPENDENCIES = "required-after:forge@[14.21.0.2320,);after:csb_ench_table";
|
||||
// after:csb_ench_table as a workaround for https://github.com/crazysnailboy/EnchantingTable/issues/7
|
||||
|
||||
@Mod.Instance(DimDoors.MODID)
|
||||
public static DimDoors instance;
|
||||
public static Logger log; // TODO: make non-static?
|
||||
public static Logger log;
|
||||
|
||||
@SidedProxy(clientSide = "org.dimdev.dimdoors.client.ClientProxy",
|
||||
serverSide = "org.dimdev.dimdoors.server.ServerProxy")
|
||||
|
@ -86,11 +85,9 @@ public class DimDoors {
|
|||
}
|
||||
|
||||
public static void sendTranslatedMessage(Entity entity, String text, Object... translationArgs) {
|
||||
if (ModConfig.general.useStatusBar && entity instanceof EntityPlayerMP) {
|
||||
if (entity instanceof EntityPlayerMP) {
|
||||
EntityPlayerMP player = (EntityPlayerMP) entity;
|
||||
player.sendStatusMessage(new TextComponentTranslation(text, translationArgs), true);
|
||||
} else {
|
||||
chat(entity, text, translationArgs);
|
||||
player.sendStatusMessage(new TextComponentTranslation(text, translationArgs), ModConfig.general.useStatusBar);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -41,12 +41,7 @@ public class TileEntityEntranceRiftRenderer extends TileEntitySpecialRenderer<Ti
|
|||
GlStateManager.pushMatrix();
|
||||
GlStateManager.translate(x, y, z);
|
||||
|
||||
//x = ActiveRenderInfo.getPosition().xCoord;
|
||||
//y = ActiveRenderInfo.getPosition().yCoord;
|
||||
//z = ActiveRenderInfo.getPosition().zCoord;
|
||||
|
||||
GlStateManager.rotate(180.0F - 90 * rotation.getHorizontalIndex(), 0.0F, 1.0F, 0.0F);
|
||||
// GlStateManager.rotate((float)(-90 * rotation), 0.0F, 0.0F, 1.0F);
|
||||
|
||||
GlStateManager.translate(0.007F, .25F, 0F);
|
||||
|
||||
|
@ -102,25 +97,24 @@ public class TileEntityEntranceRiftRenderer extends TileEntitySpecialRenderer<Ti
|
|||
|
||||
@Override
|
||||
public void render(TileEntityEntranceRift entrance, double x, double y, double z, float partialTicks, int destroyStage, float alpha) {
|
||||
if (entrance.shouldRender) {
|
||||
Vec3d offset = new Vec3d(entrance.orientation.getOpposite().getDirectionVec()).scale(
|
||||
entrance.orientation == EnumFacing.NORTH ||
|
||||
entrance.orientation == EnumFacing.WEST ||
|
||||
entrance.orientation == EnumFacing.UP ? entrance.pushIn : entrance.pushIn - 1);
|
||||
DimensionalWallRenderer.renderDimensionalWall(
|
||||
x + offset.x,
|
||||
y + offset.y,
|
||||
z + offset.z,
|
||||
//entrance.orientation.getHorizontalAngle(),
|
||||
//entrance.orientation.getDirectionVec().getY() * 90,
|
||||
entrance.orientation,
|
||||
entrance.extendLeft + entrance.extendRight,
|
||||
entrance.extendDown + entrance.extendUp,
|
||||
getColors(entrance));
|
||||
if (entrance.lockStatus >= 1) {
|
||||
for (int i = 0; i < 1 + entrance.lockStatus; i++) {
|
||||
renderKeyHole(entrance, x, y, z, i);
|
||||
}
|
||||
Vec3d offset = new Vec3d(entrance.orientation.getOpposite().getDirectionVec()).scale(
|
||||
entrance.orientation == EnumFacing.NORTH ||
|
||||
entrance.orientation == EnumFacing.WEST ||
|
||||
entrance.orientation == EnumFacing.UP ? entrance.pushIn : entrance.pushIn - 1);
|
||||
DimensionalWallRenderer.renderDimensionalWall(
|
||||
x + offset.x,
|
||||
y + offset.y,
|
||||
z + offset.z,
|
||||
//entrance.orientation.getHorizontalAngle(),
|
||||
//entrance.orientation.getDirectionVec().getY() * 90,
|
||||
entrance.orientation,
|
||||
entrance.extendLeft + entrance.extendRight,
|
||||
entrance.extendDown + entrance.extendUp,
|
||||
getColors(entrance));
|
||||
|
||||
if (entrance.lockStatus >= 1) {
|
||||
for (int i = 0; i < 1 + entrance.lockStatus; i++) {
|
||||
renderKeyHole(entrance, x, y, z, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,10 +11,10 @@ import static net.minecraftforge.common.config.Config.*;
|
|||
|
||||
@Config(modid = DimDoors.MODID, name = DimDoors.MODID, category = "")
|
||||
@Mod.EventBusSubscriber(modid = DimDoors.MODID)
|
||||
public final class ModConfig { // TODO: localize the rest
|
||||
public final class ModConfig {
|
||||
|
||||
public static General general = new General();
|
||||
public static Pocket pockets = new Pocket();
|
||||
public static Pockets pockets = new Pockets();
|
||||
public static World world = new World();
|
||||
public static Dungeons dungeons = new Dungeons();
|
||||
public static Monoliths monoliths = new Monoliths();
|
||||
|
@ -22,104 +22,98 @@ public final class ModConfig { // TODO: localize the rest
|
|||
|
||||
public static class General {
|
||||
@Name("baseDimensionID")
|
||||
@Comment({"Dimension ID of the first Dimensional Doors dimension. Other dimensions will use consecutive IDs.",
|
||||
"It is strongly recommendended not to change this value. Only change it if it conflicts with other mods."})
|
||||
@LangKey("dimdoors.general.baseDimensionID")
|
||||
@RequiresWorldRestart
|
||||
public int baseDimensionID = 684;
|
||||
|
||||
@Name("useStatusBar")
|
||||
@Comment("When true, the status bar is used to relay status messages to the player, instead of the chat.")
|
||||
@LangKey("dimdoors.general.useStatusBar")
|
||||
public boolean useStatusBar = true;
|
||||
|
||||
@Name("closeDoorBehind")
|
||||
@Comment("When true, Dimensional Doors will automatically close when the player enters their portal.")
|
||||
@LangKey("dimdoors.general.closeDoorBehind")
|
||||
public boolean closeDoorBehind = true;
|
||||
|
||||
@Name("closeDoorBehind")
|
||||
@Comment("Distance in blocks to teleport the player in front of the dimensional door.")
|
||||
@RangeDouble(min = 0.5, max = 3)
|
||||
public double teleportOffset = 1;
|
||||
@Name("teleportOffset")
|
||||
@LangKey("dimdoors.general.teleportOffset")
|
||||
@RangeDouble(min = 0, max = 3)
|
||||
public double teleportOffset = 0.5;
|
||||
|
||||
@Name("riftBoundingBoxInCreative")
|
||||
@LangKey("dimdoors.general.riftBoundingBoxInCreative")
|
||||
public boolean riftBoundingBoxInCreative;
|
||||
}
|
||||
|
||||
public static class Pocket {
|
||||
@Name("A_pocketGridSize")
|
||||
@Comment("Sets how many chunks apart all pockets in any pocket dimensions should be placed.")
|
||||
public static class Pockets {
|
||||
@Name("pocketGridSize")
|
||||
@LangKey("dimdoors.pockets.pocketGridSize")
|
||||
@RangeInt(min = 4)
|
||||
public int pocketGridSize = 32;
|
||||
|
||||
@Name("B_maxPocketSize")
|
||||
@Comment({"Sets the maximum size of any pocket. A 'maxPocketSize' of 'x' will allow for pockets up to (x + 1) * (x + 1) chunks.",
|
||||
"If this is set to any value bigger than 'pocketGridSize / 2', the value of 'pocketGridSize / 2' will be used instead."})
|
||||
@Name("maxPocketSize")
|
||||
@LangKey("dimdoors.pockets.maxPocketSize")
|
||||
@RangeInt(min = 0)
|
||||
public int maxPocketSize = 15;
|
||||
|
||||
@Name("C_privatePocketSize")
|
||||
@Comment({"Sets the minimum size of a newly created Private Pocket.",
|
||||
"If this is set to any value bigger than 'maxPocketSize', the value of 'maxPocketSize' will be used instead."})
|
||||
@Name("privatePocketSize")
|
||||
@LangKey("dimdoors.pockets.privatePocketSize")
|
||||
@RangeInt(min = 0, max = 7)
|
||||
public int privatePocketSize = 2;
|
||||
|
||||
@Name("D_publicPocketSize")
|
||||
@Comment({"Sets the minimum size of a newly created Public Pocket.",
|
||||
"If this is set to any value bigger than 'privatePocketSize', the value of 'privatePocketSize' will be used instead."})
|
||||
@Name("publicPocketSize")
|
||||
@LangKey("dimdoors.pockets.publicPocketSize")
|
||||
@RangeInt(min = 0)
|
||||
public int publicPocketSize = 1;
|
||||
|
||||
@Name("Z_loadAllSchematics")
|
||||
@Comment({"When true, all available Pocket Schematics will be loaded on game-start, even if the gridSize and pocketSize ",
|
||||
"configuration fields would exclude these schematics from being used in 'naturally generated' pockets.",
|
||||
"The /pocket command can be used to force-generate these pockets for dungeon building- or testing-purposes."})
|
||||
@Name("loadAllSchematics")
|
||||
@LangKey("dimdoors.pockets.loadAllSchematics")
|
||||
public boolean loadAllSchematics = false;
|
||||
}
|
||||
|
||||
public static class World {
|
||||
@Name("A_clusterGenChance")
|
||||
@Comment("Sets the chance (out of 1.0) that a cluster of Rift Scars will generate in a given chunk.")
|
||||
@Name("clusterGenChance")
|
||||
@LangKey("dimdoors.world.clusterGenChance")
|
||||
@RangeDouble(min = 0.0, max = 1.0)
|
||||
public double clusterGenChance = 0.0002;
|
||||
|
||||
@Name("A_gatewayGenChance")
|
||||
@Comment("Sets the chance (out of 1.0) that a Transient Portal gateway will generate in a given chunk.")
|
||||
@Name("gatewayGenChance")
|
||||
@LangKey("dimdoors.world.gatewayGenChance")
|
||||
@RangeDouble(min = 0.0, max = 1.0)
|
||||
public double gatewayGenChance = 0.0015;
|
||||
|
||||
@Name("B_clusterDimBlacklist")
|
||||
@Comment({"Dimension Blacklist for the generation of Rift Scar clusters. Add a dimension ID here to prevent generation in certain dimensions.",
|
||||
"Default: []"})
|
||||
@Name("clusterDimBlacklist")
|
||||
@LangKey("dimdoors.world.clusterDimBlacklist")
|
||||
public int[] clusterDimBlacklist = {};
|
||||
|
||||
@Name("B_gatewayDimBlacklist")
|
||||
@Comment({"Dimension Blacklist for the generation of Transient Portal gateways. Add a dimension ID here to prevent generation in certain dimensions.",
|
||||
"Default: []"})
|
||||
@Name("gatewayDimBlacklist")
|
||||
@LangKey("dimdoors.world.gatewayDimBlacklist")
|
||||
public int[] gatewayDimBlacklist = {};
|
||||
}
|
||||
|
||||
public static class Dungeons {
|
||||
@Name("maxDungeonDepth")
|
||||
@Comment({"The depth at which limbo is located. If a Rift reaches any deeper than this while searching for a new ",
|
||||
"destination, the player trying to enter the Rift will be sent straight to Limbo."})
|
||||
@RangeInt(min = 100)
|
||||
public int maxDungeonDepth = 2000;
|
||||
@LangKey("dimdoors.dungeons.maxDungeonDepth")
|
||||
@RangeInt(min = 5)
|
||||
public int maxDungeonDepth = 50;
|
||||
}
|
||||
|
||||
public static class Monoliths {
|
||||
@Name("dangerousLimboMonoliths")
|
||||
@Comment("When true, Monoliths in Limbo attack the player and deal damage.")
|
||||
@LangKey("dimdoors.monoliths.dangerousLimboMonoliths")
|
||||
public boolean dangerousLimboMonoliths = false;
|
||||
|
||||
@Name("monolithTeleportation")
|
||||
@Comment("When true, being exposed to the gaze of Monoliths for too long, will cause the player to be teleported to the void above Limbo.")
|
||||
@LangKey("dimdoors.monoliths.monolithTeleportation")
|
||||
public boolean monolithTeleportation = true;
|
||||
}
|
||||
|
||||
public static class Limbo {
|
||||
@Name("universalLimbo")
|
||||
@Comment({"When true, players are also teleported to Limbo when they die in any non-Pocket Dimension (except Limbo itself).",
|
||||
"Otherwise, players only go to Limbo if they die in a Pocket Dimension."})
|
||||
@LangKey("dimdoors.limbo.universalLimbo")
|
||||
public boolean universalLimbo = false;
|
||||
|
||||
@Name("hardcoreLimbo")
|
||||
@Comment("When true, a player dying in Limbo will respawn in Limbo, making Eternal Fluid or Golden Dimensional Doors the only way to escape Limbo.")
|
||||
@LangKey("dimdoors.limbo.hardcoreLimbo")
|
||||
public boolean hardcoreLimbo = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -119,7 +119,9 @@ public abstract class BlockDimensionalDoor extends BlockDoor implements IRiftPro
|
|||
public TileEntityEntranceRift createNewTileEntity(World world, int meta) {
|
||||
TileEntityEntranceRift rift = new TileEntityEntranceRift();
|
||||
rift.orientation = getStateFromMeta(meta).getValue(BlockDoor.FACING).getOpposite();
|
||||
rift.extendUp += 1;
|
||||
if (DimDoors.proxy.isClient()) {
|
||||
rift.extendUp += 1;
|
||||
}
|
||||
return rift;
|
||||
}
|
||||
|
||||
|
@ -132,7 +134,7 @@ public abstract class BlockDimensionalDoor extends BlockDoor implements IRiftPro
|
|||
if (rift == null) {
|
||||
DimDoors.log.error("Rift tile entity was null when breaking block at " + new Location(world, pos) + ", please report this error.");
|
||||
}
|
||||
if (rift.isPlaceRiftOnBreak() || rift.isRegistered() && RiftRegistry.instance().getSources(new Location(rift.getWorld(), rift.getPos())).size() > 0 && !rift.isAlwaysDelete()) {
|
||||
if (rift.isLeaveScarWhenClosed() || rift.isRegistered() && RiftRegistry.instance().getSources(new Location(rift.getWorld(), rift.getPos())).size() > 0 && !rift.isAlwaysDelete()) {
|
||||
world.setBlockState(pos, ModBlocks.RIFT.getDefaultState());
|
||||
// This isn't run when we change the block from within block break
|
||||
TileEntityFloatingRift newRift = (TileEntityFloatingRift) world.getTileEntity(pos);
|
||||
|
|
|
@ -62,8 +62,10 @@ public class BlockDimensionalPortal extends BlockDimensionalDoor { // TODO: conv
|
|||
public TileEntityEntranceRift createNewTileEntity(World world, int meta) {
|
||||
TileEntityEntranceRift rift = new TileEntityEntranceRift();
|
||||
rift.orientation = getStateFromMeta(meta).getValue(BlockDoor.FACING).getOpposite();
|
||||
rift.extendUp += 1;
|
||||
rift.pushIn = 0.5;
|
||||
if (DimDoors.proxy.isClient()) {
|
||||
rift.extendUp += 1;
|
||||
rift.pushIn = 0.5;
|
||||
}
|
||||
return rift;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,9 +2,12 @@ package org.dimdev.dimdoors.shared.blocks;
|
|||
|
||||
import java.util.*;
|
||||
|
||||
import net.minecraft.client.entity.EntityPlayerSP;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import org.dimdev.dimdoors.DimDoors;
|
||||
import org.dimdev.dimdoors.client.ParticleRiftEffect;
|
||||
import org.dimdev.dimdoors.shared.ModConfig;
|
||||
import org.dimdev.dimdoors.shared.items.ModItems;
|
||||
import org.dimdev.dimdoors.shared.tileentities.TileEntityFloatingRift;
|
||||
import org.dimdev.ddutils.blocks.BlockSpecialAir;
|
||||
|
@ -57,8 +60,15 @@ public class BlockFloatingRift extends BlockSpecialAir implements ITileEntityPro
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
|
||||
return false; // TODO
|
||||
@SuppressWarnings("deprecation")
|
||||
public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess world, BlockPos pos) {
|
||||
if (ModConfig.general.riftBoundingBoxInCreative) {
|
||||
EntityPlayer player = DimDoors.proxy.getLocalPlayer();
|
||||
if (player != null && player.isCreative()) {
|
||||
return blockState.getBoundingBox(world, pos);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -57,16 +57,16 @@ public class PocketTemplate {
|
|||
}
|
||||
}
|
||||
|
||||
public static void replacePlaceholders(Schematic parSchematic) { // TODO: it should be possible to place a schematic without replacing placeholders
|
||||
public static void replacePlaceholders(Schematic schematic) { // TODO: rift inheritance rather than placeholders
|
||||
// Replace placeholders (some schematics will contain them)
|
||||
List<NBTTagCompound> tileEntities = new ArrayList<>();
|
||||
for (NBTTagCompound tileEntityNBT : parSchematic.tileEntities) {
|
||||
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 = parSchematic.palette.get(parSchematic.blockData[x][y][z]);
|
||||
IBlockState state = schematic.palette.get(schematic.blockData[x][y][z]);
|
||||
|
||||
NBTTagCompound newNBT;
|
||||
switch (tileEntityNBT.getString("placeholder")) {
|
||||
|
@ -115,11 +115,11 @@ public class PocketTemplate {
|
|||
tileEntities.add(tileEntityNBT);
|
||||
}
|
||||
}
|
||||
parSchematic.tileEntities = tileEntities;
|
||||
schematic.tileEntities = tileEntities;
|
||||
|
||||
|
||||
List<NBTTagCompound> entities = new ArrayList<>();
|
||||
for (NBTTagCompound entitiesNBT : parSchematic.entities) {
|
||||
for (NBTTagCompound entitiesNBT : schematic.entities) {
|
||||
if (entitiesNBT.hasKey("placeholder")) {
|
||||
double x = entitiesNBT.getDouble("x");
|
||||
double y = entitiesNBT.getDouble("y");
|
||||
|
@ -143,7 +143,7 @@ public class PocketTemplate {
|
|||
entities.add(entitiesNBT);
|
||||
}
|
||||
}
|
||||
parSchematic.entities = entities;
|
||||
schematic.entities = entities;
|
||||
}
|
||||
|
||||
public void place(Pocket pocket) {
|
||||
|
@ -241,7 +241,7 @@ public class PocketTemplate {
|
|||
if (linkProperties != null) rift.setProperties(linkProperties);
|
||||
rift.setDestination(rift.getProperties() == null || !rift.getProperties().oneWay ? linkTo : null);
|
||||
if (rift instanceof TileEntityEntranceRift && !rift.isAlwaysDelete()) {
|
||||
((TileEntityEntranceRift) rift).setPlaceRiftOnBreak(true); // We modified the door's state
|
||||
((TileEntityEntranceRift) rift).setLeaveScarWhenClosed(true); // We modified the door's state
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,7 +7,6 @@ import net.minecraft.nbt.NBTTagCompound;
|
|||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ITickable;
|
||||
import net.minecraftforge.common.DimensionManager;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
@ -23,7 +22,7 @@ import org.dimdev.dimdoors.shared.rifts.registry.RiftRegistry;
|
|||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
@NBTSerializable public abstract class TileEntityRift extends TileEntity implements ITickable { // TODO: implement ITeleportSource and ITeleportDestination
|
||||
@NBTSerializable public abstract class TileEntityRift extends TileEntity { // TODO: implement ITeleportSource and ITeleportDestination
|
||||
|
||||
/*@Saved*/ @Nonnull @Getter protected RiftDestination destination; // How the rift acts as a source
|
||||
@Saved @Getter protected LinkProperties properties; // How the rift acts as a target, and properties that affect how it can link to other rifts
|
||||
|
|
|
@ -5,6 +5,8 @@ import net.minecraft.entity.EntityLiving;
|
|||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
import org.dimdev.ddutils.WorldUtils;
|
||||
import org.dimdev.ddutils.nbt.NBTUtils;
|
||||
import org.dimdev.annotatednbt.Saved;
|
||||
|
@ -20,20 +22,20 @@ import net.minecraft.util.EnumFacing;
|
|||
|
||||
import java.util.Random;
|
||||
|
||||
// TODO: merge horizontal and vertical entrances' render code into one, and support custom sizes
|
||||
@NBTSerializable public class TileEntityEntranceRift extends TileEntityRift {
|
||||
@Saved @Getter /*package-private*/ boolean placeRiftOnBreak = false;
|
||||
@Saved @Getter /*package-private*/ boolean closeAfterPassThrough = false;
|
||||
@Saved @Getter public boolean shouldRender = true;
|
||||
@Saved @Getter public byte lockStatus = 0;
|
||||
@Saved @Getter protected boolean leaveScarWhenClosed = false;
|
||||
@Saved @Getter protected boolean closeAfterPassThrough = false; // TODO: doesn't make sense lore-wise for doors, split into separate tile entity
|
||||
|
||||
// Set by the block TODO: get rid of these, calculate client-side!
|
||||
@Saved public EnumFacing orientation;
|
||||
@Saved public double extendUp = 0.5; // Use += to set these.
|
||||
@Saved public double extendDown = 0.5;
|
||||
@Saved public double extendLeft = 0.5;
|
||||
@Saved public double extendRight = 0.5;
|
||||
@Saved public double pushIn = 0.01;
|
||||
// Set by the block on tile entity creation, can't get from the block, it's not necessarily a door
|
||||
public EnumFacing orientation;
|
||||
|
||||
// Render info, use += to change these on block tile entity creation
|
||||
@SideOnly(Side.CLIENT) public double extendUp = 0.5;
|
||||
@SideOnly(Side.CLIENT) public double extendDown = 0.5;
|
||||
@SideOnly(Side.CLIENT) public double extendLeft = 0.5;
|
||||
@SideOnly(Side.CLIENT) public double extendRight = 0.5;
|
||||
@SideOnly(Side.CLIENT) public double pushIn = 0.01;
|
||||
@SideOnly(Side.CLIENT) public byte lockStatus = 0; // TODO
|
||||
|
||||
@Override
|
||||
public void copyFrom(TileEntityRift oldRift) {
|
||||
|
@ -42,22 +44,13 @@ import java.util.Random;
|
|||
TileEntityEntranceRift oldEntranceRift = (TileEntityEntranceRift) oldRift;
|
||||
closeAfterPassThrough = oldEntranceRift.closeAfterPassThrough;
|
||||
}
|
||||
placeRiftOnBreak = true;
|
||||
leaveScarWhenClosed = true;
|
||||
}
|
||||
|
||||
@Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTUtils.readFromNBT(this, nbt); }
|
||||
@Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
|
||||
nbt = super.writeToNBT(nbt);
|
||||
return NBTUtils.writeToNBT(this, nbt);
|
||||
}
|
||||
@Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { nbt = super.writeToNBT(nbt); return NBTUtils.writeToNBT(this, nbt); }
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
|
||||
}
|
||||
|
||||
public void setPlaceRiftOnBreak(boolean placeRiftOnBreak) { this.placeRiftOnBreak = placeRiftOnBreak; markDirty(); }
|
||||
public void setShouldRender(boolean shouldRender) { this.shouldRender = shouldRender; markDirty(); }
|
||||
public void setLeaveScarWhenClosed(boolean leaveScarWhenClosed) { this.leaveScarWhenClosed = leaveScarWhenClosed; markDirty(); }
|
||||
public void setLockStatus(byte lockStatus) { this.lockStatus = lockStatus; markDirty(); }
|
||||
public void setCloseAfterPassThrough(boolean closeAfterPassThrough) { this.closeAfterPassThrough = closeAfterPassThrough; markDirty(); }
|
||||
|
||||
|
@ -65,7 +58,7 @@ import java.util.Random;
|
|||
public boolean teleport(Entity entity) {
|
||||
boolean status = super.teleport(entity);
|
||||
if (riftStateChanged && !alwaysDelete) {
|
||||
placeRiftOnBreak = true;
|
||||
leaveScarWhenClosed = true;
|
||||
markDirty();
|
||||
}
|
||||
return status;
|
||||
|
@ -73,7 +66,7 @@ import java.util.Random;
|
|||
|
||||
@Override
|
||||
public void teleportTo(Entity entity, float fromYaw, float fromPitch) { // TODO: teleportOffset for all rifts instead?
|
||||
Vec3d targetPos = new Vec3d(pos).addVector(0.5, 0, 0.5).add(new Vec3d(orientation.getDirectionVec()).scale(ModConfig.general.teleportOffset));
|
||||
Vec3d targetPos = new Vec3d(pos).addVector(0.5, 0, 0.5).add(new Vec3d(orientation.getDirectionVec()).scale(ModConfig.general.teleportOffset + 0.5));
|
||||
if (relativeRotation) {
|
||||
float yaw = getDestinationYaw(entity.rotationYaw) + entity.rotationYaw - fromYaw;
|
||||
float pitch = entity instanceof EntityLiving ? entity.rotationPitch : getDestinationPitch(entity.rotationPitch) + entity.rotationPitch - fromPitch;
|
||||
|
@ -86,7 +79,7 @@ import java.util.Random;
|
|||
|
||||
@Override
|
||||
public void teleportTo(Entity entity) {
|
||||
Vec3d targetPos = new Vec3d(pos).add(new Vec3d(orientation.getDirectionVec()).scale(ModConfig.general.teleportOffset));
|
||||
Vec3d targetPos = new Vec3d(pos).add(new Vec3d(orientation.getDirectionVec()).scale(ModConfig.general.teleportOffset + 0.5));
|
||||
TeleportUtils.teleport(entity, WorldUtils.getDim(world), targetPos.x, targetPos.y, targetPos.z, orientation.getHorizontalAngle(), 0);
|
||||
}
|
||||
|
||||
|
@ -130,11 +123,13 @@ import java.util.Random;
|
|||
return orientation.getOpposite().getFrontOffsetY() * 90;
|
||||
}
|
||||
|
||||
@Override public float getDestinationYaw(float entityYaw) {
|
||||
@Override
|
||||
public float getDestinationYaw(float entityYaw) {
|
||||
return orientation.getHorizontalAngle();
|
||||
}
|
||||
|
||||
@Override public float getDestinationPitch(float entityPitch) {
|
||||
@Override
|
||||
public float getDestinationPitch(float entityPitch) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -156,7 +156,7 @@ public final class SchematicGenerator {
|
|||
.build());
|
||||
rift.setProperties(link);
|
||||
|
||||
rift.setPlaceRiftOnBreak(true);
|
||||
rift.setLeaveScarWhenClosed(true);
|
||||
NBTTagCompound tileNBT = rift.serializeNBT();
|
||||
tileNBT.setInteger("x", (size - 1) / 2);
|
||||
tileNBT.setInteger("y", 5);
|
||||
|
|
|
@ -12,9 +12,9 @@ import org.dimdev.ddutils.nbt.NBTUtils;
|
|||
@NBTSerializable public class Pocket implements INBTStorable {
|
||||
|
||||
@Saved @Getter protected int id;
|
||||
@Saved @Getter protected int x; // Grid x TODO: rename to gridX and gridY, or just convert to non-grid dependant coordinates
|
||||
@Saved @Getter protected int x; // Grid x TODO: convert to non-grid dependant coordinates
|
||||
@Saved @Getter protected int z; // Grid y
|
||||
@Saved @Getter @Setter protected int size; // TODO: size = sizeInChunks - 1 ???!!! TODO: non chunk-based size, better bounds such as minX, minZ, maxX, maxZ, etc.
|
||||
@Saved @Getter @Setter protected int size; // TODO: non chunk-based size, better bounds such as minX, minZ, maxX, maxZ, etc.
|
||||
@Saved @Getter @Setter protected VirtualLocation virtualLocation;
|
||||
|
||||
@Getter int dim; // Not saved
|
||||
|
|
|
@ -141,15 +141,55 @@ dimdoors.general=General Options
|
|||
dimdoors.general.tooltip=General configuration options for the mod
|
||||
dimdoors.general.baseDimensionID=Base Dimension ID
|
||||
dimdoors.general.baseDimensionID.tooltip=Dimension ID of the first Dimensional Doors dimension. Other dimensions will use consecutive IDs. It is strongly recommended to leave this to the default value.
|
||||
dimdoors.general.useStatusBar.name=Status Bar Messages
|
||||
dimdoors.general.useStatusBar.comment=Whether to use the status bar to send messages rather than the chat.
|
||||
dimdoors.general.useStatusBar=Status Bar Messages
|
||||
dimdoors.general.useStatusBar.tooltip=Whether to use the status bar to send messages rather than the chat.
|
||||
dimdoors.general.closeDoorBehind=Close Door Behind
|
||||
dimdoors.general.closeDoorBehind.tooltip=When true, Dimensional Doors will automatically close when the player enters their portal.
|
||||
dimdoors.general.teleportOffset=Teleport Offset
|
||||
dimdoors.general.teleportOffset.tooltip=Distance in blocks to teleport the player in front of the dimensional door.
|
||||
dimdoors.general.riftBoundingBoxInCreative=Rift Bounding Box in Creative
|
||||
dimdoors.general.riftBoundingBoxInCreative.tooltip=When true, shows the bounding boxes of floating rifts when the player is in creative.
|
||||
|
||||
dimdoors.pockets=Pocket Dimension Options
|
||||
dimdoors.pockets.tooltip=Options that determine the spacing and maximum size of pockets in the pocket world
|
||||
dimdoors.world=Worldgen Options
|
||||
dimdoors.pockets.pocketGridSize=Pocket Grid Size
|
||||
dimdoors.pockets.pocketGridSize.tooltip=Sets how many chunks apart all pockets in any pocket dimensions should be placed.
|
||||
dimdoors.pockets.maxPocketSize=Maximum Pocket Size
|
||||
dimdoors.pockets.maxPocketSize.tooltip=Sets the maximum size of any pocket. A size of x will allow for pockets up to (x + 1) * (x + 1) chunks. If this is set to any value bigger than pocketGridSize / 2, the value of pocketGridSize / 2 will be used instead.
|
||||
dimdoors.pockets.privatePocketSize=Private Pocket Size
|
||||
dimdoors.pockets.privatePocketSize.tooltip=Sets the minimum size of a newly created Private Pocket. If this is set to any value bigger than maxPocketSize, the value of maxPocketSize will be used instead.
|
||||
dimdoors.pockets.publicPocketSize=Public Pocket Size
|
||||
dimdoors.pockets.publicPocketSize.tooltip=Sets the minimum size of a newly created Public Pocket. If this is set to any value bigger than privatePocketSize, the value of privatePocketSize will be used instead.
|
||||
dimdoors.pockets.loadAllSchematics=Load All Schematics
|
||||
dimdoors.pockets.loadAllSchematics.tooltip= When true, all available Pocket Schematics will be loaded on game-start, even if the gridSize and pocketSize configuration fields would exclude these schematics from being used in 'naturally generated' pockets. The /pocket command can be used to force-generate these pockets for dungeon building or testing purposes.
|
||||
|
||||
dimdoors.world=World Generation Options
|
||||
dimdoors.world.tooltip=Options that determine where dimensional gateways and rift clusters can be generated and at what frequency
|
||||
dimdoors.world.clusterGenChance=Cluster Generation Chance
|
||||
dimdoors.world.clusterGenChance.tooltip=Sets the chance (out of 1.0) that a cluster of Rift Scars will generate in a given chunk.
|
||||
dimdoors.world.gatewayGenChance=Gateway generation chance
|
||||
dimdoors.world.gatewayGenChance.tooltip=Sets the chance (out of 1.0) that a Transient Portal gateway will generate in a given chunk.
|
||||
dimdoors.world.clusterDimBlacklist=Cluster Dimension Blacklist
|
||||
dimdoors.world.clusterDimBlacklist.tooltip=Dimension Blacklist for the generation of Rift Scar clusters. Add a dimension ID here to prevent generation in certain dimensions.
|
||||
dimdoors.world.gatewayDimBlacklist=Gateway Dimension Blacklist
|
||||
dimdoors.world.gatewayDimBlacklist.tooltip=Dimension Blacklist for the generation of Transient Portal gateways. Add a dimension ID here to prevent generation in certain dimensions.
|
||||
|
||||
dimdoors.dungeons=Dungeon Options
|
||||
dimdoors.dungeons.tooltip=Options that affect the generation of pocket dungeons
|
||||
dimdoors.dungeons.maxDungeonDepth.tooltip=Maximum Dungeon Depth
|
||||
dimdoors.dungeons.maxDungeonDepth.tooltip=The depth at which limbo is located. If a Rift reaches any deeper than this while searching for a new destination, the player trying to enter the Rift will be sent straight to Limbo.
|
||||
|
||||
dimdoors.monoliths=Monolith Options
|
||||
dimdoors.monoliths.tooltip=Options that determine how dangerous monoliths are
|
||||
dimdoors.monoliths.dangerousLimboMonoliths=Dangerous Limbo Monoliths
|
||||
dimdoors.monoliths.dangerousLimboMonoliths.tooltip=When true, Monoliths in Limbo attack the player and deal damage.
|
||||
dimdoors.monoliths.monolithTeleportation=Monolith Teleportation
|
||||
dimdoors.monoliths.monolithTeleportation.tooltip=When true, being exposed to the gaze of Monoliths for too long, will cause the player to be teleported to the void above Limbo.
|
||||
|
||||
dimdoors.limbo=Limbo Options
|
||||
dimdoors.limbo.tooltip=Options that control various aspects of the Limbo dimension
|
||||
dimdoors.limbo.universalLimbo=Universal Limbo
|
||||
dimdoors.limbo.universalLimbo.tooltip=When true, players are also teleported to Limbo when they die in any non-Pocket Dimension (except Limbo itself). Otherwise, players only go to Limbo if they die in a Pocket Dimension.
|
||||
dimdoors.limbo.hardcoreLimbo=Hardcore Limbo
|
||||
dimdoors.limbo.hardcoreLimbo.tooltip=When true, a player dying in Limbo will respawn in Limbo, making Eternal Fluid or Golden Dimensional Doors the only way to escape Limbo.
|
||||
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 2.3 KiB |
Binary file not shown.
After Width: | Height: | Size: 3.2 KiB |
BIN
src/main/resources/assets/dimdoors/textures/other/keyhole.png
Normal file
BIN
src/main/resources/assets/dimdoors/textures/other/keyhole.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
Loading…
Reference in a new issue