WarpDoor improvements
-Added Forge version dependency -Made sure that Warp Doors always lead to a non-pocket dimension if they lead anywhere at all -Added Event checks on Players entering chunks in/and pocket dimensions
This commit is contained in:
parent
53568707f0
commit
c29c9b3d23
9 changed files with 119 additions and 21 deletions
|
@ -23,7 +23,7 @@ import net.minecraftforge.fml.relauncher.SideOnly;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Mod(modid = DimDoors.MODID, name = "Dimensional Doors", version = DimDoors.VERSION)
|
@Mod(modid = DimDoors.MODID, name = "Dimensional Doors", version = DimDoors.VERSION, dependencies = "required-after:Forge@[12.18.3.2281,)")
|
||||||
public class DimDoors {
|
public class DimDoors {
|
||||||
|
|
||||||
public static final String VERSION = "${version}";
|
public static final String VERSION = "${version}";
|
||||||
|
|
|
@ -6,28 +6,78 @@
|
||||||
package com.zixiken.dimdoors.shared;
|
package com.zixiken.dimdoors.shared;
|
||||||
|
|
||||||
import com.zixiken.dimdoors.DimDoors;
|
import com.zixiken.dimdoors.DimDoors;
|
||||||
|
import com.zixiken.dimdoors.shared.util.Location;
|
||||||
|
import com.zixiken.dimdoors.shared.world.DimDoorDimensions;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraftforge.event.entity.EntityEvent;
|
||||||
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
|
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
|
||||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||||
|
import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerChangedDimensionEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author s101426
|
* @author Robijnvogel
|
||||||
*/
|
*/
|
||||||
public class DDEventHandler {
|
public class DDEventHandler {
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void onPlayerJoinWorld(EntityJoinWorldEvent event) { //@todo, probably move this to another class
|
public void onPlayerJoinWorld(EntityJoinWorldEvent event) {
|
||||||
//check if config default values have been checked
|
//check if config default values have been checked
|
||||||
if (!DDConfig.HAVE_CONFIG_DEFAULTS_BEEN_CHECKED_FOR_CORRECTNESS) {
|
if (!DDConfig.HAVE_CONFIG_DEFAULTS_BEEN_CHECKED_FOR_CORRECTNESS) {
|
||||||
if (!DimDoors.VERSION.contains("a")) { //if it is not an alpha version
|
if (!DimDoors.VERSION.contains("a")) { //if it is not an alpha version
|
||||||
Entity entity = event.getEntity();
|
Entity entity = event.getEntity();
|
||||||
if (entity instanceof EntityPlayer) {
|
World world = entity.world;
|
||||||
EntityPlayer player = (EntityPlayer) entity;
|
if (!world.isRemote) {
|
||||||
DimDoors.chat(player, "The default values for the config files fo this non-alpha version of DimDoors have not been sufficiently checked on correctness. Please notify the developer about this IF no newer version of this mod is available.");
|
if (entity instanceof EntityPlayer) {
|
||||||
|
EntityPlayer player = (EntityPlayer) entity;
|
||||||
|
DimDoors.chat(player, "The default values for the config files fo this non-alpha version of DimDoors have not been sufficiently checked on correctness. Please notify the developer about this IF no newer version of this mod is available.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void onPlayerChangedDim(PlayerChangedDimensionEvent event) {
|
||||||
|
EntityPlayer player = event.player;
|
||||||
|
int dimID = event.toDim;
|
||||||
|
World world = player.world;
|
||||||
|
if (!world.isRemote && DimDoorDimensions.isPocketDimensionID(dimID)) {
|
||||||
|
if (player instanceof EntityPlayerMP) {
|
||||||
|
EntityPlayerMP playerMP = (EntityPlayerMP) player;
|
||||||
|
checkPlayerLocationPermission(playerMP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void onEntityEnterChunk(EntityEvent.EnteringChunk event) {
|
||||||
|
Entity entity = event.getEntity();
|
||||||
|
if (entity instanceof EntityPlayerMP) {
|
||||||
|
World world = entity.world;
|
||||||
|
if (!world.isRemote && DimDoorDimensions.isPocketDimensionID(world.provider.getDimension())) {
|
||||||
|
EntityPlayerMP player = (EntityPlayerMP) entity;
|
||||||
|
checkPlayerLocationPermission(player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param player the player entity to check for permissions
|
||||||
|
* @pre {@code (entity instanceof EntityPlayerMP)}
|
||||||
|
*/
|
||||||
|
private void checkPlayerLocationPermission(EntityPlayerMP player) {
|
||||||
|
if (!player.isDead && !(player.getPosition().getY() < 1)) {
|
||||||
|
Location location = Location.getLocation(player);
|
||||||
|
DimDoors.log(this.getClass(), "A player just entered a new chunk in a DimDoors dimension.");
|
||||||
|
if (!PocketRegistry.INSTANCE.isPlayerAllowedToBeHere(player, location)) {
|
||||||
|
//@todo this doesn't really work yet.
|
||||||
|
//DimDoors.chat(player, "You are not supposed to be here. In future version of this mod, you will be teleported to Limbo if you go here.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ public class Pocket {
|
||||||
private final int x; //pocket-relative 0 coordinate, should be at x * PocketRegistry.INSTANCE.gridSize * 16
|
private final int x; //pocket-relative 0 coordinate, should be at x * PocketRegistry.INSTANCE.gridSize * 16
|
||||||
private final int z; //pocket-relative 0 coordinate, should be at z * PocketRegistry.INSTANCE.gridSize * 16
|
private final int z; //pocket-relative 0 coordinate, should be at z * PocketRegistry.INSTANCE.gridSize * 16
|
||||||
private final List<String> playerUUIDs;
|
private final List<String> playerUUIDs;
|
||||||
private final List<Integer> riftIDs;
|
private final List<Integer> riftIDs; //@todo these aren't being used after the entrance door has been paired, I believe
|
||||||
private final Location depthZeroLocation;
|
private final Location depthZeroLocation;
|
||||||
//when adding any new variables, don't forget to add them to the write and load functions
|
//when adding any new variables, don't forget to add them to the write and load functions
|
||||||
|
|
||||||
|
@ -158,6 +158,13 @@ public class Pocket {
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the depth
|
||||||
|
*/
|
||||||
|
public int getDepth() {
|
||||||
|
return depth;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the depthZeroLocation
|
* @return the depthZeroLocation
|
||||||
*/
|
*/
|
||||||
|
@ -165,6 +172,10 @@ public class Pocket {
|
||||||
return depthZeroLocation;
|
return depthZeroLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addRiftID(int id) {
|
||||||
|
riftIDs.add(id);
|
||||||
|
}
|
||||||
|
|
||||||
public void validatePlayerEntry(EntityPlayer player) {
|
public void validatePlayerEntry(EntityPlayer player) {
|
||||||
String playerUUID = player.getCachedUniqueIdString();
|
String playerUUID = player.getCachedUniqueIdString();
|
||||||
if (!playerUUIDs.contains(playerUUID)) { //the 'contains' method uses the 'equals' method to check, so for Strings, this should work.
|
if (!playerUUIDs.contains(playerUUID)) { //the 'contains' method uses the 'equals' method to check, so for Strings, this should work.
|
||||||
|
|
|
@ -316,7 +316,7 @@ public class PocketRegistry {
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
private int getPocketIDFromCoords(Location location) {
|
public int getPocketIDFromCoords(Location location) {
|
||||||
final int dimID = location.getDimensionID();
|
final int dimID = location.getDimensionID();
|
||||||
if (DimDoorDimensions.isPocketDimensionID(dimID)) {
|
if (DimDoorDimensions.isPocketDimensionID(dimID)) {
|
||||||
int x = location.getPos().getX();
|
int x = location.getPos().getX();
|
||||||
|
|
|
@ -79,7 +79,8 @@ public abstract class BlockDimDoorBase extends BlockDoor implements IDimDoor, IT
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isDoorOnRift(World world, BlockPos pos) {
|
@Override
|
||||||
|
public boolean isDoorOnRift(World world, BlockPos pos) { //@todo what does this even mean?
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ import com.zixiken.dimdoors.shared.*;
|
||||||
import com.zixiken.dimdoors.shared.tileentities.TileEntityDimDoor;
|
import com.zixiken.dimdoors.shared.tileentities.TileEntityDimDoor;
|
||||||
import com.zixiken.dimdoors.shared.util.DDStringUtils;
|
import com.zixiken.dimdoors.shared.util.DDStringUtils;
|
||||||
import com.zixiken.dimdoors.shared.util.Location;
|
import com.zixiken.dimdoors.shared.util.Location;
|
||||||
|
import com.zixiken.dimdoors.shared.world.DimDoorDimensions;
|
||||||
import net.minecraft.command.CommandBase;
|
import net.minecraft.command.CommandBase;
|
||||||
import net.minecraft.command.CommandException;
|
import net.minecraft.command.CommandException;
|
||||||
import net.minecraft.command.ICommandSender;
|
import net.minecraft.command.ICommandSender;
|
||||||
|
@ -52,10 +53,18 @@ public class PocketCommand extends CommandBase {
|
||||||
|
|
||||||
BlockPos pos = player.getPosition();
|
BlockPos pos = player.getPosition();
|
||||||
World world = player.world;
|
World world = player.world;
|
||||||
Location playerLoc = new Location(world, pos);
|
Location origLoc = new Location(world, pos);
|
||||||
|
|
||||||
|
int dimID = origLoc.getDimensionID();
|
||||||
|
if (DimDoorDimensions.isPocketDimensionID(dimID)) {
|
||||||
|
int pocketID = PocketRegistry.INSTANCE.getPocketIDFromCoords(origLoc);
|
||||||
|
EnumPocketType type = DimDoorDimensions.getPocketType(dimID);
|
||||||
|
Pocket oldPocket = PocketRegistry.INSTANCE.getPocket(pocketID, type);
|
||||||
|
origLoc = oldPocket.getDepthZeroLocation();
|
||||||
|
}
|
||||||
|
|
||||||
PocketTemplate template = SchematicHandler.INSTANCE.getDungeonTemplate(args[0], args[1]);
|
PocketTemplate template = SchematicHandler.INSTANCE.getDungeonTemplate(args[0], args[1]);
|
||||||
Pocket pocket = PocketRegistry.INSTANCE.generatePocketAt(EnumPocketType.DUNGEON, 1, playerLoc, template);
|
Pocket pocket = PocketRegistry.INSTANCE.generatePocketAt(EnumPocketType.DUNGEON, 1, origLoc, template);
|
||||||
int entranceDoorID = pocket.getEntranceDoorID();
|
int entranceDoorID = pocket.getEntranceDoorID();
|
||||||
RiftRegistry.INSTANCE.setLastGeneratedEntranceDoorID(entranceDoorID);
|
RiftRegistry.INSTANCE.setLastGeneratedEntranceDoorID(entranceDoorID);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package com.zixiken.dimdoors.shared.tileentities;
|
||||||
import com.zixiken.dimdoors.DimDoors;
|
import com.zixiken.dimdoors.DimDoors;
|
||||||
import com.zixiken.dimdoors.shared.DDConfig;
|
import com.zixiken.dimdoors.shared.DDConfig;
|
||||||
import com.zixiken.dimdoors.shared.EnumPocketType;
|
import com.zixiken.dimdoors.shared.EnumPocketType;
|
||||||
|
import com.zixiken.dimdoors.shared.Pocket;
|
||||||
import com.zixiken.dimdoors.shared.PocketRegistry;
|
import com.zixiken.dimdoors.shared.PocketRegistry;
|
||||||
import com.zixiken.dimdoors.shared.blocks.BlockDimDoor;
|
import com.zixiken.dimdoors.shared.blocks.BlockDimDoor;
|
||||||
import com.zixiken.dimdoors.shared.util.Location;
|
import com.zixiken.dimdoors.shared.util.Location;
|
||||||
|
@ -90,26 +91,42 @@ public class TileEntityDimDoor extends DDTileEntityBase {
|
||||||
//load data from old rift (that must already have been registered)
|
//load data from old rift (that must already have been registered)
|
||||||
loadDataFrom(oldRift);
|
loadDataFrom(oldRift);
|
||||||
} else {
|
} else {
|
||||||
|
Location locationOfThisRift = new Location(world, pos);
|
||||||
|
pocketID = PocketRegistry.INSTANCE.getPocketIDFromCoords(locationOfThisRift);
|
||||||
|
|
||||||
|
if (pocketID >= 0) {
|
||||||
|
isInPocket = true;
|
||||||
|
pocketType = DimDoorDimensions.getPocketType(locationOfThisRift.getDimensionID());
|
||||||
|
Pocket pocket = PocketRegistry.INSTANCE.getPocket(pocketID, pocketType);
|
||||||
|
depth = pocket.getDepth();
|
||||||
|
}
|
||||||
//default data and set register this rift in the registry
|
//default data and set register this rift in the registry
|
||||||
register(0); //@todo check if it's in a pocket and register it at that depth instead if applicable
|
register(depth); //depth is 0 by default; registration sets this rift's riftID
|
||||||
|
|
||||||
|
if (pocketID >= 0) {
|
||||||
|
Pocket pocket = PocketRegistry.INSTANCE.getPocket(pocketID, pocketType);
|
||||||
|
pocket.addRiftID(riftID); //@todo not used yet?
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//storing the orientation inside the tile-entity, because that thing can actually save the orientation in the worldsave, unlike the block itself, which fail at that stuff somehow
|
//storing the orientation inside the tile-entity, because that thing can actually save the orientation in the worldsave, unlike the block itself, which fail at that stuff somehow
|
||||||
this.orientation = this.getWorld().getBlockState(this.getPos()).getValue(BlockDimDoor.FACING).getOpposite();
|
this.orientation = this.getWorld().getBlockState(this.getPos()).getValue(BlockDimDoor.FACING).getOpposite(); //@todo since this is used to determine the render of the "portal, this gets reset to the "wrong" side every time the door gets updated
|
||||||
}
|
}
|
||||||
|
|
||||||
protected int getNewTeleportDestination() {
|
protected int getNewTeleportDestination() {
|
||||||
int otherRiftID;
|
int otherRiftID;
|
||||||
Location locationOfThisRift = RiftRegistry.INSTANCE.getRiftLocation(this.riftID); //returns null if this rift isn't registered
|
Location locationOfThisRift = RiftRegistry.INSTANCE.getRiftLocation(this.riftID); //returns null if this rift isn't registered
|
||||||
if (locationOfThisRift.getDimensionID() == DimDoorDimensions.getPocketDimensionType(EnumPocketType.DUNGEON).getId()) { //if this dimdoor is a pocket Dungeon
|
|
||||||
|
if (this.isInPocket && this.pocketType ==EnumPocketType.DUNGEON) {
|
||||||
|
Location origLocation = PocketRegistry.INSTANCE.getPocket(pocketID, pocketType).getDepthZeroLocation();
|
||||||
//choose between generating a new pocket or connecting to another door on a similar or close depth
|
//choose between generating a new pocket or connecting to another door on a similar or close depth
|
||||||
if (DDRandomUtils.weightedBoolean(20, 80)) { //@todo make this configurable
|
if (DDRandomUtils.weightedBoolean(20, 80)) { //@todo make this configurable
|
||||||
otherRiftID = RiftRegistry.INSTANCE.getRandomUnpairedRiftIDAroundDepth(getRiftID(), depth);
|
otherRiftID = RiftRegistry.INSTANCE.getRandomUnpairedRiftIDAroundDepth(getRiftID(), depth);
|
||||||
if (otherRiftID < 0) { //ergo: no other rift can be found
|
if (otherRiftID < 0) { //ergo: no other rift can be found
|
||||||
//@todo, this should rarely happen. Put in an easter egg?
|
//@todo, this should rarely happen. Put in an easter egg?
|
||||||
otherRiftID = PocketRegistry.INSTANCE.getEntranceDoorIDOfNewPocket(EnumPocketType.DUNGEON, getRandomlyTransFormedDepth(), locationOfThisRift);
|
otherRiftID = PocketRegistry.INSTANCE.getEntranceDoorIDOfNewPocket(EnumPocketType.DUNGEON, getRandomlyTransFormedDepth(), origLocation);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
otherRiftID = PocketRegistry.INSTANCE.getEntranceDoorIDOfNewPocket(EnumPocketType.DUNGEON, getRandomlyTransFormedDepth(), locationOfThisRift);
|
otherRiftID = PocketRegistry.INSTANCE.getEntranceDoorIDOfNewPocket(EnumPocketType.DUNGEON, getRandomlyTransFormedDepth(), origLocation);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
otherRiftID = PocketRegistry.INSTANCE.getEntranceDoorIDOfNewPocket(EnumPocketType.PUBLIC, 0, locationOfThisRift); //@todo should this depth be 1 instead?
|
otherRiftID = PocketRegistry.INSTANCE.getEntranceDoorIDOfNewPocket(EnumPocketType.PUBLIC, 0, locationOfThisRift); //@todo should this depth be 1 instead?
|
||||||
|
|
|
@ -6,6 +6,7 @@ import com.zixiken.dimdoors.shared.IChunkLoader;
|
||||||
import com.zixiken.dimdoors.shared.PocketRegistry;
|
import com.zixiken.dimdoors.shared.PocketRegistry;
|
||||||
import com.zixiken.dimdoors.shared.RiftRegistry;
|
import com.zixiken.dimdoors.shared.RiftRegistry;
|
||||||
import com.zixiken.dimdoors.shared.util.Location;
|
import com.zixiken.dimdoors.shared.util.Location;
|
||||||
|
import com.zixiken.dimdoors.shared.world.DimDoorDimensions;
|
||||||
import net.minecraftforge.common.ForgeChunkManager;
|
import net.minecraftforge.common.ForgeChunkManager;
|
||||||
import net.minecraftforge.common.ForgeChunkManager.Ticket;
|
import net.minecraftforge.common.ForgeChunkManager.Ticket;
|
||||||
|
|
||||||
|
@ -68,8 +69,11 @@ public class TileEntityDimDoorGold extends TileEntityDimDoor implements IChunkLo
|
||||||
//DimDoors.log(this.getClass(), "Trying to find suitable destination rift.");
|
//DimDoors.log(this.getClass(), "Trying to find suitable destination rift.");
|
||||||
int otherRiftID = RiftRegistry.INSTANCE.getRandomUnpairedRiftIDAtDepth(getRiftID(), depth);
|
int otherRiftID = RiftRegistry.INSTANCE.getRandomUnpairedRiftIDAtDepth(getRiftID(), depth);
|
||||||
if (otherRiftID < 0) {
|
if (otherRiftID < 0) {
|
||||||
Location locationOfThisRift = RiftRegistry.INSTANCE.getRiftLocation(this.riftID);
|
Location origLocation = RiftRegistry.INSTANCE.getRiftLocation(this.riftID);
|
||||||
otherRiftID = PocketRegistry.INSTANCE.getEntranceDoorIDOfNewPocket(EnumPocketType.DUNGEON, getRandomlyTransFormedDepth(), locationOfThisRift);
|
if (origLocation.getDimensionID() == DimDoorDimensions.getPocketDimensionType(EnumPocketType.DUNGEON).getId()) { //if this dimdoor is a pocket Dungeon
|
||||||
|
origLocation = PocketRegistry.INSTANCE.getPocket(pocketID, pocketType).getDepthZeroLocation();
|
||||||
|
}
|
||||||
|
otherRiftID = PocketRegistry.INSTANCE.getEntranceDoorIDOfNewPocket(EnumPocketType.DUNGEON, getRandomlyTransFormedDepth(), origLocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (otherRiftID < 0) {
|
if (otherRiftID < 0) {
|
||||||
|
|
|
@ -4,6 +4,7 @@ import com.zixiken.dimdoors.DimDoors;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
@ -56,11 +57,16 @@ public class Location implements Serializable {
|
||||||
return dimensionID;
|
return dimensionID;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Location getLocation(TileEntity tileEntity) {//@todo Location is not yet comparable, so a Location begotten by this method, can not be used to find a rift ID in the RiftRegistry
|
public static Location getLocation(TileEntity tileEntity) {
|
||||||
World world = tileEntity.getWorld();
|
World world = tileEntity.getWorld();
|
||||||
int dimID = world.provider.getDimension();
|
|
||||||
BlockPos blockPos = tileEntity.getPos();
|
BlockPos blockPos = tileEntity.getPos();
|
||||||
return new Location(dimID, blockPos);
|
return new Location(world, blockPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Location getLocation(Entity entity) {
|
||||||
|
World world = entity.world;
|
||||||
|
BlockPos blockPos = entity.getPosition();
|
||||||
|
return new Location(world, blockPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static NBTTagCompound writeToNBT(Location location) {
|
public static NBTTagCompound writeToNBT(Location location) {
|
||||||
|
|
Loading…
Reference in a new issue