Rewrite #79

Merged
StevenRS11 merged 14 commits from rewrite into DevBranch 2013-09-02 02:17:17 +00:00
12 changed files with 239 additions and 293 deletions
Showing only changes of commit 4086e75ead - Show all commits

View File

@@ -56,7 +56,7 @@ public class DDProperties
* Crafting Flags * Crafting Flags
*/ */
public final boolean CraftingDimensionaDoorAllowed; public final boolean CraftingDimensionalDoorAllowed;
public final boolean CraftingWarpDoorAllowed; public final boolean CraftingWarpDoorAllowed;
public final boolean CraftingRiftSignatureAllowed; public final boolean CraftingRiftSignatureAllowed;
public final boolean CraftingRiftRemoverAllowed; public final boolean CraftingRiftRemoverAllowed;
@@ -129,7 +129,7 @@ public class DDProperties
Configuration config = new Configuration(configFile); Configuration config = new Configuration(configFile);
config.load(); config.load();
CraftingDimensionaDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Dimensional Door", true).getBoolean(true); CraftingDimensionalDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Dimensional Door", true).getBoolean(true);
CraftingWarpDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Warp Door", true).getBoolean(true); CraftingWarpDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Warp Door", true).getBoolean(true);
CraftingUnstableDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Unstable Door", true).getBoolean(true); CraftingUnstableDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Unstable Door", true).getBoolean(true);
CraftingTransTrapdoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Transdimensional Trapdoor", true).getBoolean(true); CraftingTransTrapdoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Transdimensional Trapdoor", true).getBoolean(true);

View File

@@ -1,7 +1,7 @@
package StevenDimDoors.mod_pocketDim; package StevenDimDoors.mod_pocketDim;
import cpw.mods.fml.common.registry.GameRegistry; import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityList;
import net.minecraft.entity.item.EntityMinecart; import net.minecraft.entity.item.EntityMinecart;
@@ -19,36 +19,27 @@ import net.minecraftforge.common.DimensionManager;
import StevenDimDoors.mod_pocketDim.core.IDimLink; import StevenDimDoors.mod_pocketDim.core.IDimLink;
import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.core.PocketManager;
import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.util.Point4D;
import StevenDimDoors.mod_pocketDim.world.PocketBuilder;
import cpw.mods.fml.common.registry.GameRegistry;
public class DDTeleporter public class DDTeleporter
{ {
private static final Random random = new Random();
public static int cooldown = 0;
private DDTeleporter() { } private DDTeleporter() { }
/** private static void placeInPortal(Entity entity, WorldServer world, Point4D destination, DDProperties properties)
* Create a new portal near an entity.
*/
public static void placeInPortal(Entity par1Entity, WorldServer world, IDimLink link)
{ {
Point4D destination = link.destination();
int x = destination.getX(); int x = destination.getX();
int y = destination.getY(); int y = destination.getY();
int z = destination.getZ(); int z = destination.getZ();
//TODO Temporary workaround for mismatched door/rift metadata cases. Gives priority to the door. int orientation = getDestinationOrientation(destination, properties);
int orientation = PocketManager.getDestinationOrientation(link);
int receivingDoorMeta = world.getBlockMetadata(x, y - 1, z);
int receivingDoorID = world.getBlockId(x, y, z);
if (receivingDoorMeta != orientation)
{
if (receivingDoorID == mod_pocketDim.dimDoor.blockID || receivingDoorID == mod_pocketDim.ExitDoor.blockID)
{
orientation = receivingDoorMeta;
}
}
if (par1Entity instanceof EntityPlayer) if (entity instanceof EntityPlayer)
{ {
EntityPlayer player = (EntityPlayer) par1Entity; EntityPlayer player = (EntityPlayer) entity;
player.rotationYaw=(orientation*90)+90; player.rotationYaw=(orientation*90)+90;
if(orientation==2||orientation==6) if(orientation==2||orientation==6)
{ {
@@ -71,65 +62,65 @@ public class DDTeleporter
player.setPositionAndUpdate(x, y-1, z); player.setPositionAndUpdate(x, y-1, z);
} }
} }
else if (par1Entity instanceof EntityMinecart) else if (entity instanceof EntityMinecart)
{ {
par1Entity.motionX=0; entity.motionX=0;
par1Entity.motionZ=0; entity.motionZ=0;
par1Entity.motionY=0; entity.motionY=0;
par1Entity.rotationYaw=(orientation*90)+90; entity.rotationYaw=(orientation*90)+90;
if(orientation==2||orientation==6) if(orientation==2||orientation==6)
{ {
DDTeleporter.setEntityPosition(par1Entity, x+1.5, y, z+.5 ); DDTeleporter.setEntityPosition(entity, x+1.5, y, z+.5 );
par1Entity.motionX =.39; entity.motionX =.39;
par1Entity.worldObj.updateEntityWithOptionalForce(par1Entity, false); entity.worldObj.updateEntityWithOptionalForce(entity, false);
} }
else if(orientation==3||orientation==7) else if(orientation==3||orientation==7)
{ {
DDTeleporter.setEntityPosition(par1Entity, x+.5, y, z+1.5 ); DDTeleporter.setEntityPosition(entity, x+.5, y, z+1.5 );
par1Entity.motionZ =.39; entity.motionZ =.39;
par1Entity.worldObj.updateEntityWithOptionalForce(par1Entity, false); entity.worldObj.updateEntityWithOptionalForce(entity, false);
} }
else if(orientation==0||orientation==4) else if(orientation==0||orientation==4)
{ {
DDTeleporter.setEntityPosition(par1Entity,x-.5, y, z+.5); DDTeleporter.setEntityPosition(entity,x-.5, y, z+.5);
par1Entity.motionX =-.39; entity.motionX =-.39;
par1Entity.worldObj.updateEntityWithOptionalForce(par1Entity, false); entity.worldObj.updateEntityWithOptionalForce(entity, false);
} }
else if(orientation==1||orientation==5) else if(orientation==1||orientation==5)
{ {
DDTeleporter.setEntityPosition(par1Entity,x+.5, y, z-.5); DDTeleporter.setEntityPosition(entity,x+.5, y, z-.5);
par1Entity.motionZ =-.39; entity.motionZ =-.39;
par1Entity.worldObj.updateEntityWithOptionalForce(par1Entity, false); entity.worldObj.updateEntityWithOptionalForce(entity, false);
} }
else else
{ {
DDTeleporter.setEntityPosition(par1Entity,x, y, z); DDTeleporter.setEntityPosition(entity,x, y, z);
} }
} }
else if (par1Entity instanceof Entity) else if (entity instanceof Entity)
{ {
par1Entity.rotationYaw=(orientation*90)+90; entity.rotationYaw=(orientation*90)+90;
if(orientation==2||orientation==6) if(orientation==2||orientation==6)
{ {
DDTeleporter.setEntityPosition(par1Entity, x+1.5, y, z+.5 ); DDTeleporter.setEntityPosition(entity, x+1.5, y, z+.5 );
} }
else if(orientation==3||orientation==7) else if(orientation==3||orientation==7)
{ {
DDTeleporter.setEntityPosition(par1Entity, x+.5, y, z+1.5 ); DDTeleporter.setEntityPosition(entity, x+.5, y, z+1.5 );
} }
else if(orientation==0||orientation==4) else if(orientation==0||orientation==4)
{ {
DDTeleporter.setEntityPosition(par1Entity,x-.5, y, z+.5); DDTeleporter.setEntityPosition(entity,x-.5, y, z+.5);
} }
else if(orientation==1||orientation==5) else if(orientation==1||orientation==5)
{ {
DDTeleporter.setEntityPosition(par1Entity,x+.5, y, z-.5); DDTeleporter.setEntityPosition(entity,x+.5, y, z-.5);
} }
else else
{ {
DDTeleporter.setEntityPosition(par1Entity,x, y, z); DDTeleporter.setEntityPosition(entity,x, y, z);
} }
} }
} }
@@ -142,18 +133,49 @@ public class DDTeleporter
entity.setPosition(x, y, z); entity.setPosition(x, y, z);
} }
public static Entity teleportEntity(World world, Entity entity, IDimLink link) private static int getDestinationOrientation(Point4D door, DDProperties properties)
{ {
World world = DimensionManager.getWorld(door.getDimension());
if (world == null)
{
throw new IllegalStateException("The destination world should be loaded!");
}
//Check if the block at that point is actually a door
int blockID = world.getBlockId(door.getX(), door.getY(), door.getZ());
if (blockID != properties.DimensionalDoorID && blockID != properties.WarpDoorID &&
blockID != properties.TransientDoorID && blockID != properties.UnstableDoorID)
{
//Return the pocket's orientation instead
return PocketManager.getDimensionData(door.getDimension()).orientation();
}
//Return the orientation portion of its metadata
return world.getBlockMetadata(door.getX(), door.getY(), door.getZ()) & 3;
}
public static Entity teleportEntity(Entity entity, Point4D destination)
{
if (entity == null)
{
throw new IllegalArgumentException("entity cannot be null.");
}
if (destination == null)
{
throw new IllegalArgumentException("destination cannot be null.");
}
//This beautiful teleport method is based off of xCompWiz's teleport function. //This beautiful teleport method is based off of xCompWiz's teleport function.
WorldServer oldWorld = (WorldServer)world; WorldServer oldWorld = (WorldServer) entity.worldObj;
WorldServer newWorld; WorldServer newWorld;
EntityPlayerMP player = (entity instanceof EntityPlayerMP) ? (EntityPlayerMP)entity : null; EntityPlayerMP player = (entity instanceof EntityPlayerMP) ? (EntityPlayerMP) entity : null;
DDProperties properties = DDProperties.instance();
// Is something riding? Handle it first. // Is something riding? Handle it first.
if(entity.riddenByEntity != null) if (entity.riddenByEntity != null)
{ {
return teleportEntity(oldWorld, entity.riddenByEntity, link); return teleportEntity(entity.riddenByEntity, destination);
} }
// Are we riding something? Dismount and tell the mount to go first. // Are we riding something? Dismount and tell the mount to go first.
@@ -161,22 +183,21 @@ public class DDTeleporter
if (cart != null) if (cart != null)
{ {
entity.mountEntity(null); entity.mountEntity(null);
cart = teleportEntity(oldWorld, cart, link); cart = teleportEntity(cart, destination);
// We keep track of both so we can remount them on the other side. // We keep track of both so we can remount them on the other side.
} }
// Destination doesn't exist? We need to make it. // Determine if our destination is in another realm.
if (DimensionManager.getWorld(link.destination().getDimension()) == null) boolean difDest = entity.dimension == destination.getDimension();
{
//FIXME: I think this is where I need to add initialization code for pockets!!! REALLY IMPORTANT!!!
DimensionManager.initDimension(link.destination().getDimension());
}
// Determine if our destination's in another realm.
boolean difDest = link.source().getDimension() != link.destination().getDimension();
if (difDest) if (difDest)
{ {
newWorld = DimensionManager.getWorld(link.destination().getDimension()); // Destination isn't loaded? Then we need to load it.
newWorld = DimensionManager.getWorld(destination.getDimension());
if (newWorld == null)
{
DimensionManager.initDimension(destination.getDimension());
}
newWorld = DimensionManager.getWorld(destination.getDimension());
} }
else else
{ {
@@ -185,7 +206,7 @@ public class DDTeleporter
// GreyMaria: What is this even accomplishing? We're doing the exact same thing at the end of this all. // GreyMaria: What is this even accomplishing? We're doing the exact same thing at the end of this all.
// TODO Check to see if this is actually vital. // TODO Check to see if this is actually vital.
DDTeleporter.placeInPortal(entity, newWorld, link); DDTeleporter.placeInPortal(entity, newWorld, destination, properties);
if (difDest) // Are we moving our target to a new dimension? if (difDest) // Are we moving our target to a new dimension?
{ {
@@ -194,7 +215,7 @@ public class DDTeleporter
// We need to do all this special stuff to move a player between dimensions. // We need to do all this special stuff to move a player between dimensions.
// Set the new dimension and inform the client that it's moving to a new world. // Set the new dimension and inform the client that it's moving to a new world.
player.dimension = link.destination().getDimension(); player.dimension = destination.getDimension();
player.playerNetServerHandler.sendPacketToPlayer(new Packet9Respawn(player.dimension, (byte)player.worldObj.difficultySetting, newWorld.getWorldInfo().getTerrainType(), newWorld.getHeight(), player.theItemInWorldManager.getGameType())); player.playerNetServerHandler.sendPacketToPlayer(new Packet9Respawn(player.dimension, (byte)player.worldObj.difficultySetting, newWorld.getWorldInfo().getTerrainType(), newWorld.getHeight(), player.theItemInWorldManager.getGameType()));
// GreyMaria: Used the safe player entity remover before. // GreyMaria: Used the safe player entity remover before.
@@ -203,7 +224,7 @@ public class DDTeleporter
// for a pocket dimension, causing all sleeping players // for a pocket dimension, causing all sleeping players
// to remain asleep instead of progressing to day. // to remain asleep instead of progressing to day.
oldWorld.removePlayerEntityDangerously(player); oldWorld.removePlayerEntityDangerously(player);
player.isDead=false; player.isDead = false;
// Creates sanity by ensuring that we're only known to exist where we're supposed to be known to exist. // Creates sanity by ensuring that we're only known to exist where we're supposed to be known to exist.
oldWorld.getPlayerManager().removePlayer(player); oldWorld.getPlayerManager().removePlayer(player);
@@ -243,7 +264,8 @@ public class DDTeleporter
entity = EntityList.createEntityFromNBT(entityNBT, newWorld); entity = EntityList.createEntityFromNBT(entityNBT, newWorld);
if (entity == null) if (entity == null)
{ // TODO FIXME IMPLEMENT NULL CHECKS THAT ACTUALLY DO SOMETHING. {
// TODO FIXME IMPLEMENT NULL CHECKS THAT ACTUALLY DO SOMETHING.
/* /*
* shit ourselves in an organized fashion, preferably * shit ourselves in an organized fashion, preferably
* in a neat pile instead of all over our users' games * in a neat pile instead of all over our users' games
@@ -270,107 +292,84 @@ public class DDTeleporter
} }
// Did we teleport a player? Load the chunk for them. // Did we teleport a player? Load the chunk for them.
if(player != null) if (player != null)
{ {
WorldServer.class.cast(newWorld).getChunkProvider().loadChunk(MathHelper.floor_double(entity.posX) >> 4, MathHelper.floor_double(entity.posZ) >> 4); newWorld.getChunkProvider().loadChunk(MathHelper.floor_double(entity.posX) >> 4, MathHelper.floor_double(entity.posZ) >> 4);
// Tell Forge we're moving its players so everyone else knows. // Tell Forge we're moving its players so everyone else knows.
// Let's try doing this down here in case this is what's killing NEI. // Let's try doing this down here in case this is what's killing NEI.
GameRegistry.onPlayerChangedDimension((EntityPlayer)entity); GameRegistry.onPlayerChangedDimension((EntityPlayer)entity);
} }
DDTeleporter.placeInPortal(entity, newWorld, link); DDTeleporter.placeInPortal(entity, newWorld, destination, properties);
return entity; return entity;
} }
/** /**
* Primary function used to teleport the player using doors. Performs numerous null checks, and also generates the destination door/pocket if it has not done so already. * Primary function used to teleport the player using doors. Performs numerous null checks, and also generates the destination door/pocket if it has not done so already.
* Also ensures correct orientation relative to the door using DDTeleporter. * Also ensures correct orientation relative to the door.
* @param world- world the player is currently in * @param world - world the player is currently in
* @param linkData- the link the player is using to teleport, sends the player to its dest information. * @param link - the link the player is using to teleport; sends the player to its destination
* @param player- the instance of the player to be teleported * @param player - the instance of the player to be teleported
* @param orientation- the orientation of the door used to teleport, determines player orientation and door placement on arrival
* @Return
*/ */
public static void traverseDimDoor(World world, IDimLink linkData, Entity entity) public static void traverseDimDoor(World world, IDimLink link, Entity entity)
{ {
DDProperties properties = DDProperties.instance(); if (world == null)
{
throw new IllegalArgumentException("world cannot be null.");
}
if (link == null)
{
throw new IllegalArgumentException("link cannot be null.");
}
if (entity == null)
{
throw new IllegalArgumentException("entity cannot be null.");
}
if (world.isRemote) if (world.isRemote)
{ {
return; return;
} }
if (linkData != null)
if (cooldown == 0 || entity instanceof EntityPlayer)
{ {
int destinationID = link.destination().getDimension(); cooldown = 2 + random.nextInt(2);
}
if(PocketManager.dimList.containsKey(destinationID) && PocketManager.dimList.containsKey(world.provider.dimensionId)) else
{ {
this.generatePocket(linkData); return;
}
if(mod_pocketDim.teleTimer==0||entity instanceof EntityPlayer)
{ if (!initializeDestination(link, DDProperties.instance()))
mod_pocketDim.teleTimer=2+rand.nextInt(2); {
} return;
else }
{
return; entity = teleportEntity(entity, link.destination());
} entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F);
if(!world.isRemote) }
{
entity = this.teleportEntity(world, entity, linkData); private static boolean initializeDestination(IDimLink link, DDProperties properties)
} {
entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); //FIXME: Change this later to support rooms that have been wiped and must be regenerated.
if (link.hasDestination())
int playerXCoord=MathHelper.floor_double(entity.posX); {
int playerYCoord=MathHelper.floor_double(entity.posY); return true;
int playerZCoord=MathHelper.floor_double(entity.posZ); }
if(!entity.worldObj.isBlockOpaqueCube(playerXCoord, playerYCoord-1,playerZCoord )&&PocketManager.instance.getDimData(linkData.locDimID).isDimRandomRift&&!linkData.hasGennedDoor) //Check the destination type and respond accordingly
{ //FIXME: Add missing link types.
for(int count=0;count<20;count++) //FIXME: Add code for restoring the destination-side door.
{ switch (link.linkType())
if(!entity.worldObj.isAirBlock(playerXCoord, playerYCoord-2-count,playerZCoord)) {
{ case IDimLink.TYPE_DUNGEON:
if(Block.blocksList[entity.worldObj.getBlockId(playerXCoord, playerYCoord-2-count,playerZCoord)].blockMaterial.isLiquid()) return PocketBuilder.generateNewDungeonPocket(link, properties);
{ case IDimLink.TYPE_POCKET:
entity.worldObj.setBlock(playerXCoord, playerYCoord-1, playerZCoord, properties.FabricBlockID); return PocketBuilder.generateNewPocket(link, properties);
break; case IDimLink.TYPE_NORMAL:
} return true;
} default:
throw new IllegalArgumentException("link has an unrecognized link type.");
if(entity.worldObj.isBlockOpaqueCube(playerXCoord, playerYCoord-1-count,playerZCoord))
{
break;
}
if(count==19)
{
entity.worldObj.setBlock(playerXCoord, playerYCoord-1, playerZCoord, properties.FabricBlockID);
}
}
}
this.generateDoor(world,linkData);
if(!entity.worldObj.isAirBlock(playerXCoord,playerYCoord+1,playerZCoord))
{
if(Block.blocksList[entity.worldObj.getBlockId(playerXCoord,playerYCoord+1,playerZCoord)].isOpaqueCube() &&
!mod_pocketDim.blockRift.isBlockImmune(entity.worldObj, playerXCoord+1,playerYCoord,playerZCoord))
{
entity.worldObj.setBlock(playerXCoord,playerYCoord+1,playerZCoord,0);
}
}
if (!entity.worldObj.isAirBlock(playerXCoord,playerYCoord,playerZCoord))
{
if(Block.blocksList[entity.worldObj.getBlockId(playerXCoord,playerYCoord,playerZCoord)].isOpaqueCube() &&
!mod_pocketDim.blockRift.isBlockImmune(entity.worldObj, playerXCoord,playerYCoord,playerZCoord))
{
entity.worldObj.setBlock(playerXCoord,playerYCoord,playerZCoord,0);
}
}
}
} }
return;
} }
} }

View File

@@ -12,12 +12,11 @@ import cpw.mods.fml.relauncher.SideOnly;
public class EventHookContainer public class EventHookContainer
{ {
private static DDProperties properties = null; private final DDProperties properties;
public EventHookContainer() public EventHookContainer(DDProperties properties)
{ {
if (properties == null) this.properties = properties;
properties = DDProperties.instance();
} }
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
@@ -56,7 +55,7 @@ public class EventHookContainer
@ForgeSubscribe @ForgeSubscribe
public void onWorldsave(WorldEvent.Save event) public void onWorldsave(WorldEvent.Save event)
{ {
if (PocketManager.isInitialized() && event.world.provider.dimensionId == 0) if (event.world.provider.dimensionId == 0)
{ {
PocketManager.save(); PocketManager.save();
} }

View File

@@ -10,6 +10,7 @@ import java.util.HashSet;
import net.minecraft.network.INetworkManager; import net.minecraft.network.INetworkManager;
import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.network.packet.Packet250CustomPayload;
import StevenDimDoors.mod_pocketDim.core.IDimLink;
import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.NewDimData;
import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.core.PocketManager;
@@ -23,11 +24,9 @@ import cpw.mods.fml.common.network.Player;
public class PacketHandler implements IPacketHandler public class PacketHandler implements IPacketHandler
{ {
public static byte DIM_UPDATE_PACKET_ID = 1; public static byte DIM_UPDATE_PACKET_ID = 1;
public static byte REGISTER_DIM_PACKET_ID = 3; public static byte REGISTER_DIM_PACKET_ID = 2;
public static byte REGISTER_LINK_PACKET_ID = 4; public static byte REGISTER_LINK_PACKET_ID = 3;
public static byte REMOVE_LINK_PACKET_ID = 5; public static byte REMOVE_LINK_PACKET_ID = 4;
public static byte DIM_PACKET_ID = 6;
public static byte LINK_KEY_PACKET_ID = 7;
@Override @Override
public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player)
@@ -71,7 +70,7 @@ public class PacketHandler implements IPacketHandler
{ {
NewDimData dimDataToAddLink= PocketManager.instance.getDimData(dimId); NewDimData dimDataToAddLink= PocketManager.instance.getDimData(dimId);
ILinkData linkToAdd = new ILinkData(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt()); IDimLink linkToAdd = new IDimLink(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt());
linkToAdd.hasGennedDoor=data.readBoolean(); linkToAdd.hasGennedDoor=data.readBoolean();
PocketManager.instance.createLink(linkToAdd); PocketManager.instance.createLink(linkToAdd);
@@ -90,7 +89,7 @@ public class PacketHandler implements IPacketHandler
{ {
NewDimData dimDataToRemoveFrom= PocketManager.instance.getDimData(dimId); NewDimData dimDataToRemoveFrom= PocketManager.instance.getDimData(dimId);
ILinkData linkToAdd = new ILinkData(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt()); IDimLink linkToAdd = new IDimLink(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt());
dimDataToRemoveFrom.removeLinkAtCoords(linkToAdd.locDimID, linkToAdd.locXCoord,linkToAdd.locYCoord, linkToAdd.locZCoord); dimDataToRemoveFrom.removeLinkAtCoords(linkToAdd.locDimID, linkToAdd.locXCoord,linkToAdd.locYCoord, linkToAdd.locZCoord);
} }
catch (Exception e) catch (Exception e)
@@ -99,11 +98,6 @@ public class PacketHandler implements IPacketHandler
e.printStackTrace(); e.printStackTrace();
} }
} }
else if (id == LINK_KEY_PACKET_ID)
{
ILinkData link = new ILinkData(data.readInt(), data.readInt(), data.readInt(), data.readInt());
dimHelper.PocketManager.interDimLinkList.put(data.readInt(), link);
}
} }
private static void processRegisterDimPacket() private static void processRegisterDimPacket()
@@ -136,16 +130,16 @@ public class PacketHandler implements IPacketHandler
{ {
manager.addToSendQueue(PacketHandler.onDimCreatedPacket(data)); manager.addToSendQueue(PacketHandler.onDimCreatedPacket(data));
Collection <HashMap<Integer, HashMap<Integer, ILinkData>>> linkList = data.linksInThisDim.values(); Collection <HashMap<Integer, HashMap<Integer, IDimLink>>> linkList = data.linksInThisDim.values();
for(HashMap map : linkList ) for(HashMap map : linkList )
{ {
Collection <HashMap<Integer, ILinkData>> linkList2 = map.values(); Collection <HashMap<Integer, IDimLink>> linkList2 = map.values();
for(HashMap map2 : linkList2) for(HashMap map2 : linkList2)
{ {
Collection <ILinkData> linkList3 = map2.values(); Collection <IDimLink> linkList3 = map2.values();
for(ILinkData link : linkList3) for(IDimLink link : linkList3)
{ {
packetsToSend.add(( PacketHandler.onLinkCreatedPacket(link))); packetsToSend.add(( PacketHandler.onLinkCreatedPacket(link)));
} }
@@ -159,7 +153,7 @@ public class PacketHandler implements IPacketHandler
} }
} }
public static void sendLinkCreatedPacket(ILinkData link) public static void sendLinkCreatedPacket(IDimLink link)
{ {
ByteArrayOutputStream bos = new ByteArrayOutputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dataOut = new DataOutputStream(bos); DataOutputStream dataOut = new DataOutputStream(bos);
@@ -193,36 +187,7 @@ public class PacketHandler implements IPacketHandler
return packet; return packet;
} }
public static void sendLinkRemovedPacket(IDimLink link)
public static void sendlinkKeyPacket(ILinkData link, int key)
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dataOut = new DataOutputStream(bos);
try
{
dataOut.writeByte(PacketHandler.linkKeyPacketID);
dataOut.writeInt(link.destDimID);
dataOut.writeInt(link.destXCoord);
dataOut.writeInt(link.destYCoord);
dataOut.writeInt(link.destZCoord);
dataOut.writeInt(key);
}
catch (IOException e)
{
e.printStackTrace();
}
Packet250CustomPayload packet = new Packet250CustomPayload();
packet.channel="DimDoorPackets";
packet.data = bos.toByteArray();
packet.length = bos.size();;
PacketDispatcher.sendPacketToAllPlayers(packet);
}
public static void sendLinkRemovedPacket(ILinkData link)
{ {
ByteArrayOutputStream bos = new ByteArrayOutputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dataOut = new DataOutputStream(bos); DataOutputStream dataOut = new DataOutputStream(bos);

View File

@@ -12,14 +12,13 @@ import cpw.mods.fml.common.IPlayerTracker;
public class PlayerRespawnTracker implements IPlayerTracker public class PlayerRespawnTracker implements IPlayerTracker
{ {
public PlayerRespawnTracker() private final DDProperties properties;
public PlayerRespawnTracker(DDProperties properties)
{ {
if (properties == null) this.properties = properties;
properties = DDProperties.instance();
} }
private static DDProperties properties = null;
@Override @Override
public void onPlayerLogin(EntityPlayer player) { public void onPlayerLogin(EntityPlayer player) {
// TODO Auto-generated method stub // TODO Auto-generated method stub

View File

@@ -67,7 +67,7 @@ public class BlockDimWallPerm extends Block
//FIXME: Shouldn't we make the player's destination safe BEFORE teleporting him?! //FIXME: Shouldn't we make the player's destination safe BEFORE teleporting him?!
//player.setPositionAndUpdate( x, y, z ); //player.setPositionAndUpdate( x, y, z );
Point4D destination = new Point4D(destinationX, destinationY, destinationZ, 0); Point4D destination = new Point4D(destinationX, destinationY, destinationZ, 0);
DDTeleporter.teleport(player, destination); DDTeleporter.teleportEntity(player, destination);
//player.setPositionAndUpdate( x, y, z ); //player.setPositionAndUpdate( x, y, z );

View File

@@ -34,7 +34,7 @@ public class CommandCreatePocket extends DDCommandBase
} }
//Place a door leading to a pocket dimension where the player is standing. //Place a door leading to a pocket dimension where the player is standing.
//The pocket dimension will be serve as a room for the player to build a dungeon. //The pocket dimension will serve as a room for the player to build a dungeon.
int x = (int) sender.posX; int x = (int) sender.posX;
int y = (int) sender.posY; int y = (int) sender.posY;
int z = (int) sender.posZ; int z = (int) sender.posZ;

View File

@@ -41,47 +41,37 @@ public class PocketManager
private static int OVERWORLD_DIMENSION_ID = 0; private static int OVERWORLD_DIMENSION_ID = 0;
private static boolean isInitialized = false; private static boolean isLoaded = false;
private static boolean isSaving = false; private static boolean isSaving = false;
//HashMap containing all the dims registered with DimDoors, sorted by dim ID. loaded on startup //HashMap that maps all the dimension IDs registered with DimDoors to their DD data.
private static HashMap<Integer, NewDimData> dimensionData = new HashMap<Integer, NewDimData>(); private static HashMap<Integer, NewDimData> dimensionData = new HashMap<Integer, NewDimData>();
public static boolean isInitialized() public static boolean isLoaded()
{ {
return isInitialized; return isLoaded;
} }
/** /**
* simple method called on startup to register all dims saved in the dim list. Only tries to register pocket dims, though. Also calls load() * simple method called on startup to register all dims saved in the dim list. Only tries to register pocket dims, though. Also calls load()
* @return * @return
*/ */
public static void initPockets() public static void load()
{ {
if (isInitialized) if (isLoaded)
{ {
throw new IllegalStateException("Pocket dimensions have already been initialized!"); throw new IllegalStateException("Pocket dimensions have already been loaded!");
} }
isLoaded = true;
loadInternal();
//Register Limbo
DDProperties properties = DDProperties.instance(); DDProperties properties = DDProperties.instance();
registerDimension(properties.LimboDimensionID, null, false, false);
isInitialized = true; //Register pocket dimensions
load(); registerPockets(properties);
for (NewDimData dimension : dimensionData.values())
{
if (dimension.isPocketDimension())
{
try
{
DimensionManager.registerDimension(dimension.id(), properties.PocketProviderID);
}
catch (Exception e)
{
System.err.println("Could not register pocket dimension #" + dimension.id() + ". Probably caused by a version update/save data corruption/other mods.");
e.printStackTrace();
}
}
}
} }
public boolean clearPocket(NewDimData dimension) public boolean clearPocket(NewDimData dimension)
@@ -120,8 +110,27 @@ public class PocketManager
return false; return false;
} }
} }
private static void registerPockets(DDProperties properties)
{
for (NewDimData dimension : dimensionData.values())
{
if (dimension.isPocketDimension())
{
try
{
DimensionManager.registerDimension(dimension.id(), properties.PocketProviderID);
}
catch (Exception e)
{
System.err.println("Could not register pocket dimension #" + dimension.id() + ". Probably caused by a version update/save data corruption/other mods.");
e.printStackTrace();
}
}
}
}
private static void unregisterDimensions() private static void unregisterPockets()
{ {
for (NewDimData dimension : dimensionData.values()) for (NewDimData dimension : dimensionData.values())
{ {
@@ -149,6 +158,10 @@ public class PocketManager
//TODO change from saving serialized objects to just saving data for compatabilies sake. //TODO change from saving serialized objects to just saving data for compatabilies sake.
//TODO If saving is multithreaded as the concurrent modification exception implies, you should be synchronizing access. ~SenseiKiwi //TODO If saving is multithreaded as the concurrent modification exception implies, you should be synchronizing access. ~SenseiKiwi
if (!isLoaded)
{
return;
}
if (isSaving) if (isSaving)
{ {
return; return;
@@ -188,7 +201,10 @@ public class PocketManager
e.printStackTrace(); e.printStackTrace();
System.err.println("Could not save data-- SEVERE"); System.err.println("Could not save data-- SEVERE");
} }
isSaving = false; finally
{
isSaving = false;
}
} }
} }
@@ -197,7 +213,7 @@ public class PocketManager
* @return * @return
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static void load() private static void loadInternal()
{ {
//FIXME: There are a lot of things to fix here... First, we shouldn't be created so many File instances //FIXME: There are a lot of things to fix here... First, we shouldn't be created so many File instances
//when we could just hold references and reuse them. Second, duplicate code is BAD. Loading stuff should //when we could just hold references and reuse them. Second, duplicate code is BAD. Loading stuff should
@@ -353,7 +369,7 @@ public class PocketManager
public static void unload() public static void unload()
{ {
save(); save();
unregisterDimensions(); unregisterPockets();
dimensionData.clear(); dimensionData.clear();
} }

View File

@@ -25,26 +25,16 @@ import StevenDimDoors.mod_pocketDim.blocks.TransientDoor;
import StevenDimDoors.mod_pocketDim.blocks.UnstableDoor; import StevenDimDoors.mod_pocketDim.blocks.UnstableDoor;
import StevenDimDoors.mod_pocketDim.blocks.WarpDoor; import StevenDimDoors.mod_pocketDim.blocks.WarpDoor;
import StevenDimDoors.mod_pocketDim.blocks.dimHatch; import StevenDimDoors.mod_pocketDim.blocks.dimHatch;
import StevenDimDoors.mod_pocketDim.commands.CommandCreateDungeonRift;
import StevenDimDoors.mod_pocketDim.commands.CommandCreatePocket;
import StevenDimDoors.mod_pocketDim.commands.CommandDeleteAllLinks;
import StevenDimDoors.mod_pocketDim.commands.CommandDeleteDimensionData;
import StevenDimDoors.mod_pocketDim.commands.CommandDeleteRifts;
import StevenDimDoors.mod_pocketDim.commands.CommandExportDungeon;
import StevenDimDoors.mod_pocketDim.commands.CommandPrintDimensionData;
import StevenDimDoors.mod_pocketDim.commands.CommandPruneDimensions;
import StevenDimDoors.mod_pocketDim.commands.CommandResetDungeons;
import StevenDimDoors.mod_pocketDim.commands.CommandTeleportPlayer;
import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.core.PocketManager;
import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper;
import StevenDimDoors.mod_pocketDim.items.ItemBlockDimWall; import StevenDimDoors.mod_pocketDim.items.ItemBlockDimWall;
import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor;
import StevenDimDoors.mod_pocketDim.items.ItemRiftBlade; import StevenDimDoors.mod_pocketDim.items.ItemRiftBlade;
import StevenDimDoors.mod_pocketDim.items.ItemRiftSignature;
import StevenDimDoors.mod_pocketDim.items.ItemStabilizedRiftSignature; import StevenDimDoors.mod_pocketDim.items.ItemStabilizedRiftSignature;
import StevenDimDoors.mod_pocketDim.items.ItemStableFabric; import StevenDimDoors.mod_pocketDim.items.ItemStableFabric;
import StevenDimDoors.mod_pocketDim.items.ItemUnstableDoor; import StevenDimDoors.mod_pocketDim.items.ItemUnstableDoor;
import StevenDimDoors.mod_pocketDim.items.ItemWarpDoor; import StevenDimDoors.mod_pocketDim.items.ItemWarpDoor;
import StevenDimDoors.mod_pocketDim.items.ItemRiftSignature;
import StevenDimDoors.mod_pocketDim.items.itemRiftRemover; import StevenDimDoors.mod_pocketDim.items.itemRiftRemover;
import StevenDimDoors.mod_pocketDim.ticking.CommonTickHandler; import StevenDimDoors.mod_pocketDim.ticking.CommonTickHandler;
import StevenDimDoors.mod_pocketDim.ticking.LimboDecay; import StevenDimDoors.mod_pocketDim.ticking.LimboDecay;
@@ -135,9 +125,6 @@ public class mod_pocketDim
public static DDProperties properties; public static DDProperties properties;
public static MonolithSpawner spawner; //Added this field temporarily. Will be refactored out later. public static MonolithSpawner spawner; //Added this field temporarily. Will be refactored out later.
public static GatewayGenerator riftGen; public static GatewayGenerator riftGen;
public static long genTime;
public static int teleTimer = 0;
public static CreativeTabs dimDoorsCreativeTab = new CreativeTabs("dimDoorsCreativeTab") public static CreativeTabs dimDoorsCreativeTab = new CreativeTabs("dimDoorsCreativeTab")
{ {
@@ -157,22 +144,20 @@ public class mod_pocketDim
@PreInit @PreInit
public void PreInit(FMLPreInitializationEvent event) public void onPreInitialization(FMLPreInitializationEvent event)
{ {
//This should be the FIRST thing that gets done. //This should be the FIRST thing that gets done.
properties = DDProperties.initialize(event.getSuggestedConfigurationFile()); properties = DDProperties.initialize(event.getSuggestedConfigurationFile());
//Now do other stuff //Now do other stuff
MinecraftForge.EVENT_BUS.register(new EventHookContainer()); MinecraftForge.EVENT_BUS.register(new EventHookContainer(properties));
//These fields MUST be initialized after properties are loaded to prevent tracker = new PlayerRespawnTracker(properties);
//instances from holding onto null references to the properties. riftGen = new GatewayGenerator(properties);
tracker = new PlayerRespawnTracker();
riftGen = new GatewayGenerator();
} }
@Init @Init
public void Init(FMLInitializationEvent event) public void onInitialization(FMLInitializationEvent event)
{ {
CommonTickHandler commonTickHandler = new CommonTickHandler(); CommonTickHandler commonTickHandler = new CommonTickHandler();
TickRegistry.registerTickHandler(new ClientTickHandler(), Side.CLIENT); TickRegistry.registerTickHandler(new ClientTickHandler(), Side.CLIENT);
@@ -255,8 +240,6 @@ public class mod_pocketDim
LanguageRegistry.instance().addStringLocalization("itemGroup.dimDoorsCustomTab", "en_US", "Dimensional Doors Items"); LanguageRegistry.instance().addStringLocalization("itemGroup.dimDoorsCustomTab", "en_US", "Dimensional Doors Items");
//GameRegistry.registerTileEntity(TileEntityDimDoor.class, "TileEntityDimRail");
GameRegistry.registerTileEntity(TileEntityDimDoor.class, "TileEntityDimDoor"); GameRegistry.registerTileEntity(TileEntityDimDoor.class, "TileEntityDimDoor");
GameRegistry.registerTileEntity(TileEntityRift.class, "TileEntityRift"); GameRegistry.registerTileEntity(TileEntityRift.class, "TileEntityRift");
@@ -268,7 +251,7 @@ public class mod_pocketDim
//GameRegistry.addBiome(this.limboBiome); //GameRegistry.addBiome(this.limboBiome);
//GameRegistry.addBiome(this.pocketBiome); //GameRegistry.addBiome(this.pocketBiome);
if (properties.CraftingDimensionaDoorAllowed) if (properties.CraftingDimensionalDoorAllowed)
{ {
GameRegistry.addRecipe(new ItemStack(itemDimDoor, 1), new Object[] GameRegistry.addRecipe(new ItemStack(itemDimDoor, 1), new Object[]
{ {
@@ -280,22 +263,6 @@ public class mod_pocketDim
" ", "yxy", " ", 'x', mod_pocketDim.itemStableFabric, 'y', Item.doorIron " ", "yxy", " ", 'x', mod_pocketDim.itemStableFabric, 'y', Item.doorIron
}); });
} }
/**
if(this.enableDimRail)
{
GameRegistry.addRecipe(new ItemStack(dimRail, 1), new Object[]
{
" ", "yxy", " ", 'x', this.itemDimDoor, 'y', Block.rail
});
GameRegistry.addRecipe(new ItemStack(dimRail, 1), new Object[]
{
" ", "yxy", " ", 'x', this.itemExitDoor, 'y', Block.rail
});
}
**/
if(properties.CraftingUnstableDoorAllowed) if(properties.CraftingUnstableDoorAllowed)
{ {
GameRegistry.addRecipe(new ItemStack(itemChaosDoor, 1), new Object[] GameRegistry.addRecipe(new ItemStack(itemChaosDoor, 1), new Object[]
@@ -385,28 +352,29 @@ public class mod_pocketDim
@PostInit @PostInit
public void PostInit(FMLPostInitializationEvent event) public void onPostInitialization(FMLPostInitializationEvent event)
{ {
//Register loot chests //Register loot chests
DDLoot.registerInfo(); DDLoot.registerInfo();
} }
@ServerStopping @ServerStopping
public void serverStopping(FMLServerStoppingEvent event) public void onServerStopping(FMLServerStoppingEvent event)
{ {
try try
{ {
PocketManager.unload(); PocketManager.unload();
} }
catch(Exception e) catch (Exception e)
{ {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ServerStarting @ServerStarting
public void serverStarting(FMLServerStartingEvent event) public void onServerStarting(FMLServerStartingEvent event)
{ {
/*
CommandResetDungeons.instance().register(event); CommandResetDungeons.instance().register(event);
CommandCreateDungeonRift.instance().register(event); CommandCreateDungeonRift.instance().register(event);
CommandDeleteAllLinks.instance().register(event); CommandDeleteAllLinks.instance().register(event);
@@ -417,6 +385,7 @@ public class mod_pocketDim
CommandPruneDimensions.instance().register(event); CommandPruneDimensions.instance().register(event);
CommandCreatePocket.instance().register(event); CommandCreatePocket.instance().register(event);
CommandTeleportPlayer.instance().register(event); CommandTeleportPlayer.instance().register(event);
*/
PocketManager.load(); PocketManager.load();
} }
} }

View File

@@ -3,7 +3,7 @@ package StevenDimDoors.mod_pocketDim.ticking;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.EnumSet; import java.util.EnumSet;
import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.DDTeleporter;
import cpw.mods.fml.common.ITickHandler; import cpw.mods.fml.common.ITickHandler;
import cpw.mods.fml.common.TickType; import cpw.mods.fml.common.TickType;
@@ -43,9 +43,9 @@ public class CommonTickHandler implements ITickHandler, IRegularTickSender
//TODO: Stuck this in here because it's already rather hackish. //TODO: Stuck this in here because it's already rather hackish.
//We should standardize this as an IRegularTickReceiver in the future. ~SenseiKiwi //We should standardize this as an IRegularTickReceiver in the future. ~SenseiKiwi
if (mod_pocketDim.teleTimer > 0) if (DDTeleporter.cooldown > 0)
{ {
mod_pocketDim.teleTimer--; DDTeleporter.cooldown--;
} }
} }

View File

@@ -150,7 +150,7 @@ public class MobMonolith extends EntityFlying implements IMob
(int) this.posY + 500, (int) this.posY + 500,
(int) this.posZ + MathHelper.getRandomIntegerInRange(rand, -250, 250), (int) this.posZ + MathHelper.getRandomIntegerInRange(rand, -250, 250),
properties.LimboDimensionID); properties.LimboDimensionID);
DDTeleporter.teleport(entityPlayer, destination); DDTeleporter.teleportEntity(entityPlayer, destination);
this.aggro = 0; this.aggro = 0;
entityPlayer.worldObj.playSoundAtEntity(entityPlayer,"mods.DimDoors.sfx.crack",13, 1); entityPlayer.worldObj.playSoundAtEntity(entityPlayer,"mods.DimDoors.sfx.crack",13, 1);

View File

@@ -29,12 +29,12 @@ public class GatewayGenerator implements IWorldGenerator
private static final int NETHER_CHANCE_CORRECTION = 4; private static final int NETHER_CHANCE_CORRECTION = 4;
private static final int OVERWORLD_DIMENSION_ID = 0; private static final int OVERWORLD_DIMENSION_ID = 0;
private static final int NETHER_DIMENSION_ID = -1; private static final int NETHER_DIMENSION_ID = -1;
private static DDProperties properties = null;
public GatewayGenerator() private final DDProperties properties;
public GatewayGenerator(DDProperties properties)
{ {
if (properties == null) this.properties = properties;
properties = DDProperties.instance();
} }
@Override @Override
@@ -141,7 +141,7 @@ public class GatewayGenerator implements IWorldGenerator
} }
else else
{ {
createLimboGateway(world, x, y, z); createLimboGateway(world, x, y, z, properties.LimboBlockID);
} }
//Place the shiny transient door into a dungeon //Place the shiny transient door into a dungeon
@@ -190,11 +190,10 @@ public class GatewayGenerator implements IWorldGenerator
world.setBlock(x, y, z + 1, blockID, 0, 3); world.setBlock(x, y, z + 1, blockID, 0, 3);
} }
private static void createLimboGateway(World world, int x, int y, int z) private static void createLimboGateway(World world, int x, int y, int z, int blockID)
{ {
//Build the gateway out of Unraveled Fabric. Since nearly all the blocks in Limbo are of //Build the gateway out of Unraveled Fabric. Since nearly all the blocks in Limbo are of
//that type, there is no point replacing the ground. //that type, there is no point replacing the ground.
final int blockID = properties.LimboBlockID;
world.setBlock(x, y + 2, z + 1, blockID, 0, 3); world.setBlock(x, y + 2, z + 1, blockID, 0, 3);
world.setBlock(x, y + 2, z - 1, blockID, 0, 3); world.setBlock(x, y + 2, z - 1, blockID, 0, 3);