Compare commits
120 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7c7129914a | ||
|
|
60bc8090f2 | ||
|
|
20db828ac0 | ||
|
|
12a2a8eb0d | ||
|
|
e793493331 | ||
|
|
7f99801e1b | ||
|
|
8544aa17ee | ||
|
|
b20a0a74d2 | ||
|
|
fb1713ae0e | ||
|
|
eff7abcbbc | ||
|
|
2c7435585d | ||
|
|
349f162a7c | ||
|
|
107aa4b7f2 | ||
|
|
1bf1f4f78c | ||
|
|
29c8a09218 | ||
|
|
71e7fdaafc | ||
|
|
1f59dc17d9 | ||
|
|
79bd5102ba | ||
|
|
b197237dfd | ||
|
|
85ff28298e | ||
|
|
782c6d5e50 | ||
|
|
c00c65eeee | ||
|
|
c22479c0e8 | ||
|
|
8da0339c78 | ||
|
|
83998969f6 | ||
|
|
c4abae8fdd | ||
|
|
1106319f8c | ||
|
|
2904ec146d | ||
|
|
7d840ff895 | ||
|
|
52bae00dc6 | ||
|
|
dc55359aaf | ||
|
|
58d5f6dd14 | ||
|
|
b40141f99d | ||
|
|
06cf72f9f7 | ||
|
|
100fa38c52 | ||
|
|
17a770eaf0 | ||
|
|
16f0a8303a | ||
|
|
1e3b32a15c | ||
|
|
4d53ae5f6a | ||
|
|
d3860119e9 | ||
|
|
f64768ed16 | ||
|
|
c1e58c25cc | ||
|
|
805e9dd040 | ||
|
|
972a67de76 | ||
|
|
592aabf627 | ||
|
|
b4a58f5c88 | ||
|
|
80bb87dac6 | ||
|
|
c5a77268fc | ||
|
|
262595ff4d | ||
|
|
c29db9b729 | ||
|
|
689df1ad6d | ||
|
|
ec290b0dc1 | ||
|
|
3d88e72ecb | ||
|
|
b2e086e7c1 | ||
|
|
e3665c09dd | ||
|
|
fb4643d7cf | ||
|
|
5ba58dc91b | ||
|
|
dea76b1a7e | ||
|
|
42568a1864 | ||
|
|
e40168954f | ||
|
|
59f335ac8c | ||
|
|
444b862b12 | ||
|
|
a0629b51a3 | ||
|
|
364ba11f81 | ||
|
|
96238d6b53 | ||
|
|
448890207f | ||
|
|
46f55b22d9 | ||
|
|
9baceb8e3c | ||
|
|
fe035f6677 | ||
|
|
4192270ef3 | ||
|
|
0029d9dac0 | ||
|
|
eff8379325 | ||
|
|
96d84ed2fa | ||
|
|
0f3d40ba60 | ||
|
|
794310bd98 | ||
|
|
a4d0f39390 | ||
|
|
e4e84644ac | ||
|
|
660ff4255e | ||
|
|
1410d4b251 | ||
|
|
161da193ad | ||
|
|
4d39d13703 | ||
|
|
18666f58b1 | ||
|
|
9e720cb458 | ||
|
|
968653e4ab | ||
|
|
eeb5f9aea1 | ||
|
|
117ed69bf7 | ||
|
|
0d53f6c029 | ||
|
|
dccb12116d | ||
|
|
e8fa928c50 | ||
|
|
f9331e4f2d | ||
|
|
7da3b7fc62 | ||
|
|
77241e6f90 | ||
|
|
844950b39e | ||
|
|
16d7bfcda6 | ||
|
|
d8fecd07b3 | ||
|
|
86cfcdeee8 | ||
|
|
3f6e32dcbf | ||
|
|
3fcc55b5e1 | ||
|
|
ef860e295e | ||
|
|
8f9dfea947 | ||
|
|
ac9b3d73e8 | ||
|
|
8d1028ccb5 | ||
|
|
d020dd384b | ||
|
|
8562456203 | ||
|
|
af77f8b2dc | ||
|
|
3a2c87cce9 | ||
|
|
03ab75b80c | ||
|
|
f4efa7dca2 | ||
|
|
79edf1004b | ||
|
|
aab818d948 | ||
|
|
68f2654000 | ||
|
|
f427e66f6e | ||
|
|
472704fe51 | ||
|
|
928adab4cf | ||
|
|
ef2e9cc561 | ||
|
|
7cabf75128 | ||
|
|
9003d924ea | ||
|
|
b15a8af299 | ||
|
|
19be17fa44 | ||
|
|
871d2ff1c2 |
15
build.gradle
15
build.gradle
@@ -13,14 +13,15 @@ buildscript {
|
|||||||
|
|
||||||
apply plugin: 'forge'
|
apply plugin: 'forge'
|
||||||
|
|
||||||
|
version = "2.2.4-" + System.getenv("BUILD_NUMBER")
|
||||||
|
group = "com.stevenrs11.dimdoors" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
|
||||||
version = "2.2.3-" + System.getenv("BUILD_NUMBER")
|
|
||||||
group= "com.stevenrs11.dimdoors" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
|
|
||||||
archivesBaseName = "DimensionalDoors"
|
archivesBaseName = "DimensionalDoors"
|
||||||
|
|
||||||
minecraft {
|
minecraft {
|
||||||
version = "1.6.4-9.11.1.964"
|
version = "1.6.4-9.11.1.964"
|
||||||
|
|
||||||
|
replaceIn "mod_pocketDim.java"
|
||||||
|
replace "@VERSION@", project.version
|
||||||
}
|
}
|
||||||
|
|
||||||
targetCompatibility = '1.6'
|
targetCompatibility = '1.6'
|
||||||
@@ -28,15 +29,15 @@ sourceCompatibility = '1.6'
|
|||||||
|
|
||||||
processResources
|
processResources
|
||||||
{
|
{
|
||||||
// replace stuff in mcmod.info, nothing else
|
// Replace stuff $version and $mcversion in mcmod.info
|
||||||
from(sourceSets.main.resources.srcDirs) {
|
from(sourceSets.main.resources.srcDirs) {
|
||||||
include 'mcmod.info'
|
include 'mcmod.info'
|
||||||
|
|
||||||
// replace version and mcversion
|
// Replace version and mcversion
|
||||||
expand 'version':project.version, 'mcversion':project.minecraft.version
|
expand 'version':project.version, 'mcversion':project.minecraft.version
|
||||||
}
|
}
|
||||||
|
|
||||||
// copy everything else, thats not the mcmod.info
|
// Copy everything else
|
||||||
from(sourceSets.main.resources.srcDirs) {
|
from(sourceSets.main.resources.srcDirs) {
|
||||||
exclude 'mcmod.info'
|
exclude 'mcmod.info'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
package StevenDimDoors.mod_pocketDim;
|
package StevenDimDoors.mod_pocketDim;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
|
import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor;
|
||||||
|
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor;
|
||||||
|
|
||||||
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.nbt.CompressedStreamTools;
|
import net.minecraft.nbt.CompressedStreamTools;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import cpw.mods.fml.common.FMLCommonHandler;
|
import cpw.mods.fml.common.FMLCommonHandler;
|
||||||
import cpw.mods.fml.common.network.IGuiHandler;
|
import cpw.mods.fml.common.network.IGuiHandler;
|
||||||
@@ -130,6 +133,20 @@ public class CommonProxy implements IGuiHandler
|
|||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
public void updateDoorTE(BaseDimDoor door, World world, int x, int y, int z)
|
||||||
|
{
|
||||||
|
TileEntity tile = world.getBlockTileEntity(x, y, z);
|
||||||
|
if (tile instanceof TileEntityDimDoor)
|
||||||
|
{
|
||||||
|
int metadata = world.getBlockMetadata(x, y, z);
|
||||||
|
TileEntityDimDoor dimTile = (TileEntityDimDoor) tile;
|
||||||
|
dimTile.openOrClosed = door.isDoorOnRift(world, x, y, z)&&door.isUpperDoorBlock(metadata);
|
||||||
|
dimTile.orientation = door.getFullMetadata(world, x, y, z) & 7;
|
||||||
|
dimTile.lockStatus = door.getLockStatus(world, x, y, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,17 +1,11 @@
|
|||||||
package StevenDimDoors.mod_pocketDim;
|
package StevenDimDoors.mod_pocketDim;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.DataOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayerMP;
|
|
||||||
import net.minecraft.network.INetworkManager;
|
import net.minecraft.network.INetworkManager;
|
||||||
import net.minecraft.network.NetLoginHandler;
|
import net.minecraft.network.NetLoginHandler;
|
||||||
import net.minecraft.network.packet.NetHandler;
|
import net.minecraft.network.packet.NetHandler;
|
||||||
import net.minecraft.network.packet.Packet1Login;
|
import net.minecraft.network.packet.Packet1Login;
|
||||||
import net.minecraft.network.packet.Packet250CustomPayload;
|
import net.minecraft.network.packet.Packet250CustomPayload;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
import net.minecraft.server.integrated.IntegratedServer;
|
|
||||||
import net.minecraftforge.common.DimensionManager;
|
import net.minecraftforge.common.DimensionManager;
|
||||||
import net.minecraftforge.common.network.ForgePacket;
|
import net.minecraftforge.common.network.ForgePacket;
|
||||||
import net.minecraftforge.common.network.packet.DimensionRegisterPacket;
|
import net.minecraftforge.common.network.packet.DimensionRegisterPacket;
|
||||||
@@ -65,7 +59,8 @@ public class ConnectionHandler implements IConnectionHandler
|
|||||||
@Override
|
@Override
|
||||||
public void playerLoggedIn(Player player, NetHandler netHandler, INetworkManager manager)
|
public void playerLoggedIn(Player player, NetHandler netHandler, INetworkManager manager)
|
||||||
{
|
{
|
||||||
PocketManager.getDimwatcher().onCreated(new ClientDimData(PocketManager.getDimensionData(0)));
|
// Hax... please don't do this! >_<
|
||||||
|
PocketManager.getDimwatcher().onCreated(new ClientDimData(PocketManager.createDimensionDataDangerously(0)));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,15 +1,23 @@
|
|||||||
package StevenDimDoors.mod_pocketDim;
|
package StevenDimDoors.mod_pocketDim;
|
||||||
|
|
||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockDispenser;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.inventory.IInventory;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraftforge.oredict.ShapedOreRecipe;
|
||||||
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.DDLock;
|
||||||
|
import StevenDimDoors.mod_pocketDim.items.ItemDDKey;
|
||||||
|
import StevenDimDoors.mod_pocketDim.items.behaviors.DispenserBehaviorStabilizedRS;
|
||||||
|
import cpw.mods.fml.common.ICraftingHandler;
|
||||||
import cpw.mods.fml.common.registry.GameRegistry;
|
import cpw.mods.fml.common.registry.GameRegistry;
|
||||||
import static StevenDimDoors.mod_pocketDim.mod_pocketDim.*;
|
|
||||||
|
|
||||||
public class CraftingManager
|
public class CraftingManager implements ICraftingHandler
|
||||||
{
|
{
|
||||||
private CraftingManager() { }
|
CraftingManager() { }
|
||||||
|
|
||||||
public static void registerRecipes(DDProperties properties)
|
public static void registerRecipes(DDProperties properties)
|
||||||
{
|
{
|
||||||
@@ -18,19 +26,19 @@ public class CraftingManager
|
|||||||
switch (properties.WorldThreadRequirementLevel)
|
switch (properties.WorldThreadRequirementLevel)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
GameRegistry.addShapelessRecipe(new ItemStack(itemStableFabric, 1),
|
GameRegistry.addShapelessRecipe(new ItemStack(mod_pocketDim.itemStableFabric, 1),
|
||||||
Item.enderPearl, mod_pocketDim.itemWorldThread);
|
Item.enderPearl, mod_pocketDim.itemWorldThread);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
GameRegistry.addRecipe(new ItemStack(itemStableFabric, 1),
|
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemStableFabric, 1),
|
||||||
"yxy", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread);
|
"yxy", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
GameRegistry.addRecipe(new ItemStack(itemStableFabric, 1),
|
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemStableFabric, 1),
|
||||||
" y ", "yxy", " y ", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread);
|
" y ", "yxy", " y ", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
GameRegistry.addRecipe(new ItemStack(itemStableFabric, 1),
|
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemStableFabric, 1),
|
||||||
"yyy", "yxy", "yyy", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread);
|
"yyy", "yxy", "yyy", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -38,54 +46,125 @@ public class CraftingManager
|
|||||||
|
|
||||||
if (properties.CraftingDimensionalDoorAllowed)
|
if (properties.CraftingDimensionalDoorAllowed)
|
||||||
{
|
{
|
||||||
GameRegistry.addRecipe(new ItemStack(itemDimensionalDoor, 1),
|
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemDimensionalDoor, 1),
|
||||||
"yxy", 'x', mod_pocketDim.itemStableFabric, 'y', Item.doorIron);
|
"yxy", 'x', mod_pocketDim.itemStableFabric, 'y', Item.doorIron);
|
||||||
}
|
}
|
||||||
if (properties.CraftingUnstableDoorAllowed)
|
if (properties.CraftingUnstableDoorAllowed)
|
||||||
{
|
{
|
||||||
GameRegistry.addRecipe(new ItemStack(itemUnstableDoor, 1),
|
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemUnstableDoor, 1),
|
||||||
"yxy", 'x', Item.eyeOfEnder, 'y', mod_pocketDim.itemDimensionalDoor);
|
"yxy", 'x', Item.eyeOfEnder, 'y', mod_pocketDim.itemDimensionalDoor);
|
||||||
}
|
}
|
||||||
if (properties.CraftingWarpDoorAllowed)
|
if (properties.CraftingWarpDoorAllowed)
|
||||||
{
|
{
|
||||||
GameRegistry.addRecipe(new ItemStack(itemWarpDoor, 1),
|
|
||||||
"yxy", 'x', mod_pocketDim.itemStableFabric, 'y', Item.doorWood);
|
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemWarpDoor, 1),
|
||||||
|
"yxy", 'x', Item.enderPearl, 'y', Item.doorWood);
|
||||||
}
|
}
|
||||||
if (properties.CraftingTransTrapdoorAllowed)
|
if (properties.CraftingTransTrapdoorAllowed)
|
||||||
{
|
{
|
||||||
GameRegistry.addRecipe(new ItemStack(transTrapdoor, 1),
|
|
||||||
"y", "x", "y", 'x', mod_pocketDim.itemStableFabric, 'y', Block.trapdoor);
|
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.transTrapdoor, 1),
|
||||||
|
"y", "x", "y", 'x', Item.enderPearl, 'y', Block.trapdoor);
|
||||||
}
|
}
|
||||||
if (properties.CraftingRiftSignatureAllowed)
|
if (properties.CraftingRiftSignatureAllowed)
|
||||||
{
|
{
|
||||||
GameRegistry.addRecipe(new ItemStack(itemRiftSignature, 1),
|
|
||||||
" y ", "yxy", " y ", 'x', mod_pocketDim.itemStableFabric, 'y', Item.ingotIron);
|
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemRiftSignature, 1),
|
||||||
|
" y ", "yxy", " y ", 'x', Item.enderPearl, 'y', Item.ingotIron);
|
||||||
}
|
}
|
||||||
if (properties.CraftingRiftRemoverAllowed)
|
if (properties.CraftingRiftRemoverAllowed)
|
||||||
{
|
{
|
||||||
GameRegistry.addRecipe(new ItemStack(itemRiftRemover, 1),
|
|
||||||
"yyy", "yxy", "yyy", 'x', mod_pocketDim.itemStableFabric, 'y', Item.ingotGold);
|
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemRiftRemover, 1),
|
||||||
|
"yyy", "yxy", "yyy", 'x', Item.enderPearl, 'y', Item.ingotGold);
|
||||||
}
|
}
|
||||||
if (properties.CraftingRiftBladeAllowed)
|
if (properties.CraftingRiftBladeAllowed)
|
||||||
{
|
{
|
||||||
GameRegistry.addRecipe(new ItemStack(itemRiftBlade, 1),
|
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemRiftBlade, 1),
|
||||||
"x", "x", "y", 'x', mod_pocketDim.itemStableFabric, 'y', Item.blazeRod);
|
"x", "x", "y", 'x', mod_pocketDim.itemStableFabric, 'y', Item.blazeRod);
|
||||||
}
|
}
|
||||||
if (properties.CraftingStabilizedRiftSignatureAllowed)
|
if (properties.CraftingStabilizedRiftSignatureAllowed)
|
||||||
{
|
{
|
||||||
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemStabilizedLinkSignature,1),
|
|
||||||
" y ", "yxy", " y ", 'x', mod_pocketDim.itemRiftSignature, 'y', mod_pocketDim.itemStableFabric);
|
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemStabilizedRiftSignature, 1),
|
||||||
|
" y ", "yxy", " y ", 'x', mod_pocketDim.itemStableFabric, 'y', Item.ingotIron);
|
||||||
}
|
}
|
||||||
if (properties.CraftingGoldenDimensionalDoorAllowed)
|
if (properties.CraftingGoldenDimensionalDoorAllowed)
|
||||||
{
|
{
|
||||||
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemGoldenDimensionalDoor,1),
|
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemGoldenDimensionalDoor, 1),
|
||||||
"yxy", 'x', mod_pocketDim.itemGoldenDoor, 'y', mod_pocketDim.itemStableFabric);
|
"yxy", 'x', mod_pocketDim.itemStableFabric, 'y', mod_pocketDim.itemGoldenDoor);
|
||||||
}
|
}
|
||||||
if (properties.CraftingGoldenDoorAllowed)
|
if (properties.CraftingGoldenDoorAllowed)
|
||||||
{
|
{
|
||||||
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemGoldenDoor, 1),
|
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemGoldenDoor, 1),
|
||||||
"yy", "yy", "yy", 'y', Item.ingotGold);
|
"yy", "yy", "yy", 'y', Item.ingotGold);
|
||||||
}
|
}
|
||||||
|
if (properties.CraftingPersonalDimDoorAllowed)
|
||||||
|
{
|
||||||
|
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemPersonalDoor,1),
|
||||||
|
"yxy", 'y', mod_pocketDim.itemGoldenDoor, 'x', mod_pocketDim.itemStableFabric);
|
||||||
|
}
|
||||||
|
if (properties.CraftingQuartzDoorAllowed)
|
||||||
|
{
|
||||||
|
GameRegistry.addRecipe(new ShapedOreRecipe(mod_pocketDim.itemQuartzDoor, new Object[]{
|
||||||
|
"yy", "yy", "yy", Character.valueOf('y'), "oreQuartz"}));
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
if (properties.CraftingDDKeysAllowed)
|
||||||
|
{
|
||||||
|
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemDDKey, 1),
|
||||||
|
" z", " y ", "y ", 'y', Item.ingotGold, 'z', Item.enderPearl);
|
||||||
|
GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemDDKey, 1),
|
||||||
|
"z", "z", 'z', mod_pocketDim.itemDDKey);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCrafting(EntityPlayer player, ItemStack item, IInventory craftMatrix)
|
||||||
|
{
|
||||||
|
if(item.getItem() instanceof ItemDDKey)
|
||||||
|
{
|
||||||
|
ItemDDKey keyItem = (ItemDDKey) item.getItem();
|
||||||
|
ItemStack topKey = null;
|
||||||
|
ItemStack bottomKey = null;
|
||||||
|
int topKeySlot = 0;
|
||||||
|
|
||||||
|
for(int i = 0; i<craftMatrix.getSizeInventory();i++)
|
||||||
|
{
|
||||||
|
ItemStack slot = craftMatrix.getStackInSlot(i);
|
||||||
|
if(slot!=null)
|
||||||
|
{
|
||||||
|
if(topKey==null)
|
||||||
|
{
|
||||||
|
topKey = slot;
|
||||||
|
topKeySlot = i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bottomKey = slot;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DDLock.addKeys(bottomKey, DDLock.getKeys(topKey));
|
||||||
|
item.setTagCompound(bottomKey.getTagCompound());
|
||||||
|
player.inventory.addItemStackToInventory(topKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSmelting(EntityPlayer player, ItemStack item)
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void registerDispenserBehaviors()
|
||||||
|
{
|
||||||
|
// Register the dispenser behaviors for certain DD items
|
||||||
|
BlockDispenser.dispenseBehaviorRegistry.putObject(mod_pocketDim.itemStabilizedRiftSignature, new DispenserBehaviorStabilizedRS());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,14 @@
|
|||||||
package StevenDimDoors.mod_pocketDim;
|
package StevenDimDoors.mod_pocketDim;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.client.audio.SoundManager;
|
import net.minecraft.client.audio.SoundManager;
|
||||||
import net.minecraft.client.audio.SoundPoolEntry;
|
import net.minecraft.client.audio.SoundPoolEntry;
|
||||||
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.item.Item;
|
|
||||||
import net.minecraft.item.ItemDoor;
|
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.ChunkCoordinates;
|
import net.minecraft.util.DamageSource;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraft.world.WorldProvider;
|
||||||
|
import net.minecraft.world.chunk.Chunk;
|
||||||
import net.minecraftforge.client.event.sound.PlayBackgroundMusicEvent;
|
import net.minecraftforge.client.event.sound.PlayBackgroundMusicEvent;
|
||||||
import net.minecraftforge.client.event.sound.SoundLoadEvent;
|
import net.minecraftforge.client.event.sound.SoundLoadEvent;
|
||||||
import net.minecraftforge.event.EventPriority;
|
import net.minecraftforge.event.EventPriority;
|
||||||
@@ -19,12 +18,18 @@ import net.minecraftforge.event.entity.living.LivingFallEvent;
|
|||||||
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
|
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
|
||||||
import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
|
import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
|
||||||
import net.minecraftforge.event.terraingen.InitMapGenEvent;
|
import net.minecraftforge.event.terraingen.InitMapGenEvent;
|
||||||
|
import net.minecraftforge.event.world.ChunkEvent;
|
||||||
import net.minecraftforge.event.world.WorldEvent;
|
import net.minecraftforge.event.world.WorldEvent;
|
||||||
import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor;
|
|
||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
|
import StevenDimDoors.mod_pocketDim.config.DDWorldProperties;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DDTeleporter;
|
import StevenDimDoors.mod_pocketDim.core.DDTeleporter;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.DimensionType;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
import StevenDimDoors.mod_pocketDim.items.BaseItemDoor;
|
import StevenDimDoors.mod_pocketDim.items.BaseItemDoor;
|
||||||
|
import StevenDimDoors.mod_pocketDim.items.ItemWarpDoor;
|
||||||
|
import StevenDimDoors.mod_pocketDim.ticking.RiftRegenerator;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
import StevenDimDoors.mod_pocketDim.world.LimboProvider;
|
import StevenDimDoors.mod_pocketDim.world.LimboProvider;
|
||||||
import StevenDimDoors.mod_pocketDim.world.PocketProvider;
|
import StevenDimDoors.mod_pocketDim.world.PocketProvider;
|
||||||
@@ -34,13 +39,26 @@ import cpw.mods.fml.relauncher.SideOnly;
|
|||||||
|
|
||||||
public class EventHookContainer
|
public class EventHookContainer
|
||||||
{
|
{
|
||||||
|
private static final int MAX_FOOD_LEVEL = 20;
|
||||||
|
|
||||||
private final DDProperties properties;
|
private final DDProperties properties;
|
||||||
|
private DDWorldProperties worldProperties;
|
||||||
|
private RiftRegenerator regenerator;
|
||||||
|
|
||||||
public EventHookContainer(DDProperties properties)
|
public EventHookContainer(DDProperties properties)
|
||||||
{
|
{
|
||||||
this.properties = properties;
|
this.properties = properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setSessionFields(DDWorldProperties worldProperties, RiftRegenerator regenerator)
|
||||||
|
{
|
||||||
|
// SenseiKiwi:
|
||||||
|
// Why have a setter rather than accessing mod_pocketDim directly?
|
||||||
|
// I want to make this dependency explicit in our code.
|
||||||
|
this.worldProperties = worldProperties;
|
||||||
|
this.regenerator = regenerator;
|
||||||
|
}
|
||||||
|
|
||||||
@ForgeSubscribe(priority = EventPriority.LOW)
|
@ForgeSubscribe(priority = EventPriority.LOW)
|
||||||
public void onInitMapGen(InitMapGenEvent event)
|
public void onInitMapGen(InitMapGenEvent event)
|
||||||
{
|
{
|
||||||
@@ -59,6 +77,10 @@ public class EventHookContainer
|
|||||||
@ForgeSubscribe
|
@ForgeSubscribe
|
||||||
public void onSoundLoad(SoundLoadEvent event)
|
public void onSoundLoad(SoundLoadEvent event)
|
||||||
{
|
{
|
||||||
|
event.manager.addSound(mod_pocketDim.modid + ":doorLockRemoved.ogg");
|
||||||
|
event.manager.addSound(mod_pocketDim.modid + ":doorLocked.ogg");
|
||||||
|
event.manager.addSound(mod_pocketDim.modid + ":keyLock.ogg");
|
||||||
|
event.manager.addSound(mod_pocketDim.modid + ":keyUnlock.ogg");
|
||||||
event.manager.addSound(mod_pocketDim.modid + ":monk.ogg");
|
event.manager.addSound(mod_pocketDim.modid + ":monk.ogg");
|
||||||
event.manager.addSound(mod_pocketDim.modid + ":crack.ogg");
|
event.manager.addSound(mod_pocketDim.modid + ":crack.ogg");
|
||||||
event.manager.addSound(mod_pocketDim.modid + ":tearing.ogg");
|
event.manager.addSound(mod_pocketDim.modid + ":tearing.ogg");
|
||||||
@@ -75,7 +97,6 @@ public class EventHookContainer
|
|||||||
public void onSoundEffectResult(PlayBackgroundMusicEvent event)
|
public void onSoundEffectResult(PlayBackgroundMusicEvent event)
|
||||||
{
|
{
|
||||||
if (FMLClientHandler.instance().getClient().thePlayer.worldObj.provider.dimensionId == mod_pocketDim.properties.LimboDimensionID)
|
if (FMLClientHandler.instance().getClient().thePlayer.worldObj.provider.dimensionId == mod_pocketDim.properties.LimboDimensionID)
|
||||||
;
|
|
||||||
{
|
{
|
||||||
this.playMusicForDim(FMLClientHandler.instance().getClient().thePlayer.worldObj);
|
this.playMusicForDim(FMLClientHandler.instance().getClient().thePlayer.worldObj);
|
||||||
}
|
}
|
||||||
@@ -85,21 +106,33 @@ public class EventHookContainer
|
|||||||
public void onPlayerEvent(PlayerInteractEvent event)
|
public void onPlayerEvent(PlayerInteractEvent event)
|
||||||
{
|
{
|
||||||
// Handle all door placement here
|
// Handle all door placement here
|
||||||
if(event.action == Action.LEFT_CLICK_BLOCK)
|
if (event.action == Action.LEFT_CLICK_BLOCK)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
World world = event.entity.worldObj;
|
World world = event.entity.worldObj;
|
||||||
ItemStack stack = event.entityPlayer.inventory.getCurrentItem();
|
ItemStack stack = event.entityPlayer.inventory.getCurrentItem();
|
||||||
if (stack != null && stack.getItem() instanceof ItemDoor)
|
if (stack != null)
|
||||||
{
|
{
|
||||||
if (mod_pocketDim.itemDimensionalDoor.tryToPlaceDoor(stack, event.entityPlayer, world,
|
if(stack.getItem() instanceof ItemWarpDoor)
|
||||||
|
{
|
||||||
|
NewDimData data = PocketManager.getDimensionData(world);
|
||||||
|
|
||||||
|
if(data.type() == DimensionType.PERSONAL)
|
||||||
|
{
|
||||||
|
mod_pocketDim.sendChat(event.entityPlayer,("Something prevents the Warp Door from tunneling out here"));
|
||||||
|
event.setCanceled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (BaseItemDoor.tryToPlaceDoor(stack, event.entityPlayer, world,
|
||||||
event.x, event.y, event.z, event.face))
|
event.x, event.y, event.z, event.face))
|
||||||
{
|
{
|
||||||
// Cancel the event so that we don't get two doors from vanilla doors
|
// Cancel the event so that we don't get two doors from vanilla doors
|
||||||
event.setCanceled(true);
|
event.setCanceled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ForgeSubscribe
|
@ForgeSubscribe
|
||||||
@@ -137,13 +170,24 @@ public class EventHookContainer
|
|||||||
Entity entity = event.entity;
|
Entity entity = event.entity;
|
||||||
|
|
||||||
if (properties.LimboEnabled && properties.LimboReturnsInventoryEnabled &&
|
if (properties.LimboEnabled && properties.LimboReturnsInventoryEnabled &&
|
||||||
entity instanceof EntityPlayer && entity.worldObj.provider instanceof PocketProvider)
|
entity instanceof EntityPlayer && isValidSourceForLimbo(entity.worldObj.provider))
|
||||||
{
|
{
|
||||||
EntityPlayer player = (EntityPlayer) entity;
|
if(entity.worldObj.provider instanceof PocketProvider)
|
||||||
mod_pocketDim.deathTracker.addUsername(player.username);
|
{
|
||||||
revivePlayerInLimbo(player);
|
EntityPlayer player = (EntityPlayer) entity;
|
||||||
event.setCanceled(true);
|
mod_pocketDim.deathTracker.addUsername(player.username);
|
||||||
return false;
|
revivePlayerInLimbo(player);
|
||||||
|
event.setCanceled(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if(entity.worldObj.provider instanceof LimboProvider && event.source == DamageSource.outOfWorld)
|
||||||
|
{
|
||||||
|
EntityPlayer player = (EntityPlayer) entity;
|
||||||
|
revivePlayerInLimbo(player);
|
||||||
|
mod_pocketDim.sendChat(player, "Search for the dark red pools which accumulate in the lower reaches of Limbo");
|
||||||
|
event.setCanceled(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -159,7 +203,7 @@ public class EventHookContainer
|
|||||||
|
|
||||||
Entity entity = event.entity;
|
Entity entity = event.entity;
|
||||||
|
|
||||||
if (entity instanceof EntityPlayer && entity.worldObj.provider instanceof PocketProvider)
|
if (entity instanceof EntityPlayer && isValidSourceForLimbo(entity.worldObj.provider))
|
||||||
{
|
{
|
||||||
EntityPlayer player = (EntityPlayer) entity;
|
EntityPlayer player = (EntityPlayer) entity;
|
||||||
mod_pocketDim.deathTracker.addUsername(player.username);
|
mod_pocketDim.deathTracker.addUsername(player.username);
|
||||||
@@ -175,11 +219,23 @@ public class EventHookContainer
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isValidSourceForLimbo(WorldProvider provider)
|
||||||
|
{
|
||||||
|
// Returns whether a given world is a valid place for sending a player
|
||||||
|
// to Limbo. We can send someone to Limbo from a certain dimension if
|
||||||
|
// Universal Limbo is enabled and the source dimension is not Limbo, or
|
||||||
|
// if the source dimension is a pocket dimension.
|
||||||
|
|
||||||
|
return (worldProperties.UniversalLimboEnabled && provider.dimensionId != properties.LimboDimensionID) ||
|
||||||
|
(provider instanceof PocketProvider);
|
||||||
|
}
|
||||||
|
|
||||||
private void revivePlayerInLimbo(EntityPlayer player)
|
private void revivePlayerInLimbo(EntityPlayer player)
|
||||||
{
|
{
|
||||||
player.extinguish();
|
player.extinguish();
|
||||||
player.clearActivePotions();
|
player.clearActivePotions();
|
||||||
player.setHealth(player.getMaxHealth());
|
player.setHealth(player.getMaxHealth());
|
||||||
|
player.getFoodStats().addStats(MAX_FOOD_LEVEL, 0);
|
||||||
Point4D destination = LimboProvider.getLimboSkySpawn(player, properties);
|
Point4D destination = LimboProvider.getLimboSkySpawn(player, properties);
|
||||||
DDTeleporter.teleportEntity(player, destination, false);
|
DDTeleporter.teleportEntity(player, destination, false);
|
||||||
}
|
}
|
||||||
@@ -198,6 +254,25 @@ public class EventHookContainer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ForgeSubscribe
|
||||||
|
public void onChunkLoad(ChunkEvent.Load event)
|
||||||
|
{
|
||||||
|
// Schedule rift regeneration for any links located in this chunk.
|
||||||
|
// This event runs on both the client and server. Allow server only.
|
||||||
|
// Also, check that PocketManager is loaded, because onChunkLoad() can
|
||||||
|
// fire while chunks are being initialized in a new world, before
|
||||||
|
// onWorldLoad() fires.
|
||||||
|
Chunk chunk = event.getChunk();
|
||||||
|
if (!chunk.worldObj.isRemote && PocketManager.isLoaded())
|
||||||
|
{
|
||||||
|
NewDimData dimension = PocketManager.createDimensionData(chunk.worldObj);
|
||||||
|
for (DimLink link : dimension.getChunkLinks(chunk.xPosition, chunk.zPosition))
|
||||||
|
{
|
||||||
|
regenerator.scheduleSlowRegeneration(link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void playMusicForDim(World world)
|
public void playMusicForDim(World world)
|
||||||
{
|
{
|
||||||
if (world.isRemote)
|
if (world.isRemote)
|
||||||
|
|||||||
@@ -4,5 +4,6 @@ import net.minecraftforge.common.ForgeChunkManager.Ticket;
|
|||||||
|
|
||||||
public interface IChunkLoader
|
public interface IChunkLoader
|
||||||
{
|
{
|
||||||
public void forceChunkLoading(Ticket ticket,int x, int z);
|
public boolean isInitialized();
|
||||||
|
public void initialize(Ticket ticket);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,5 +12,6 @@ public class PacketConstants
|
|||||||
public static final byte CREATE_LINK_PACKET_ID = 4;
|
public static final byte CREATE_LINK_PACKET_ID = 4;
|
||||||
public static final byte DELETE_LINK_PACKET_ID = 5;
|
public static final byte DELETE_LINK_PACKET_ID = 5;
|
||||||
public static final byte CLIENT_LOGIN_DIM_REGISTER = 6;
|
public static final byte CLIENT_LOGIN_DIM_REGISTER = 6;
|
||||||
|
public static final byte UPDATE_LINK_PACKET_ID = 7;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,13 @@ public class ServerPacketHandler implements IPacketHandler
|
|||||||
{
|
{
|
||||||
sendDimPacket(PacketConstants.DELETE_DIM_PACKET_ID, message);
|
sendDimPacket(PacketConstants.DELETE_DIM_PACKET_ID, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(ClientDimData message)
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class LinkWatcher implements IUpdateWatcher<ClientLinkData>
|
private static class LinkWatcher implements IUpdateWatcher<ClientLinkData>
|
||||||
@@ -54,6 +61,12 @@ public class ServerPacketHandler implements IPacketHandler
|
|||||||
{
|
{
|
||||||
sendLinkPacket(PacketConstants.DELETE_LINK_PACKET_ID, message);
|
sendLinkPacket(PacketConstants.DELETE_LINK_PACKET_ID, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(ClientLinkData message)
|
||||||
|
{
|
||||||
|
sendLinkPacket(PacketConstants.UPDATE_LINK_PACKET_ID, message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Packet250CustomPayload createLinkPacket(ClientLinkData data)
|
public static Packet250CustomPayload createLinkPacket(ClientLinkData data)
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.blocks;
|
package StevenDimDoors.mod_pocketDim.blocks;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockDoor;
|
import net.minecraft.block.BlockDoor;
|
||||||
import net.minecraft.block.ITileEntityProvider;
|
import net.minecraft.block.ITileEntityProvider;
|
||||||
@@ -11,7 +10,8 @@ import net.minecraft.client.renderer.texture.IconRegister;
|
|||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.EntityLivingBase;
|
import net.minecraft.entity.EntityLivingBase;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.ItemDoor;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.Icon;
|
import net.minecraft.util.Icon;
|
||||||
import net.minecraft.util.MathHelper;
|
import net.minecraft.util.MathHelper;
|
||||||
@@ -22,7 +22,7 @@ import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
|||||||
import StevenDimDoors.mod_pocketDim.core.DDTeleporter;
|
import StevenDimDoors.mod_pocketDim.core.DDTeleporter;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
import StevenDimDoors.mod_pocketDim.schematic.BlockRotator;
|
import StevenDimDoors.mod_pocketDim.items.ItemDDKey;
|
||||||
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor;
|
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor;
|
||||||
import cpw.mods.fml.relauncher.Side;
|
import cpw.mods.fml.relauncher.Side;
|
||||||
import cpw.mods.fml.relauncher.SideOnly;
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
@@ -32,9 +32,9 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn
|
|||||||
protected final DDProperties properties;
|
protected final DDProperties properties;
|
||||||
|
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly(Side.CLIENT)
|
||||||
private Icon[] upperTextures;
|
protected Icon[] upperTextures;
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly(Side.CLIENT)
|
||||||
private Icon[] lowerTextures;
|
protected Icon[] lowerTextures;
|
||||||
|
|
||||||
public BaseDimDoor(int blockID, Material material, DDProperties properties)
|
public BaseDimDoor(int blockID, Material material, DDProperties properties)
|
||||||
{
|
{
|
||||||
@@ -74,6 +74,18 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn
|
|||||||
@Override
|
@Override
|
||||||
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ)
|
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
ItemStack stack = player.inventory.getCurrentItem();
|
||||||
|
if (stack != null && stack.getItem() instanceof ItemDDKey)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!checkCanOpen(world, x, y, z, player))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
final int MAGIC_CONSTANT = 1003;
|
final int MAGIC_CONSTANT = 1003;
|
||||||
|
|
||||||
int metadata = this.getFullMetadata(world, x, y, z);
|
int metadata = this.getFullMetadata(world, x, y, z);
|
||||||
@@ -92,6 +104,7 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn
|
|||||||
}
|
}
|
||||||
|
|
||||||
world.playAuxSFXAtEntity(player, MAGIC_CONSTANT, x, y, z, 0);
|
world.playAuxSFXAtEntity(player, MAGIC_CONSTANT, x, y, z, 0);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,27 +172,26 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn
|
|||||||
reversed = !reversed;
|
reversed = !reversed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isUpperDoorBlock(fullMetadata))
|
if (isUpperDoorBlock(fullMetadata))
|
||||||
|
{
|
||||||
return this.upperTextures[reversed ? 1 : 0];
|
return this.upperTextures[reversed ? 1 : 0];
|
||||||
else
|
}
|
||||||
return this.lowerTextures[reversed ? 1 : 0];
|
return this.lowerTextures[reversed ? 1 : 0];
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return this.lowerTextures[0];
|
|
||||||
}
|
}
|
||||||
|
return this.lowerTextures[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
//Called to update the render information on the tile entity. Could probably implement a data watcher,
|
//Called to update the render information on the tile entity. Could probably implement a data watcher,
|
||||||
//but this works fine and is more versatile I think.
|
//but this works fine and is more versatile I think.
|
||||||
public BaseDimDoor updateAttachedTile(World world, int x, int y, int z)
|
public BaseDimDoor updateAttachedTile(World world, int x, int y, int z)
|
||||||
{
|
{
|
||||||
|
mod_pocketDim.proxy.updateDoorTE(this, world, x, y, z);
|
||||||
TileEntity tile = world.getBlockTileEntity(x, y, z);
|
TileEntity tile = world.getBlockTileEntity(x, y, z);
|
||||||
if (tile instanceof TileEntityDimDoor)
|
if (tile instanceof TileEntityDimDoor)
|
||||||
{
|
{
|
||||||
|
int metadata = world.getBlockMetadata(x, y, z);
|
||||||
TileEntityDimDoor dimTile = (TileEntityDimDoor) tile;
|
TileEntityDimDoor dimTile = (TileEntityDimDoor) tile;
|
||||||
dimTile.openOrClosed = this.isDoorOnRift(world, x, y, z);
|
dimTile.openOrClosed = isDoorOnRift(world, x, y, z) && isUpperDoorBlock(metadata);
|
||||||
dimTile.orientation = this.getFullMetadata(world, x, y, z) & 7;
|
dimTile.orientation = this.getFullMetadata(world, x, y, z) & 7;
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
@@ -187,21 +199,34 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn
|
|||||||
|
|
||||||
public boolean isDoorOnRift(World world, int x, int y, int z)
|
public boolean isDoorOnRift(World world, int x, int y, int z)
|
||||||
{
|
{
|
||||||
if(this.isUpperDoorBlock( world.getBlockMetadata(x, y, z)))
|
return this.getLink(world, x, y, z) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DimLink getLink(World world, int x, int y, int z)
|
||||||
|
{
|
||||||
|
DimLink link= PocketManager.getLink(x, y, z, world.provider.dimensionId);
|
||||||
|
if(link!=null)
|
||||||
{
|
{
|
||||||
if(PocketManager.getLink(x, y, z, world.provider.dimensionId) != null||PocketManager.getLink(x, y-1, z, world.provider.dimensionId) != null)
|
return link;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isUpperDoorBlock( world.getBlockMetadata(x, y, z)))
|
||||||
|
{
|
||||||
|
link = PocketManager.getLink(x, y-1, z, world.provider.dimensionId);
|
||||||
|
if(link!=null)
|
||||||
{
|
{
|
||||||
return true;
|
return link;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(PocketManager.getLink(x, y, z, world.provider.dimensionId) != null||PocketManager.getLink(x, y+1, z, world.provider.dimensionId) != null)
|
link = PocketManager.getLink(x, y+1, z, world.provider.dimensionId);
|
||||||
|
if(link != null)
|
||||||
{
|
{
|
||||||
return true;
|
return link;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -311,14 +336,14 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn
|
|||||||
@Override
|
@Override
|
||||||
public void onNeighborBlockChange(World world, int x, int y, int z, int neighborID)
|
public void onNeighborBlockChange(World world, int x, int y, int z, int neighborID)
|
||||||
{
|
{
|
||||||
|
|
||||||
int metadata = world.getBlockMetadata(x, y, z);
|
int metadata = world.getBlockMetadata(x, y, z);
|
||||||
if (isUpperDoorBlock(metadata))
|
if (isUpperDoorBlock(metadata))
|
||||||
{
|
{
|
||||||
if (world.getBlockId(x, y - 1, z) != this.blockID)
|
if (world.getBlockId(x, y - 1, z) != this.blockID)
|
||||||
{
|
{
|
||||||
world.setBlock(x, y, z, 0);
|
world.setBlockToAir(x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (neighborID > 0 && neighborID != this.blockID)
|
if (neighborID > 0 && neighborID != this.blockID)
|
||||||
{
|
{
|
||||||
this.onNeighborBlockChange(world, x, y - 1, z, neighborID);
|
this.onNeighborBlockChange(world, x, y - 1, z, neighborID);
|
||||||
@@ -328,13 +353,13 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn
|
|||||||
{
|
{
|
||||||
if (world.getBlockId(x, y + 1, z) != this.blockID)
|
if (world.getBlockId(x, y + 1, z) != this.blockID)
|
||||||
{
|
{
|
||||||
world.setBlock(x, y, z, 0);
|
world.setBlockToAir(x, y, z);
|
||||||
if (!world.isRemote)
|
if (!world.isRemote)
|
||||||
{
|
{
|
||||||
this.dropBlockAsItem(world, x, y, z, metadata, 0);
|
this.dropBlockAsItem(world, x, y, z, metadata, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if(this.getLockStatus(world, x, y, z)<=1)
|
||||||
{
|
{
|
||||||
boolean powered = world.isBlockIndirectlyGettingPowered(x, y, z) || world.isBlockIndirectlyGettingPowered(x, y + 1, z);
|
boolean powered = world.isBlockIndirectlyGettingPowered(x, y, z) || world.isBlockIndirectlyGettingPowered(x, y + 1, z);
|
||||||
if ((powered || neighborID > 0 && Block.blocksList[neighborID].canProvidePower()) && neighborID != this.blockID)
|
if ((powered || neighborID > 0 && Block.blocksList[neighborID].canProvidePower()) && neighborID != this.blockID)
|
||||||
@@ -350,31 +375,20 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly(Side.CLIENT)
|
||||||
public int idPicked(World par1World, int par2, int par3, int par4)
|
public int idPicked(World world, int x, int y, int z)
|
||||||
{
|
{
|
||||||
return this.getDrops();
|
return this.getDoorItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the ID of the items to drop on destruction.
|
* Returns the ID of the items to drop on destruction.
|
||||||
*/
|
*/
|
||||||
public int idDropped(int metadata, Random random, int fortune)
|
@Override
|
||||||
|
public int idDropped(int metadata, Random random, int fortune)
|
||||||
{
|
{
|
||||||
return isUpperDoorBlock(metadata) ? 0 : this.getDrops();
|
return isUpperDoorBlock(metadata) ? 0 : this.getDrops();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the block is attempted to be harvested
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void onBlockHarvested(World par1World, int par2, int par3, int par4, int par5, EntityPlayer par6EntityPlayer)
|
|
||||||
{
|
|
||||||
if (par6EntityPlayer.capabilities.isCreativeMode && (par5 & 8) != 0 && par1World.getBlockId(par2, par3 - 1, par4) == this.blockID)
|
|
||||||
{
|
|
||||||
par1World.setBlock(par2, par3 - 1, par4, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TileEntity createNewTileEntity(World world)
|
public TileEntity createNewTileEntity(World world)
|
||||||
{
|
{
|
||||||
@@ -428,16 +442,77 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isUpperDoorBlock(int metadata)
|
public boolean isUpperDoorBlock(int metadata)
|
||||||
{
|
{
|
||||||
return (metadata & 8) != 0;
|
return (metadata & 8) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isDoorOpen(int metadata)
|
public boolean isDoorOpen(int metadata)
|
||||||
{
|
{
|
||||||
return (metadata & 4) != 0;
|
return (metadata & 4) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 0 if link is no lock;
|
||||||
|
* 1 if there is a lock;
|
||||||
|
* 2 if the lock is locked.
|
||||||
|
* @param world
|
||||||
|
* @param x
|
||||||
|
* @param y
|
||||||
|
* @param z
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public byte getLockStatus(World world, int x, int y, int z)
|
||||||
|
{
|
||||||
|
byte status = 0;
|
||||||
|
DimLink link = getLink(world, x, y, z);
|
||||||
|
if(link!=null&&link.hasLock())
|
||||||
|
{
|
||||||
|
status++;
|
||||||
|
if(link.getLockState())
|
||||||
|
{
|
||||||
|
status++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean checkCanOpen(World world, int x, int y, int z)
|
||||||
|
{
|
||||||
|
return this.checkCanOpen(world, x, y, z, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkCanOpen(World world, int x, int y, int z, EntityPlayer player)
|
||||||
|
{
|
||||||
|
DimLink link = getLink(world, x, y, z);
|
||||||
|
if(link==null||player==null)
|
||||||
|
{
|
||||||
|
return link==null;
|
||||||
|
}
|
||||||
|
if(!link.getLockState())
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(ItemStack item : player.inventory.mainInventory)
|
||||||
|
{
|
||||||
|
if(item != null)
|
||||||
|
{
|
||||||
|
if(item.getItem() instanceof ItemDDKey)
|
||||||
|
{
|
||||||
|
if(link.tryToOpen(item))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
player.playSound(mod_pocketDim.modid + ":doorLocked", 1F, 1F);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected static boolean isEntityFacingDoor(int metadata, EntityLivingBase entity)
|
protected static boolean isEntityFacingDoor(int metadata, EntityLivingBase entity)
|
||||||
{
|
{
|
||||||
// Although any entity has the proper fields for this check,
|
// Although any entity has the proper fields for this check,
|
||||||
@@ -454,4 +529,18 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn
|
|||||||
world.setBlockTileEntity(x, y, z, te);
|
world.setBlockTileEntity(x, y, z, te);
|
||||||
return te;
|
return te;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void breakBlock(World world, int x, int y, int z, int oldBlockID, int oldMeta)
|
||||||
|
{
|
||||||
|
// This function runs on the server side after a block is replaced
|
||||||
|
// We MUST call super.breakBlock() since it involves removing tile entities
|
||||||
|
super.breakBlock(world, x, y, z, oldBlockID, oldMeta);
|
||||||
|
|
||||||
|
// Schedule rift regeneration for this block if it was replaced
|
||||||
|
if (world.getBlockId(x, y, z) != oldBlockID)
|
||||||
|
{
|
||||||
|
mod_pocketDim.riftRegenerator.scheduleFastRegeneration(x, y, z, world);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -14,8 +14,10 @@ import net.minecraft.item.Item;
|
|||||||
import net.minecraft.item.ItemBlock;
|
import net.minecraft.item.ItemBlock;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.Icon;
|
import net.minecraft.util.Icon;
|
||||||
|
import net.minecraft.world.IBlockAccess;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
|
import StevenDimDoors.mod_pocketDimClient.PrivatePocketRender;
|
||||||
import cpw.mods.fml.relauncher.Side;
|
import cpw.mods.fml.relauncher.Side;
|
||||||
import cpw.mods.fml.relauncher.SideOnly;
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
|
|
||||||
@@ -23,7 +25,7 @@ public class BlockDimWall extends Block
|
|||||||
{
|
{
|
||||||
private static final float SUPER_HIGH_HARDNESS = 10000000000000F;
|
private static final float SUPER_HIGH_HARDNESS = 10000000000000F;
|
||||||
private static final float SUPER_EXPLOSION_RESISTANCE = 18000000F;
|
private static final float SUPER_EXPLOSION_RESISTANCE = 18000000F;
|
||||||
private Icon[] blockIcon = new Icon[2];
|
private Icon[] blockIcon = new Icon[3];
|
||||||
|
|
||||||
public BlockDimWall(int blockID, int j, Material par2Material)
|
public BlockDimWall(int blockID, int j, Material par2Material)
|
||||||
{
|
{
|
||||||
@@ -34,7 +36,7 @@ public class BlockDimWall extends Block
|
|||||||
@Override
|
@Override
|
||||||
public float getBlockHardness(World world, int x, int y, int z)
|
public float getBlockHardness(World world, int x, int y, int z)
|
||||||
{
|
{
|
||||||
if (world.getBlockMetadata(x, y, z) == 0)
|
if (world.getBlockMetadata(x, y, z) != 1)
|
||||||
{
|
{
|
||||||
return this.blockHardness;
|
return this.blockHardness;
|
||||||
}
|
}
|
||||||
@@ -47,7 +49,7 @@ public class BlockDimWall extends Block
|
|||||||
@Override
|
@Override
|
||||||
public float getExplosionResistance(Entity entity, World world, int x, int y, int z, double explosionX, double explosionY, double explosionZ)
|
public float getExplosionResistance(Entity entity, World world, int x, int y, int z, double explosionX, double explosionY, double explosionZ)
|
||||||
{
|
{
|
||||||
if (world.getBlockMetadata(x, y, z) == 0)
|
if (world.getBlockMetadata(x, y, z) != 1)
|
||||||
{
|
{
|
||||||
return super.getExplosionResistance(entity, world, x, y, z, explosionX, explosionY, explosionZ);
|
return super.getExplosionResistance(entity, world, x, y, z, explosionX, explosionY, explosionZ);
|
||||||
}
|
}
|
||||||
@@ -57,25 +59,41 @@ public class BlockDimWall extends Block
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getRenderType()
|
||||||
|
{
|
||||||
|
return PrivatePocketRender.renderID;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerIcons(IconRegister par1IconRegister)
|
public void registerIcons(IconRegister par1IconRegister)
|
||||||
{
|
{
|
||||||
this.blockIcon[0] = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName());
|
this.blockIcon[0] = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName());
|
||||||
this.blockIcon[1] = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName() + "Perm");
|
this.blockIcon[1] = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName() + "Perm");
|
||||||
|
this.blockIcon[2] = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName() + "Personal");
|
||||||
}
|
}
|
||||||
|
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly(Side.CLIENT)
|
||||||
@Override
|
@Override
|
||||||
public Icon getIcon(int par1, int par2)
|
public Icon getIcon(int par1, int par2)
|
||||||
{
|
{
|
||||||
return (par2 != 1) ? blockIcon[0] : blockIcon[1];
|
switch(par2)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return blockIcon[0];
|
||||||
|
case 1:
|
||||||
|
return blockIcon[1];
|
||||||
|
case 2:
|
||||||
|
return blockIcon[2];
|
||||||
|
default:
|
||||||
|
return blockIcon[0];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int damageDropped(int metadata)
|
public int damageDropped(int metadata)
|
||||||
{
|
{
|
||||||
//Return 0 to avoid dropping Ancient Fabric even if the player somehow manages to break it
|
//Return 0 to avoid dropping Ancient Fabric even if the player somehow manages to break it
|
||||||
return 0;
|
return metadata == 1 ? 0 : metadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -83,11 +101,12 @@ public class BlockDimWall extends Block
|
|||||||
@SideOnly(Side.CLIENT)
|
@SideOnly(Side.CLIENT)
|
||||||
public void getSubBlocks(int unknown, CreativeTabs tab, List subItems)
|
public void getSubBlocks(int unknown, CreativeTabs tab, List subItems)
|
||||||
{
|
{
|
||||||
for (int ix = 0; ix < 2; ix++)
|
for (int ix = 0; ix < 3; ix++)
|
||||||
{
|
{
|
||||||
subItems.add(new ItemStack(this, 1, ix));
|
subItems.add(new ItemStack(this, 1, ix));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBlockDestroyedByPlayer(World par1World, int par2, int par3, int par4, int par5) {}
|
public void onBlockDestroyedByPlayer(World par1World, int par2, int par3, int par4, int par5) {}
|
||||||
|
|
||||||
@@ -110,7 +129,7 @@ public class BlockDimWall extends Block
|
|||||||
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer entityPlayer, int par6, float par7, float par8, float par9)
|
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer entityPlayer, int par6, float par7, float par8, float par9)
|
||||||
{
|
{
|
||||||
//Check if the metadata value is 0 -- we don't want the user to replace Ancient Fabric
|
//Check if the metadata value is 0 -- we don't want the user to replace Ancient Fabric
|
||||||
if (entityPlayer.getCurrentEquippedItem() != null && world.getBlockMetadata(x, y, z) == 0)
|
if (entityPlayer.getCurrentEquippedItem() != null && world.getBlockMetadata(x, y, z) != 1)
|
||||||
{
|
{
|
||||||
Item playerEquip = entityPlayer.getCurrentEquippedItem().getItem();
|
Item playerEquip = entityPlayer.getCurrentEquippedItem().getItem();
|
||||||
|
|
||||||
|
|||||||
@@ -2,123 +2,34 @@ package StevenDimDoors.mod_pocketDim.blocks;
|
|||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import cpw.mods.fml.relauncher.Side;
|
|
||||||
import cpw.mods.fml.relauncher.SideOnly;
|
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
|
||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
|
||||||
import net.minecraft.block.BlockDoor;
|
import net.minecraft.block.BlockDoor;
|
||||||
import net.minecraft.block.material.Material;
|
import net.minecraft.block.material.Material;
|
||||||
import net.minecraft.client.renderer.IconFlipped;
|
import net.minecraft.client.renderer.IconFlipped;
|
||||||
import net.minecraft.client.renderer.texture.IconRegister;
|
import net.minecraft.client.renderer.texture.IconRegister;
|
||||||
import net.minecraft.item.Item;
|
|
||||||
import net.minecraft.util.Icon;
|
import net.minecraft.util.Icon;
|
||||||
import net.minecraft.world.IBlockAccess;
|
import net.minecraft.world.IBlockAccess;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
|
import cpw.mods.fml.relauncher.Side;
|
||||||
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
|
|
||||||
public class BlockDoorGold extends BlockDoor
|
public class BlockDoorGold extends BlockDoor
|
||||||
{
|
{
|
||||||
@SideOnly(Side.CLIENT)
|
|
||||||
private Icon[] upperTextures;
|
|
||||||
@SideOnly(Side.CLIENT)
|
|
||||||
private Icon[] lowerTextures;
|
|
||||||
|
|
||||||
public BlockDoorGold(int par1, Material par2Material)
|
public BlockDoorGold(int par1, Material par2Material)
|
||||||
{
|
{
|
||||||
super(par1, par2Material);
|
super(par1, par2Material);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@SideOnly(Side.CLIENT)
|
||||||
@SideOnly(Side.CLIENT)
|
protected String getTextureName()
|
||||||
public void registerIcons(IconRegister iconRegister)
|
{
|
||||||
{
|
return mod_pocketDim.modid + ":" + this.getUnlocalizedName();
|
||||||
upperTextures = new Icon[2];
|
}
|
||||||
lowerTextures = new Icon[2];
|
|
||||||
upperTextures[0] = iconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName() + "_upper");
|
|
||||||
lowerTextures[0] = iconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName() + "_lower");
|
|
||||||
upperTextures[1] = new IconFlipped(upperTextures[0], true, false);
|
|
||||||
lowerTextures[1] = new IconFlipped(lowerTextures[0], true, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int idDropped(int par1, Random par2Random, int par3)
|
public int idDropped(int par1, Random par2Random, int par3)
|
||||||
{
|
{
|
||||||
return (par1 & 8) != 0 ? 0 : mod_pocketDim.itemGoldenDoor.itemID;
|
return (par1 & 8) != 0 ? 0 : mod_pocketDim.itemGoldenDoor.itemID;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* From the specified side and block metadata retrieves the blocks texture. Args: side, metadata
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
@SideOnly(Side.CLIENT)
|
|
||||||
public Icon getIcon(int side, int metadata)
|
|
||||||
{
|
|
||||||
return this.upperTextures[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
@SideOnly(Side.CLIENT)
|
|
||||||
public Icon getBlockTexture(IBlockAccess blockAccess, int x, int y, int z, int side)
|
|
||||||
{
|
|
||||||
if (side != 1 && side != 0)
|
|
||||||
{
|
|
||||||
int fullMetadata = this.getFullMetadata(blockAccess, x, y, z);
|
|
||||||
int orientation = fullMetadata & 3;
|
|
||||||
boolean reversed = false;
|
|
||||||
|
|
||||||
if (BaseDimDoor.isDoorOpen(fullMetadata))
|
|
||||||
{
|
|
||||||
if (orientation == 0 && side == 2)
|
|
||||||
{
|
|
||||||
reversed = !reversed;
|
|
||||||
}
|
|
||||||
else if (orientation == 1 && side == 5)
|
|
||||||
{
|
|
||||||
reversed = !reversed;
|
|
||||||
}
|
|
||||||
else if (orientation == 2 && side == 3)
|
|
||||||
{
|
|
||||||
reversed = !reversed;
|
|
||||||
}
|
|
||||||
else if (orientation == 3 && side == 4)
|
|
||||||
{
|
|
||||||
reversed = !reversed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (orientation == 0 && side == 5)
|
|
||||||
{
|
|
||||||
reversed = !reversed;
|
|
||||||
}
|
|
||||||
else if (orientation == 1 && side == 3)
|
|
||||||
{
|
|
||||||
reversed = !reversed;
|
|
||||||
}
|
|
||||||
else if (orientation == 2 && side == 4)
|
|
||||||
{
|
|
||||||
reversed = !reversed;
|
|
||||||
}
|
|
||||||
else if (orientation == 3 && side == 2)
|
|
||||||
{
|
|
||||||
reversed = !reversed;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((fullMetadata & 16) != 0)
|
|
||||||
{
|
|
||||||
reversed = !reversed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BaseDimDoor.isUpperDoorBlock(fullMetadata))
|
|
||||||
return this.upperTextures[reversed ? 1 : 0];
|
|
||||||
else
|
|
||||||
return this.lowerTextures[reversed ? 1 : 0];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return this.lowerTextures[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package StevenDimDoors.mod_pocketDim.blocks;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
|
import cpw.mods.fml.relauncher.Side;
|
||||||
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
|
import net.minecraft.block.BlockDoor;
|
||||||
|
import net.minecraft.block.material.Material;
|
||||||
|
|
||||||
|
public class BlockDoorQuartz extends BlockDoor
|
||||||
|
{
|
||||||
|
public BlockDoorQuartz(int par1, Material par2Material)
|
||||||
|
{
|
||||||
|
super(par1, par2Material);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SideOnly(Side.CLIENT)
|
||||||
|
protected String getTextureName()
|
||||||
|
{
|
||||||
|
return mod_pocketDim.modid + ":" + this.getUnlocalizedName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int idDropped(int par1, Random par2Random, int par3)
|
||||||
|
{
|
||||||
|
return (par1 & 8) != 0 ? 0 : mod_pocketDim.itemGoldenDoor.itemID;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,7 +3,7 @@ package StevenDimDoors.mod_pocketDim.blocks;
|
|||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoorGold;
|
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoorGold;
|
||||||
@@ -25,15 +25,21 @@ public class BlockGoldDimDoor extends BaseDimDoor
|
|||||||
{
|
{
|
||||||
if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID)
|
if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID)
|
||||||
{
|
{
|
||||||
NewDimData dimension = PocketManager.getDimensionData(world);
|
NewDimData dimension = PocketManager.createDimensionData(world);
|
||||||
DimLink link = dimension.getLink(x, y, z);
|
DimLink link = dimension.getLink(x, y, z);
|
||||||
if (link == null)
|
if (link == null)
|
||||||
{
|
{
|
||||||
dimension.createLink(x, y, z, LinkTypes.POCKET,world.getBlockMetadata(x, y - 1, z));
|
dimension.createLink(x, y, z, LinkType.POCKET,world.getBlockMetadata(x, y - 1, z));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDoorItem()
|
||||||
|
{
|
||||||
|
return mod_pocketDim.itemGoldenDimensionalDoor.itemID;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getDrops()
|
public int getDrops()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import net.minecraft.util.Icon;
|
|||||||
import net.minecraft.world.IBlockAccess;
|
import net.minecraft.world.IBlockAccess;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.ticking.LimboDecay;
|
import StevenDimDoors.mod_pocketDim.world.LimboDecay;
|
||||||
import cpw.mods.fml.relauncher.Side;
|
import cpw.mods.fml.relauncher.Side;
|
||||||
import cpw.mods.fml.relauncher.SideOnly;
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
|
|
||||||
|
|||||||
@@ -47,14 +47,28 @@ public class BlockRift extends Block implements ITileEntityProvider
|
|||||||
public static final int MAX_WORLD_THREAD_DROP_CHANCE = 1000;
|
public static final int MAX_WORLD_THREAD_DROP_CHANCE = 1000;
|
||||||
|
|
||||||
private final DDProperties properties;
|
private final DDProperties properties;
|
||||||
private final ArrayList<Integer> blocksImmuneToRift;
|
private final ArrayList<Integer> blocksImmuneToRift; // List of Vanilla blocks immune to rifts
|
||||||
|
private final ArrayList<Integer> modBlocksImmuneToRift; // List of DD blocks immune to rifts
|
||||||
|
|
||||||
public BlockRift(int i, int j, Material par2Material, DDProperties properties)
|
public BlockRift(int i, int j, Material par2Material, DDProperties properties)
|
||||||
{
|
{
|
||||||
super(i, par2Material);
|
super(i, par2Material);
|
||||||
this.setTickRandomly(true);
|
this.setTickRandomly(true);
|
||||||
this.properties = properties;
|
this.properties = properties;
|
||||||
|
this.modBlocksImmuneToRift = new ArrayList<Integer>();
|
||||||
|
this.modBlocksImmuneToRift.add(properties.FabricBlockID);
|
||||||
|
this.modBlocksImmuneToRift.add(properties.PermaFabricBlockID);
|
||||||
|
this.modBlocksImmuneToRift.add(properties.DimensionalDoorID);
|
||||||
|
this.modBlocksImmuneToRift.add(properties.WarpDoorID);
|
||||||
|
this.modBlocksImmuneToRift.add(properties.TransTrapdoorID);
|
||||||
|
this.modBlocksImmuneToRift.add(properties.UnstableDoorID);
|
||||||
|
this.modBlocksImmuneToRift.add(properties.RiftBlockID);
|
||||||
|
this.modBlocksImmuneToRift.add(properties.TransientDoorID);
|
||||||
|
this.modBlocksImmuneToRift.add(properties.GoldenDimensionalDoorID);
|
||||||
|
this.modBlocksImmuneToRift.add(properties.GoldenDoorID);
|
||||||
|
|
||||||
this.blocksImmuneToRift = new ArrayList<Integer>();
|
this.blocksImmuneToRift = new ArrayList<Integer>();
|
||||||
|
|
||||||
this.blocksImmuneToRift.add(properties.FabricBlockID);
|
this.blocksImmuneToRift.add(properties.FabricBlockID);
|
||||||
this.blocksImmuneToRift.add(properties.PermaFabricBlockID);
|
this.blocksImmuneToRift.add(properties.PermaFabricBlockID);
|
||||||
this.blocksImmuneToRift.add(properties.DimensionalDoorID);
|
this.blocksImmuneToRift.add(properties.DimensionalDoorID);
|
||||||
@@ -65,7 +79,7 @@ public class BlockRift extends Block implements ITileEntityProvider
|
|||||||
this.blocksImmuneToRift.add(properties.TransientDoorID);
|
this.blocksImmuneToRift.add(properties.TransientDoorID);
|
||||||
this.blocksImmuneToRift.add(properties.GoldenDimensionalDoorID);
|
this.blocksImmuneToRift.add(properties.GoldenDimensionalDoorID);
|
||||||
this.blocksImmuneToRift.add(properties.GoldenDoorID);
|
this.blocksImmuneToRift.add(properties.GoldenDoorID);
|
||||||
|
this.blocksImmuneToRift.add(properties.PersonalDimDoorID);
|
||||||
this.blocksImmuneToRift.add(Block.blockLapis.blockID);
|
this.blocksImmuneToRift.add(Block.blockLapis.blockID);
|
||||||
this.blocksImmuneToRift.add(Block.blockIron.blockID);
|
this.blocksImmuneToRift.add(Block.blockIron.blockID);
|
||||||
this.blocksImmuneToRift.add(Block.blockGold.blockID);
|
this.blocksImmuneToRift.add(Block.blockGold.blockID);
|
||||||
@@ -85,9 +99,6 @@ public class BlockRift extends Block implements ITileEntityProvider
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBlockDestroyedByPlayer(World par1World, int par2, int par3, int par4, int par5) {}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isOpaqueCube()
|
public boolean isOpaqueCube()
|
||||||
{
|
{
|
||||||
@@ -113,10 +124,10 @@ public class BlockRift extends Block implements ITileEntityProvider
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//this doesnt do anything yet.
|
|
||||||
@Override
|
@Override
|
||||||
public int getRenderType()
|
public int getRenderType()
|
||||||
{
|
{
|
||||||
|
// This doesn't do anything yet
|
||||||
if (mod_pocketDim.isPlayerWearingGoogles)
|
if (mod_pocketDim.isPlayerWearingGoogles)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@@ -220,7 +231,7 @@ public class BlockRift extends Block implements ITileEntityProvider
|
|||||||
return targets;
|
return targets;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void dropWorldThread(int blockID, World world, int x, int y, int z, Random random)
|
public void dropWorldThread(int blockID, World world, int x, int y, int z, Random random)
|
||||||
{
|
{
|
||||||
if (blockID != 0 && (random.nextInt(MAX_WORLD_THREAD_DROP_CHANCE) < properties.WorldThreadDropChance)
|
if (blockID != 0 && (random.nextInt(MAX_WORLD_THREAD_DROP_CHANCE) < properties.WorldThreadDropChance)
|
||||||
&& !(Block.blocksList[blockID] instanceof BlockFlowing ||
|
&& !(Block.blocksList[blockID] instanceof BlockFlowing ||
|
||||||
@@ -232,7 +243,7 @@ public class BlockRift extends Block implements ITileEntityProvider
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addAdjacentBlocks(int x, int y, int z, int distance, HashMap<Point3D, Integer> pointDistances, Queue<Point3D> points)
|
private static void addAdjacentBlocks(int x, int y, int z, int distance, HashMap<Point3D, Integer> pointDistances, Queue<Point3D> points)
|
||||||
{
|
{
|
||||||
Point3D[] neighbors = new Point3D[] {
|
Point3D[] neighbors = new Point3D[] {
|
||||||
new Point3D(x - 1, y, z),
|
new Point3D(x - 1, y, z),
|
||||||
@@ -252,16 +263,6 @@ public class BlockRift extends Block implements ITileEntityProvider
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void regenerateRift(World world, int x, int y, int z, Random random)
|
|
||||||
{
|
|
||||||
if (!this.isBlockImmune(world, x, y, z) && world.getChunkProvider().chunkExists(x >> 4, z >> 4))
|
|
||||||
{
|
|
||||||
int blockID = world.getBlockId(x, y, z);
|
|
||||||
if (world.setBlock(x, y, z, properties.RiftBlockID))
|
|
||||||
dropWorldThread(blockID, world, x, y, z, random);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean spreadRift(NewDimData dimension, DimLink parent, World world, Random random)
|
public boolean spreadRift(NewDimData dimension, DimLink parent, World world, Random random)
|
||||||
{
|
{
|
||||||
int x, y, z, blockID;
|
int x, y, z, blockID;
|
||||||
@@ -413,6 +414,15 @@ public class BlockRift extends Block implements ITileEntityProvider
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean tryPlacingRift(World world, int x, int y, int z)
|
||||||
|
{
|
||||||
|
if (world != null && !isBlockImmune(world, x, y, z))
|
||||||
|
{
|
||||||
|
return world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isBlockImmune(World world, int x, int y, int z)
|
public boolean isBlockImmune(World world, int x, int y, int z)
|
||||||
{
|
{
|
||||||
Block block = Block.blocksList[world.getBlockId(x, y, z)];
|
Block block = Block.blocksList[world.getBlockId(x, y, z)];
|
||||||
@@ -424,7 +434,21 @@ public class BlockRift extends Block implements ITileEntityProvider
|
|||||||
// is designed to receive an entity, the source of the blast. We have no entity so
|
// is designed to receive an entity, the source of the blast. We have no entity so
|
||||||
// I've set this to access blockResistance directly. Might need changing later.
|
// I've set this to access blockResistance directly. Might need changing later.
|
||||||
|
|
||||||
return (block.blockResistance >= MIN_IMMUNE_RESISTANCE || blocksImmuneToRift.contains(block.blockID));
|
return (block.blockResistance >= MIN_IMMUNE_RESISTANCE ||
|
||||||
|
modBlocksImmuneToRift.contains(block.blockID) ||
|
||||||
|
blocksImmuneToRift.contains(block.blockID));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isModBlockImmune(World world, int x, int y, int z)
|
||||||
|
{
|
||||||
|
// Check whether the block at the specified location is one of the
|
||||||
|
// rift-resistant blocks from DD.
|
||||||
|
Block block = Block.blocksList[world.getBlockId(x, y, z)];
|
||||||
|
if (block != null)
|
||||||
|
{
|
||||||
|
return modBlocksImmuneToRift.contains(block.blockID);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -446,4 +470,18 @@ public class BlockRift extends Block implements ITileEntityProvider
|
|||||||
{
|
{
|
||||||
return new TileEntityRift();
|
return new TileEntityRift();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void breakBlock(World world, int x, int y, int z, int oldBlockID, int oldMeta)
|
||||||
|
{
|
||||||
|
// This function runs on the server side after a block is replaced
|
||||||
|
// We MUST call super.breakBlock() since it involves removing tile entities
|
||||||
|
super.breakBlock(world, x, y, z, oldBlockID, oldMeta);
|
||||||
|
|
||||||
|
// Schedule rift regeneration for this block if it was changed
|
||||||
|
if (world.getBlockId(x, y, z) != oldBlockID)
|
||||||
|
{
|
||||||
|
mod_pocketDim.riftRegenerator.scheduleSlowRegeneration(x, y, z, world);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -3,16 +3,15 @@ package StevenDimDoors.mod_pocketDim.blocks;
|
|||||||
import net.minecraft.block.material.Material;
|
import net.minecraft.block.material.Material;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public class DimensionalDoor extends BaseDimDoor
|
public class DimensionalDoor extends BaseDimDoor
|
||||||
{
|
{
|
||||||
|
|
||||||
public DimensionalDoor(int blockID, Material material, DDProperties properties)
|
public DimensionalDoor(int blockID, Material material, DDProperties properties)
|
||||||
{
|
{
|
||||||
super(blockID, material, properties);
|
super(blockID, material, properties);
|
||||||
@@ -23,14 +22,21 @@ public class DimensionalDoor extends BaseDimDoor
|
|||||||
{
|
{
|
||||||
if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID)
|
if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID)
|
||||||
{
|
{
|
||||||
NewDimData dimension = PocketManager.getDimensionData(world);
|
NewDimData dimension = PocketManager.createDimensionData(world);
|
||||||
DimLink link = dimension.getLink(x, y, z);
|
DimLink link = dimension.getLink(x, y, z);
|
||||||
if (link == null)
|
if (link == null)
|
||||||
{
|
{
|
||||||
dimension.createLink(x, y, z, LinkTypes.POCKET,world.getBlockMetadata(x, y - 1, z));
|
dimension.createLink(x, y, z, LinkType.POCKET,world.getBlockMetadata(x, y - 1, z));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDoorItem()
|
||||||
|
{
|
||||||
|
return mod_pocketDim.itemDimensionalDoor.itemID;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getDrops()
|
public int getDrops()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -6,11 +6,39 @@ import net.minecraft.world.World;
|
|||||||
|
|
||||||
public interface IDimDoor
|
public interface IDimDoor
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* A function to enter a dim door and traverse its link, called when a player collides with an open door
|
||||||
|
* @param world
|
||||||
|
* @param x
|
||||||
|
* @param y
|
||||||
|
* @param z
|
||||||
|
* @param entity
|
||||||
|
*/
|
||||||
public void enterDimDoor(World world, int x, int y, int z, Entity entity);
|
public void enterDimDoor(World world, int x, int y, int z, Entity entity);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* called when a door is placed to determine how it will place a link
|
||||||
|
* @param world
|
||||||
|
* @param x
|
||||||
|
* @param y
|
||||||
|
* @param z
|
||||||
|
*/
|
||||||
public void placeLink(World world, int x, int y, int z);
|
public void placeLink(World world, int x, int y, int z);
|
||||||
|
|
||||||
public int getDrops();
|
public int getDrops();
|
||||||
|
|
||||||
|
public int getDoorItem();
|
||||||
|
|
||||||
public TileEntity initDoorTE(World world, int x, int y, int z);
|
public TileEntity initDoorTE(World world, int x, int y, int z);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* checks if any of this doors blocks are overlapping with a rift
|
||||||
|
* @param world
|
||||||
|
* @param x
|
||||||
|
* @param y
|
||||||
|
* @param z
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isDoorOnRift(World world, int x, int y, int z);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package StevenDimDoors.mod_pocketDim.blocks;
|
||||||
|
|
||||||
|
import net.minecraft.block.material.Material;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
|
|
||||||
|
public class PersonalDimDoor extends BaseDimDoor
|
||||||
|
{
|
||||||
|
|
||||||
|
public PersonalDimDoor(int blockID, Material material, DDProperties properties)
|
||||||
|
{
|
||||||
|
super(blockID, material, properties);
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void placeLink(World world, int x, int y, int z)
|
||||||
|
{
|
||||||
|
if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID)
|
||||||
|
{
|
||||||
|
NewDimData dimension = PocketManager.getDimensionData(world);
|
||||||
|
DimLink link = dimension.getLink(x, y, z);
|
||||||
|
if (link == null)
|
||||||
|
{
|
||||||
|
dimension.createLink(x, y, z, LinkType.PERSONAL, world.getBlockMetadata(x, y - 1, z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDrops()
|
||||||
|
{
|
||||||
|
return mod_pocketDim.itemQuartzDoor.itemID;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDoorItem()
|
||||||
|
{
|
||||||
|
return mod_pocketDim.itemPersonalDoor.itemID;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,23 +2,28 @@ package StevenDimDoors.mod_pocketDim.blocks;
|
|||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
|
import cpw.mods.fml.relauncher.Side;
|
||||||
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockTrapDoor;
|
import net.minecraft.block.BlockTrapDoor;
|
||||||
import net.minecraft.block.ITileEntityProvider;
|
import net.minecraft.block.ITileEntityProvider;
|
||||||
import net.minecraft.block.material.Material;
|
import net.minecraft.block.material.Material;
|
||||||
import net.minecraft.client.renderer.texture.IconRegister;
|
import net.minecraft.client.renderer.texture.IconRegister;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DDTeleporter;
|
import StevenDimDoors.mod_pocketDim.core.DDTeleporter;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
|
import StevenDimDoors.mod_pocketDim.items.ItemDDKey;
|
||||||
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityTransTrapdoor;
|
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityTransTrapdoor;
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntityProvider
|
public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntityProvider
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -41,18 +46,66 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntit
|
|||||||
enterDimDoor(world, x, y, z, entity);
|
enterDimDoor(world, x, y, z, entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean checkCanOpen(World world, int x, int y, int z)
|
||||||
|
{
|
||||||
|
return this.checkCanOpen(world, x, y, z, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkCanOpen(World world, int x, int y, int z, EntityPlayer player)
|
||||||
|
{
|
||||||
|
DimLink link = PocketManager.getLink( x, y, z, world);
|
||||||
|
if(link==null||player==null)
|
||||||
|
{
|
||||||
|
return link==null;
|
||||||
|
}
|
||||||
|
if(!link.getLockState())
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(ItemStack item : player.inventory.mainInventory)
|
||||||
|
{
|
||||||
|
if(item != null)
|
||||||
|
{
|
||||||
|
if(item.getItem() instanceof ItemDDKey)
|
||||||
|
{
|
||||||
|
if(link.tryToOpen(item))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
|
||||||
|
{
|
||||||
|
if(this.checkCanOpen(par1World, par2, par3, par4, par5EntityPlayer))
|
||||||
|
{
|
||||||
|
return super.onBlockActivated(par1World, par2, par3, par4, par5EntityPlayer, par6, par7, par8, par9);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onPoweredBlockChange(World par1World, int par2, int par3, int par4, boolean par5)
|
||||||
|
{
|
||||||
|
if(this.checkCanOpen(par1World, par2, par3, par4))
|
||||||
|
{
|
||||||
|
super.onPoweredBlockChange(par1World, par2, par3, par4, par5);
|
||||||
|
}
|
||||||
|
}
|
||||||
@Override
|
@Override
|
||||||
public void enterDimDoor(World world, int x, int y, int z, Entity entity)
|
public void enterDimDoor(World world, int x, int y, int z, Entity entity)
|
||||||
{
|
{
|
||||||
if (!world.isRemote && isTrapdoorOpen(world.getBlockMetadata(x, y, z)))
|
if (!world.isRemote && isTrapdoorOpen(world.getBlockMetadata(x, y, z)))
|
||||||
{
|
{
|
||||||
this.onPoweredBlockChange(world, x, y, z, false);
|
|
||||||
|
|
||||||
DimLink link = PocketManager.getLink(x, y, z, world);
|
DimLink link = PocketManager.getLink(x, y, z, world);
|
||||||
if (link != null)
|
if (link != null)
|
||||||
{
|
{
|
||||||
DDTeleporter.traverseDimDoor(world, link, entity,this);
|
DDTeleporter.traverseDimDoor(world, link, entity,this);
|
||||||
}
|
}
|
||||||
|
super.onPoweredBlockChange(world, x, y, z, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,14 +114,6 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntit
|
|||||||
{
|
{
|
||||||
this.placeLink(world, x, y, z);
|
this.placeLink(world, x, y, z);
|
||||||
world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world));
|
world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world));
|
||||||
this.updateAttachedTile(world, x, y, z);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateTick(World world, int x, int y, int z, Random random)
|
|
||||||
{
|
|
||||||
TileEntityTransTrapdoor tile = (TileEntityTransTrapdoor) world.getBlockTileEntity(x, y, z);
|
|
||||||
tile.hasRift = PocketManager.getLink(x, y, z, world) != null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -77,41 +122,43 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntit
|
|||||||
return new TileEntityTransTrapdoor();
|
return new TileEntityTransTrapdoor();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateAttachedTile(World world, int x, int y, int z)
|
|
||||||
{
|
|
||||||
TileEntity tile = world.getBlockTileEntity(x, y, z);
|
|
||||||
if (tile instanceof TileEntityTransTrapdoor)
|
|
||||||
{
|
|
||||||
TileEntityTransTrapdoor trapdoorTile = (TileEntityTransTrapdoor) tile;
|
|
||||||
trapdoorTile.hasRift = (PocketManager.getLink(x, y, z, world) != null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void placeLink(World world, int x, int y, int z)
|
public void placeLink(World world, int x, int y, int z)
|
||||||
{
|
{
|
||||||
if (!world.isRemote)
|
if (!world.isRemote)
|
||||||
{
|
{
|
||||||
NewDimData dimension = PocketManager.getDimensionData(world);
|
NewDimData dimension = PocketManager.createDimensionData(world);
|
||||||
DimLink link = dimension.getLink(x, y, z);
|
DimLink link = dimension.getLink(x, y, z);
|
||||||
if (link == null && dimension.isPocketDimension())
|
if (link == null && dimension.isPocketDimension())
|
||||||
{
|
{
|
||||||
dimension.createLink(x, y, z, LinkTypes.UNSAFE_EXIT,0);
|
dimension.createLink(x, y, z, LinkType.UNSAFE_EXIT,0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SideOnly(Side.CLIENT)
|
||||||
|
public int idPicked(World world, int x, int y, int z)
|
||||||
|
{
|
||||||
|
return this.getDoorItem();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int idDropped(int metadata, Random random, int fortuneLevel)
|
public int idDropped(int metadata, Random random, int fortuneLevel)
|
||||||
{
|
{
|
||||||
return getDrops();
|
return this.getDrops();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDoorItem()
|
||||||
|
{
|
||||||
|
return mod_pocketDim.transTrapdoor.blockID;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getDrops()
|
public int getDrops()
|
||||||
{
|
{
|
||||||
return Block.trapdoor.blockID;
|
return Block.trapdoor.blockID;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isTrapdoorSetLow(int metadata)
|
public static boolean isTrapdoorSetLow(int metadata)
|
||||||
@@ -126,4 +173,24 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntit
|
|||||||
world.setBlockTileEntity(x, y, z, te);
|
world.setBlockTileEntity(x, y, z, te);
|
||||||
return te;
|
return te;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isDoorOnRift(World world, int x, int y, int z)
|
||||||
|
{
|
||||||
|
return PocketManager.getLink(x, y, z, world)!=null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void breakBlock(World world, int x, int y, int z, int oldBlockID, int oldMeta)
|
||||||
|
{
|
||||||
|
// This function runs on the server side after a block is replaced
|
||||||
|
// We MUST call super.breakBlock() since it involves removing tile entities
|
||||||
|
super.breakBlock(world, x, y, z, oldBlockID, oldMeta);
|
||||||
|
|
||||||
|
// Schedule rift regeneration for this block if it was replaced
|
||||||
|
if (world.getBlockId(x, y, z) != oldBlockID)
|
||||||
|
{
|
||||||
|
mod_pocketDim.riftRegenerator.scheduleFastRegeneration(x, y, z, world);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -9,7 +9,7 @@ import net.minecraft.world.World;
|
|||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DDTeleporter;
|
import StevenDimDoors.mod_pocketDim.core.DDTeleporter;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
|
|
||||||
@@ -64,15 +64,21 @@ public class TransientDoor extends BaseDimDoor
|
|||||||
{
|
{
|
||||||
if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID)
|
if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID)
|
||||||
{
|
{
|
||||||
NewDimData dimension = PocketManager.getDimensionData(world);
|
NewDimData dimension = PocketManager.createDimensionData(world);
|
||||||
DimLink link = dimension.getLink(x, y, z);
|
DimLink link = dimension.getLink(x, y, z);
|
||||||
if (link == null && dimension.isPocketDimension())
|
if (link == null && dimension.isPocketDimension())
|
||||||
{
|
{
|
||||||
dimension.createLink(x, y, z, LinkTypes.SAFE_EXIT,world.getBlockMetadata(x, y - 1, z));
|
dimension.createLink(x, y, z, LinkType.SAFE_EXIT,world.getBlockMetadata(x, y - 1, z));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDoorItem()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getDrops()
|
public int getDrops()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,8 +3,9 @@ package StevenDimDoors.mod_pocketDim.blocks;
|
|||||||
import net.minecraft.block.material.Material;
|
import net.minecraft.block.material.Material;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
|
|
||||||
@@ -21,9 +22,16 @@ public class UnstableDoor extends BaseDimDoor
|
|||||||
if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID)
|
if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID)
|
||||||
{
|
{
|
||||||
NewDimData dimension = PocketManager.getDimensionData(world);
|
NewDimData dimension = PocketManager.getDimensionData(world);
|
||||||
dimension.createLink(x, y, z, LinkTypes.RANDOM,world.getBlockMetadata(x, y - 1, z));
|
dimension.createLink(x, y, z, LinkType.RANDOM,world.getBlockMetadata(x, y - 1, z));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDoorItem()
|
||||||
|
{
|
||||||
|
return mod_pocketDim.itemUnstableDoor.itemID;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getDrops()
|
public int getDrops()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,13 +3,13 @@ package StevenDimDoors.mod_pocketDim.blocks;
|
|||||||
import net.minecraft.block.material.Material;
|
import net.minecraft.block.material.Material;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public class WarpDoor extends BaseDimDoor
|
public class WarpDoor extends BaseDimDoor
|
||||||
{
|
{
|
||||||
public WarpDoor(int blockID, Material material, DDProperties properties)
|
public WarpDoor(int blockID, Material material, DDProperties properties)
|
||||||
@@ -22,15 +22,21 @@ public class WarpDoor extends BaseDimDoor
|
|||||||
{
|
{
|
||||||
if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID)
|
if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID)
|
||||||
{
|
{
|
||||||
NewDimData dimension = PocketManager.getDimensionData(world);
|
NewDimData dimension = PocketManager.createDimensionData(world);
|
||||||
DimLink link = dimension.getLink(x, y, z);
|
DimLink link = dimension.getLink(x, y, z);
|
||||||
if (link == null && dimension.isPocketDimension())
|
if (link == null && dimension.isPocketDimension())
|
||||||
{
|
{
|
||||||
dimension.createLink(x, y, z, LinkTypes.SAFE_EXIT,world.getBlockMetadata(x, y - 1, z));
|
dimension.createLink(x, y, z, LinkType.SAFE_EXIT,world.getBlockMetadata(x, y - 1, z));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDoorItem()
|
||||||
|
{
|
||||||
|
return mod_pocketDim.itemWarpDoor.itemID;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getDrops()
|
public int getDrops()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,20 +1,18 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.commands;
|
package StevenDimDoors.mod_pocketDim.commands;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.util.MathHelper;
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
import StevenDimDoors.mod_pocketDim.dungeon.DungeonData;
|
import StevenDimDoors.mod_pocketDim.dungeon.DungeonData;
|
||||||
import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper;
|
import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper;
|
||||||
import StevenDimDoors.mod_pocketDim.world.PocketBuilder;
|
import StevenDimDoors.mod_pocketDim.world.PocketBuilder;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
import net.minecraft.command.ICommandSender;
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
|
||||||
import net.minecraft.util.MathHelper;
|
|
||||||
|
|
||||||
public class CommandCreateDungeonRift extends DDCommandBase
|
public class CommandCreateDungeonRift extends DDCommandBase
|
||||||
{
|
{
|
||||||
private static CommandCreateDungeonRift instance = null;
|
private static CommandCreateDungeonRift instance = null;
|
||||||
@@ -38,10 +36,6 @@ public class CommandCreateDungeonRift extends DDCommandBase
|
|||||||
NewDimData dimension;
|
NewDimData dimension;
|
||||||
DungeonHelper dungeonHelper = DungeonHelper.instance();
|
DungeonHelper dungeonHelper = DungeonHelper.instance();
|
||||||
|
|
||||||
if (sender.worldObj.isRemote)
|
|
||||||
{
|
|
||||||
return DDCommandResult.SUCCESS;
|
|
||||||
}
|
|
||||||
if (command.length == 0)
|
if (command.length == 0)
|
||||||
{
|
{
|
||||||
return DDCommandResult.TOO_FEW_ARGUMENTS;
|
return DDCommandResult.TOO_FEW_ARGUMENTS;
|
||||||
@@ -68,7 +62,8 @@ public class CommandCreateDungeonRift extends DDCommandBase
|
|||||||
if (result != null)
|
if (result != null)
|
||||||
{
|
{
|
||||||
dimension = PocketManager.getDimensionData(sender.worldObj);
|
dimension = PocketManager.getDimensionData(sender.worldObj);
|
||||||
link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation);
|
link = dimension.createLink(x, y + 1, z, LinkType.DUNGEON, orientation);
|
||||||
|
|
||||||
if (PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, result))
|
if (PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, result))
|
||||||
{
|
{
|
||||||
// Create a rift to our selected dungeon and notify the player
|
// Create a rift to our selected dungeon and notify the player
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.commands;
|
package StevenDimDoors.mod_pocketDim.commands;
|
||||||
|
|
||||||
import net.minecraft.command.ICommandSender;
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper;
|
import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper;
|
||||||
|
|
||||||
@@ -24,26 +23,21 @@ public class CommandCreatePocket extends DDCommandBase
|
|||||||
@Override
|
@Override
|
||||||
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
||||||
{
|
{
|
||||||
//TODO: Some commands have isRemote checks, some do not. Why? Can commands even run locally anyway?
|
if (command.length > 0)
|
||||||
//What does it mean when you run a command locally? ~SenseiKiwi
|
|
||||||
|
|
||||||
if (!sender.worldObj.isRemote)
|
|
||||||
{
|
{
|
||||||
if (command.length > 0)
|
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
||||||
{
|
|
||||||
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Place a door leading to a pocket dimension where the player is standing.
|
|
||||||
//The pocket dimension will serve as a room for the player to build a dungeon.
|
|
||||||
int x = (int) sender.posX;
|
|
||||||
int y = (int) sender.posY;
|
|
||||||
int z = (int) sender.posZ;
|
|
||||||
DungeonHelper.instance().createCustomDungeonDoor(sender.worldObj, x, y, z);
|
|
||||||
|
|
||||||
//Notify the player
|
|
||||||
sendChat(sender,("Created a door to a pocket dimension. Please build your dungeon there."));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Place a door leading to a pocket dimension where the player is standing.
|
||||||
|
//The pocket dimension will serve as a room for the player to build a dungeon.
|
||||||
|
int x = (int) sender.posX;
|
||||||
|
int y = (int) sender.posY;
|
||||||
|
int z = (int) sender.posZ;
|
||||||
|
DungeonHelper.instance().createCustomDungeonDoor(sender.worldObj, x, y, z);
|
||||||
|
|
||||||
|
//Notify the player
|
||||||
|
sendChat(sender, "Created a door to a pocket dimension. Please build your dungeon there.");
|
||||||
|
|
||||||
return DDCommandResult.SUCCESS;
|
return DDCommandResult.SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,7 +8,7 @@ import net.minecraft.entity.player.EntityPlayer;
|
|||||||
import net.minecraft.util.MathHelper;
|
import net.minecraft.util.MathHelper;
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
import StevenDimDoors.mod_pocketDim.dungeon.DungeonData;
|
import StevenDimDoors.mod_pocketDim.dungeon.DungeonData;
|
||||||
@@ -39,10 +39,6 @@ public class CommandCreateRandomRift extends DDCommandBase
|
|||||||
NewDimData dimension;
|
NewDimData dimension;
|
||||||
DungeonHelper dungeonHelper = DungeonHelper.instance();
|
DungeonHelper dungeonHelper = DungeonHelper.instance();
|
||||||
|
|
||||||
if (sender.worldObj.isRemote)
|
|
||||||
{
|
|
||||||
return DDCommandResult.SUCCESS;
|
|
||||||
}
|
|
||||||
if (command.length > 1)
|
if (command.length > 1)
|
||||||
{
|
{
|
||||||
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
||||||
@@ -58,7 +54,8 @@ public class CommandCreateRandomRift extends DDCommandBase
|
|||||||
if (command.length == 0)
|
if (command.length == 0)
|
||||||
{
|
{
|
||||||
dimension = PocketManager.getDimensionData(sender.worldObj);
|
dimension = PocketManager.getDimensionData(sender.worldObj);
|
||||||
link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation);
|
link = dimension.createLink(x, y + 1, z, LinkType.DUNGEON, orientation);
|
||||||
|
|
||||||
sender.worldObj.setBlock(x, y + 1, z,mod_pocketDim.blockRift.blockID, 0, 3);
|
sender.worldObj.setBlock(x, y + 1, z,mod_pocketDim.blockRift.blockID, 0, 3);
|
||||||
sendChat(sender, "Created a rift to a random dungeon.");
|
sendChat(sender, "Created a rift to a random dungeon.");
|
||||||
}
|
}
|
||||||
@@ -74,7 +71,8 @@ public class CommandCreateRandomRift extends DDCommandBase
|
|||||||
if (result != null)
|
if (result != null)
|
||||||
{
|
{
|
||||||
dimension = PocketManager.getDimensionData(sender.worldObj);
|
dimension = PocketManager.getDimensionData(sender.worldObj);
|
||||||
link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation);
|
link = dimension.createLink(x, y + 1, z, LinkType.DUNGEON, orientation);
|
||||||
|
|
||||||
if (PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, result))
|
if (PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, result))
|
||||||
{
|
{
|
||||||
// Create a rift to our selected dungeon and notify the player
|
// Create a rift to our selected dungeon and notify the player
|
||||||
@@ -118,9 +116,6 @@ public class CommandCreateRandomRift extends DDCommandBase
|
|||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
else
|
return matches.get( random.nextInt(matches.size()) );
|
||||||
{
|
|
||||||
return matches.get( random.nextInt(matches.size()) );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.commands;
|
|
||||||
|
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import net.minecraft.command.ICommandSender;
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
|
||||||
import net.minecraft.world.World;
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public class CommandDeleteAllLinks extends DDCommandBase
|
|
||||||
{
|
|
||||||
private static CommandDeleteAllLinks instance = null;
|
|
||||||
|
|
||||||
private CommandDeleteAllLinks()
|
|
||||||
{
|
|
||||||
super("dd-deletelinks", "???");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static CommandDeleteAllLinks instance()
|
|
||||||
{
|
|
||||||
if (instance == null)
|
|
||||||
instance = new CommandDeleteAllLinks();
|
|
||||||
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
|
||||||
{
|
|
||||||
int linksRemoved=0;
|
|
||||||
int targetDim;
|
|
||||||
boolean shouldGo= true;
|
|
||||||
|
|
||||||
if(command.length==1)
|
|
||||||
{
|
|
||||||
targetDim = parseInt(sender, command[0]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
targetDim=0;
|
|
||||||
shouldGo=false;
|
|
||||||
sendChat(sender, ("Error-Invalid argument, delete_all_links <targetDimID>"));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(shouldGo)
|
|
||||||
{
|
|
||||||
|
|
||||||
NewDimData dim = PocketManager.getDimensionData(targetDim);
|
|
||||||
ArrayList<DimLink> linksInDim = dim.getAllLinks();
|
|
||||||
|
|
||||||
for (DimLink link : linksInDim)
|
|
||||||
{
|
|
||||||
World targetWorld = PocketManager.loadDimension(targetDim);
|
|
||||||
targetWorld.setBlock(link.source().getX(), link.source().getY(), link.source().getZ(), 0);
|
|
||||||
dim.deleteLink(link);
|
|
||||||
//TODO Probably should check what the block is, but thats annoying so Ill do it later.
|
|
||||||
|
|
||||||
linksRemoved++;
|
|
||||||
}
|
|
||||||
sendChat(sender,("Removed " + linksRemoved + " links."));
|
|
||||||
|
|
||||||
}
|
|
||||||
return DDCommandResult.SUCCESS; //TEMPORARY HACK
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,22 +2,21 @@ package StevenDimDoors.mod_pocketDim.commands;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import net.minecraft.command.ICommandSender;
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public class CommandDeleteRifts extends DDCommandBase
|
public class CommandDeleteRifts extends DDCommandBase
|
||||||
{
|
{
|
||||||
private static CommandDeleteRifts instance = null;
|
private static CommandDeleteRifts instance = null;
|
||||||
|
|
||||||
private CommandDeleteRifts()
|
private CommandDeleteRifts()
|
||||||
{
|
{
|
||||||
super("dd-???", "???");
|
super("dd-deleterifts", "[dimension number]");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CommandDeleteRifts instance()
|
public static CommandDeleteRifts instance()
|
||||||
@@ -31,47 +30,64 @@ public class CommandDeleteRifts extends DDCommandBase
|
|||||||
@Override
|
@Override
|
||||||
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
||||||
{
|
{
|
||||||
int linksRemoved=0;
|
int linksRemoved = 0;
|
||||||
int targetDim;
|
int targetDimension;
|
||||||
boolean shouldGo= true;
|
|
||||||
|
|
||||||
if(command.length==1)
|
if (command.length > 1)
|
||||||
{
|
{
|
||||||
targetDim = parseInt(sender, command[0]);
|
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
||||||
|
}
|
||||||
|
if (command.length == 0)
|
||||||
|
{
|
||||||
|
targetDimension = sender.worldObj.provider.dimensionId;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
targetDim=0;
|
try
|
||||||
shouldGo=false;
|
{
|
||||||
sendChat(sender,("Error-Invalid argument, delete_all_links <targetDimID>"));
|
targetDimension = Integer.parseInt(command[0]);
|
||||||
|
}
|
||||||
|
catch (NumberFormatException e)
|
||||||
|
{
|
||||||
|
return DDCommandResult.INVALID_DIMENSION_ID;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(shouldGo)
|
World world = PocketManager.loadDimension(targetDimension);
|
||||||
|
if (world == null)
|
||||||
{
|
{
|
||||||
|
return DDCommandResult.UNREGISTERED_DIMENSION;
|
||||||
NewDimData dim = PocketManager.getDimensionData(targetDim);
|
|
||||||
ArrayList<DimLink> linksInDim = dim.getAllLinks();
|
|
||||||
|
|
||||||
for (DimLink link : linksInDim)
|
|
||||||
{
|
|
||||||
World targetWorld = PocketManager.loadDimension(targetDim);
|
|
||||||
|
|
||||||
if(!mod_pocketDim.blockRift.isBlockImmune(sender.worldObj,link.source().getX(), link.source().getY(), link.source().getZ())||
|
|
||||||
(targetWorld.getBlockId(link.source().getX(), link.source().getY(), link.source().getZ())==mod_pocketDim.blockRift.blockID))
|
|
||||||
{
|
|
||||||
linksRemoved++;
|
|
||||||
targetWorld.setBlock(link.source().getX(), link.source().getY(), link.source().getZ(), 0);
|
|
||||||
dim.deleteLink(link);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
//TODO Probably should check what the block is, but thats annoying so Ill do it later.
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
sendChat(sender,("Removed " + linksRemoved + " links."));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
return DDCommandResult.SUCCESS; //TEMPORARY HACK
|
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int z;
|
||||||
|
Point4D location;
|
||||||
|
NewDimData dimension = PocketManager.createDimensionData(world);
|
||||||
|
ArrayList<DimLink> links = dimension.getAllLinks();
|
||||||
|
for (DimLink link : links)
|
||||||
|
{
|
||||||
|
location = link.source();
|
||||||
|
x = location.getX();
|
||||||
|
y = location.getY();
|
||||||
|
z = location.getZ();
|
||||||
|
if (world.getBlockId(x, y, z) == mod_pocketDim.blockRift.blockID)
|
||||||
|
{
|
||||||
|
// Remove the rift and its link
|
||||||
|
world.setBlockToAir(x, y, z);
|
||||||
|
dimension.deleteLink(link);
|
||||||
|
linksRemoved++;
|
||||||
|
}
|
||||||
|
else if (!mod_pocketDim.blockRift.isBlockImmune(world, x, y, z))
|
||||||
|
{
|
||||||
|
// If a block is not immune, then it must not be a DD block.
|
||||||
|
// The link would regenerate into a rift eventually.
|
||||||
|
// We only need to remove the link.
|
||||||
|
dimension.deleteLink(link);
|
||||||
|
linksRemoved++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sendChat(sender, "Removed " + linksRemoved + " links.");
|
||||||
|
return DDCommandResult.SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,6 @@ package StevenDimDoors.mod_pocketDim.commands;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
import net.minecraft.command.ICommandSender;
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper;
|
import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper;
|
||||||
@@ -60,66 +59,51 @@ public class CommandExportDungeon extends DDCommandBase
|
|||||||
//Export the schematic
|
//Export the schematic
|
||||||
return exportDungeon(sender, command[0]);
|
return exportDungeon(sender, command[0]);
|
||||||
}
|
}
|
||||||
else
|
//The schematic name contains illegal characters. Inform the user.
|
||||||
{
|
return new DDCommandResult("Error: Invalid schematic name. Please use only letters, numbers, dashes, and underscores.");
|
||||||
//The schematic name contains illegal characters. Inform the user.
|
|
||||||
return new DDCommandResult("Error: Invalid schematic name. Please use only letters, numbers, dashes, and underscores.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//The command is malformed in some way. Assume that the user meant to use
|
|
||||||
//the 3-argument version and report an error.
|
|
||||||
return DDCommandResult.TOO_FEW_ARGUMENTS;
|
|
||||||
}
|
}
|
||||||
|
//The command is malformed in some way. Assume that the user meant to use
|
||||||
|
//the 3-argument version and report an error.
|
||||||
|
return DDCommandResult.TOO_FEW_ARGUMENTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
//The user must have used the 3-argument version of this command
|
//The user must have used the 3-argument version of this command
|
||||||
//TODO: Why do we check remoteness here but not before? And why not for the other export case?
|
//TODO: This validation should be in DungeonHelper or in another class. We should move it
|
||||||
//Something feels wrong... ~SenseiKiwi
|
//during the save file format rewrite. ~SenseiKiwi
|
||||||
if (!sender.worldObj.isRemote)
|
|
||||||
|
if (!dungeonHelper.validateDungeonType(command[0], dungeonHelper.getDungeonPack("ruins")))
|
||||||
{
|
{
|
||||||
//TODO: This validation should be in DungeonHelper or in another class. We should move it
|
return new DDCommandResult("Error: Invalid dungeon type. Please use one of the existing types.");
|
||||||
//during the save file format rewrite. ~SenseiKiwi
|
}
|
||||||
|
if (!DungeonHelper.DUNGEON_NAME_PATTERN.matcher(command[1]).matches())
|
||||||
if (!dungeonHelper.validateDungeonType(command[0], dungeonHelper.getDungeonPack("ruins")))
|
{
|
||||||
{
|
return new DDCommandResult("Error: Invalid dungeon name. Please use only letters, numbers, and dashes.");
|
||||||
return new DDCommandResult("Error: Invalid dungeon type. Please use one of the existing types.");
|
}
|
||||||
}
|
if (!command[2].equalsIgnoreCase("open") && !command[2].equalsIgnoreCase("closed"))
|
||||||
if (!DungeonHelper.DUNGEON_NAME_PATTERN.matcher(command[1]).matches())
|
{
|
||||||
{
|
return new DDCommandResult("Error: Please specify whether the dungeon is 'open' or 'closed'.");
|
||||||
return new DDCommandResult("Error: Invalid dungeon name. Please use only letters, numbers, and dashes.");
|
|
||||||
}
|
|
||||||
if (!command[2].equalsIgnoreCase("open") && !command[2].equalsIgnoreCase("closed"))
|
|
||||||
{
|
|
||||||
return new DDCommandResult("Error: Please specify whether the dungeon is 'open' or 'closed'.");
|
|
||||||
}
|
|
||||||
|
|
||||||
//If there are no more arguments, export the dungeon.
|
|
||||||
if (command.length == 3)
|
|
||||||
{
|
|
||||||
return exportDungeon(sender, join(command, "_", 0, 3));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//Validate the weight argument
|
|
||||||
try
|
|
||||||
{
|
|
||||||
int weight = Integer.parseInt(command[3]);
|
|
||||||
if (weight >= DungeonHelper.MIN_DUNGEON_WEIGHT && weight <= DungeonHelper.MAX_DUNGEON_WEIGHT)
|
|
||||||
{
|
|
||||||
return exportDungeon(sender, join(command, "_", 0, 4));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
//If we've reached this point, then we must have an invalid weight.
|
|
||||||
return new DDCommandResult("Invalid dungeon weight. Please specify a weight between "
|
|
||||||
+ DungeonHelper.MIN_DUNGEON_WEIGHT + " and " + DungeonHelper.MAX_DUNGEON_WEIGHT + ", inclusive.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return DDCommandResult.SUCCESS;
|
//If there are no more arguments, export the dungeon.
|
||||||
|
if (command.length == 3)
|
||||||
|
{
|
||||||
|
return exportDungeon(sender, join(command, "_", 0, 3));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Validate the weight argument
|
||||||
|
try
|
||||||
|
{
|
||||||
|
int weight = Integer.parseInt(command[3]);
|
||||||
|
if (weight >= DungeonHelper.MIN_DUNGEON_WEIGHT && weight <= DungeonHelper.MAX_DUNGEON_WEIGHT)
|
||||||
|
{
|
||||||
|
return exportDungeon(sender, join(command, "_", 0, 4));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) { }
|
||||||
|
|
||||||
|
//If we've reached this point, then we must have an invalid weight.
|
||||||
|
return new DDCommandResult("Invalid dungeon weight. Please specify a weight between "
|
||||||
|
+ DungeonHelper.MIN_DUNGEON_WEIGHT + " and " + DungeonHelper.MAX_DUNGEON_WEIGHT + ", inclusive.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static DDCommandResult exportDungeon(EntityPlayer player, String name)
|
private static DDCommandResult exportDungeon(EntityPlayer player, String name)
|
||||||
@@ -137,10 +121,7 @@ public class CommandExportDungeon extends DDCommandBase
|
|||||||
dungeonHelper.registerDungeon(exportPath, dungeonHelper.getDungeonPack("ruins"), false, true);
|
dungeonHelper.registerDungeon(exportPath, dungeonHelper.getDungeonPack("ruins"), false, true);
|
||||||
return DDCommandResult.SUCCESS;
|
return DDCommandResult.SUCCESS;
|
||||||
}
|
}
|
||||||
else
|
return new DDCommandResult("Error: Failed to save dungeon schematic!");
|
||||||
{
|
|
||||||
return new DDCommandResult("Error: Failed to save dungeon schematic!");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String join(String[] source, String delimiter, int start, int end)
|
private static String join(String[] source, String delimiter, int start, int end)
|
||||||
|
|||||||
@@ -31,10 +31,6 @@ public class CommandListDungeons extends DDCommandBase
|
|||||||
int pageCount;
|
int pageCount;
|
||||||
ArrayList<String> dungeonNames;
|
ArrayList<String> dungeonNames;
|
||||||
|
|
||||||
if (sender.worldObj.isRemote)
|
|
||||||
{
|
|
||||||
return DDCommandResult.SUCCESS;
|
|
||||||
}
|
|
||||||
if (command.length > 1)
|
if (command.length > 1)
|
||||||
{
|
{
|
||||||
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
||||||
|
|||||||
@@ -1,16 +1,14 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.commands;
|
package StevenDimDoors.mod_pocketDim.commands;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
import net.minecraft.command.ICommandSender;
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraftforge.common.DimensionManager;
|
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
import StevenDimDoors.mod_pocketDim.core.DimensionType;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public class CommandResetDungeons extends DDCommandBase
|
public class CommandResetDungeons extends DDCommandBase
|
||||||
{
|
{
|
||||||
private static CommandResetDungeons instance = null;
|
private static CommandResetDungeons instance = null;
|
||||||
@@ -31,61 +29,78 @@ public class CommandResetDungeons extends DDCommandBase
|
|||||||
@Override
|
@Override
|
||||||
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
||||||
{
|
{
|
||||||
if(sender.worldObj.isRemote)
|
|
||||||
{
|
|
||||||
return DDCommandResult.SUCCESS;
|
|
||||||
}
|
|
||||||
if (command.length > 0)
|
if (command.length > 0)
|
||||||
{
|
{
|
||||||
return DDCommandResult.TOO_FEW_ARGUMENTS;
|
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dungeonCount = 0;
|
int id;
|
||||||
int resetCount = 0;
|
int resetCount = 0;
|
||||||
ArrayList<Integer> dimsToDelete = new ArrayList<Integer>();
|
int dungeonCount = 0;
|
||||||
ArrayList<Integer> dimsToFix = new ArrayList<Integer>();
|
HashSet<Integer> deletedDimensions = new HashSet<Integer>();
|
||||||
|
ArrayList<NewDimData> loadedDungeons = new ArrayList<NewDimData>();
|
||||||
|
|
||||||
for (NewDimData data : PocketManager.getDimensions())
|
// Copy the list of dimensions to iterate over the copy. Otherwise,
|
||||||
|
// we would trigger an exception by modifying the original list.
|
||||||
|
ArrayList<NewDimData> dimensions = new ArrayList<NewDimData>();
|
||||||
|
for (NewDimData dimension : PocketManager.getDimensions())
|
||||||
{
|
{
|
||||||
|
|
||||||
if(DimensionManager.getWorld(data.id())==null&&data.isDungeon())
|
dimensions.add(dimension);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterate over the list of dimensions. Check which ones are dungeons.
|
||||||
|
// If a dungeon is found, try to delete it. If it can't be deleted,
|
||||||
|
// then it must be loaded and needs to be updated to prevent bugs.
|
||||||
|
for (NewDimData dimension : dimensions)
|
||||||
|
{
|
||||||
|
if (dimension.type() == DimensionType.DUNGEON)
|
||||||
{
|
{
|
||||||
resetCount++;
|
|
||||||
dungeonCount++;
|
dungeonCount++;
|
||||||
dimsToDelete.add(data.id());
|
id = dimension.id();
|
||||||
}
|
if (PocketManager.deletePocket(dimension, true))
|
||||||
else if(data.isDungeon())
|
|
||||||
{
|
|
||||||
dimsToFix.add(data.id());
|
|
||||||
dungeonCount++;
|
|
||||||
for(DimLink link : data.links())
|
|
||||||
{
|
{
|
||||||
if(link.linkType()==LinkTypes.REVERSE)
|
resetCount++;
|
||||||
|
deletedDimensions.add(id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
loadedDungeons.add(dimension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modify the loaded dungeons to prevent bugs
|
||||||
|
for (NewDimData dungeon : loadedDungeons)
|
||||||
|
{
|
||||||
|
// Find top-most loaded dungeons and update their parents.
|
||||||
|
// They will automatically update their children.
|
||||||
|
// Dungeons with non-dungeon parents don't need to be fixed.
|
||||||
|
if (dungeon.parent() == null)
|
||||||
|
{
|
||||||
|
dungeon.setParentToRoot();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Links to any deleted dungeons must be replaced
|
||||||
|
for (DimLink link : dungeon.links())
|
||||||
|
{
|
||||||
|
if (link.hasDestination() && deletedDimensions.contains(link.destination().getDimension()))
|
||||||
|
{
|
||||||
|
|
||||||
|
if (link.linkType() == LinkType.DUNGEON)
|
||||||
{
|
{
|
||||||
data.createLink(link.source(), LinkTypes.DUNGEON_EXIT, link.orientation());
|
dungeon.createLink(link.source(), LinkType.DUNGEON, link.orientation(), null);
|
||||||
}
|
}
|
||||||
if(link.linkType()==LinkTypes.DUNGEON)
|
else if (link.linkType() == LinkType.REVERSE)
|
||||||
{
|
{
|
||||||
data.createLink(link.source(), LinkTypes.DUNGEON, link.orientation());
|
dungeon.createLink(link.source(), LinkType.DUNGEON_EXIT, link.orientation(), null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(Integer dimID:dimsToDelete)
|
// Notify the user of the results
|
||||||
{
|
|
||||||
PocketManager.deletePocket(PocketManager.getDimensionData(dimID), true);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* temporary workaround
|
|
||||||
*/
|
|
||||||
for(Integer dimID: dimsToFix)
|
|
||||||
{
|
|
||||||
PocketManager.getDimensionData(dimID).setParentToRoot();
|
|
||||||
}
|
|
||||||
//TODO- for some reason the parent field of loaded dimenions get reset to null if I call .setParentToRoot() before I delete the pockets.
|
|
||||||
//TODO implement blackList
|
|
||||||
//Notify the user of the results
|
|
||||||
sendChat(sender,("Reset complete. " + resetCount + " out of " + dungeonCount + " dungeons were reset."));
|
sendChat(sender,("Reset complete. " + resetCount + " out of " + dungeonCount + " dungeons were reset."));
|
||||||
return DDCommandResult.SUCCESS;
|
return DDCommandResult.SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.commands;
|
package StevenDimDoors.mod_pocketDim.commands;
|
||||||
|
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.server.MinecraftServer;
|
||||||
|
import net.minecraft.world.World;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DDTeleporter;
|
import StevenDimDoors.mod_pocketDim.core.DDTeleporter;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
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 java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import net.minecraft.command.ICommandSender;
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
|
||||||
import net.minecraftforge.common.DimensionManager;
|
|
||||||
|
|
||||||
public class CommandTeleportPlayer extends DDCommandBase
|
public class CommandTeleportPlayer extends DDCommandBase
|
||||||
{
|
{
|
||||||
private static CommandTeleportPlayer instance = null;
|
private static CommandTeleportPlayer instance = null;
|
||||||
|
|
||||||
private CommandTeleportPlayer()
|
private CommandTeleportPlayer()
|
||||||
{
|
{
|
||||||
super("dd-tp", new String[] {"<Player Name> <Dimension ID> <X Coord> <Y Coord> <Z Coord>","<Player Name> <Dimension ID>"} );
|
super("dd-tp", new String[] {
|
||||||
|
"<player name> <dimension number>",
|
||||||
|
"<player name> <x> <y> <z>",
|
||||||
|
"<player name> <dimension number> <x> <y> <z>"} );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CommandTeleportPlayer instance()
|
public static CommandTeleportPlayer instance()
|
||||||
@@ -28,110 +28,119 @@ public class CommandTeleportPlayer extends DDCommandBase
|
|||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO- Change to accept variety of input, like just coords, just dim ID, or two player names.
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
||||||
{
|
{
|
||||||
EntityPlayer targetPlayer = sender;
|
int x;
|
||||||
int dimDestinationID = sender.worldObj.provider.dimensionId;
|
int y;
|
||||||
|
int z;
|
||||||
|
World world;
|
||||||
|
int dimensionID;
|
||||||
|
Point4D destination;
|
||||||
|
NewDimData dimension;
|
||||||
|
boolean checkOrientation;
|
||||||
|
EntityPlayer targetPlayer;
|
||||||
|
|
||||||
if(command.length == 5)
|
if (command.length < 2)
|
||||||
{
|
{
|
||||||
for(int i= 1; i <5;i++)
|
return DDCommandResult.TOO_FEW_ARGUMENTS;
|
||||||
{
|
|
||||||
if(!isInteger(command[i]))
|
|
||||||
{
|
|
||||||
return DDCommandResult.INVALID_ARGUMENTS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(sender.worldObj.getPlayerEntityByName(command[0])!=null) //Gets the targeted player
|
|
||||||
{
|
|
||||||
targetPlayer = sender.worldObj.getPlayerEntityByName(command[0]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return DDCommandResult.INVALID_ARGUMENTS;
|
|
||||||
}
|
|
||||||
dimDestinationID=Integer.parseInt(command[1]);//gets the target dim ID from the command string
|
|
||||||
|
|
||||||
if(!DimensionManager.isDimensionRegistered(dimDestinationID))
|
|
||||||
{
|
|
||||||
return DDCommandResult.INVALID_DIMENSION_ID;
|
|
||||||
}
|
|
||||||
|
|
||||||
PocketManager.loadDimension(dimDestinationID);
|
|
||||||
Point4D destination = new Point4D(Integer.parseInt(command[2]),Integer.parseInt(command[3]),Integer.parseInt(command[4]),dimDestinationID);
|
|
||||||
DDTeleporter.teleportEntity(targetPlayer, destination, false);
|
|
||||||
}
|
}
|
||||||
else if(command.length == 2 && isInteger(command[1]))
|
if (command.length > 5)
|
||||||
{
|
{
|
||||||
if(sender.worldObj.getPlayerEntityByName(command[0])!=null) //Gets the targeted player
|
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
||||||
{
|
|
||||||
targetPlayer = sender.worldObj.getPlayerEntityByName(command[0]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return DDCommandResult.INVALID_ARGUMENTS;
|
|
||||||
}
|
|
||||||
dimDestinationID=Integer.parseInt(command[1]);//gets the target dim ID from the command string
|
|
||||||
|
|
||||||
if(!DimensionManager.isDimensionRegistered(dimDestinationID))
|
|
||||||
{
|
|
||||||
return DDCommandResult.INVALID_DIMENSION_ID;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Point4D destination = PocketManager.getDimensionData(dimDestinationID).origin();
|
|
||||||
if(!PocketManager.getDimensionData(dimDestinationID).isPocketDimension())
|
|
||||||
{
|
|
||||||
destination = new Point4D(destination.getX(),PocketManager.loadDimension(dimDestinationID).getTopSolidOrLiquidBlock(
|
|
||||||
destination.getX(), destination.getZ()),
|
|
||||||
destination.getZ(),destination.getDimension());
|
|
||||||
}
|
|
||||||
DDTeleporter.teleportEntity(targetPlayer, destination, false);
|
|
||||||
}
|
}
|
||||||
else if(command.length == 1 && isInteger(command[0]))
|
if (command.length == 3)
|
||||||
{
|
|
||||||
|
|
||||||
targetPlayer = sender;
|
|
||||||
|
|
||||||
dimDestinationID=Integer.parseInt(command[0]);//gets the target dim ID from the command string
|
|
||||||
|
|
||||||
if(!DimensionManager.isDimensionRegistered(dimDestinationID))
|
|
||||||
{
|
|
||||||
return DDCommandResult.INVALID_DIMENSION_ID;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Point4D destination = PocketManager.getDimensionData(dimDestinationID).origin();
|
|
||||||
if(!PocketManager.getDimensionData(dimDestinationID).isPocketDimension())
|
|
||||||
{
|
|
||||||
destination = new Point4D(destination.getX(),PocketManager.loadDimension(dimDestinationID).getTopSolidOrLiquidBlock(
|
|
||||||
destination.getX(), destination.getZ()),
|
|
||||||
destination.getZ(),destination.getDimension());
|
|
||||||
}
|
|
||||||
DDTeleporter.teleportEntity(targetPlayer, destination, false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
return DDCommandResult.INVALID_ARGUMENTS;
|
return DDCommandResult.INVALID_ARGUMENTS;
|
||||||
}
|
}
|
||||||
|
// Check that all arguments after the username are integers
|
||||||
|
for (int k = 1; k < command.length; k++)
|
||||||
|
{
|
||||||
|
if (!isInteger(command[k]))
|
||||||
|
{
|
||||||
|
return DDCommandResult.INVALID_ARGUMENTS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Check if the target player is logged in
|
||||||
|
targetPlayer = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(command[0]);
|
||||||
|
if (targetPlayer == null)
|
||||||
|
{
|
||||||
|
return DDCommandResult.PLAYER_OFFLINE;
|
||||||
|
}
|
||||||
|
// If a dimension ID was provided, try to load it
|
||||||
|
if (command.length != 4)
|
||||||
|
{
|
||||||
|
dimensionID = Integer.parseInt(command[1]);
|
||||||
|
world = PocketManager.loadDimension(dimensionID);
|
||||||
|
if (world == null)
|
||||||
|
{
|
||||||
|
return DDCommandResult.UNREGISTERED_DIMENSION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dimensionID = targetPlayer.worldObj.provider.dimensionId;
|
||||||
|
world = targetPlayer.worldObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we teleport to a pocket dimension, set checkOrientation to true
|
||||||
|
// so the player is placed correctly relative to the entrance door.
|
||||||
|
checkOrientation = false;
|
||||||
|
|
||||||
|
// Parse or calculate the destination as necessary
|
||||||
|
// The Y coordinate must be increased by 1 because of the way that
|
||||||
|
// DDTeleporter considers destination points. It assumes that the
|
||||||
|
// point provided is the upper block of a door.
|
||||||
|
if (command.length == 2)
|
||||||
|
{
|
||||||
|
// Check if the destination is a pocket dimension
|
||||||
|
dimension = PocketManager.createDimensionData(world);
|
||||||
|
if (dimension.isPocketDimension())
|
||||||
|
{
|
||||||
|
// The destination is a pocket dimension.
|
||||||
|
// Teleport the player to its original entrance (the origin).
|
||||||
|
destination = dimension.origin();
|
||||||
|
checkOrientation = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// The destination is not a pocket dimension, which means we
|
||||||
|
// don't automatically know a safe location where we can send
|
||||||
|
// the player. Send the player to (0, Y, 0), where Y is chosen
|
||||||
|
// by searching. Add 2 to place the player ABOVE the top block.
|
||||||
|
y = world.getTopSolidOrLiquidBlock(0, 0) + 2;
|
||||||
|
destination = new Point4D(0, y, 0, dimensionID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (command.length == 4)
|
||||||
|
{
|
||||||
|
x = Integer.parseInt(command[1]);
|
||||||
|
y = Integer.parseInt(command[2]) + 1; // Correct the Y value
|
||||||
|
z = Integer.parseInt(command[3]);
|
||||||
|
destination = new Point4D(x, y, z, dimensionID);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
x = Integer.parseInt(command[2]);
|
||||||
|
y = Integer.parseInt(command[3]) + 1; // Correct the Y value
|
||||||
|
z = Integer.parseInt(command[4]);
|
||||||
|
destination = new Point4D(x, y, z, dimensionID);
|
||||||
|
}
|
||||||
|
// Teleport!
|
||||||
|
DDTeleporter.teleportEntity(targetPlayer, destination, checkOrientation);
|
||||||
return DDCommandResult.SUCCESS;
|
return DDCommandResult.SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInteger( String input )
|
private static boolean isInteger(String input)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Integer.parseInt( input );
|
Integer.parseInt(input);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch(Exception e )
|
catch(Exception e)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -5,7 +5,6 @@ import net.minecraft.command.ICommand;
|
|||||||
import net.minecraft.command.ICommandSender;
|
import net.minecraft.command.ICommandSender;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.util.ChatMessageComponent;
|
import net.minecraft.util.ChatMessageComponent;
|
||||||
import cpw.mods.fml.common.event.FMLServerStartingEvent;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* An abstract base class for our Dimensional Doors commands. This cleans up the code a little and provides
|
* An abstract base class for our Dimensional Doors commands. This cleans up the code a little and provides
|
||||||
@@ -96,13 +95,15 @@ public abstract class DDCommandBase extends CommandBase
|
|||||||
* that Dryware and Technic Jenkins don't have those functions defined. How in the world?
|
* that Dryware and Technic Jenkins don't have those functions defined. How in the world?
|
||||||
* I have no idea. But it's breaking our builds. -_- ~SenseiKiwi
|
* I have no idea. But it's breaking our builds. -_- ~SenseiKiwi
|
||||||
*/
|
*/
|
||||||
public int compareTo(ICommand par1ICommand)
|
@Override
|
||||||
|
public int compareTo(ICommand command)
|
||||||
{
|
{
|
||||||
return this.getCommandName().compareTo(par1ICommand.getCommandName());
|
return this.getCommandName().compareTo(command.getCommandName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public int compareTo(Object par1Obj)
|
@Override
|
||||||
|
public int compareTo(Object other)
|
||||||
{
|
{
|
||||||
return this.compareTo((ICommand)par1Obj);
|
return this.compareTo((ICommand) other);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ public class DDCommandResult {
|
|||||||
public static final DDCommandResult TOO_MANY_ARGUMENTS = new DDCommandResult(2, "Error: Too many arguments passed to the command", true);
|
public static final DDCommandResult TOO_MANY_ARGUMENTS = new DDCommandResult(2, "Error: Too many arguments passed to the command", true);
|
||||||
public static final DDCommandResult INVALID_DIMENSION_ID = new DDCommandResult(3, "Error: Invalid dimension ID", true);
|
public static final DDCommandResult INVALID_DIMENSION_ID = new DDCommandResult(3, "Error: Invalid dimension ID", true);
|
||||||
public static final DDCommandResult UNREGISTERED_DIMENSION = new DDCommandResult(4, "Error: Dimension is not registered", false);
|
public static final DDCommandResult UNREGISTERED_DIMENSION = new DDCommandResult(4, "Error: Dimension is not registered", false);
|
||||||
public static final DDCommandResult INVALID_ARGUMENTS = new DDCommandResult(5, "Error: Invalid arguments passed to the command.", true);
|
public static final DDCommandResult INVALID_ARGUMENTS = new DDCommandResult(5, "Error: Invalid arguments passed to the command", true);
|
||||||
|
public static final DDCommandResult PLAYER_OFFLINE = new DDCommandResult(6, "Error: Player is not online", false);
|
||||||
|
|
||||||
public static final int CUSTOM_ERROR_CODE = -1;
|
public static final int CUSTOM_ERROR_CODE = -1;
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,9 @@ public class DDProperties
|
|||||||
public final int TransientDoorID;
|
public final int TransientDoorID;
|
||||||
public final int FabricBlockID;
|
public final int FabricBlockID;
|
||||||
public final int RiftBlockID;
|
public final int RiftBlockID;
|
||||||
|
public final int QuartzDoorID;
|
||||||
|
public final int PersonalDimDoorID;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* World Generation Block IDs
|
* World Generation Block IDs
|
||||||
@@ -46,7 +49,9 @@ public class DDProperties
|
|||||||
public final int UnstableDoorItemID;
|
public final int UnstableDoorItemID;
|
||||||
public final int WarpDoorItemID;
|
public final int WarpDoorItemID;
|
||||||
public final int WorldThreadItemID;
|
public final int WorldThreadItemID;
|
||||||
|
public final int DDKeyItemID;
|
||||||
|
public final int ItemQuartzDoorID;
|
||||||
|
public final int ItemPersonalDimDoorID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Other IDs
|
* Other IDs
|
||||||
@@ -57,6 +62,7 @@ public class DDProperties
|
|||||||
public final int LimboDimensionID;
|
public final int LimboDimensionID;
|
||||||
public final int LimboProviderID;
|
public final int LimboProviderID;
|
||||||
public final int PocketProviderID;
|
public final int PocketProviderID;
|
||||||
|
public final int PersonalPocketProviderID;
|
||||||
public final int DoorRenderEntityID;
|
public final int DoorRenderEntityID;
|
||||||
public final int MonolithEntityID;
|
public final int MonolithEntityID;
|
||||||
|
|
||||||
@@ -75,6 +81,9 @@ public class DDProperties
|
|||||||
public final boolean CraftingStableFabricAllowed;
|
public final boolean CraftingStableFabricAllowed;
|
||||||
public final boolean CraftingGoldenDimensionalDoorAllowed;
|
public final boolean CraftingGoldenDimensionalDoorAllowed;
|
||||||
public final boolean CraftingGoldenDoorAllowed;
|
public final boolean CraftingGoldenDoorAllowed;
|
||||||
|
public final boolean CraftingDDKeysAllowed;
|
||||||
|
public final boolean CraftingQuartzDoorAllowed;
|
||||||
|
public final boolean CraftingPersonalDimDoorAllowed;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loot Flags
|
* Loot Flags
|
||||||
@@ -147,6 +156,9 @@ public class DDProperties
|
|||||||
CraftingStableFabricAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Stable Fabric", true).getBoolean(true);
|
CraftingStableFabricAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Stable Fabric", true).getBoolean(true);
|
||||||
CraftingGoldenDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Golden Door", true).getBoolean(true);
|
CraftingGoldenDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Golden Door", true).getBoolean(true);
|
||||||
CraftingGoldenDimensionalDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Golden Dimensional Door", true).getBoolean(true);
|
CraftingGoldenDimensionalDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Golden Dimensional Door", true).getBoolean(true);
|
||||||
|
CraftingDDKeysAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Rift Keys", true).getBoolean(true);
|
||||||
|
CraftingQuartzDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Quartz Doors", true).getBoolean(true);
|
||||||
|
CraftingPersonalDimDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Personal Dim Doors", true).getBoolean(true);
|
||||||
|
|
||||||
WorldThreadRequirementLevel = config.get(CATEGORY_CRAFTING, "World Thread Requirement Level", 4,
|
WorldThreadRequirementLevel = config.get(CATEGORY_CRAFTING, "World Thread Requirement Level", 4,
|
||||||
"Controls the amount of World Thread needed to craft Stable Fabric. The number must be an " +
|
"Controls the amount of World Thread needed to craft Stable Fabric. The number must be an " +
|
||||||
@@ -192,6 +204,8 @@ public class DDProperties
|
|||||||
TransientDoorID = config.getBlock("Transient Door Block ID", 1979).getInt();
|
TransientDoorID = config.getBlock("Transient Door Block ID", 1979).getInt();
|
||||||
GoldenDoorID = config.getBlock("Gold Door Block ID", 1980).getInt();
|
GoldenDoorID = config.getBlock("Gold Door Block ID", 1980).getInt();
|
||||||
GoldenDimensionalDoorID = config.getBlock("Gold Dim Door Block ID", 1981).getInt();
|
GoldenDimensionalDoorID = config.getBlock("Gold Dim Door Block ID", 1981).getInt();
|
||||||
|
QuartzDoorID = config.getBlock("Quartz Door Block ID", 1982).getInt();
|
||||||
|
PersonalDimDoorID = config.getBlock("Personal Dim Door ID", 1983).getInt();
|
||||||
|
|
||||||
WarpDoorItemID = config.getItem("Warp Door Item ID", 5670).getInt();
|
WarpDoorItemID = config.getItem("Warp Door Item ID", 5670).getInt();
|
||||||
RiftRemoverItemID = config.getItem("Rift Remover Item ID", 5671).getInt();
|
RiftRemoverItemID = config.getItem("Rift Remover Item ID", 5671).getInt();
|
||||||
@@ -204,6 +218,9 @@ public class DDProperties
|
|||||||
GoldenDoorItemID = config.getItem("Gold Door Item ID", 5678).getInt();
|
GoldenDoorItemID = config.getItem("Gold Door Item ID", 5678).getInt();
|
||||||
GoldenDimensionalDoorItemID = config.getItem("Gold Dim Door Item ID", 5679).getInt();
|
GoldenDimensionalDoorItemID = config.getItem("Gold Dim Door Item ID", 5679).getInt();
|
||||||
WorldThreadItemID = config.getItem("World Thread Item ID", 5680).getInt();
|
WorldThreadItemID = config.getItem("World Thread Item ID", 5680).getInt();
|
||||||
|
DDKeyItemID = config.getItem("Rift Key Item ID", 5681).getInt();
|
||||||
|
ItemQuartzDoorID = config.getItem("Quartz Door Item ID", 5681).getInt();
|
||||||
|
ItemPersonalDimDoorID = config.getItem("Personal Dim Door ID", 5681).getInt();
|
||||||
|
|
||||||
LimboBlockID = config.getTerrainBlock("World Generation Block IDs - must be less than 256", "Limbo Block ID", 217,
|
LimboBlockID = config.getTerrainBlock("World Generation Block IDs - must be less than 256", "Limbo Block ID", 217,
|
||||||
"Blocks used for the terrain in Limbo").getInt();
|
"Blocks used for the terrain in Limbo").getInt();
|
||||||
@@ -213,6 +230,7 @@ public class DDProperties
|
|||||||
LimboDimensionID = config.get(CATEGORY_DIMENSION, "Limbo Dimension ID", -23).getInt();
|
LimboDimensionID = config.get(CATEGORY_DIMENSION, "Limbo Dimension ID", -23).getInt();
|
||||||
PocketProviderID = config.get(CATEGORY_PROVIDER, "Pocket Provider ID", 124).getInt();
|
PocketProviderID = config.get(CATEGORY_PROVIDER, "Pocket Provider ID", 124).getInt();
|
||||||
LimboProviderID = config.get(CATEGORY_PROVIDER, "Limbo Provider ID", 113).getInt();
|
LimboProviderID = config.get(CATEGORY_PROVIDER, "Limbo Provider ID", 113).getInt();
|
||||||
|
PersonalPocketProviderID = config.get(CATEGORY_PROVIDER, "Personal Pocket Provider ID", 125).getInt();
|
||||||
|
|
||||||
MonolithTeleportationEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Monolith Teleportation", true,
|
MonolithTeleportationEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Monolith Teleportation", true,
|
||||||
"Sets whether Monoliths can teleport players").getBoolean(true);
|
"Sets whether Monoliths can teleport players").getBoolean(true);
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ public class DDWorldProperties
|
|||||||
/**
|
/**
|
||||||
* World Generation Settings
|
* World Generation Settings
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public final DimensionFilter RiftClusterDimensions;
|
public final DimensionFilter RiftClusterDimensions;
|
||||||
public final DimensionFilter RiftGatewayDimensions;
|
public final DimensionFilter RiftGatewayDimensions;
|
||||||
|
|
||||||
@@ -17,7 +16,7 @@ public class DDWorldProperties
|
|||||||
* General Flags
|
* General Flags
|
||||||
*/
|
*/
|
||||||
public final boolean LimboEscapeEnabled;
|
public final boolean LimboEscapeEnabled;
|
||||||
|
public final boolean UniversalLimboEnabled;
|
||||||
|
|
||||||
//Names of categories
|
//Names of categories
|
||||||
private static final String CATEGORY_WORLD_GENERATION = "world generation";
|
private static final String CATEGORY_WORLD_GENERATION = "world generation";
|
||||||
@@ -44,6 +43,12 @@ public class DDWorldProperties
|
|||||||
"generates near the bottom of the dimension. If disabled, players could still leave through " +
|
"generates near the bottom of the dimension. If disabled, players could still leave through " +
|
||||||
"dungeons in Limbo or by dying (if Hardcore Limbo is disabled). The default value is true.").getBoolean(true);
|
"dungeons in Limbo or by dying (if Hardcore Limbo is disabled). The default value is true.").getBoolean(true);
|
||||||
|
|
||||||
|
UniversalLimboEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Universal Limbo", false,
|
||||||
|
"Sets whether players are teleported to Limbo when they die in any dimension (except Limbo). " +
|
||||||
|
"Normally, players only go to Limbo if they die in a pocket dimension. This setting will not " +
|
||||||
|
"affect deaths in Limbo, which can be set with the Hardcore Limbo option. " +
|
||||||
|
"The default value is false.").getBoolean(false);
|
||||||
|
|
||||||
config.save();
|
config.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
169
src/main/java/StevenDimDoors/mod_pocketDim/core/DDLock.java
Normal file
169
src/main/java/StevenDimDoors/mod_pocketDim/core/DDLock.java
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
package StevenDimDoors.mod_pocketDim.core;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import com.google.gson.stream.JsonReader;
|
||||||
|
import StevenDimDoors.mod_pocketDim.items.ItemDDKey;
|
||||||
|
import StevenDimDoors.mod_pocketDim.saving.IPackable;
|
||||||
|
import StevenDimDoors.mod_pocketDim.saving.PackedDimData;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTTagIntArray;
|
||||||
|
import net.minecraft.nbt.NBTTagList;
|
||||||
|
|
||||||
|
public class DDLock
|
||||||
|
{
|
||||||
|
private boolean lockState;
|
||||||
|
private final int lockKey;
|
||||||
|
|
||||||
|
|
||||||
|
public DDLock(boolean isLocked, int lockKey)
|
||||||
|
{
|
||||||
|
this.lockState = isLocked;
|
||||||
|
this.lockKey = lockKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLockKey()
|
||||||
|
{
|
||||||
|
return this.lockKey;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* See if the lock is currently locked. False if there is no lock.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean getLockState()
|
||||||
|
{
|
||||||
|
return this.lockState;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the state of the lock. Returns false if there is no lock to set,
|
||||||
|
* otherwise returns true
|
||||||
|
* @param flag
|
||||||
|
*/
|
||||||
|
protected void setLockState(boolean flag)
|
||||||
|
{
|
||||||
|
this.lockState = flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* see if we could unlock this door if it where locked.
|
||||||
|
* @param link
|
||||||
|
* @param itemStack
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean doesKeyUnlock(ItemStack itemStack)
|
||||||
|
{
|
||||||
|
for(int key :getKeys(itemStack))
|
||||||
|
{
|
||||||
|
if(this.lockKey == key)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tries to open this lock
|
||||||
|
* @param item
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean tryToOpen(ItemStack itemStack)
|
||||||
|
{
|
||||||
|
return (!this.lockState)||this.doesKeyUnlock(itemStack);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets the key/s to the given key/s
|
||||||
|
* @return
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets all the keys stored on a single key item
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static int[] getKeys(ItemStack itemStack)
|
||||||
|
{
|
||||||
|
if (!itemStack.hasTagCompound())
|
||||||
|
{
|
||||||
|
initNBTTags(itemStack);
|
||||||
|
}
|
||||||
|
return itemStack.getTagCompound().getIntArray("DDKeys");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* adds the key/s to the given key
|
||||||
|
* @return
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static void addKeys(ItemStack itemStack, int[] keysToAdd)
|
||||||
|
{
|
||||||
|
int[] oldKeys = DDLock.getKeys(itemStack);
|
||||||
|
int[] newKeys = new int[keysToAdd.length+oldKeys.length];
|
||||||
|
System.arraycopy(oldKeys, 0, newKeys, 0, oldKeys.length);
|
||||||
|
System.arraycopy(keysToAdd, 0, newKeys, oldKeys.length, keysToAdd.length);
|
||||||
|
setKeys(itemStack,newKeys);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets the key/s to the given key/s
|
||||||
|
* @return
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static void setKeys(ItemStack itemStack, int[] keys)
|
||||||
|
{
|
||||||
|
if (!itemStack.hasTagCompound())
|
||||||
|
{
|
||||||
|
initNBTTags(itemStack);
|
||||||
|
}
|
||||||
|
NBTTagCompound tag = itemStack.getTagCompound();
|
||||||
|
tag.setIntArray("DDKeys", keys);
|
||||||
|
itemStack.setTagCompound(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gives the key a new NBTTag
|
||||||
|
* @param itemStack
|
||||||
|
*/
|
||||||
|
public static void initNBTTags(ItemStack itemStack)
|
||||||
|
{
|
||||||
|
itemStack.setTagCompound(new NBTTagCompound());
|
||||||
|
NBTTagCompound tag = itemStack.getTagCompound();
|
||||||
|
tag.setIntArray("DDKeys", new int[0]);
|
||||||
|
tag.setBoolean("HasCreatedLock", false);
|
||||||
|
itemStack.setTagCompound(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean hasCreatedLock(ItemStack key)
|
||||||
|
{
|
||||||
|
if(isItemKey(key))
|
||||||
|
{
|
||||||
|
if(key.hasTagCompound())
|
||||||
|
{
|
||||||
|
return key.getTagCompound().getBoolean("HasCreatedLock");
|
||||||
|
}
|
||||||
|
initNBTTags(key);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isItemKey(ItemStack key)
|
||||||
|
{
|
||||||
|
return key.getItem() instanceof ItemDDKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected static DDLock generateLockKeyPair(ItemStack itemStack, int lockKey2)
|
||||||
|
{
|
||||||
|
itemStack.getTagCompound().setBoolean("HasCreatedLock", true);
|
||||||
|
DDLock.setKeys(itemStack, new int[]{lockKey2});
|
||||||
|
return new DDLock(true, lockKey2);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,7 +2,6 @@ package StevenDimDoors.mod_pocketDim.core;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
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;
|
||||||
@@ -23,9 +22,9 @@ import net.minecraftforge.common.DimensionManager;
|
|||||||
import StevenDimDoors.mod_pocketDim.Point3D;
|
import StevenDimDoors.mod_pocketDim.Point3D;
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor;
|
import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor;
|
||||||
|
import StevenDimDoors.mod_pocketDim.blocks.IDimDoor;
|
||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper;
|
import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper;
|
||||||
import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor;
|
|
||||||
import StevenDimDoors.mod_pocketDim.schematic.BlockRotator;
|
import StevenDimDoors.mod_pocketDim.schematic.BlockRotator;
|
||||||
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor;
|
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
@@ -52,59 +51,49 @@ public class DDTeleporter
|
|||||||
|
|
||||||
private DDTeleporter() { }
|
private DDTeleporter() { }
|
||||||
|
|
||||||
/**Checks if the destination supplied is valid, ie, filled by any non-replaceable block.
|
/**
|
||||||
*
|
* Checks if the destination supplied is safe (i.e. filled by any replaceable or non-opaque blocks)
|
||||||
* @param entity
|
|
||||||
* @param world
|
|
||||||
* @param destination
|
|
||||||
* @param properties
|
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
private static boolean checkDestination(Entity entity, WorldServer world, Point4D destination,DDProperties properties)
|
private static boolean checkDestination(WorldServer world, Point4D destination, int orientation)
|
||||||
{
|
{
|
||||||
int x = destination.getX();
|
int x = destination.getX();
|
||||||
int y = destination.getY();
|
int y = destination.getY();
|
||||||
int z = destination.getZ();
|
int z = destination.getZ();
|
||||||
int blockIDTop;
|
int blockIDTop;
|
||||||
int blockIDBottom;
|
int blockIDBottom;
|
||||||
|
|
||||||
Point3D point;
|
Point3D point;
|
||||||
|
|
||||||
int orientation;
|
|
||||||
|
|
||||||
orientation = getDestinationOrientation(destination, properties);
|
|
||||||
entity.rotationYaw = (orientation * 90) + 90;
|
|
||||||
switch (orientation)
|
switch (orientation)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
point = new Point3D(MathHelper.floor_double(x - 0.5), y - 1, MathHelper.floor_double(z + 0.5));
|
point = new Point3D(x - 1, y - 1, z);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
point = new Point3D(MathHelper.floor_double(x + 0.5), y - 1, MathHelper.floor_double(z - 0.5));
|
point = new Point3D(x, y - 1, z - 1);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
point = new Point3D(MathHelper.floor_double(x + 1.5), y - 1, MathHelper.floor_double(z + 0.5));
|
point = new Point3D(x + 1, y - 1, z);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
point = new Point3D(MathHelper.floor_double(x + 0.5), y - 1, MathHelper.floor_double(z + 1.5));
|
point = new Point3D(x, y - 1, z + 1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
point = new Point3D(x, y - 1, z);
|
point = new Point3D(x, y - 1, z);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
blockIDBottom = world.getBlockId(point.getX(), point.getY(), point.getZ());
|
blockIDBottom = world.getBlockId(point.getX(), point.getY(), point.getZ());
|
||||||
blockIDTop = world.getBlockId(point.getX(), point.getY()+1, point.getZ());
|
blockIDTop = world.getBlockId(point.getX(), point.getY() + 1, point.getZ());
|
||||||
|
|
||||||
if (Block.blocksList[blockIDBottom] != null)
|
if (Block.blocksList[blockIDBottom] != null)
|
||||||
{
|
{
|
||||||
if(!Block.blocksList[blockIDBottom].isBlockReplaceable(world, point.getX(), point.getY(), point.getZ())&&world.isBlockOpaqueCube(point.getX(), point.getY(), point.getZ()))
|
if (!Block.blocksList[blockIDBottom].isBlockReplaceable(world, point.getX(), point.getY(), point.getZ()) && world.isBlockOpaqueCube(point.getX(), point.getY(), point.getZ()))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Block.blocksList[blockIDTop] != null)
|
if (Block.blocksList[blockIDTop] != null)
|
||||||
{
|
{
|
||||||
if (!Block.blocksList[blockIDTop].isBlockReplaceable(world, point.getX(), point.getY()+1, point.getZ()))
|
if (!Block.blocksList[blockIDTop].isBlockReplaceable(world, point.getX(), point.getY() + 1, point.getZ()))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -126,56 +115,37 @@ public class DDTeleporter
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//Teleport the entity to the precise destination point
|
// Teleport the entity to the precise destination point
|
||||||
orientation = -1;
|
orientation = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!checkDestination(entity, world, destination, properties))
|
if (entity instanceof EntityPlayer)
|
||||||
{
|
|
||||||
if (entity instanceof EntityPlayerMP)
|
|
||||||
{
|
|
||||||
EntityPlayer player = (EntityPlayer) entity;
|
|
||||||
player.rotationYaw = (orientation * 90) + 90;
|
|
||||||
switch (orientation)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
player.setPositionAndUpdate(x, y - 1, z);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (entity instanceof EntityPlayer)
|
|
||||||
{
|
{
|
||||||
EntityPlayer player = (EntityPlayer) entity;
|
EntityPlayer player = (EntityPlayer) entity;
|
||||||
switch (orientation)
|
if (checkDestination(world, destination, orientation))
|
||||||
{
|
{
|
||||||
case 0:
|
switch (orientation)
|
||||||
player.setPositionAndUpdate(x - 0.5, y - 1, z + 0.5);
|
{
|
||||||
break;
|
case 0:
|
||||||
case 1:
|
player.setPositionAndUpdate(x - 0.5, y - 1, z + 0.5);
|
||||||
player.setPositionAndUpdate(x + 0.5, y - 1, z - 0.5);
|
break;
|
||||||
break;
|
case 1:
|
||||||
case 2:
|
player.setPositionAndUpdate(x + 0.5, y - 1, z - 0.5);
|
||||||
player.setPositionAndUpdate(x + 1.5, y - 1, z + 0.5);
|
break;
|
||||||
break;
|
case 2:
|
||||||
case 3:
|
player.setPositionAndUpdate(x + 1.5, y - 1, z + 0.5);
|
||||||
player.setPositionAndUpdate(x + 0.5, y - 1, z + 1.5);
|
break;
|
||||||
break;
|
case 3:
|
||||||
default:
|
player.setPositionAndUpdate(x + 0.5, y - 1, z + 1.5);
|
||||||
player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5);
|
break;
|
||||||
break;
|
default:
|
||||||
|
player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (entity instanceof EntityMinecart)
|
else if (entity instanceof EntityMinecart)
|
||||||
@@ -201,7 +171,7 @@ public class DDTeleporter
|
|||||||
entity.worldObj.updateEntityWithOptionalForce(entity, false);
|
entity.worldObj.updateEntityWithOptionalForce(entity, false);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
DDTeleporter.setEntityPosition(entity, x + 0.5, y, z + 1.5 );
|
DDTeleporter.setEntityPosition(entity, x + 0.5, y, z + 1.5);
|
||||||
entity.motionZ = 0.39;
|
entity.motionZ = 0.39;
|
||||||
entity.worldObj.updateEntityWithOptionalForce(entity, false);
|
entity.worldObj.updateEntityWithOptionalForce(entity, false);
|
||||||
break;
|
break;
|
||||||
@@ -251,15 +221,14 @@ public class DDTeleporter
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Check if the block below that point is actually a door
|
//Check if the block below that point is actually a door
|
||||||
int blockID = world.getBlockId(door.getX(), door.getY() - 1, door.getZ());
|
Block block = Block.blocksList[world.getBlockId(door.getX(), door.getY() - 1, door.getZ())];
|
||||||
if (blockID != properties.DimensionalDoorID && blockID != properties.WarpDoorID &&
|
if (block==null || !(block instanceof IDimDoor))
|
||||||
blockID != properties.TransientDoorID && blockID != properties.UnstableDoorID
|
|
||||||
&& blockID != properties.GoldenDimensionalDoorID)
|
|
||||||
{
|
{
|
||||||
//Return the pocket's orientation instead
|
//Return the pocket's orientation instead
|
||||||
return PocketManager.getDimensionData(door.getDimension()).orientation();
|
return PocketManager.createDimensionData(world).orientation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//Return the orientation portion of its metadata
|
//Return the orientation portion of its metadata
|
||||||
return world.getBlockMetadata(door.getX(), door.getY() - 1, door.getZ()) & 3;
|
return world.getBlockMetadata(door.getX(), door.getY() - 1, door.getZ()) & 3;
|
||||||
}
|
}
|
||||||
@@ -324,7 +293,7 @@ public class DDTeleporter
|
|||||||
// to prevent us from doing bad things. Moreover, no dimension is being created, so if we ever
|
// to prevent us from doing bad things. Moreover, no dimension is being created, so if we ever
|
||||||
// tie code to that, it could cause confusing bugs.
|
// tie code to that, it could cause confusing bugs.
|
||||||
// No hacky for you! ~SenseiKiwi
|
// No hacky for you! ~SenseiKiwi
|
||||||
PocketManager.getDimwatcher().onCreated(new ClientDimData(PocketManager.getDimensionData(destination.getDimension())));
|
PocketManager.getDimwatcher().onCreated(new ClientDimData(PocketManager.createDimensionData(newWorld)));
|
||||||
|
|
||||||
// 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 = destination.getDimension();
|
player.dimension = destination.getDimension();
|
||||||
@@ -458,11 +427,11 @@ public class DDTeleporter
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!initializeDestination(link, DDProperties.instance(),door))
|
if (!initializeDestination(link, DDProperties.instance(),entity,door))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (link.linkType() == LinkTypes.RANDOM)
|
if (link.linkType() == LinkType.RANDOM)
|
||||||
{
|
{
|
||||||
Point4D randomDestination = getRandomDestination();
|
Point4D randomDestination = getRandomDestination();
|
||||||
if (randomDestination != null)
|
if (randomDestination != null)
|
||||||
@@ -474,18 +443,43 @@ public class DDTeleporter
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
buildExitDoor(door, link, DDProperties.instance());
|
buildExitDoor(door, link, DDProperties.instance());
|
||||||
entity = teleportEntity(entity, link.destination(), link.linkType() != LinkTypes.UNSAFE_EXIT);
|
entity = teleportEntity(entity, link.destination(), link.linkType() != LinkType.UNSAFE_EXIT);
|
||||||
entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F);
|
entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean initializeDestination(DimLink link, DDProperties properties, Block door)
|
private static boolean initializeDestination(DimLink link, DDProperties properties, Entity entity, Block door)
|
||||||
{
|
{
|
||||||
if (link.hasDestination())
|
if (link.hasDestination()&&link.linkType()!=LinkType.PERSONAL)
|
||||||
{
|
{
|
||||||
if(PocketManager.isBlackListed(link.destination().getDimension()))
|
if (PocketManager.isBlackListed(link.destination().getDimension()))
|
||||||
{
|
{
|
||||||
link=PocketManager.getDimensionData(link.source().getDimension()).createLink(link.link.point,LinkTypes.SAFE_EXIT,link.link.orientation);
|
|
||||||
|
// This link leads to a dimension that has been blacklisted.
|
||||||
|
// That means that it was a pocket and it was deleted.
|
||||||
|
// Depending on the link type, we must overwrite it or cancel
|
||||||
|
// the teleport operation. We don't need to assign 'link' with
|
||||||
|
// a different value. NewDimData will overwrite it in-place.
|
||||||
|
NewDimData start = PocketManager.getDimensionData(link.source().getDimension());
|
||||||
|
if (link.linkType() == LinkType.DUNGEON)
|
||||||
|
{
|
||||||
|
// Ovewrite the link into a dungeon link with no destination
|
||||||
|
start.createLink(link.source(), LinkType.DUNGEON, link.orientation(), null);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (start.isPocketDimension())
|
||||||
|
{
|
||||||
|
// Ovewrite the link into a safe exit link, because
|
||||||
|
// this could be the only way out from a pocket.
|
||||||
|
start.createLink(link.source(), LinkType.SAFE_EXIT, link.orientation(), null);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Cancel the teleport attempt
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -496,25 +490,50 @@ public class DDTeleporter
|
|||||||
// Check the destination type and respond accordingly
|
// Check the destination type and respond accordingly
|
||||||
switch (link.linkType())
|
switch (link.linkType())
|
||||||
{
|
{
|
||||||
case LinkTypes.DUNGEON:
|
case DUNGEON:
|
||||||
return PocketBuilder.generateNewDungeonPocket(link, properties);
|
return PocketBuilder.generateNewDungeonPocket(link, properties);
|
||||||
case LinkTypes.POCKET:
|
case POCKET:
|
||||||
return PocketBuilder.generateNewPocket(link, properties,door);
|
return PocketBuilder.generateNewPocket(link, properties, door, DimensionType.POCKET);
|
||||||
case LinkTypes.SAFE_EXIT:
|
case PERSONAL:
|
||||||
|
return setupPersonalLink(link, properties, entity, door);
|
||||||
|
case SAFE_EXIT:
|
||||||
return generateSafeExit(link, properties);
|
return generateSafeExit(link, properties);
|
||||||
case LinkTypes.DUNGEON_EXIT:
|
case DUNGEON_EXIT:
|
||||||
return generateDungeonExit(link, properties);
|
return generateDungeonExit(link, properties);
|
||||||
case LinkTypes.UNSAFE_EXIT:
|
case UNSAFE_EXIT:
|
||||||
return generateUnsafeExit(link);
|
return generateUnsafeExit(link);
|
||||||
case LinkTypes.NORMAL:
|
case NORMAL:
|
||||||
case LinkTypes.REVERSE:
|
case REVERSE:
|
||||||
case LinkTypes.RANDOM:
|
case RANDOM:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
throw new IllegalArgumentException("link has an unrecognized link type.");
|
throw new IllegalArgumentException("link has an unrecognized link type.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean setupPersonalLink(DimLink link, DDProperties properties,Entity player, Block door)
|
||||||
|
{
|
||||||
|
if(!(player instanceof EntityPlayer))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
NewDimData dim = PocketManager.getPersonalDimensionForPlayer(player.getEntityName());
|
||||||
|
if(dim == null)
|
||||||
|
{
|
||||||
|
return PocketBuilder.generateNewPersonalPocket(link, properties, player, door);
|
||||||
|
}
|
||||||
|
|
||||||
|
DimLink personalHomeLink = dim.getLink(dim.origin());
|
||||||
|
if(personalHomeLink!=null)
|
||||||
|
{
|
||||||
|
PocketManager.getDimensionData(link.source().getDimension()).setLinkDestination(personalHomeLink, link.source().getX(), link.source().getY(), link.source().getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
dim.setLinkDestination(link, dim.origin.getX(), dim.origin.getY(), dim.origin.getZ());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private static Point4D getRandomDestination()
|
private static Point4D getRandomDestination()
|
||||||
{
|
{
|
||||||
// Our aim is to return a random link's source point
|
// Our aim is to return a random link's source point
|
||||||
@@ -532,7 +551,7 @@ public class DDTeleporter
|
|||||||
{
|
{
|
||||||
for (DimLink link : dimension.getAllLinks())
|
for (DimLink link : dimension.getAllLinks())
|
||||||
{
|
{
|
||||||
if (link.linkType() != LinkTypes.RANDOM)
|
if (link.linkType() != LinkType.RANDOM)
|
||||||
{
|
{
|
||||||
matches.add(link.source());
|
matches.add(link.source());
|
||||||
}
|
}
|
||||||
@@ -544,10 +563,7 @@ public class DDTeleporter
|
|||||||
{
|
{
|
||||||
return matches.get( random.nextInt(matches.size()) );
|
return matches.get( random.nextInt(matches.size()) );
|
||||||
}
|
}
|
||||||
else
|
return null;
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean generateUnsafeExit(DimLink link)
|
private static boolean generateUnsafeExit(DimLink link)
|
||||||
@@ -561,7 +577,8 @@ public class DDTeleporter
|
|||||||
// To avoid loops, don't generate a destination if the player is
|
// To avoid loops, don't generate a destination if the player is
|
||||||
// already in a non-pocket dimension.
|
// already in a non-pocket dimension.
|
||||||
|
|
||||||
NewDimData current = PocketManager.getDimensionData(link.link.point.getDimension());
|
NewDimData current = PocketManager.getDimensionData(link.point.getDimension());
|
||||||
|
|
||||||
if (current.isPocketDimension())
|
if (current.isPocketDimension())
|
||||||
{
|
{
|
||||||
Point4D source = link.source();
|
Point4D source = link.source();
|
||||||
@@ -574,7 +591,7 @@ public class DDTeleporter
|
|||||||
Point3D destination = yCoordHelper.findDropPoint(world, source.getX(), source.getY() + 1, source.getZ());
|
Point3D destination = yCoordHelper.findDropPoint(world, source.getX(), source.getY() + 1, source.getZ());
|
||||||
if (destination != null)
|
if (destination != null)
|
||||||
{
|
{
|
||||||
current.root().setDestination(link, destination.getX(), destination.getY(), destination.getZ());
|
current.root().setLinkDestination(link, destination.getX(), destination.getY(), destination.getZ());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -585,7 +602,7 @@ public class DDTeleporter
|
|||||||
{
|
{
|
||||||
World startWorld = PocketManager.loadDimension(link.source().getDimension());
|
World startWorld = PocketManager.loadDimension(link.source().getDimension());
|
||||||
World destWorld = PocketManager.loadDimension(link.destination().getDimension());
|
World destWorld = PocketManager.loadDimension(link.destination().getDimension());
|
||||||
TileEntity doorTE = startWorld.getBlockTileEntity(link.source().getX(), link.source().getY(), link.link.point.getZ());
|
TileEntity doorTE = startWorld.getBlockTileEntity(link.source().getX(), link.source().getY(), link.point.getZ());
|
||||||
if(doorTE instanceof TileEntityDimDoor)
|
if(doorTE instanceof TileEntityDimDoor)
|
||||||
{
|
{
|
||||||
if((TileEntityDimDoor.class.cast(doorTE).hasGennedPair))
|
if((TileEntityDimDoor.class.cast(doorTE).hasGennedPair))
|
||||||
@@ -615,9 +632,10 @@ public class DDTeleporter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean generateSafeExit(DimLink link, DDProperties properties)
|
private static boolean generateSafeExit(DimLink link, DDProperties properties)
|
||||||
{
|
{
|
||||||
NewDimData current = PocketManager.getDimensionData(link.link.point.getDimension());
|
NewDimData current = PocketManager.getDimensionData(link.point.getDimension());
|
||||||
return generateSafeExit(current.root(), link, properties);
|
return generateSafeExit(current.root(), link, properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -628,7 +646,8 @@ public class DDTeleporter
|
|||||||
// There is a chance of choosing the Nether first before other root dimensions
|
// There is a chance of choosing the Nether first before other root dimensions
|
||||||
// to compensate for servers with many Mystcraft ages or other worlds.
|
// to compensate for servers with many Mystcraft ages or other worlds.
|
||||||
|
|
||||||
NewDimData current = PocketManager.getDimensionData(link.link.point.getDimension());
|
NewDimData current = PocketManager.getDimensionData(link.point.getDimension());
|
||||||
|
|
||||||
ArrayList<NewDimData> roots = PocketManager.getRootDimensions();
|
ArrayList<NewDimData> roots = PocketManager.getRootDimensions();
|
||||||
int shiftChance = START_ROOT_SHIFT_CHANCE + ROOT_SHIFT_CHANCE_PER_LEVEL * (current.packDepth() - 1);
|
int shiftChance = START_ROOT_SHIFT_CHANCE + ROOT_SHIFT_CHANCE_PER_LEVEL * (current.packDepth() - 1);
|
||||||
|
|
||||||
@@ -636,11 +655,11 @@ public class DDTeleporter
|
|||||||
{
|
{
|
||||||
if (current.root().id() != OVERWORLD_DIMENSION_ID && random.nextInt(MAX_OVERWORLD_EXIT_CHANCE) < OVERWORLD_EXIT_CHANCE)
|
if (current.root().id() != OVERWORLD_DIMENSION_ID && random.nextInt(MAX_OVERWORLD_EXIT_CHANCE) < OVERWORLD_EXIT_CHANCE)
|
||||||
{
|
{
|
||||||
return generateSafeExit(PocketManager.getDimensionData(OVERWORLD_DIMENSION_ID), link, properties);
|
return generateSafeExit(PocketManager.createDimensionDataDangerously(OVERWORLD_DIMENSION_ID), link, properties);
|
||||||
}
|
}
|
||||||
if (current.root().id() != NETHER_DIMENSION_ID && random.nextInt(MAX_NETHER_EXIT_CHANCE) < NETHER_EXIT_CHANCE)
|
if (current.root().id() != NETHER_DIMENSION_ID && random.nextInt(MAX_NETHER_EXIT_CHANCE) < NETHER_EXIT_CHANCE)
|
||||||
{
|
{
|
||||||
return generateSafeExit(PocketManager.getDimensionData(NETHER_DIMENSION_ID), link, properties);
|
return generateSafeExit(PocketManager.createDimensionDataDangerously(NETHER_DIMENSION_ID), link, properties);
|
||||||
}
|
}
|
||||||
for (int attempts = 0; attempts < 10; attempts++)
|
for (int attempts = 0; attempts < 10; attempts++)
|
||||||
{
|
{
|
||||||
@@ -744,16 +763,17 @@ public class DDTeleporter
|
|||||||
// Create a reverse link for returning
|
// Create a reverse link for returning
|
||||||
int orientation = getDestinationOrientation(source, properties);
|
int orientation = getDestinationOrientation(source, properties);
|
||||||
NewDimData sourceDim = PocketManager.getDimensionData(link.source().getDimension());
|
NewDimData sourceDim = PocketManager.getDimensionData(link.source().getDimension());
|
||||||
DimLink reverse = destinationDim.createLink(x, y + 2, z, LinkTypes.REVERSE,orientation);
|
DimLink reverse = destinationDim.createLink(x, y + 2, z, LinkType.REVERSE,orientation);
|
||||||
sourceDim.setDestination(reverse, source.getX(), source.getY(), source.getZ());
|
|
||||||
|
sourceDim.setLinkDestination(reverse, source.getX(), source.getY(), source.getZ());
|
||||||
|
|
||||||
// Set up the warp door at the destination
|
// Set up the warp door at the destination
|
||||||
orientation = BlockRotator.transformMetadata(orientation, 2, properties.WarpDoorID);
|
orientation = BlockRotator.transformMetadata(orientation, 2, properties.WarpDoorID);
|
||||||
ItemDimensionalDoor.placeDoorBlock(world, x, y + 1, z, orientation, mod_pocketDim.warpDoor);
|
ItemDoor.placeDoorBlock(world, x, y + 1, z, orientation, mod_pocketDim.warpDoor);
|
||||||
|
|
||||||
// Complete the link to the destination
|
// Complete the link to the destination
|
||||||
// This comes last so the destination isn't set unless everything else works first
|
// This comes last so the destination isn't set unless everything else works first
|
||||||
destinationDim.setDestination(link, x, y + 2, z);
|
destinationDim.setLinkDestination(link, x, y + 2, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (destination != null);
|
return (destination != null);
|
||||||
|
|||||||
@@ -2,73 +2,99 @@ package StevenDimDoors.mod_pocketDim.core;
|
|||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.world.ChunkCoordIntPair;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData;
|
|
||||||
|
|
||||||
public abstract class DimLink
|
public abstract class DimLink
|
||||||
{
|
{
|
||||||
protected ClientLinkData link;
|
protected Point4D point;
|
||||||
|
protected int orientation;
|
||||||
|
protected DDLock lock;
|
||||||
protected DimLink parent;
|
protected DimLink parent;
|
||||||
protected LinkTail tail;
|
protected LinkTail tail;
|
||||||
protected List<DimLink> children;
|
protected List<DimLink> children;
|
||||||
|
|
||||||
protected DimLink(ClientLinkData link, DimLink parent)
|
protected DimLink(Point4D point, int orientation, DDLock lock, DimLink parent)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (parent.link.point.getDimension() != link.point.getDimension())
|
if (parent.point.getDimension() != point.getDimension())
|
||||||
{
|
{
|
||||||
// Ban having children in other dimensions to avoid serialization issues with cross-dimensional tails
|
// Ban having children in other dimensions to avoid serialization issues with cross-dimensional tails
|
||||||
throw new IllegalArgumentException("source and parent.source must have the same dimension.");
|
throw new IllegalArgumentException("source and parent.source must have the same dimension.");
|
||||||
}
|
}
|
||||||
|
this.lock = lock;
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
this.link = link;
|
this.point = point;
|
||||||
this.tail = parent.tail;
|
this.tail = parent.tail;
|
||||||
|
this.orientation = orientation;
|
||||||
this.children = new LinkedList<DimLink>();
|
this.children = new LinkedList<DimLink>();
|
||||||
parent.children.add(this);
|
parent.children.add(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected DimLink(ClientLinkData link, int linkType)
|
protected DimLink(Point4D point, int orientation, DDLock lock, LinkType linkType)
|
||||||
{
|
{
|
||||||
|
/**This really cant happen anymore, I guess.
|
||||||
|
*
|
||||||
if ((linkType < LinkTypes.ENUM_MIN || linkType > LinkTypes.ENUM_MAX) && linkType != LinkTypes.CLIENT_SIDE)
|
if ((linkType < LinkTypes.ENUM_MIN || linkType > LinkTypes.ENUM_MAX) && linkType != LinkTypes.CLIENT_SIDE)
|
||||||
{
|
{
|
||||||
throw new IllegalArgumentException("The specified link type is invalid.");
|
throw new IllegalArgumentException("The specified link type is invalid.");
|
||||||
}
|
}
|
||||||
|
**/
|
||||||
|
|
||||||
|
this.lock = lock;
|
||||||
this.parent = null;
|
this.parent = null;
|
||||||
this.link = link;
|
this.point = point;
|
||||||
|
this.orientation = orientation;
|
||||||
this.tail = new LinkTail(linkType, null);
|
this.tail = new LinkTail(linkType, null);
|
||||||
this.children = new LinkedList<DimLink>();
|
this.children = new LinkedList<DimLink>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Point4D source()
|
public Point4D source()
|
||||||
{
|
{
|
||||||
return link.point;
|
return point;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clear()
|
||||||
|
{
|
||||||
|
//Release children
|
||||||
|
for (DimLink child : children)
|
||||||
|
{
|
||||||
|
child.parent = null;
|
||||||
|
}
|
||||||
|
children.clear();
|
||||||
|
|
||||||
|
//Release parent
|
||||||
|
if (parent != null)
|
||||||
|
{
|
||||||
|
parent.children.remove(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
parent = null;
|
||||||
|
point = null;
|
||||||
|
tail = new LinkTail(LinkType.NORMAL, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int orientation()
|
public int orientation()
|
||||||
{
|
{
|
||||||
return link.orientation;
|
return orientation;
|
||||||
}
|
|
||||||
|
|
||||||
public ClientLinkData link()
|
|
||||||
{
|
|
||||||
return link;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Point4D destination()
|
public Point4D destination()
|
||||||
{
|
{
|
||||||
return tail.getDestination();
|
return tail.getDestination();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getDestinationOrientation()
|
public int getDestinationOrientation()
|
||||||
{
|
{
|
||||||
DimLink link = PocketManager.getLink(this.destination().getX(), this.destination().getY(), this.destination().getZ(), this.destination().getDimension());
|
DimLink destinationLink = PocketManager.getLink(tail.getDestination());
|
||||||
if(link !=null)
|
if (destinationLink != null)
|
||||||
{
|
{
|
||||||
return link.orientation();
|
return destinationLink.orientation();
|
||||||
}
|
}
|
||||||
return (this.orientation()+2)%4;
|
return (orientation + 2) % 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasDestination()
|
public boolean hasDestination()
|
||||||
{
|
{
|
||||||
return (tail.getDestination() != null);
|
return (tail.getDestination() != null);
|
||||||
@@ -89,13 +115,65 @@ public abstract class DimLink
|
|||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int linkType()
|
public LinkType linkType()
|
||||||
{
|
{
|
||||||
return tail.getLinkType();
|
return tail.getLinkType();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tries to open this lock. Returns true if the lock is open or if the key can open it
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean tryToOpen(ItemStack item)
|
||||||
|
{
|
||||||
|
return lock.tryToOpen(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests if the given key item fits this lock
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean doesKeyUnlock(ItemStack item)
|
||||||
|
{
|
||||||
|
return lock.doesKeyUnlock(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test if there is a lock, regardless if it is locked or not.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean hasLock()
|
||||||
|
{
|
||||||
|
return this.lock!=null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests if the lock is open or not
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean getLockState()
|
||||||
|
{
|
||||||
|
return this.hasLock()&&this.lock.getLockState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the actual lock object
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public DDLock getLock()
|
||||||
|
{
|
||||||
|
return this.lock;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChunkCoordIntPair getChunkCoordinates()
|
||||||
|
{
|
||||||
|
return new ChunkCoordIntPair(point.getX() >> 4, point.getZ() >> 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
{
|
{
|
||||||
return link.point + " -> " + (hasDestination() ? destination() : "");
|
return point + " -> " + (hasDestination() ? destination() : "()");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package StevenDimDoors.mod_pocketDim.core;
|
||||||
|
|
||||||
|
public enum DimensionType
|
||||||
|
{
|
||||||
|
// WARNING: Don't modify these values carelessly or you'll risk breaking existing worlds!
|
||||||
|
ROOT(0,false),
|
||||||
|
POCKET(1,true),
|
||||||
|
DUNGEON(2,true),
|
||||||
|
PERSONAL(3,true);
|
||||||
|
|
||||||
|
DimensionType(int index, boolean isPocket)
|
||||||
|
{
|
||||||
|
this.index = index;
|
||||||
|
this.isPocket = isPocket;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int index;
|
||||||
|
public final boolean isPocket;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the DimensionType given an index. I feel like there should be a better way to do this.
|
||||||
|
* @param index
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static DimensionType getTypeFromIndex(int index)
|
||||||
|
{
|
||||||
|
for(DimensionType type : DimensionType.values())
|
||||||
|
{
|
||||||
|
if(type.index == index)
|
||||||
|
{
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPocketDimension()
|
||||||
|
{
|
||||||
|
return this.isPocket;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,5 +2,5 @@ package StevenDimDoors.mod_pocketDim.core;
|
|||||||
|
|
||||||
public interface IDimRegistrationCallback
|
public interface IDimRegistrationCallback
|
||||||
{
|
{
|
||||||
public NewDimData registerDimension(int dimensionID, int rootID);
|
public NewDimData registerDimension(int dimensionID, int rootID, DimensionType type);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import StevenDimDoors.mod_pocketDim.util.Point4D;
|
|||||||
class LinkTail
|
class LinkTail
|
||||||
{
|
{
|
||||||
private Point4D destination;
|
private Point4D destination;
|
||||||
private int linkType;
|
private LinkType linkType;
|
||||||
|
|
||||||
public LinkTail(int linkType, Point4D destination)
|
public LinkTail(LinkType linkType, Point4D destination)
|
||||||
{
|
{
|
||||||
this.linkType = linkType;
|
this.linkType = linkType;
|
||||||
this.destination = destination;
|
this.destination = destination;
|
||||||
@@ -21,12 +21,11 @@ class LinkTail
|
|||||||
this.destination = destination;
|
this.destination = destination;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getLinkType() {
|
public LinkType getLinkType() {
|
||||||
return linkType;
|
return linkType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLinkType(int linkType) {
|
public void setLinkType(LinkType linkType) {
|
||||||
this.linkType = linkType;
|
this.linkType = linkType;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package StevenDimDoors.mod_pocketDim.core;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public enum LinkType
|
||||||
|
{
|
||||||
|
// WARNING: Don't modify these values carelessly or you'll risk breaking links in existing worlds!
|
||||||
|
NORMAL(0),
|
||||||
|
POCKET(1),
|
||||||
|
DUNGEON(2),
|
||||||
|
RANDOM(3),
|
||||||
|
DUNGEON_EXIT(4),
|
||||||
|
SAFE_EXIT(5),
|
||||||
|
UNSAFE_EXIT(6),
|
||||||
|
REVERSE(7),
|
||||||
|
PERSONAL(8),
|
||||||
|
CLIENT(-1337);
|
||||||
|
|
||||||
|
LinkType(int index)
|
||||||
|
{
|
||||||
|
this.index = index;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int index;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the LinkType given an index. I feel like there should be a better way to do this.
|
||||||
|
* @param index
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static LinkType getLinkTypeFromIndex(int index)
|
||||||
|
{
|
||||||
|
for(LinkType type : LinkType.values())
|
||||||
|
{
|
||||||
|
if(type.index == index)
|
||||||
|
{
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.core;
|
|
||||||
|
|
||||||
public class LinkTypes
|
|
||||||
{
|
|
||||||
private LinkTypes() { }
|
|
||||||
|
|
||||||
public static final int ENUM_MIN = 0;
|
|
||||||
public static final int ENUM_MAX = 7;
|
|
||||||
|
|
||||||
public static final int CLIENT_SIDE = -1337;
|
|
||||||
|
|
||||||
// WARNING: Don't modify these values carelessly or you'll risk breaking links in existing worlds!
|
|
||||||
public static final int NORMAL = 0;
|
|
||||||
public static final int POCKET = 1;
|
|
||||||
public static final int DUNGEON = 2;
|
|
||||||
public static final int RANDOM = 3;
|
|
||||||
public static final int DUNGEON_EXIT = 4;
|
|
||||||
public static final int SAFE_EXIT = 5;
|
|
||||||
public static final int UNSAFE_EXIT = 6;
|
|
||||||
public static final int REVERSE = 7;
|
|
||||||
}
|
|
||||||
@@ -1,32 +1,42 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.core;
|
package StevenDimDoors.mod_pocketDim.core;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import java.util.Stack;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
|
|
||||||
import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData;
|
import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.world.ChunkCoordIntPair;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import StevenDimDoors.mod_pocketDim.Point3D;
|
import StevenDimDoors.mod_pocketDim.Point3D;
|
||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
import StevenDimDoors.mod_pocketDim.dungeon.DungeonData;
|
import StevenDimDoors.mod_pocketDim.dungeon.DungeonData;
|
||||||
import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack;
|
import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack;
|
||||||
|
import StevenDimDoors.mod_pocketDim.saving.IPackable;
|
||||||
|
import StevenDimDoors.mod_pocketDim.saving.PackedDimData;
|
||||||
|
import StevenDimDoors.mod_pocketDim.saving.PackedDungeonData;
|
||||||
|
import StevenDimDoors.mod_pocketDim.saving.PackedLinkData;
|
||||||
|
import StevenDimDoors.mod_pocketDim.saving.PackedLinkTail;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
|
import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData;
|
||||||
import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher;
|
import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher;
|
||||||
|
|
||||||
public abstract class NewDimData
|
public abstract class NewDimData implements IPackable<PackedDimData>
|
||||||
{
|
{
|
||||||
private static class InnerDimLink extends DimLink
|
private static class InnerDimLink extends DimLink
|
||||||
{
|
{
|
||||||
public InnerDimLink(Point4D source, DimLink parent, int orientation)
|
public InnerDimLink(Point4D source, DimLink parent, int orientation, DDLock lock)
|
||||||
{
|
{
|
||||||
super(new ClientLinkData(source, orientation), parent);
|
super(source, orientation, lock, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public InnerDimLink(Point4D source, int linkType, int orientation)
|
public InnerDimLink(Point4D source, LinkType linkType, int orientation, DDLock lock)
|
||||||
{
|
{
|
||||||
super(new ClientLinkData(source, orientation), linkType);
|
super(source, orientation, lock, linkType);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDestination(int x, int y, int z, NewDimData dimension)
|
public void setDestination(int x, int y, int z, NewDimData dimension)
|
||||||
@@ -34,26 +44,6 @@ public abstract class NewDimData
|
|||||||
tail.setDestination(new Point4D(x, y, z, dimension.id()));
|
tail.setDestination(new Point4D(x, y, z, dimension.id()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clear()
|
|
||||||
{
|
|
||||||
//Release children
|
|
||||||
for (DimLink child : children)
|
|
||||||
{
|
|
||||||
((InnerDimLink) child).parent = null;
|
|
||||||
}
|
|
||||||
children.clear();
|
|
||||||
|
|
||||||
//Release parent
|
|
||||||
if (parent != null)
|
|
||||||
{
|
|
||||||
parent.children.remove(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
parent = null;
|
|
||||||
link = null;
|
|
||||||
tail = new LinkTail(0, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean overwrite(InnerDimLink nextParent,int orientation)
|
public boolean overwrite(InnerDimLink nextParent,int orientation)
|
||||||
{
|
{
|
||||||
if (nextParent == null)
|
if (nextParent == null)
|
||||||
@@ -65,7 +55,7 @@ public abstract class NewDimData
|
|||||||
//Ignore this request silently
|
//Ignore this request silently
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (nextParent.link.point.getDimension() != link.point.getDimension())
|
if (nextParent.point.getDimension() != point.getDimension())
|
||||||
{
|
{
|
||||||
// Ban having children in other dimensions to avoid serialization issues with cross-dimensional tails
|
// Ban having children in other dimensions to avoid serialization issues with cross-dimensional tails
|
||||||
throw new IllegalArgumentException("source and parent.source must have the same dimension.");
|
throw new IllegalArgumentException("source and parent.source must have the same dimension.");
|
||||||
@@ -88,11 +78,11 @@ public abstract class NewDimData
|
|||||||
parent = nextParent;
|
parent = nextParent;
|
||||||
tail = nextParent.tail;
|
tail = nextParent.tail;
|
||||||
nextParent.children.add(this);
|
nextParent.children.add(this);
|
||||||
this.link.orientation=orientation;
|
this.orientation=orientation;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void overwrite(int linkType, int orientation)
|
public void overwrite(LinkType linkType, int orientation)
|
||||||
{
|
{
|
||||||
//Release children
|
//Release children
|
||||||
for (DimLink child : children)
|
for (DimLink child : children)
|
||||||
@@ -111,19 +101,54 @@ public abstract class NewDimData
|
|||||||
parent = null;
|
parent = null;
|
||||||
tail = new LinkTail(linkType, null);
|
tail = new LinkTail(linkType, null);
|
||||||
//Set new orientation
|
//Set new orientation
|
||||||
this.link.orientation=orientation;
|
this.orientation=orientation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* only use this on the client to update errything
|
||||||
|
* @param lock
|
||||||
|
*/
|
||||||
|
public void setLock(DDLock lock)
|
||||||
|
{
|
||||||
|
this.lock = lock;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create a lock from a key. Returns false if this door already has a lock, or if they has already locked a door
|
||||||
|
* @param itemStack
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean createLock(ItemStack itemStack, int lockKey)
|
||||||
|
{
|
||||||
|
if(this.hasLock()||DDLock.hasCreatedLock(itemStack))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
this.lock = DDLock.generateLockKeyPair(itemStack, lockKey);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeLock(ItemStack itemStack, InnerDimLink link)
|
||||||
|
{
|
||||||
|
if(link.doesKeyUnlock(itemStack))
|
||||||
|
{
|
||||||
|
link.lock = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static int EXPECTED_LINKS_PER_CHUNK = 2;
|
||||||
protected static Random random = new Random();
|
protected static Random random = new Random();
|
||||||
|
|
||||||
protected int id;
|
protected int id;
|
||||||
protected Map<Point4D, InnerDimLink> linkMapping;
|
protected Map<Point4D, InnerDimLink> linkMapping;
|
||||||
protected List<InnerDimLink> linkList;
|
protected List<InnerDimLink> linkList;
|
||||||
protected boolean isDungeon;
|
|
||||||
protected boolean isFilled;
|
protected boolean isFilled;
|
||||||
protected int depth;
|
protected int depth;
|
||||||
protected int packDepth;
|
protected int packDepth;
|
||||||
|
protected DimensionType type;
|
||||||
protected NewDimData parent;
|
protected NewDimData parent;
|
||||||
protected NewDimData root;
|
protected NewDimData root;
|
||||||
protected List<NewDimData> children;
|
protected List<NewDimData> children;
|
||||||
@@ -133,18 +158,16 @@ public abstract class NewDimData
|
|||||||
protected boolean modified;
|
protected boolean modified;
|
||||||
public IUpdateWatcher<ClientLinkData> linkWatcher;
|
public IUpdateWatcher<ClientLinkData> linkWatcher;
|
||||||
|
|
||||||
protected NewDimData(int id, NewDimData parent, boolean isPocket, boolean isDungeon,
|
|
||||||
IUpdateWatcher<ClientLinkData> linkWatcher)
|
// Don't write this field to a file - it should be recreated on startup
|
||||||
|
private Map<ChunkCoordIntPair, List<InnerDimLink>> chunkMapping;
|
||||||
|
|
||||||
|
protected NewDimData(int id, NewDimData parent, DimensionType type, IUpdateWatcher<ClientLinkData> linkWatcher)
|
||||||
{
|
{
|
||||||
// The isPocket flag is redundant. It's meant as an integrity safeguard.
|
if (type != DimensionType.ROOT && (parent == null))
|
||||||
if (isPocket && (parent == null))
|
|
||||||
{
|
{
|
||||||
throw new NullPointerException("Dimensions can be pocket dimensions if and only if they have a parent dimension.");
|
throw new NullPointerException("Dimensions can be pocket dimensions if and only if they have a parent dimension.");
|
||||||
}
|
}
|
||||||
if (isDungeon && !isPocket)
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("A dimensional dungeon must also be a pocket dimension.");
|
|
||||||
}
|
|
||||||
|
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.linkMapping = new TreeMap<Point4D, InnerDimLink>(); //Should be stored in oct tree -- temporary solution
|
this.linkMapping = new TreeMap<Point4D, InnerDimLink>(); //Should be stored in oct tree -- temporary solution
|
||||||
@@ -152,12 +175,13 @@ public abstract class NewDimData
|
|||||||
this.children = new ArrayList<NewDimData>();
|
this.children = new ArrayList<NewDimData>();
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
this.packDepth = 0;
|
this.packDepth = 0;
|
||||||
this.isDungeon = isDungeon;
|
this.type = type;
|
||||||
this.isFilled = false;
|
this.isFilled = false;
|
||||||
this.orientation = 0;
|
this.orientation = 0;
|
||||||
this.origin = null;
|
this.origin = null;
|
||||||
this.dungeon = null;
|
this.dungeon = null;
|
||||||
this.linkWatcher = linkWatcher;
|
this.linkWatcher = linkWatcher;
|
||||||
|
this.chunkMapping = new HashMap<ChunkCoordIntPair, List<InnerDimLink>>();
|
||||||
this.modified = true;
|
this.modified = true;
|
||||||
|
|
||||||
//Register with parent
|
//Register with parent
|
||||||
@@ -176,7 +200,7 @@ public abstract class NewDimData
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected NewDimData(int id, NewDimData root)
|
protected NewDimData(int id, NewDimData root, DimensionType type)
|
||||||
{
|
{
|
||||||
// This constructor is meant for client-side code only
|
// This constructor is meant for client-side code only
|
||||||
if (root == null)
|
if (root == null)
|
||||||
@@ -190,7 +214,7 @@ public abstract class NewDimData
|
|||||||
this.children = new ArrayList<NewDimData>();
|
this.children = new ArrayList<NewDimData>();
|
||||||
this.parent = null;
|
this.parent = null;
|
||||||
this.packDepth = 0;
|
this.packDepth = 0;
|
||||||
this.isDungeon = false;
|
this.type = type;
|
||||||
this.isFilled = false;
|
this.isFilled = false;
|
||||||
this.orientation = 0;
|
this.orientation = 0;
|
||||||
this.origin = null;
|
this.origin = null;
|
||||||
@@ -198,28 +222,26 @@ public abstract class NewDimData
|
|||||||
this.linkWatcher = null;
|
this.linkWatcher = null;
|
||||||
this.depth = 0;
|
this.depth = 0;
|
||||||
this.root = root;
|
this.root = root;
|
||||||
|
this.chunkMapping = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public DimLink findNearestRift(World world, int range, int x, int y, int z)
|
public DimLink findNearestRift(World world, int range, int x, int y, int z)
|
||||||
{
|
{
|
||||||
//TODO: Rewrite this later to use an octtree
|
// Sanity check...
|
||||||
|
|
||||||
//Sanity check...
|
|
||||||
if (world.provider.dimensionId != id)
|
if (world.provider.dimensionId != id)
|
||||||
{
|
{
|
||||||
throw new IllegalArgumentException("Attempted to search for links in a World instance for a different dimension!");
|
throw new IllegalArgumentException("Attempted to search for links in a World instance for a different dimension!");
|
||||||
}
|
}
|
||||||
|
|
||||||
//Note: Only detect rifts at a distance > 1, so we ignore the rift
|
// Note: Only detect rifts at a distance > 0, so we ignore the rift
|
||||||
//that called this function and any adjacent rifts.
|
// at the center of the search space.
|
||||||
|
|
||||||
DimLink nearest = null;
|
|
||||||
DimLink link;
|
DimLink link;
|
||||||
|
DimLink nearest = null;
|
||||||
|
|
||||||
|
int i, j, k;
|
||||||
int distance;
|
int distance;
|
||||||
int minDistance = Integer.MAX_VALUE;
|
int minDistance = Integer.MAX_VALUE;
|
||||||
int i, j, k;
|
|
||||||
DDProperties properties = DDProperties.instance();
|
DDProperties properties = DDProperties.instance();
|
||||||
|
|
||||||
for (i = -range; i <= range; i++)
|
for (i = -range; i <= range; i++)
|
||||||
@@ -231,7 +253,7 @@ public abstract class NewDimData
|
|||||||
distance = getAbsoluteSum(i, j, k);
|
distance = getAbsoluteSum(i, j, k);
|
||||||
if (distance > 0 && distance < minDistance && world.getBlockId(x + i, y + j, z + k) == properties.RiftBlockID)
|
if (distance > 0 && distance < minDistance && world.getBlockId(x + i, y + j, z + k) == properties.RiftBlockID)
|
||||||
{
|
{
|
||||||
link = getLink(x+i, y+j, z+k);
|
link = getLink(x + i, y + j, z + k);
|
||||||
if (link != null)
|
if (link != null)
|
||||||
{
|
{
|
||||||
nearest = link;
|
nearest = link;
|
||||||
@@ -247,23 +269,19 @@ public abstract class NewDimData
|
|||||||
|
|
||||||
public ArrayList<DimLink> findRiftsInRange(World world, int range, int x, int y, int z)
|
public ArrayList<DimLink> findRiftsInRange(World world, int range, int x, int y, int z)
|
||||||
{
|
{
|
||||||
ArrayList<DimLink> links = new ArrayList<DimLink>();
|
// Sanity check...
|
||||||
//TODO: Rewrite this later to use an octtree
|
|
||||||
|
|
||||||
//Sanity check...
|
|
||||||
if (world.provider.dimensionId != id)
|
if (world.provider.dimensionId != id)
|
||||||
{
|
{
|
||||||
throw new IllegalArgumentException("Attempted to search for links in a World instance for a different dimension!");
|
throw new IllegalArgumentException("Attempted to search for links in a World instance for a different dimension!");
|
||||||
}
|
}
|
||||||
|
|
||||||
//Note: Only detect rifts at a distance > 1, so we ignore the rift
|
// Note: Only detect rifts at a distance > 0, so we ignore the rift
|
||||||
//that called this function and any adjacent rifts.
|
// at the center of the search space.
|
||||||
|
|
||||||
DimLink link;
|
|
||||||
|
|
||||||
int distance;
|
|
||||||
int i, j, k;
|
int i, j, k;
|
||||||
|
int distance;
|
||||||
|
DimLink link;
|
||||||
DDProperties properties = DDProperties.instance();
|
DDProperties properties = DDProperties.instance();
|
||||||
|
ArrayList<DimLink> links = new ArrayList<DimLink>();
|
||||||
|
|
||||||
for (i = -range; i <= range; i++)
|
for (i = -range; i <= range; i++)
|
||||||
{
|
{
|
||||||
@@ -274,7 +292,7 @@ public abstract class NewDimData
|
|||||||
distance = getAbsoluteSum(i, j, k);
|
distance = getAbsoluteSum(i, j, k);
|
||||||
if (distance > 0 && world.getBlockId(x + i, y + j, z + k) == properties.RiftBlockID)
|
if (distance > 0 && world.getBlockId(x + i, y + j, z + k) == properties.RiftBlockID)
|
||||||
{
|
{
|
||||||
link = getLink(x+i, y+j, z+k);
|
link = getLink(x + i, y + j, z + k);
|
||||||
if (link != null)
|
if (link != null)
|
||||||
{
|
{
|
||||||
links.add(link);
|
links.add(link);
|
||||||
@@ -292,20 +310,33 @@ public abstract class NewDimData
|
|||||||
return Math.abs(i) + Math.abs(j) + Math.abs(k);
|
return Math.abs(i) + Math.abs(j) + Math.abs(k);
|
||||||
}
|
}
|
||||||
|
|
||||||
public DimLink createLink(int x, int y, int z, int linkType, int orientation)
|
public DimLink createLink(int x, int y, int z, LinkType linkType, int orientation)
|
||||||
{
|
{
|
||||||
return createLink(new Point4D(x, y, z, id), linkType, orientation);
|
return createLink(new Point4D(x, y, z, id), linkType, orientation, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public DimLink createLink(Point4D source, int linkType, int orientation)
|
public DimLink createLink(Point4D source, LinkType linkType, int orientation, DDLock locked)
|
||||||
{
|
{
|
||||||
//Return an existing link if there is one to avoid creating multiple links starting at the same point.
|
// Return an existing link if there is one to avoid creating multiple links starting at the same point.
|
||||||
InnerDimLink link = linkMapping.get(source);
|
InnerDimLink link = linkMapping.get(source);
|
||||||
if (link == null)
|
if (link == null)
|
||||||
{
|
{
|
||||||
link = new InnerDimLink(source, linkType, orientation);
|
link = new InnerDimLink(source, linkType, orientation, locked);
|
||||||
linkMapping.put(source, link);
|
linkMapping.put(source, link);
|
||||||
linkList.add(link);
|
linkList.add(link);
|
||||||
|
|
||||||
|
// If this code is running on the server side, add this link to chunkMapping.
|
||||||
|
if (linkType != LinkType.CLIENT)
|
||||||
|
{
|
||||||
|
ChunkCoordIntPair chunk = link.getChunkCoordinates();
|
||||||
|
List<InnerDimLink> chunkLinks = chunkMapping.get(chunk);
|
||||||
|
if (chunkLinks == null)
|
||||||
|
{
|
||||||
|
chunkLinks = new ArrayList<InnerDimLink>(EXPECTED_LINKS_PER_CHUNK);
|
||||||
|
chunkMapping.put(chunk, chunkLinks);
|
||||||
|
}
|
||||||
|
chunkLinks.add(link);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -314,44 +345,59 @@ public abstract class NewDimData
|
|||||||
modified = true;
|
modified = true;
|
||||||
|
|
||||||
//Link created!
|
//Link created!
|
||||||
if (linkType != LinkTypes.CLIENT_SIDE)
|
if (linkType != LinkType.CLIENT)
|
||||||
|
|
||||||
{
|
{
|
||||||
linkWatcher.onCreated(link.link);
|
linkWatcher.onCreated(new ClientLinkData(link));
|
||||||
}
|
}
|
||||||
return link;
|
return link;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DimLink createChildLink(int x, int y, int z, DimLink parent)
|
public DimLink createChildLink(int x, int y, int z, DimLink parent)
|
||||||
{
|
{
|
||||||
|
return createChildLink(new Point4D(x, y, z, id), (InnerDimLink) parent, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DimLink createChildLink(Point4D source, DimLink parent, DDLock locked)
|
||||||
|
{
|
||||||
|
// To avoid having multiple links at a single point, if we find an existing link then we overwrite
|
||||||
|
// its destination data instead of creating a new instance.
|
||||||
|
|
||||||
if (parent == null)
|
if (parent == null)
|
||||||
{
|
{
|
||||||
throw new IllegalArgumentException("parent cannot be null.");
|
throw new IllegalArgumentException("parent cannot be null.");
|
||||||
}
|
}
|
||||||
|
|
||||||
return createChildLink(new Point4D(x, y, z, id), (InnerDimLink) parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
private DimLink createChildLink(Point4D source, InnerDimLink parent)
|
|
||||||
{
|
|
||||||
//To avoid having multiple links at a single point, if we find an existing link then we overwrite
|
|
||||||
//its destination data instead of creating a new instance.
|
|
||||||
|
|
||||||
InnerDimLink link = linkMapping.get(source);
|
InnerDimLink link = linkMapping.get(source);
|
||||||
if (link == null)
|
if (link == null)
|
||||||
{
|
{
|
||||||
link = new InnerDimLink(source, parent, parent.link.orientation);
|
link = new InnerDimLink(source, parent, parent.orientation, locked);
|
||||||
linkMapping.put(source, link);
|
linkMapping.put(source, link);
|
||||||
linkList.add(link);
|
linkList.add(link);
|
||||||
|
|
||||||
//Link created!
|
|
||||||
linkWatcher.onCreated(link.link);
|
// If this code is running on the server side, add this link to chunkMapping.
|
||||||
|
// Granted, the client side code should never create child links anyway...
|
||||||
|
if (link.linkType() != LinkType.CLIENT)
|
||||||
|
{
|
||||||
|
ChunkCoordIntPair chunk = link.getChunkCoordinates();
|
||||||
|
List<InnerDimLink> chunkLinks = chunkMapping.get(chunk);
|
||||||
|
if (chunkLinks == null)
|
||||||
|
{
|
||||||
|
chunkLinks = new ArrayList<InnerDimLink>(EXPECTED_LINKS_PER_CHUNK);
|
||||||
|
chunkMapping.put(chunk, chunkLinks);
|
||||||
|
}
|
||||||
|
chunkLinks.add(link);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Link created!
|
||||||
|
linkWatcher.onCreated(new ClientLinkData(link));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (link.overwrite(parent, parent.link.orientation))
|
if (link.overwrite((InnerDimLink) parent, parent.orientation))
|
||||||
{
|
{
|
||||||
//Link created!
|
//Link created!
|
||||||
linkWatcher.onCreated(link.link);
|
linkWatcher.onCreated(new ClientLinkData(link));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
modified = true;
|
modified = true;
|
||||||
@@ -368,8 +414,20 @@ public abstract class NewDimData
|
|||||||
if (target != null)
|
if (target != null)
|
||||||
{
|
{
|
||||||
linkList.remove(target);
|
linkList.remove(target);
|
||||||
//Raise deletion event
|
|
||||||
linkWatcher.onDeleted(target.link);
|
// If this code is running on the server side, remove this link to chunkMapping.
|
||||||
|
if (link.linkType() != LinkType.CLIENT)
|
||||||
|
{
|
||||||
|
ChunkCoordIntPair chunk = target.getChunkCoordinates();
|
||||||
|
List<InnerDimLink> chunkLinks = chunkMapping.get(chunk);
|
||||||
|
if (chunkLinks != null)
|
||||||
|
{
|
||||||
|
chunkLinks.remove(target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Raise deletion event
|
||||||
|
linkWatcher.onDeleted(new ClientLinkData(link));
|
||||||
target.clear();
|
target.clear();
|
||||||
modified = true;
|
modified = true;
|
||||||
}
|
}
|
||||||
@@ -378,7 +436,10 @@ public abstract class NewDimData
|
|||||||
|
|
||||||
public boolean deleteLink(int x, int y, int z)
|
public boolean deleteLink(int x, int y, int z)
|
||||||
{
|
{
|
||||||
Point4D location = new Point4D(x, y, z, id);
|
return this.deleteLink(this.getLink(x, y, z));
|
||||||
|
}
|
||||||
|
public boolean deleteLink(Point4D location)
|
||||||
|
{
|
||||||
return this.deleteLink(this.getLink(location));
|
return this.deleteLink(this.getLink(location));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -390,7 +451,7 @@ public abstract class NewDimData
|
|||||||
|
|
||||||
public DimLink getLink(Point3D location)
|
public DimLink getLink(Point3D location)
|
||||||
{
|
{
|
||||||
return linkMapping.get(new Point4D(location.getX(),location.getY(),location.getZ(),this.id));
|
return linkMapping.get(new Point4D(location.getX(), location.getY(), location.getZ(), this.id));
|
||||||
}
|
}
|
||||||
|
|
||||||
public DimLink getLink(Point4D location)
|
public DimLink getLink(Point4D location)
|
||||||
@@ -413,11 +474,10 @@ public abstract class NewDimData
|
|||||||
return (root != this);
|
return (root != this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isDungeon()
|
public DimensionType type()
|
||||||
{
|
{
|
||||||
return isDungeon;
|
return this.type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isFilled()
|
public boolean isFilled()
|
||||||
{
|
{
|
||||||
return isFilled;
|
return isFilled;
|
||||||
@@ -491,7 +551,7 @@ public abstract class NewDimData
|
|||||||
|
|
||||||
public void initializeDungeon(int originX, int originY, int originZ, int orientation, DimLink incoming, DungeonData dungeon)
|
public void initializeDungeon(int originX, int originY, int originZ, int orientation, DimLink incoming, DungeonData dungeon)
|
||||||
{
|
{
|
||||||
if (!isDungeon)
|
if (this.type != DimensionType.DUNGEON)
|
||||||
{
|
{
|
||||||
throw new IllegalStateException("Cannot invoke initializeDungeon() on a non-dungeon dimension.");
|
throw new IllegalStateException("Cannot invoke initializeDungeon() on a non-dungeon dimension.");
|
||||||
}
|
}
|
||||||
@@ -503,7 +563,7 @@ public abstract class NewDimData
|
|||||||
{
|
{
|
||||||
throw new IllegalArgumentException("orientation must be between 0 and 3, inclusive.");
|
throw new IllegalArgumentException("orientation must be between 0 and 3, inclusive.");
|
||||||
}
|
}
|
||||||
setDestination(incoming, originX, originY, originZ);
|
setLinkDestination(incoming, originX, originY, originZ);
|
||||||
this.origin = incoming.destination();
|
this.origin = incoming.destination();
|
||||||
this.orientation = orientation;
|
this.orientation = orientation;
|
||||||
this.dungeon = dungeon;
|
this.dungeon = dungeon;
|
||||||
@@ -516,11 +576,42 @@ public abstract class NewDimData
|
|||||||
*/
|
*/
|
||||||
public void setParentToRoot()
|
public void setParentToRoot()
|
||||||
{
|
{
|
||||||
|
// Update this dimension's information
|
||||||
|
if (parent != null)
|
||||||
|
{
|
||||||
|
parent.children.remove(this);
|
||||||
|
}
|
||||||
this.depth = 1;
|
this.depth = 1;
|
||||||
this.parent = this.root;
|
this.parent = this.root;
|
||||||
this.root.children.add(this);
|
this.root.children.add(this);
|
||||||
this.root.modified = true;
|
this.root.modified = true;
|
||||||
this.modified = true;
|
this.modified = true;
|
||||||
|
if (this.type == DimensionType.DUNGEON)
|
||||||
|
{
|
||||||
|
this.packDepth = calculatePackDepth(this.parent, this.dungeon);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the depths for child dimensions using a depth-first traversal
|
||||||
|
Stack<NewDimData> ordering = new Stack<NewDimData>();
|
||||||
|
ordering.addAll(this.children);
|
||||||
|
|
||||||
|
while (!ordering.isEmpty())
|
||||||
|
{
|
||||||
|
NewDimData current = ordering.pop();
|
||||||
|
current.resetDepth();
|
||||||
|
ordering.addAll(current.children);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void resetDepth()
|
||||||
|
{
|
||||||
|
// We assume that this is only applied to dimensions with parents
|
||||||
|
this.depth = this.parent.depth + 1;
|
||||||
|
if (this.type == DimensionType.DUNGEON)
|
||||||
|
{
|
||||||
|
this.packDepth = calculatePackDepth(this.parent, this.dungeon);
|
||||||
|
}
|
||||||
|
this.modified = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int calculatePackDepth(NewDimData parent, DungeonData current)
|
public static int calculatePackDepth(NewDimData parent, DungeonData current)
|
||||||
@@ -549,10 +640,7 @@ public abstract class NewDimData
|
|||||||
{
|
{
|
||||||
return parent.packDepth + 1;
|
return parent.packDepth + 1;
|
||||||
}
|
}
|
||||||
else
|
return 1;
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initializePocket(int originX, int originY, int originZ, int orientation, DimLink incoming)
|
public void initializePocket(int originX, int originY, int originZ, int orientation, DimLink incoming)
|
||||||
@@ -566,19 +654,47 @@ public abstract class NewDimData
|
|||||||
throw new IllegalStateException("The dimension has already been initialized.");
|
throw new IllegalStateException("The dimension has already been initialized.");
|
||||||
}
|
}
|
||||||
|
|
||||||
setDestination(incoming, originX, originY, originZ);
|
setLinkDestination(incoming, originX, originY, originZ);
|
||||||
this.origin = incoming.destination();
|
this.origin = incoming.destination();
|
||||||
this.orientation = orientation;
|
this.orientation = orientation;
|
||||||
this.modified = true;
|
this.modified = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDestination(DimLink incoming, int x, int y, int z)
|
public void setLinkDestination(DimLink incoming, int x, int y, int z)
|
||||||
{
|
{
|
||||||
InnerDimLink link = (InnerDimLink) incoming;
|
InnerDimLink link = (InnerDimLink) incoming;
|
||||||
link.setDestination(x, y, z, this);
|
link.setDestination(x, y, z, this);
|
||||||
this.modified = true;
|
this.modified = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void lock(DimLink link, boolean locked)
|
||||||
|
{
|
||||||
|
InnerDimLink innerLink = (InnerDimLink)link;
|
||||||
|
innerLink.lock.setLockState(locked);
|
||||||
|
modified = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLock(DimLink link, DDLock lock)
|
||||||
|
{
|
||||||
|
InnerDimLink innerLink = (InnerDimLink)link;
|
||||||
|
innerLink.setLock(lock);
|
||||||
|
modified = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createLock(DimLink link, ItemStack item, int lockKey)
|
||||||
|
{
|
||||||
|
InnerDimLink innerLink = (InnerDimLink)link;
|
||||||
|
innerLink.createLock(item, lockKey);
|
||||||
|
modified = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeLock(DimLink link, ItemStack item)
|
||||||
|
{
|
||||||
|
InnerDimLink innerLink = (InnerDimLink)link;
|
||||||
|
innerLink.removeLock(item, innerLink);
|
||||||
|
modified = true;
|
||||||
|
}
|
||||||
|
|
||||||
public DimLink getRandomLink()
|
public DimLink getRandomLink()
|
||||||
{
|
{
|
||||||
if (linkMapping.isEmpty())
|
if (linkMapping.isEmpty())
|
||||||
@@ -589,10 +705,17 @@ public abstract class NewDimData
|
|||||||
{
|
{
|
||||||
return linkList.get(random.nextInt(linkList.size()));
|
return linkList.get(random.nextInt(linkList.size()));
|
||||||
}
|
}
|
||||||
else
|
return linkList.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<? extends DimLink> getChunkLinks(int chunkX, int chunkZ)
|
||||||
|
{
|
||||||
|
List<InnerDimLink> chunkLinks = chunkMapping.get(new ChunkCoordIntPair(chunkX, chunkZ));
|
||||||
|
if (chunkLinks != null)
|
||||||
{
|
{
|
||||||
return linkList.get(0);
|
return chunkLinks;
|
||||||
}
|
}
|
||||||
|
return new ArrayList<InnerDimLink>(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isModified()
|
public boolean isModified()
|
||||||
@@ -605,6 +728,101 @@ public abstract class NewDimData
|
|||||||
this.modified = false;
|
this.modified = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void clear()
|
||||||
|
{
|
||||||
|
// If this dimension has a parent, remove it from its parent's list of children
|
||||||
|
if (parent != null)
|
||||||
|
{
|
||||||
|
parent.children.remove(this);
|
||||||
|
}
|
||||||
|
// Remove this dimension as the parent of its children
|
||||||
|
for (NewDimData child : children)
|
||||||
|
{
|
||||||
|
child.parent = null;
|
||||||
|
}
|
||||||
|
// Clear all fields
|
||||||
|
id = Integer.MIN_VALUE;
|
||||||
|
linkMapping.clear();
|
||||||
|
linkMapping = null;
|
||||||
|
linkList.clear();
|
||||||
|
linkList = null;
|
||||||
|
children.clear();
|
||||||
|
children = null;
|
||||||
|
type = null;
|
||||||
|
isFilled = false;
|
||||||
|
depth = Integer.MIN_VALUE;
|
||||||
|
packDepth = Integer.MIN_VALUE;
|
||||||
|
origin = null;
|
||||||
|
orientation = Integer.MIN_VALUE;
|
||||||
|
dungeon = null;
|
||||||
|
linkWatcher = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PackedDimData pack()
|
||||||
|
{
|
||||||
|
ArrayList<Integer> ChildIDs = new ArrayList<Integer>();
|
||||||
|
ArrayList<PackedLinkData> Links = new ArrayList<PackedLinkData>();
|
||||||
|
ArrayList<PackedLinkTail> Tails = new ArrayList<PackedLinkTail>();
|
||||||
|
PackedDungeonData packedDungeon=null;
|
||||||
|
|
||||||
|
if(this.dungeon!=null)
|
||||||
|
{
|
||||||
|
packedDungeon= new PackedDungeonData(dungeon.weight(), dungeon.isOpen(), dungeon.isInternal(),
|
||||||
|
dungeon.schematicPath(), dungeon.schematicName(), dungeon.dungeonType().Name,
|
||||||
|
dungeon.dungeonType().Owner.getName());
|
||||||
|
}
|
||||||
|
//Make a list of children
|
||||||
|
for(NewDimData data : this.children)
|
||||||
|
{
|
||||||
|
ChildIDs.add(data.id);
|
||||||
|
}
|
||||||
|
for(DimLink link:this.links())
|
||||||
|
{
|
||||||
|
ArrayList<Point3D> children = new ArrayList<Point3D>();
|
||||||
|
Point3D parentPoint = new Point3D(-1,-1,-1);
|
||||||
|
if(link.parent!=null)
|
||||||
|
{
|
||||||
|
parentPoint=link.parent.point.toPoint3D();
|
||||||
|
}
|
||||||
|
|
||||||
|
for(DimLink childLink : link.children)
|
||||||
|
{
|
||||||
|
children.add(childLink.source().toPoint3D());
|
||||||
|
}
|
||||||
|
PackedLinkTail tail = new PackedLinkTail(link.tail.getDestination(),link.tail.getLinkType());
|
||||||
|
Links.add(new PackedLinkData(link.point,parentPoint,tail,link.orientation,children,link.lock));
|
||||||
|
|
||||||
|
PackedLinkTail tempTail = new PackedLinkTail(link.tail.getDestination(),link.tail.getLinkType());
|
||||||
|
if(Tails.contains(tempTail))
|
||||||
|
{
|
||||||
|
Tails.add(tempTail);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
int parentID=this.id;
|
||||||
|
Point3D originPoint=new Point3D(0,0,0);
|
||||||
|
if(this.parent!=null)
|
||||||
|
{
|
||||||
|
parentID = this.parent.id;
|
||||||
|
}
|
||||||
|
if(this.origin!=null)
|
||||||
|
{
|
||||||
|
originPoint=this.origin.toPoint3D();
|
||||||
|
}
|
||||||
|
return new PackedDimData(this.id, depth, this.packDepth, parentID, this.root().id(), orientation,
|
||||||
|
type, isFilled,packedDungeon, originPoint, ChildIDs, Links, Tails);
|
||||||
|
// FIXME: IMPLEMENTATION PLZTHX
|
||||||
|
//I tried
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String name()
|
||||||
|
{
|
||||||
|
return String.valueOf(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
{
|
{
|
||||||
return "DimID= " + this.id;
|
return "DimID= " + this.id;
|
||||||
|
|||||||
@@ -7,32 +7,26 @@ import java.io.IOException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import cpw.mods.fml.common.FMLCommonHandler;
|
|
||||||
import cpw.mods.fml.relauncher.Side;
|
|
||||||
import cpw.mods.fml.relauncher.SideOnly;
|
|
||||||
|
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.WorldServer;
|
import net.minecraft.world.WorldServer;
|
||||||
import net.minecraftforge.common.DimensionManager;
|
import net.minecraftforge.common.DimensionManager;
|
||||||
import StevenDimDoors.mod_pocketDim.Point3D;
|
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
import StevenDimDoors.mod_pocketDim.helpers.Compactor;
|
import StevenDimDoors.mod_pocketDim.helpers.Compactor;
|
||||||
import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder;
|
import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder;
|
||||||
import StevenDimDoors.mod_pocketDim.saving.DDSaveHandler;
|
import StevenDimDoors.mod_pocketDim.saving.DDSaveHandler;
|
||||||
import StevenDimDoors.mod_pocketDim.saving.IPackable;
|
|
||||||
import StevenDimDoors.mod_pocketDim.saving.OldSaveImporter;
|
import StevenDimDoors.mod_pocketDim.saving.OldSaveImporter;
|
||||||
import StevenDimDoors.mod_pocketDim.saving.PackedDimData;
|
import StevenDimDoors.mod_pocketDim.saving.PackedDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.saving.PackedDungeonData;
|
|
||||||
import StevenDimDoors.mod_pocketDim.saving.PackedLinkData;
|
|
||||||
import StevenDimDoors.mod_pocketDim.saving.PackedLinkTail;
|
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
import StevenDimDoors.mod_pocketDim.watcher.ClientDimData;
|
import StevenDimDoors.mod_pocketDim.watcher.ClientDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData;
|
import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData;
|
||||||
import StevenDimDoors.mod_pocketDim.watcher.IUpdateSource;
|
import StevenDimDoors.mod_pocketDim.watcher.IUpdateSource;
|
||||||
import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher;
|
import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher;
|
||||||
import StevenDimDoors.mod_pocketDim.watcher.UpdateWatcherProxy;
|
import StevenDimDoors.mod_pocketDim.watcher.UpdateWatcherProxy;
|
||||||
|
import cpw.mods.fml.common.FMLCommonHandler;
|
||||||
|
import cpw.mods.fml.relauncher.Side;
|
||||||
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class regulates all the operations involving the storage and manipulation of dimensions.
|
* This class regulates all the operations involving the storage and manipulation of dimensions.
|
||||||
@@ -41,120 +35,25 @@ import StevenDimDoors.mod_pocketDim.watcher.UpdateWatcherProxy;
|
|||||||
*/
|
*/
|
||||||
public class PocketManager
|
public class PocketManager
|
||||||
{
|
{
|
||||||
private static class InnerDimData extends NewDimData implements IPackable<PackedDimData>
|
private static class InnerDimData extends NewDimData
|
||||||
{
|
{
|
||||||
// This class allows us to instantiate NewDimData indirectly without exposing
|
// This class allows us to instantiate NewDimData indirectly without exposing
|
||||||
// a public constructor from NewDimData. It's meant to stop us from constructing
|
// a public constructor from NewDimData. It's meant to stop us from constructing
|
||||||
// instances of NewDimData going through PocketManager. In turn, that enforces
|
// instances of NewDimData going through PocketManager. In turn, that enforces
|
||||||
// that any link destinations must be real dimensions controlled by PocketManager.
|
// that any link destinations must be real dimensions controlled by PocketManager.
|
||||||
|
|
||||||
public InnerDimData(int id, InnerDimData parent, boolean isPocket, boolean isDungeon,
|
public InnerDimData(int id, InnerDimData parent, DimensionType type,
|
||||||
IUpdateWatcher<ClientLinkData> linkWatcher)
|
IUpdateWatcher<ClientLinkData> linkWatcher)
|
||||||
{
|
{
|
||||||
super(id, parent, isPocket, isDungeon, linkWatcher);
|
super(id, parent, type, linkWatcher);
|
||||||
}
|
}
|
||||||
|
|
||||||
public InnerDimData(int id, InnerDimData root)
|
public InnerDimData(int id, NewDimData root, DimensionType type)
|
||||||
{
|
{
|
||||||
// This constructor is meant for client-side code only
|
// This constructor is meant for client-side code only
|
||||||
super(id, root);
|
super(id, root, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clear()
|
|
||||||
{
|
|
||||||
// If this dimension has a parent, remove it from its parent's list of children
|
|
||||||
if (parent != null)
|
|
||||||
{
|
|
||||||
parent.children.remove(this);
|
|
||||||
}
|
|
||||||
// Remove this dimension as the parent of its children
|
|
||||||
for (NewDimData child : children)
|
|
||||||
{
|
|
||||||
child.parent = null;
|
|
||||||
}
|
|
||||||
// Clear all fields
|
|
||||||
id = Integer.MIN_VALUE;
|
|
||||||
linkMapping.clear();
|
|
||||||
linkMapping = null;
|
|
||||||
linkList.clear();
|
|
||||||
linkList = null;
|
|
||||||
children.clear();
|
|
||||||
children = null;
|
|
||||||
isDungeon = false;
|
|
||||||
isFilled = false;
|
|
||||||
depth = Integer.MIN_VALUE;
|
|
||||||
packDepth = Integer.MIN_VALUE;
|
|
||||||
origin = null;
|
|
||||||
orientation = Integer.MIN_VALUE;
|
|
||||||
dungeon = null;
|
|
||||||
linkWatcher = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String name()
|
|
||||||
{
|
|
||||||
return String.valueOf(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PackedDimData pack()
|
|
||||||
{
|
|
||||||
ArrayList<Integer> ChildIDs = new ArrayList<Integer>();
|
|
||||||
ArrayList<PackedLinkData> Links = new ArrayList<PackedLinkData>();
|
|
||||||
ArrayList<PackedLinkTail> Tails = new ArrayList<PackedLinkTail>();
|
|
||||||
PackedDungeonData packedDungeon=null;
|
|
||||||
|
|
||||||
if(this.dungeon!=null)
|
|
||||||
{
|
|
||||||
packedDungeon= new PackedDungeonData(dungeon.weight(), dungeon.isOpen(), dungeon.isInternal(),
|
|
||||||
dungeon.schematicPath(), dungeon.schematicName(), dungeon.dungeonType().Name,
|
|
||||||
dungeon.dungeonType().Owner.getName());
|
|
||||||
}
|
|
||||||
//Make a list of children
|
|
||||||
for(NewDimData data : this.children)
|
|
||||||
{
|
|
||||||
ChildIDs.add(data.id);
|
|
||||||
}
|
|
||||||
for(DimLink link:this.links())
|
|
||||||
{
|
|
||||||
ArrayList<Point3D> children = new ArrayList<Point3D>();
|
|
||||||
Point3D parentPoint = new Point3D(-1,-1,-1);
|
|
||||||
if(link.parent!=null)
|
|
||||||
{
|
|
||||||
parentPoint=link.parent.link.point.toPoint3D();
|
|
||||||
}
|
|
||||||
|
|
||||||
for(DimLink childLink : link.children)
|
|
||||||
{
|
|
||||||
children.add(childLink.source().toPoint3D());
|
|
||||||
}
|
|
||||||
PackedLinkTail tail = new PackedLinkTail(link.tail.getDestination(),link.tail.getLinkType());
|
|
||||||
Links.add(new PackedLinkData(link.link.point,parentPoint,tail,link.link.orientation,children));
|
|
||||||
|
|
||||||
PackedLinkTail tempTail = new PackedLinkTail(link.tail.getDestination(),link.tail.getLinkType());
|
|
||||||
if(Tails.contains(tempTail))
|
|
||||||
{
|
|
||||||
Tails.add(tempTail);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
int parentID=this.id;
|
|
||||||
Point3D originPoint=new Point3D(0,0,0);
|
|
||||||
if(this.parent!=null)
|
|
||||||
{
|
|
||||||
parentID = this.parent.id;
|
|
||||||
}
|
|
||||||
if(this.origin!=null)
|
|
||||||
{
|
|
||||||
originPoint=this.origin.toPoint3D();
|
|
||||||
}
|
|
||||||
return new PackedDimData(this.id, depth, this.packDepth, parentID, this.root().id(), orientation,
|
|
||||||
isDungeon, isFilled,packedDungeon, originPoint, ChildIDs, Links, Tails);
|
|
||||||
// FIXME: IMPLEMENTATION PLZTHX
|
|
||||||
//I tried
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class ClientLinkWatcher implements IUpdateWatcher<ClientLinkData>
|
private static class ClientLinkWatcher implements IUpdateWatcher<ClientLinkData>
|
||||||
@@ -164,7 +63,7 @@ public class PocketManager
|
|||||||
{
|
{
|
||||||
Point4D source = link.point;
|
Point4D source = link.point;
|
||||||
NewDimData dimension = getDimensionData(source.getDimension());
|
NewDimData dimension = getDimensionData(source.getDimension());
|
||||||
dimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.CLIENT_SIDE,link.orientation);
|
dimension.createLink(source, LinkType.CLIENT, 0, link.lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -173,7 +72,17 @@ public class PocketManager
|
|||||||
Point4D source = link.point;
|
Point4D source = link.point;
|
||||||
NewDimData dimension = getDimensionData(source.getDimension());
|
NewDimData dimension = getDimensionData(source.getDimension());
|
||||||
dimension.deleteLink(source.getX(), source.getY(), source.getZ());
|
dimension.deleteLink(source.getX(), source.getY(), source.getZ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(ClientLinkData link)
|
||||||
|
{
|
||||||
|
Point4D source = link.point;
|
||||||
|
NewDimData dimension = getDimensionData(source.getDimension());
|
||||||
|
DimLink dLink = dimension.getLink(source);
|
||||||
|
dLink.lock=link.lock;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class ClientDimWatcher implements IUpdateWatcher<ClientDimData>
|
private static class ClientDimWatcher implements IUpdateWatcher<ClientDimData>
|
||||||
@@ -181,7 +90,7 @@ public class PocketManager
|
|||||||
@Override
|
@Override
|
||||||
public void onCreated(ClientDimData data)
|
public void onCreated(ClientDimData data)
|
||||||
{
|
{
|
||||||
registerClientDimension(data.ID, data.RootID);
|
registerClientDimension(data.ID, data.rootID, data.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -189,6 +98,12 @@ public class PocketManager
|
|||||||
{
|
{
|
||||||
deletePocket(getDimensionData(data.ID), false);
|
deletePocket(getDimensionData(data.ID), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(ClientDimData message)
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class DimRegistrationCallback implements IDimRegistrationCallback
|
private static class DimRegistrationCallback implements IDimRegistrationCallback
|
||||||
@@ -199,9 +114,9 @@ public class PocketManager
|
|||||||
// exposing a private constructor ONLY to a very specific trusted class.
|
// exposing a private constructor ONLY to a very specific trusted class.
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NewDimData registerDimension(int dimensionID, int rootID)
|
public NewDimData registerDimension(int dimensionID, int rootID, DimensionType type)
|
||||||
{
|
{
|
||||||
return registerClientDimension(dimensionID, rootID);
|
return registerClientDimension(dimensionID, rootID, type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -223,6 +138,9 @@ public class PocketManager
|
|||||||
//ArrayList that stores the dimension IDs of any dimension that has been deleted.
|
//ArrayList that stores the dimension IDs of any dimension that has been deleted.
|
||||||
private static ArrayList<Integer> dimensionIDBlackList = null;
|
private static ArrayList<Integer> dimensionIDBlackList = null;
|
||||||
|
|
||||||
|
//Stores all the personal pocket mappings
|
||||||
|
private static HashMap<String, NewDimData> personalPocketsMapping = null;
|
||||||
|
|
||||||
public static boolean isLoaded()
|
public static boolean isLoaded()
|
||||||
{
|
{
|
||||||
return isLoaded;
|
return isLoaded;
|
||||||
@@ -247,6 +165,8 @@ public class PocketManager
|
|||||||
dimensionData = new HashMap<Integer, InnerDimData>();
|
dimensionData = new HashMap<Integer, InnerDimData>();
|
||||||
rootDimensions = new ArrayList<NewDimData>();
|
rootDimensions = new ArrayList<NewDimData>();
|
||||||
dimensionIDBlackList = new ArrayList<Integer>();
|
dimensionIDBlackList = new ArrayList<Integer>();
|
||||||
|
personalPocketsMapping = new HashMap<String, NewDimData>();
|
||||||
|
|
||||||
|
|
||||||
if(FMLCommonHandler.instance().getEffectiveSide().isClient())
|
if(FMLCommonHandler.instance().getEffectiveSide().isClient())
|
||||||
{
|
{
|
||||||
@@ -258,7 +178,8 @@ public class PocketManager
|
|||||||
}
|
}
|
||||||
//Register Limbo
|
//Register Limbo
|
||||||
DDProperties properties = DDProperties.instance();
|
DDProperties properties = DDProperties.instance();
|
||||||
registerDimension(properties.LimboDimensionID, null, false, false);
|
registerDimension(properties.LimboDimensionID, null, DimensionType.ROOT);
|
||||||
|
|
||||||
|
|
||||||
loadInternal();
|
loadInternal();
|
||||||
|
|
||||||
@@ -271,12 +192,16 @@ public class PocketManager
|
|||||||
|
|
||||||
public static boolean registerPackedDimData(PackedDimData packedData)
|
public static boolean registerPackedDimData(PackedDimData packedData)
|
||||||
{
|
{
|
||||||
|
|
||||||
InnerDimData dimData;
|
InnerDimData dimData;
|
||||||
|
DimensionType type = DimensionType.getTypeFromIndex(packedData.DimensionType);
|
||||||
|
if(type == null)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Invalid dimension type");
|
||||||
|
}
|
||||||
//register roots
|
//register roots
|
||||||
if(packedData.ID==packedData.ParentID)
|
if(packedData.ID==packedData.ParentID)
|
||||||
{
|
{
|
||||||
dimData = new InnerDimData(packedData.ID, null, false, false, linkWatcher);
|
dimData = new InnerDimData(packedData.ID, null, type, linkWatcher);
|
||||||
dimData.root=dimData;
|
dimData.root=dimData;
|
||||||
dimData.parent=dimData;
|
dimData.parent=dimData;
|
||||||
dimData.depth=packedData.Depth;
|
dimData.depth=packedData.Depth;
|
||||||
@@ -288,10 +213,10 @@ public class PocketManager
|
|||||||
else //register children
|
else //register children
|
||||||
{
|
{
|
||||||
InnerDimData test = PocketManager.dimensionData.get(packedData.ParentID);
|
InnerDimData test = PocketManager.dimensionData.get(packedData.ParentID);
|
||||||
dimData = new InnerDimData(packedData.ID, test,true, packedData.IsDungeon, linkWatcher);
|
dimData = new InnerDimData(packedData.ID, test, type, linkWatcher);
|
||||||
dimData.isFilled=packedData.IsFilled;
|
dimData.isFilled=packedData.IsFilled;
|
||||||
dimData.origin = new Point4D(packedData.Origin.getX(),packedData.Origin.getY(),packedData.Origin.getZ(),packedData.ID);
|
dimData.origin = new Point4D(packedData.Origin.getX(),packedData.Origin.getY(),packedData.Origin.getZ(),packedData.ID);
|
||||||
dimData.root=PocketManager.getDimensionData(packedData.RootID);
|
dimData.root = PocketManager.createDimensionData(packedData.RootID);
|
||||||
|
|
||||||
if(packedData.DungeonData!=null)
|
if(packedData.DungeonData!=null)
|
||||||
{
|
{
|
||||||
@@ -315,44 +240,48 @@ public class PocketManager
|
|||||||
{
|
{
|
||||||
if (deleteFolder)
|
if (deleteFolder)
|
||||||
{
|
{
|
||||||
deleteDimensionFiles(target);
|
deleteDimensionFiles(dimension);
|
||||||
}
|
}
|
||||||
|
// Note: We INTENTIONALLY don't unregister the dimensions that we
|
||||||
|
// delete with Forge. Instead, we keep them registered to stop Forge
|
||||||
|
// from reallocating those IDs to other mods such as Mystcraft. This
|
||||||
|
// is to prevent bugs. Blacklisted dimensions are still properly
|
||||||
|
// unregistered when the server shuts down.
|
||||||
dimensionIDBlackList.add(dimension.id);
|
dimensionIDBlackList.add(dimension.id);
|
||||||
deleteDimensionData(dimension.id);
|
deleteDimensionData(dimension);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean deleteDimensionFiles(NewDimData target)
|
private static void deleteDimensionFiles(InnerDimData dimension)
|
||||||
{
|
{
|
||||||
InnerDimData dimension = (InnerDimData) target;
|
// We assume that the caller checks if the dimension is loaded, for the
|
||||||
if (dimension.isPocketDimension() && DimensionManager.getWorld(dimension.id()) == null)
|
// sake of efficiency. Don't call this on a loaded dimension or bad
|
||||||
{
|
// things will happen!
|
||||||
String saveRootPath = DimensionManager.getCurrentSaveRootDirectory().getAbsolutePath();
|
String saveRootPath = DimensionManager.getCurrentSaveRootDirectory().getAbsolutePath();
|
||||||
File saveDirectory = new File(saveRootPath + "/DimensionalDoors/pocketDimID" + dimension.id());
|
File saveDirectory = new File(saveRootPath + "/DimensionalDoors/pocketDimID" + dimension.id());
|
||||||
DeleteFolder.deleteFolder(saveDirectory);
|
DeleteFolder.deleteFolder(saveDirectory);
|
||||||
File dataFile = new File(saveRootPath + "/DimensionalDoors/data/dim_" + dimension.id() + ".txt");
|
File dataFile = new File(saveRootPath + "/DimensionalDoors/data/dim_" + dimension.id() + ".txt");
|
||||||
dataFile.delete();
|
dataFile.delete();
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean deleteDimensionData(int dimensionID)
|
private static void deleteDimensionData(InnerDimData dimension)
|
||||||
{
|
{
|
||||||
if (dimensionData.containsKey(dimensionID) && DimensionManager.getWorld(dimensionID) == null)
|
// We assume that the caller checks if the dimension is loaded, for the
|
||||||
|
// sake of efficiency. Don't call this on a loaded dimension or bad
|
||||||
|
// things will happen!
|
||||||
|
if (dimensionData.remove(dimension.id()) != null)
|
||||||
{
|
{
|
||||||
NewDimData target = PocketManager.getDimensionData(dimensionID);
|
|
||||||
InnerDimData dimension = (InnerDimData) target;
|
|
||||||
|
|
||||||
dimensionData.remove(dimensionID);
|
|
||||||
// Raise the dim deleted event
|
// Raise the dim deleted event
|
||||||
getDimwatcher().onDeleted(new ClientDimData(dimension));
|
getDimwatcher().onDeleted(new ClientDimData(dimension));
|
||||||
dimension.clear();
|
dimension.clear();
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
return false;
|
else
|
||||||
|
{
|
||||||
|
// This should never happen. A simple sanity check.
|
||||||
|
throw new IllegalArgumentException("The specified dimension is not listed with PocketManager.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void registerPockets(DDProperties properties)
|
private static void registerPockets(DDProperties properties)
|
||||||
@@ -363,7 +292,14 @@ public class PocketManager
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
DimensionManager.registerDimension(dimension.id(), properties.PocketProviderID);
|
if(personalPocketsMapping.containsValue(dimension))
|
||||||
|
{
|
||||||
|
DimensionManager.registerDimension(dimension.id(), properties.PersonalPocketProviderID);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DimensionManager.registerDimension(dimension.id(), properties.PocketProviderID);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -410,8 +346,6 @@ public class PocketManager
|
|||||||
*/
|
*/
|
||||||
private static void loadInternal()
|
private static void loadInternal()
|
||||||
{
|
{
|
||||||
//System.out.println(!FMLCommonHandler.instance().getSide().isClient());
|
|
||||||
|
|
||||||
File saveDir = DimensionManager.getCurrentSaveRootDirectory();
|
File saveDir = DimensionManager.getCurrentSaveRootDirectory();
|
||||||
if (saveDir != null)
|
if (saveDir != null)
|
||||||
{
|
{
|
||||||
@@ -424,7 +358,8 @@ public class PocketManager
|
|||||||
{
|
{
|
||||||
System.out.println("Importing old DD save data...");
|
System.out.println("Importing old DD save data...");
|
||||||
OldSaveImporter.importOldSave(oldSaveData);
|
OldSaveImporter.importOldSave(oldSaveData);
|
||||||
oldSaveData.delete();
|
|
||||||
|
oldSaveData.renameTo(new File(oldSaveData.getAbsolutePath()+"_IMPORTED"));
|
||||||
|
|
||||||
System.out.println("Import Succesful!");
|
System.out.println("Import Succesful!");
|
||||||
}
|
}
|
||||||
@@ -478,6 +413,11 @@ public class PocketManager
|
|||||||
|
|
||||||
public static WorldServer loadDimension(int id)
|
public static WorldServer loadDimension(int id)
|
||||||
{
|
{
|
||||||
|
if (!DimensionManager.isDimensionRegistered(id))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
WorldServer world = DimensionManager.getWorld(id);
|
WorldServer world = DimensionManager.getWorld(id);
|
||||||
if (world == null)
|
if (world == null)
|
||||||
{
|
{
|
||||||
@@ -494,10 +434,17 @@ public class PocketManager
|
|||||||
|
|
||||||
public static NewDimData registerDimension(World world)
|
public static NewDimData registerDimension(World world)
|
||||||
{
|
{
|
||||||
return registerDimension(world.provider.dimensionId, null, false, false);
|
return registerDimension(world.provider.dimensionId, null, DimensionType.ROOT);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static NewDimData registerPocket(NewDimData parent, boolean isDungeon)
|
/**
|
||||||
|
* method to register a new pocket with DD and with forge.
|
||||||
|
* @param parent
|
||||||
|
* @param type
|
||||||
|
* @param playername
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static NewDimData registerPocket(NewDimData parent, DimensionType type, String playername)
|
||||||
{
|
{
|
||||||
if (parent == null)
|
if (parent == null)
|
||||||
{
|
{
|
||||||
@@ -506,9 +453,40 @@ public class PocketManager
|
|||||||
|
|
||||||
DDProperties properties = DDProperties.instance();
|
DDProperties properties = DDProperties.instance();
|
||||||
int dimensionID = DimensionManager.getNextFreeDimId();
|
int dimensionID = DimensionManager.getNextFreeDimId();
|
||||||
DimensionManager.registerDimension(dimensionID, properties.PocketProviderID);
|
|
||||||
return registerDimension(dimensionID, (InnerDimData) parent, true, isDungeon);
|
//register a personal pocket
|
||||||
|
if(type == DimensionType.PERSONAL)
|
||||||
|
{
|
||||||
|
if(playername == null)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("A personal pocket must be attached to a playername");
|
||||||
|
}
|
||||||
|
DimensionManager.registerDimension(dimensionID, properties.PersonalPocketProviderID);
|
||||||
|
NewDimData data = registerDimension(dimensionID, (InnerDimData) parent, type);
|
||||||
|
personalPocketsMapping.put(playername, data);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ //register a pocket as personal if its parents are personal, but without a mapping.
|
||||||
|
if(parent.type == DimensionType.PERSONAL)
|
||||||
|
{
|
||||||
|
DimensionManager.registerDimension(dimensionID, properties.PersonalPocketProviderID);
|
||||||
|
NewDimData data = registerDimension(dimensionID, (InnerDimData) parent, DimensionType.PERSONAL);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
//register a standard pocket
|
||||||
|
DimensionManager.registerDimension(dimensionID, properties.PocketProviderID);
|
||||||
|
return registerDimension(dimensionID, (InnerDimData) parent, type);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static NewDimData registerPocket(NewDimData parent, DimensionType type)
|
||||||
|
{
|
||||||
|
return registerPocket(parent, type, null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers a dimension with DD but NOT with forge.
|
* Registers a dimension with DD but NOT with forge.
|
||||||
* @param dimensionID
|
* @param dimensionID
|
||||||
@@ -517,7 +495,7 @@ public class PocketManager
|
|||||||
* @param isDungeon
|
* @param isDungeon
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private static NewDimData registerDimension(int dimensionID, InnerDimData parent, boolean isPocket, boolean isDungeon)
|
private static NewDimData registerDimension(int dimensionID, InnerDimData parent, DimensionType type)
|
||||||
{
|
{
|
||||||
if (dimensionData.containsKey(dimensionID))
|
if (dimensionData.containsKey(dimensionID))
|
||||||
{
|
{
|
||||||
@@ -527,7 +505,7 @@ public class PocketManager
|
|||||||
}
|
}
|
||||||
throw new IllegalArgumentException("Cannot register a dimension with ID = " + dimensionID + " because it has already been registered.");
|
throw new IllegalArgumentException("Cannot register a dimension with ID = " + dimensionID + " because it has already been registered.");
|
||||||
}
|
}
|
||||||
InnerDimData dimension = new InnerDimData(dimensionID, parent, isPocket, isDungeon, linkWatcher);
|
InnerDimData dimension = new InnerDimData(dimensionID, parent, type, linkWatcher);
|
||||||
dimensionData.put(dimensionID, dimension);
|
dimensionData.put(dimensionID, dimension);
|
||||||
if (!dimension.isPocketDimension())
|
if (!dimension.isPocketDimension())
|
||||||
{
|
{
|
||||||
@@ -539,16 +517,17 @@ public class PocketManager
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly(Side.CLIENT)
|
||||||
private static NewDimData registerClientDimension(int dimensionID, int rootID)
|
private static NewDimData registerClientDimension(int dimensionID, int rootID, DimensionType type)
|
||||||
{
|
|
||||||
System.out.println("Registered dim "+dimensionID+" on the client.");
|
|
||||||
// No need to raise events heres since this code should only run on the client side
|
|
||||||
// getDimensionData() always handles root dimensions properly, even if the weren't defined before
|
|
||||||
|
|
||||||
// SenseiKiwi: I'm a little worried about how getDimensionData will raise
|
{
|
||||||
|
// No need to raise events heres since this code should only run on the
|
||||||
|
// client side. createDimensionData() always handles root dimensions
|
||||||
|
// properly, even if they weren't defined before.
|
||||||
|
|
||||||
|
// SenseiKiwi: I'm a little worried about how createDimensionData will raise
|
||||||
// an event when it creates any root dimensions... Needs checking later.
|
// an event when it creates any root dimensions... Needs checking later.
|
||||||
|
|
||||||
InnerDimData root = (InnerDimData) getDimensionData(rootID);
|
InnerDimData root = (InnerDimData) createDimensionData(rootID);
|
||||||
InnerDimData dimension;
|
InnerDimData dimension;
|
||||||
|
|
||||||
if (rootID != dimensionID)
|
if (rootID != dimensionID)
|
||||||
@@ -556,7 +535,7 @@ public class PocketManager
|
|||||||
dimension = dimensionData.get(dimensionID);
|
dimension = dimensionData.get(dimensionID);
|
||||||
if (dimension == null)
|
if (dimension == null)
|
||||||
{
|
{
|
||||||
dimension = new InnerDimData(dimensionID, root);
|
dimension = new InnerDimData(dimensionID, root, type);
|
||||||
dimensionData.put(dimension.id(), dimension);
|
dimensionData.put(dimension.id(), dimension);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -564,7 +543,7 @@ public class PocketManager
|
|||||||
{
|
{
|
||||||
dimension = root;
|
dimension = root;
|
||||||
}
|
}
|
||||||
if(dimension.isPocketDimension()&&!DimensionManager.isDimensionRegistered(dimension.id()))
|
if (dimension.isPocketDimension() && !DimensionManager.isDimensionRegistered(dimension.id()))
|
||||||
{
|
{
|
||||||
//Im registering pocket dims here. I *think* we can assume that if its a pocket and we are
|
//Im registering pocket dims here. I *think* we can assume that if its a pocket and we are
|
||||||
//registering its dim data, we also need to register it with forge.
|
//registering its dim data, we also need to register it with forge.
|
||||||
@@ -573,32 +552,42 @@ public class PocketManager
|
|||||||
//Steven
|
//Steven
|
||||||
DimensionManager.registerDimension(dimensionID, mod_pocketDim.properties.PocketProviderID);
|
DimensionManager.registerDimension(dimensionID, mod_pocketDim.properties.PocketProviderID);
|
||||||
}
|
}
|
||||||
return dimension;
|
return dimension;
|
||||||
}
|
|
||||||
|
|
||||||
public static NewDimData getDimensionData(World world)
|
|
||||||
{
|
|
||||||
return getDimensionData(world.provider.dimensionId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static NewDimData getDimensionData(int dimensionID)
|
public static NewDimData getDimensionData(int dimensionID)
|
||||||
{
|
{
|
||||||
//Retrieve the data for a dimension. If we don't have a record for that dimension,
|
return PocketManager.dimensionData.get(dimensionID);
|
||||||
//assume it's a non-pocket dimension that hasn't been initialized with us before
|
}
|
||||||
//and create a NewDimData instance for it.
|
|
||||||
//Any pocket dimension must be listed with PocketManager to have a dimension ID
|
|
||||||
//assigned, so it's safe to assume that any unknown dimensions don't belong to us.
|
|
||||||
|
|
||||||
//FIXME: What's the point of this condition? Most calls to this function will crash anyway! ~SenseiKiwi
|
public static NewDimData getDimensionData(World dimension)
|
||||||
if(PocketManager.dimensionData == null)
|
{
|
||||||
{
|
return PocketManager.dimensionData.get(dimension.provider.dimensionId);
|
||||||
System.out.println("Something odd happend during shutdown");
|
}
|
||||||
return null;
|
|
||||||
}
|
public static NewDimData createDimensionData(World world)
|
||||||
|
{
|
||||||
|
return createDimensionData(world.provider.dimensionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NewDimData createDimensionDataDangerously(int dimensionID)
|
||||||
|
{
|
||||||
|
// Same as createDimensionData(int), but public. Meant to discourage anyone from
|
||||||
|
// using it unless absolutely needed! We'll probably phase this out eventually.
|
||||||
|
return createDimensionData(dimensionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static NewDimData createDimensionData(int dimensionID)
|
||||||
|
{
|
||||||
|
// Retrieve the data for a dimension. If we don't have a record for that dimension,
|
||||||
|
// assume it's a non-pocket dimension that hasn't been initialized with us before
|
||||||
|
// and create a NewDimData instance for it.
|
||||||
NewDimData dimension = PocketManager.dimensionData.get(dimensionID);
|
NewDimData dimension = PocketManager.dimensionData.get(dimensionID);
|
||||||
|
|
||||||
|
// if we do not have a record of it, then it must be a root
|
||||||
if (dimension == null)
|
if (dimension == null)
|
||||||
{
|
{
|
||||||
dimension = registerDimension(dimensionID, null, false, false);
|
dimension = registerDimension(dimensionID, null, DimensionType.ROOT);
|
||||||
}
|
}
|
||||||
return dimension;
|
return dimension;
|
||||||
}
|
}
|
||||||
@@ -624,6 +613,7 @@ public class PocketManager
|
|||||||
|
|
||||||
unregisterPockets();
|
unregisterPockets();
|
||||||
dimensionData = null;
|
dimensionData = null;
|
||||||
|
personalPocketsMapping = null;
|
||||||
rootDimensions = null;
|
rootDimensions = null;
|
||||||
isLoaded = false;
|
isLoaded = false;
|
||||||
isConnected = false;
|
isConnected = false;
|
||||||
@@ -646,10 +636,7 @@ public class PocketManager
|
|||||||
{
|
{
|
||||||
return dimension.getLink(x, y, z);
|
return dimension.getLink(x, y, z);
|
||||||
}
|
}
|
||||||
else
|
return null;
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isBlackListed(int dimensionID)
|
public static boolean isBlackListed(int dimensionID)
|
||||||
@@ -715,9 +702,6 @@ public class PocketManager
|
|||||||
load();
|
load();
|
||||||
Compactor.readDimensions(input, new DimRegistrationCallback());
|
Compactor.readDimensions(input, new DimRegistrationCallback());
|
||||||
|
|
||||||
// Register pocket dimensions
|
|
||||||
DDProperties properties = DDProperties.instance();
|
|
||||||
|
|
||||||
isLoaded = true;
|
isLoaded = true;
|
||||||
isLoading = false;
|
isLoading = false;
|
||||||
isConnected = true;
|
isConnected = true;
|
||||||
@@ -727,4 +711,29 @@ public class PocketManager
|
|||||||
{
|
{
|
||||||
return dimWatcher;
|
return dimWatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static UpdateWatcherProxy<ClientLinkData> getLinkWatcher()
|
||||||
|
{
|
||||||
|
return linkWatcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NewDimData getPersonalDimensionForPlayer(String name)
|
||||||
|
{
|
||||||
|
if(personalPocketsMapping.containsKey(name))
|
||||||
|
{
|
||||||
|
return personalPocketsMapping.get(name);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setPersonalPocketsMapping(HashMap<String, NewDimData> ppMap)
|
||||||
|
{
|
||||||
|
personalPocketsMapping = ppMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HashMap<String, NewDimData> getPersonalPocketMapping()
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return personalPocketsMapping;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import java.util.Map;
|
|||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
@@ -20,7 +19,7 @@ import StevenDimDoors.mod_pocketDim.Point3D;
|
|||||||
import StevenDimDoors.mod_pocketDim.blocks.IDimDoor;
|
import StevenDimDoors.mod_pocketDim.blocks.IDimDoor;
|
||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
import StevenDimDoors.mod_pocketDim.schematic.BlockRotator;
|
import StevenDimDoors.mod_pocketDim.schematic.BlockRotator;
|
||||||
@@ -162,7 +161,7 @@ public class DungeonSchematic extends Schematic {
|
|||||||
applyFilter(standardizer);
|
applyFilter(standardizer);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<Short, Short> getAssignedToStandardIDMapping(DDProperties properties)
|
private static Map<Short, Short> getAssignedToStandardIDMapping(DDProperties properties)
|
||||||
{
|
{
|
||||||
//If we ever need this broadly or support other mods, this should be moved to a separate class
|
//If we ever need this broadly or support other mods, this should be moved to a separate class
|
||||||
TreeMap<Short, Short> mapping = new TreeMap<Short, Short>();
|
TreeMap<Short, Short> mapping = new TreeMap<Short, Short>();
|
||||||
@@ -247,7 +246,7 @@ public class DungeonSchematic extends Schematic {
|
|||||||
world.setBlockTileEntity(pocketPoint.getX(), pocketPoint.getY(), pocketPoint.getZ(), TileEntity.createAndLoadEntity(tileTag));
|
world.setBlockTileEntity(pocketPoint.getX(), pocketPoint.getY(), pocketPoint.getZ(), TileEntity.createAndLoadEntity(tileTag));
|
||||||
}
|
}
|
||||||
|
|
||||||
setUpDungeon(PocketManager.getDimensionData(world), world, pocketCenter, turnAngle, entryLink, random, properties, blockSetter);
|
setUpDungeon(PocketManager.createDimensionData(world), world, pocketCenter, turnAngle, entryLink, random, properties, blockSetter);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpDungeon(NewDimData dimension, World world, Point3D pocketCenter, int turnAngle, DimLink entryLink, Random random, DDProperties properties, IBlockSetter blockSetter)
|
private void setUpDungeon(NewDimData dimension, World world, Point3D pocketCenter, int turnAngle, DimLink entryLink, Random random, DDProperties properties, IBlockSetter blockSetter)
|
||||||
@@ -322,10 +321,10 @@ public class DungeonSchematic extends Schematic {
|
|||||||
private static void createEntranceReverseLink(World world, NewDimData dimension, Point3D pocketCenter, DimLink entryLink)
|
private static void createEntranceReverseLink(World world, NewDimData dimension, Point3D pocketCenter, DimLink entryLink)
|
||||||
{
|
{
|
||||||
int orientation = world.getBlockMetadata(pocketCenter.getX(), pocketCenter.getY() - 1, pocketCenter.getZ());
|
int orientation = world.getBlockMetadata(pocketCenter.getX(), pocketCenter.getY() - 1, pocketCenter.getZ());
|
||||||
DimLink reverseLink = dimension.createLink(pocketCenter.getX(), pocketCenter.getY(), pocketCenter.getZ(), LinkTypes.REVERSE, orientation);
|
DimLink reverseLink = dimension.createLink(pocketCenter.getX(), pocketCenter.getY(), pocketCenter.getZ(), LinkType.REVERSE, orientation);
|
||||||
Point4D destination = entryLink.source();
|
Point4D destination = entryLink.source();
|
||||||
NewDimData prevDim = PocketManager.getDimensionData(destination.getDimension());
|
NewDimData prevDim = PocketManager.getDimensionData(destination.getDimension());
|
||||||
prevDim.setDestination(reverseLink, destination.getX(), destination.getY(), destination.getZ());
|
prevDim.setLinkDestination(reverseLink, destination.getX(), destination.getY(), destination.getZ());
|
||||||
initDoorTileEntity(world, pocketCenter);
|
initDoorTileEntity(world, pocketCenter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -335,7 +334,7 @@ public class DungeonSchematic extends Schematic {
|
|||||||
Point3D location = point.clone();
|
Point3D location = point.clone();
|
||||||
BlockRotator.transformPoint(location, entrance, rotation, pocketCenter);
|
BlockRotator.transformPoint(location, entrance, rotation, pocketCenter);
|
||||||
int orientation = world.getBlockMetadata(location.getX(), location.getY() - 1, location.getZ());
|
int orientation = world.getBlockMetadata(location.getX(), location.getY() - 1, location.getZ());
|
||||||
dimension.createLink(location.getX(), location.getY(), location.getZ(), LinkTypes.DUNGEON_EXIT, orientation);
|
dimension.createLink(location.getX(), location.getY(), location.getZ(), LinkType.DUNGEON_EXIT, orientation);
|
||||||
//Replace the sandstone block under the exit door with the same block as the one underneath it
|
//Replace the sandstone block under the exit door with the same block as the one underneath it
|
||||||
int x = location.getX();
|
int x = location.getX();
|
||||||
int y = location.getY() - 3;
|
int y = location.getY() - 3;
|
||||||
@@ -356,7 +355,7 @@ public class DungeonSchematic extends Schematic {
|
|||||||
BlockRotator.transformPoint(location, entrance, rotation, pocketCenter);
|
BlockRotator.transformPoint(location, entrance, rotation, pocketCenter);
|
||||||
int orientation = world.getBlockMetadata(location.getX(), location.getY() - 1, location.getZ());
|
int orientation = world.getBlockMetadata(location.getX(), location.getY() - 1, location.getZ());
|
||||||
|
|
||||||
dimension.createLink(location.getX(), location.getY(), location.getZ(), LinkTypes.DUNGEON, orientation);
|
dimension.createLink(location.getX(), location.getY(), location.getZ(), LinkType.DUNGEON, orientation);
|
||||||
initDoorTileEntity(world, location);
|
initDoorTileEntity(world, location);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -298,4 +298,9 @@ public class DungeonPack
|
|||||||
WeightedContainer<DungeonData> resultContainer = (WeightedContainer<DungeonData>) WeightedRandom.getRandomItem(random, weights);
|
WeightedContainer<DungeonData> resultContainer = (WeightedContainer<DungeonData>) WeightedRandom.getRandomItem(random, weights);
|
||||||
return (resultContainer != null) ? resultContainer.getData() : null;
|
return (resultContainer != null) ? resultContainer.getData() : null;
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,4 +45,9 @@ public class DungeonType implements Comparable<DungeonType>
|
|||||||
final int prime = 2039;
|
final int prime = 2039;
|
||||||
return prime * ID;
|
return prime * ID;
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
return this.Name+" owned by "+this.Owner;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,47 +1,91 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.helpers;
|
package StevenDimDoors.mod_pocketDim.helpers;
|
||||||
|
|
||||||
import StevenDimDoors.mod_pocketDim.IChunkLoader;
|
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
|
||||||
|
|
||||||
import cpw.mods.fml.common.event.FMLServerStartingEvent;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.world.ChunkCoordIntPair;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.common.DimensionManager;
|
import net.minecraftforge.common.DimensionManager;
|
||||||
import net.minecraftforge.common.ForgeChunkManager;
|
import net.minecraftforge.common.ForgeChunkManager;
|
||||||
import net.minecraftforge.common.ForgeChunkManager.LoadingCallback;
|
import net.minecraftforge.common.ForgeChunkManager.LoadingCallback;
|
||||||
import net.minecraftforge.common.ForgeChunkManager.Ticket;
|
import net.minecraftforge.common.ForgeChunkManager.Ticket;
|
||||||
|
import net.minecraftforge.common.ForgeChunkManager.Type;
|
||||||
|
import StevenDimDoors.experimental.BoundingBox;
|
||||||
|
import StevenDimDoors.mod_pocketDim.IChunkLoader;
|
||||||
|
import StevenDimDoors.mod_pocketDim.Point3D;
|
||||||
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
|
import StevenDimDoors.mod_pocketDim.world.PocketBuilder;
|
||||||
|
import cpw.mods.fml.common.event.FMLServerStartingEvent;
|
||||||
|
|
||||||
public class ChunkLoaderHelper implements LoadingCallback
|
public class ChunkLoaderHelper implements LoadingCallback
|
||||||
{
|
{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void ticketsLoaded(List<Ticket> tickets, World world)
|
public void ticketsLoaded(List<Ticket> tickets, World world)
|
||||||
{
|
{
|
||||||
for (Ticket ticket : tickets)
|
for (Ticket ticket : tickets)
|
||||||
{
|
{
|
||||||
int goldDimDoorX = ticket.getModData().getInteger("goldDimDoorX");
|
boolean loaded = false;
|
||||||
int goldDimDoorY = ticket.getModData().getInteger("goldDimDoorY");
|
int x = ticket.getModData().getInteger("goldDimDoorX");
|
||||||
int goldDimDoorZ = ticket.getModData().getInteger("goldDimDoorZ");
|
int y = ticket.getModData().getInteger("goldDimDoorY");
|
||||||
if(world.getBlockId(goldDimDoorX, goldDimDoorY, goldDimDoorZ) != mod_pocketDim.properties.GoldenDimensionalDoorID)
|
int z = ticket.getModData().getInteger("goldDimDoorZ");
|
||||||
|
|
||||||
|
if (world.getBlockId(x, y, z) == mod_pocketDim.properties.GoldenDimensionalDoorID)
|
||||||
|
{
|
||||||
|
IChunkLoader loader = (IChunkLoader) world.getBlockTileEntity(x, y, z);
|
||||||
|
if (!loader.isInitialized())
|
||||||
|
{
|
||||||
|
loader.initialize(ticket);
|
||||||
|
loaded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!loaded)
|
||||||
{
|
{
|
||||||
ForgeChunkManager.releaseTicket(ticket);
|
ForgeChunkManager.releaseTicket(ticket);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
IChunkLoader tile = (IChunkLoader) world.getBlockTileEntity(goldDimDoorX, goldDimDoorY, goldDimDoorZ);
|
|
||||||
tile.forceChunkLoading(ticket,goldDimDoorX,goldDimDoorZ);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void loadChunkForcedWorlds(FMLServerStartingEvent event)
|
public static Ticket createTicket(int x, int y, int z, World world)
|
||||||
{
|
{
|
||||||
for(NewDimData data : PocketManager.getDimensions())
|
NBTTagCompound data;
|
||||||
|
Ticket ticket = ForgeChunkManager.requestTicket(mod_pocketDim.instance, world, Type.NORMAL);
|
||||||
|
if (ticket != null)
|
||||||
|
{
|
||||||
|
data = ticket.getModData();
|
||||||
|
data.setInteger("goldDimDoorX", x);
|
||||||
|
data.setInteger("goldDimDoorY", y);
|
||||||
|
data.setInteger("goldDimDoorZ", z);
|
||||||
|
}
|
||||||
|
return ticket;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void forcePocketChunks(NewDimData pocket, Ticket ticket)
|
||||||
|
{
|
||||||
|
BoundingBox bounds = PocketBuilder.calculateDefaultBounds(pocket);
|
||||||
|
Point3D minCorner = bounds.minCorner();
|
||||||
|
Point3D maxCorner = bounds.maxCorner();
|
||||||
|
int minX = minCorner.getX() >> 4;
|
||||||
|
int minZ = minCorner.getZ() >> 4;
|
||||||
|
int maxX = maxCorner.getX() >> 4;
|
||||||
|
int maxZ = maxCorner.getZ() >> 4;
|
||||||
|
int chunkX;
|
||||||
|
int chunkZ;
|
||||||
|
|
||||||
|
for (chunkX = minX; chunkX <= maxX; chunkX++)
|
||||||
|
{
|
||||||
|
for (chunkZ = minZ; chunkZ <= maxZ; chunkZ++)
|
||||||
|
{
|
||||||
|
ForgeChunkManager.forceChunk(ticket, new ChunkCoordIntPair(chunkX, chunkZ));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void loadForcedChunkWorlds(FMLServerStartingEvent event)
|
||||||
|
{
|
||||||
|
for (NewDimData data : PocketManager.getDimensions())
|
||||||
{
|
{
|
||||||
if(data.isPocketDimension())
|
if(data.isPocketDimension())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ import java.io.IOException;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.DimensionType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.IDimRegistrationCallback;
|
import StevenDimDoors.mod_pocketDim.core.IDimRegistrationCallback;
|
||||||
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData;
|
import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData;
|
||||||
@@ -68,19 +68,20 @@ public class Compactor
|
|||||||
{
|
{
|
||||||
int id = input.readInt();
|
int id = input.readInt();
|
||||||
int rootID = input.readInt();
|
int rootID = input.readInt();
|
||||||
|
DimensionType type = DimensionType.getTypeFromIndex(input.readInt());
|
||||||
|
|
||||||
if (rootIDs.add(rootID))
|
if (rootIDs.add(rootID))
|
||||||
{
|
{
|
||||||
callback.registerDimension(rootID, rootID);
|
callback.registerDimension(rootID, rootID, type);
|
||||||
}
|
}
|
||||||
// Don't check if (id != rootID) - we want to retrieve the reference anyway
|
// Don't check if (id != rootID) - we want to retrieve the reference anyway
|
||||||
NewDimData dimension = callback.registerDimension(id, rootID);
|
NewDimData dimension = callback.registerDimension(id, rootID, type);
|
||||||
int linkCount = input.readInt();
|
int linkCount = input.readInt();
|
||||||
for (int h = 0; h < linkCount; h++)
|
for (int h = 0; h < linkCount; h++)
|
||||||
{
|
{
|
||||||
ClientLinkData link = ClientLinkData.read(input);
|
ClientLinkData link = ClientLinkData.read(input);
|
||||||
Point4D source = link.point;
|
Point4D source = link.point;
|
||||||
dimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.CLIENT_SIDE,link.orientation);
|
dimension.createLink(source.getX(), source.getY(), source.getZ(), LinkType.CLIENT,0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,31 +2,33 @@ package StevenDimDoors.mod_pocketDim.helpers;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
|
|
||||||
public class DeleteFolder
|
public class DeleteFolder
|
||||||
{
|
{
|
||||||
public static boolean deleteFolder(File file)
|
public static boolean deleteFolder(File directory)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
File[] files = file.listFiles();
|
File[] contents = directory.listFiles();
|
||||||
|
if (contents != null)
|
||||||
if(files==null)
|
|
||||||
{
|
{
|
||||||
file.delete();
|
for (File entry : contents)
|
||||||
return true;
|
{
|
||||||
|
if (entry.isDirectory())
|
||||||
|
{
|
||||||
|
deleteFolder(entry);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
entry.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for(File inFile : files)
|
return directory.delete();
|
||||||
{
|
|
||||||
DeleteFolder.deleteFolder(inFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -16,13 +16,12 @@ import java.util.List;
|
|||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import net.minecraft.util.WeightedRandom;
|
import net.minecraft.util.WeightedRandom;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
import StevenDimDoors.mod_pocketDim.dungeon.DungeonData;
|
import StevenDimDoors.mod_pocketDim.dungeon.DungeonData;
|
||||||
@@ -46,7 +45,7 @@ public class DungeonHelper
|
|||||||
public static final String SCHEMATIC_FILE_EXTENSION = ".schematic";
|
public static final String SCHEMATIC_FILE_EXTENSION = ".schematic";
|
||||||
|
|
||||||
private static final String DEFAULT_ERROR_SCHEMATIC_PATH = "/schematics/core/somethingBroke.schematic";
|
private static final String DEFAULT_ERROR_SCHEMATIC_PATH = "/schematics/core/somethingBroke.schematic";
|
||||||
private static final String DUNGEON_CREATION_GUIDE_SOURCE_PATH = "/mods/DimDoors/text/How_to_add_dungeons.txt";
|
private static final String DUNGEON_CREATION_GUIDE_SOURCE_PATH = "/assets/dimdoors/text/How_to_add_dungeons.txt";
|
||||||
private static final String BUNDLED_PACK_BASE_PATH = "/schematics/";
|
private static final String BUNDLED_PACK_BASE_PATH = "/schematics/";
|
||||||
private static final String STANDARD_CONFIG_FILE_NAME = "rules.txt";
|
private static final String STANDARD_CONFIG_FILE_NAME = "rules.txt";
|
||||||
|
|
||||||
@@ -264,7 +263,7 @@ public class DungeonHelper
|
|||||||
{
|
{
|
||||||
//Create a link above the specified position. Link to a new pocket dimension.
|
//Create a link above the specified position. Link to a new pocket dimension.
|
||||||
NewDimData dimension = PocketManager.getDimensionData(world);
|
NewDimData dimension = PocketManager.getDimensionData(world);
|
||||||
DimLink link = dimension.createLink(x, y + 1, z, LinkTypes.POCKET, 3);
|
DimLink link = dimension.createLink(x, y + 1, z, LinkType.POCKET, 3);
|
||||||
|
|
||||||
//Place a Warp Door linked to that pocket
|
//Place a Warp Door linked to that pocket
|
||||||
ItemDimensionalDoor.placeDoorBlock(world, x, y, z, 3, mod_pocketDim.warpDoor);
|
ItemDimensionalDoor.placeDoorBlock(world, x, y, z, 3, mod_pocketDim.warpDoor);
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package StevenDimDoors.mod_pocketDim.helpers;
|
||||||
|
|
||||||
|
public class PersonalPocketHelper
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
@@ -215,10 +215,7 @@ public class yCoordHelper
|
|||||||
{
|
{
|
||||||
for (int dz = -1; dz <= 1; dz++)
|
for (int dz = -1; dz <= 1; dz++)
|
||||||
{
|
{
|
||||||
if (!provider.chunkExists(chunkX + dx, chunkZ + dz))
|
provider.loadChunk(chunkX, chunkZ);
|
||||||
{
|
|
||||||
provider.loadChunk(chunkX, chunkZ);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return target;
|
return target;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package StevenDimDoors.mod_pocketDim.items;
|
|||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.material.Material;
|
import net.minecraft.block.material.Material;
|
||||||
import net.minecraft.client.renderer.texture.IconRegister;
|
import net.minecraft.client.renderer.texture.IconRegister;
|
||||||
@@ -23,9 +24,9 @@ import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor;
|
|||||||
|
|
||||||
public abstract class BaseItemDoor extends ItemDoor
|
public abstract class BaseItemDoor extends ItemDoor
|
||||||
{
|
{
|
||||||
// maps non-dimensional door items to their corresponding dimensional door
|
// Maps non-dimensional door items to their corresponding dimensional door item
|
||||||
// item
|
// Also maps dimensional door items to themselves for simplicity
|
||||||
private static HashMap<ItemDoor, BaseItemDoor> vanillaDoorMapping = new HashMap<ItemDoor, BaseItemDoor>();
|
private static HashMap<ItemDoor, BaseItemDoor> doorItemMapping = new HashMap<ItemDoor, BaseItemDoor>();
|
||||||
private static DDProperties properties = null;
|
private static DDProperties properties = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -34,7 +35,7 @@ public abstract class BaseItemDoor extends ItemDoor
|
|||||||
* @param material
|
* @param material
|
||||||
* @param door
|
* @param door
|
||||||
*/
|
*/
|
||||||
public BaseItemDoor(int itemID, Material material, ItemDoor door)
|
public BaseItemDoor(int itemID, Material material, ItemDoor vanillaDoor)
|
||||||
{
|
{
|
||||||
super(itemID, material);
|
super(itemID, material);
|
||||||
this.setMaxStackSize(64);
|
this.setMaxStackSize(64);
|
||||||
@@ -42,9 +43,10 @@ public abstract class BaseItemDoor extends ItemDoor
|
|||||||
if (properties == null)
|
if (properties == null)
|
||||||
properties = DDProperties.instance();
|
properties = DDProperties.instance();
|
||||||
|
|
||||||
if(door!=null)
|
doorItemMapping.put(this, this);
|
||||||
|
if (vanillaDoor != null)
|
||||||
{
|
{
|
||||||
vanillaDoorMapping.put(door, this);
|
doorItemMapping.put(vanillaDoor, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,7 +66,7 @@ public abstract class BaseItemDoor extends ItemDoor
|
|||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
protected abstract BaseDimDoor getDoortoItemMapping();
|
protected abstract BaseDimDoor getDoorBlock();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Overriden here to remove vanilla block placement functionality from
|
* Overriden here to remove vanilla block placement functionality from
|
||||||
@@ -73,23 +75,12 @@ public abstract class BaseItemDoor extends ItemDoor
|
|||||||
@Override
|
@Override
|
||||||
public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
|
public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
|
||||||
{
|
{
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BaseDimDoor getDoorToPlace(Item item)
|
|
||||||
{
|
|
||||||
if (!(item instanceof BaseItemDoor))
|
|
||||||
{
|
|
||||||
item = BaseItemDoor.vanillaDoorMapping.get(item);
|
|
||||||
}
|
|
||||||
return ((BaseItemDoor) item).getDoortoItemMapping();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tries to place a door block, called in EventHookContainer
|
* Tries to place a door as a dimensional door
|
||||||
*
|
*
|
||||||
* @param doorBlock
|
|
||||||
* @param stack
|
* @param stack
|
||||||
* @param player
|
* @param player
|
||||||
* @param world
|
* @param world
|
||||||
@@ -97,8 +88,6 @@ public abstract class BaseItemDoor extends ItemDoor
|
|||||||
* @param y
|
* @param y
|
||||||
* @param z
|
* @param z
|
||||||
* @param side
|
* @param side
|
||||||
* @param requireLink
|
|
||||||
* @param reduceStack
|
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static boolean tryToPlaceDoor(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side)
|
public static boolean tryToPlaceDoor(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side)
|
||||||
@@ -107,15 +96,20 @@ public abstract class BaseItemDoor extends ItemDoor
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!(stack.getItem() instanceof ItemDoor))
|
// Retrieve the actual door type that we want to use here.
|
||||||
|
// It's okay if stack isn't an ItemDoor. In that case, the lookup will
|
||||||
|
// return null, just as if the item was an unrecognized door type.
|
||||||
|
BaseItemDoor mappedItem = doorItemMapping.get(stack.getItem());
|
||||||
|
if (mappedItem == null)
|
||||||
{
|
{
|
||||||
throw new IllegalArgumentException("The itemstack must correspond to some type of door");
|
return false;
|
||||||
}
|
}
|
||||||
if (BaseItemDoor.placeDoorOnBlock(getDoorToPlace(stack.getItem()), stack, player, world, x, y, z, side))
|
BaseDimDoor doorBlock = mappedItem.getDoorBlock();
|
||||||
|
if (BaseItemDoor.placeDoorOnBlock(doorBlock, stack, player, world, x, y, z, side))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return BaseItemDoor.placeDoorOnRift(getDoorToPlace(stack.getItem()), world, player, stack);
|
return BaseItemDoor.placeDoorOnRift(doorBlock, world, player, stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
|||||||
|
|
||||||
public class ItemBlockDimWall extends ItemBlock
|
public class ItemBlockDimWall extends ItemBlock
|
||||||
{
|
{
|
||||||
private final static String[] subNames = {"Fabric of Reality", "Ancient Fabric"};
|
private final static String[] subNames = {"Fabric of Reality", "Ancient Fabric" , "Altered Fabric"};
|
||||||
|
|
||||||
public ItemBlockDimWall(int par1)
|
public ItemBlockDimWall(int par1)
|
||||||
{
|
{
|
||||||
|
|||||||
213
src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDDKey.java
Normal file
213
src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDDKey.java
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
package StevenDimDoors.mod_pocketDim.items;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import cpw.mods.fml.relauncher.Side;
|
||||||
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.client.renderer.texture.IconRegister;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.item.EnumAction;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.nbt.NBTBase;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTTagList;
|
||||||
|
import net.minecraft.util.EnumMovingObjectType;
|
||||||
|
import net.minecraft.util.MovingObjectPosition;
|
||||||
|
import net.minecraft.util.StatCollector;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
|
import StevenDimDoors.mod_pocketDim.blocks.IDimDoor;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.DDLock;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
|
import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData;
|
||||||
|
|
||||||
|
public class ItemDDKey extends Item
|
||||||
|
{
|
||||||
|
public static final int TIME_TO_UNLOCK = 30;
|
||||||
|
|
||||||
|
public ItemDDKey(int itemID)
|
||||||
|
{
|
||||||
|
super(itemID);
|
||||||
|
this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab);
|
||||||
|
this.setMaxStackSize(1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onCreated(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4)
|
||||||
|
{
|
||||||
|
if (DDLock.hasCreatedLock(par1ItemStack))
|
||||||
|
{
|
||||||
|
par3List.add("Bound");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
par3List.add("Unbound");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerIcons(IconRegister par1IconRegister)
|
||||||
|
{
|
||||||
|
this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SideOnly(Side.CLIENT)
|
||||||
|
public boolean hasEffect(ItemStack par1ItemStack)
|
||||||
|
{
|
||||||
|
return !DDLock.hasCreatedLock(par1ItemStack);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World par3World, int par4, int par5, int par6, int par7, float par8, float par9,
|
||||||
|
float par10)
|
||||||
|
{
|
||||||
|
player.setItemInUse(itemStack, this.getMaxItemUseDuration(itemStack));
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean onItemUseFirst(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float playerX, float playerY,
|
||||||
|
float playerZ)
|
||||||
|
{
|
||||||
|
if (world.isRemote)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player.getItemInUse() != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
int blockID = world.getBlockId(x, y, z);
|
||||||
|
// make sure we are dealing with a door
|
||||||
|
if (!(Block.blocksList[blockID] instanceof IDimDoor))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
DimLink link = PocketManager.getLink(x, y, z, world);
|
||||||
|
// dont do anything to doors without links
|
||||||
|
if (link == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// what to do if the door has a lock already
|
||||||
|
if (link.hasLock())
|
||||||
|
{
|
||||||
|
if (link.doesKeyUnlock(itemStack))
|
||||||
|
{
|
||||||
|
if (link.getLockState())
|
||||||
|
{
|
||||||
|
world.playSoundAtEntity(player, mod_pocketDim.modid + ":keyUnlock", 1F, 1F);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
world.playSoundAtEntity(player, mod_pocketDim.modid + ":keyLock", 1F, 1F);
|
||||||
|
}
|
||||||
|
PocketManager.getDimensionData(world).lock(link, !link.getLockState());
|
||||||
|
PocketManager.getLinkWatcher().update(new ClientLinkData(link));
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
world.playSoundAtEntity(player, mod_pocketDim.modid + ":doorLocked", 1F, 1F);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!DDLock.hasCreatedLock(itemStack))
|
||||||
|
{
|
||||||
|
world.playSoundAtEntity(player, mod_pocketDim.modid + ":keyLock", 1F, 1F);
|
||||||
|
PocketManager.getDimensionData(world).createLock(link, itemStack, world.rand.nextInt(Integer.MAX_VALUE));
|
||||||
|
PocketManager.getLinkWatcher().update(new ClientLinkData(link));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle removal of locks here
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onPlayerStoppedUsing(ItemStack itemStack, World world, EntityPlayer player, int heldTime)
|
||||||
|
{
|
||||||
|
int j = this.getMaxItemUseDuration(itemStack) - heldTime;
|
||||||
|
if (j >= TIME_TO_UNLOCK)
|
||||||
|
{
|
||||||
|
//Raytrace to make sure we are still looking at a door
|
||||||
|
MovingObjectPosition pos = getMovingObjectPositionFromPlayer(player.worldObj, player, true);
|
||||||
|
if (pos != null && pos.typeOfHit == EnumMovingObjectType.TILE)
|
||||||
|
{
|
||||||
|
//make sure we have a link and it has a lock
|
||||||
|
DimLink link = PocketManager.getLink(pos.blockX, pos.blockY, pos.blockZ, player.worldObj);
|
||||||
|
if (link != null && link.hasLock())
|
||||||
|
{
|
||||||
|
//make sure the given key is able to access the lock
|
||||||
|
if (link.doesKeyUnlock(itemStack) && !world.isRemote)
|
||||||
|
{
|
||||||
|
PocketManager.getDimensionData(world).removeLock(link, itemStack);
|
||||||
|
world.playSoundAtEntity(player, mod_pocketDim.modid + ":doorLockRemoved", 1F, 1F);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
player.clearItemInUse();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Raytrace to make sure we are still looking at the right block while preparing to remove the lock
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onUsingItemTick(ItemStack stack, EntityPlayer player, int count)
|
||||||
|
{
|
||||||
|
// no need to check every tick, twice a second instead
|
||||||
|
if (count % 10 == 0)
|
||||||
|
{
|
||||||
|
MovingObjectPosition pos = getMovingObjectPositionFromPlayer(player.worldObj, player, true);
|
||||||
|
if (pos != null && pos.typeOfHit == EnumMovingObjectType.TILE)
|
||||||
|
{
|
||||||
|
DimLink link = PocketManager.getLink(pos.blockX, pos.blockY, pos.blockZ, player.worldObj);
|
||||||
|
if (link != null && link.hasLock())
|
||||||
|
{
|
||||||
|
if (link.doesKeyUnlock(stack))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
player.clearItemInUse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public EnumAction getItemUseAction(ItemStack par1ItemStack)
|
||||||
|
{
|
||||||
|
return EnumAction.bow;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStack onEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
|
||||||
|
{
|
||||||
|
return par1ItemStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMaxItemUseDuration(ItemStack par1ItemStack)
|
||||||
|
{
|
||||||
|
return 72000;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getItemStackDisplayName(ItemStack par1ItemStack)
|
||||||
|
{
|
||||||
|
return StatCollector.translateToLocal(this.getUnlocalizedName(par1ItemStack));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,7 +28,7 @@ public class ItemDimensionalDoor extends BaseItemDoor
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected BaseDimDoor getDoortoItemMapping()
|
protected BaseDimDoor getDoorBlock()
|
||||||
{
|
{
|
||||||
return (BaseDimDoor) mod_pocketDim.dimensionalDoor;
|
return (BaseDimDoor) mod_pocketDim.dimensionalDoor;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ public class ItemGoldDimDoor extends BaseItemDoor
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected BaseDimDoor getDoortoItemMapping()
|
protected BaseDimDoor getDoorBlock()
|
||||||
{
|
{
|
||||||
return (BaseDimDoor) mod_pocketDim.goldenDimensionalDoor;
|
return (BaseDimDoor) mod_pocketDim.goldenDimensionalDoor;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ public class ItemGoldDoor extends ItemDoor
|
|||||||
public ItemGoldDoor(int par1, Material par2Material)
|
public ItemGoldDoor(int par1, Material par2Material)
|
||||||
{
|
{
|
||||||
super(par1, par2Material);
|
super(par1, par2Material);
|
||||||
|
this.setMaxStackSize(16);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package StevenDimDoors.mod_pocketDim.items;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.minecraft.block.material.Material;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.item.ItemDoor;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
|
import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor;
|
||||||
|
|
||||||
|
public class ItemPersonalDoor extends BaseItemDoor
|
||||||
|
{
|
||||||
|
public ItemPersonalDoor(int itemID, Material material, ItemDoor door)
|
||||||
|
{
|
||||||
|
super(itemID, material, door);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||||
|
@Override
|
||||||
|
public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4)
|
||||||
|
{
|
||||||
|
par3List.add("Creates a pathway to");
|
||||||
|
par3List.add("Your personal pocket");
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected BaseDimDoor getDoorBlock()
|
||||||
|
{
|
||||||
|
return (BaseDimDoor) mod_pocketDim.personalDimDoor;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
package StevenDimDoors.mod_pocketDim.items;
|
||||||
|
|
||||||
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.material.Material;
|
||||||
|
import net.minecraft.client.renderer.texture.IconRegister;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.item.ItemDoor;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.util.MathHelper;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
public class ItemQuartzDoor extends ItemDoor
|
||||||
|
{
|
||||||
|
public ItemQuartzDoor(int par1, Material par2Material)
|
||||||
|
{
|
||||||
|
super(par1, par2Material);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerIcons(IconRegister par1IconRegister)
|
||||||
|
{
|
||||||
|
this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10)
|
||||||
|
{
|
||||||
|
if (par7 != 1)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
++par5;
|
||||||
|
Block block = mod_pocketDim.quartzDoor;
|
||||||
|
|
||||||
|
if (par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack) && par2EntityPlayer.canPlayerEdit(par4, par5 + 1, par6, par7, par1ItemStack))
|
||||||
|
{
|
||||||
|
if (!block.canPlaceBlockAt(par3World, par4, par5, par6))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int i1 = MathHelper.floor_double((par2EntityPlayer.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3;
|
||||||
|
placeDoorBlock(par3World, par4, par5, par6, i1, block);
|
||||||
|
--par1ItemStack.stackSize;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.items;
|
package StevenDimDoors.mod_pocketDim.items;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.client.renderer.texture.IconRegister;
|
import net.minecraft.client.renderer.texture.IconRegister;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
@@ -14,7 +13,7 @@ import net.minecraftforge.common.DimensionManager;
|
|||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor;
|
import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
@@ -34,12 +33,13 @@ public class ItemRiftSignature extends Item
|
|||||||
|
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly(Side.CLIENT)
|
||||||
@Override
|
@Override
|
||||||
public boolean hasEffect(ItemStack stack)
|
public boolean hasEffect(ItemStack stack, int pass)
|
||||||
{
|
{
|
||||||
//Make the item glow if it has one endpoint stored
|
//Make the item glow if it has one endpoint stored
|
||||||
return (stack.getItemDamage() != 0);
|
return (stack.getItemDamage() != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void registerIcons(IconRegister par1IconRegister)
|
public void registerIcons(IconRegister par1IconRegister)
|
||||||
{
|
{
|
||||||
this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", ""));
|
this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", ""));
|
||||||
@@ -60,50 +60,47 @@ public class ItemRiftSignature extends Item
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
y += 2; //Increase y by 2 to place the rift at head level
|
//Increase y by 2 to place the rift at head level
|
||||||
if (!player.canPlayerEdit(x, y, z, side, stack))
|
int adjustedY = adjustYForSpecialBlocks(world, x, y + 2, z);
|
||||||
|
if (!player.canPlayerEdit(x, adjustedY, z, side, stack))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
int adjustedY = adjustYForSpecialBlocks(world,x,y,z);
|
|
||||||
Point4DOrientation source = getSource(stack);
|
Point4DOrientation source = getSource(stack);
|
||||||
int orientation = MathHelper.floor_double((double) ((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3;
|
int orientation = MathHelper.floor_double(((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3;
|
||||||
if (source != null)
|
if (source != null)
|
||||||
{
|
{
|
||||||
//The link was used before and already has an endpoint stored. Create links connecting the two endpoints.
|
// The link was used before and already has an endpoint stored.
|
||||||
|
// Create links connecting the two endpoints.
|
||||||
NewDimData sourceDimension = PocketManager.getDimensionData(source.getDimension());
|
NewDimData sourceDimension = PocketManager.getDimensionData(source.getDimension());
|
||||||
NewDimData destinationDimension = PocketManager.getDimensionData(world);
|
NewDimData destinationDimension = PocketManager.getDimensionData(world);
|
||||||
DimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.NORMAL,source.getOrientation());
|
|
||||||
DimLink reverse = destinationDimension.createLink(x, adjustedY, z, LinkTypes.NORMAL,orientation);
|
|
||||||
destinationDimension.setDestination(link, x, adjustedY, z);
|
|
||||||
sourceDimension.setDestination(reverse, source.getX(), source.getY(), source.getZ());
|
|
||||||
|
|
||||||
//Try placing a rift at the destination point
|
DimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkType.NORMAL,source.getOrientation());
|
||||||
if (!mod_pocketDim.blockRift.isBlockImmune(world, x, adjustedY, z))
|
DimLink reverse = destinationDimension.createLink(x, adjustedY, z, LinkType.NORMAL,orientation);
|
||||||
{
|
|
||||||
world.setBlock(x, adjustedY, z, mod_pocketDim.blockRift.blockID);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Try placing a rift at the source point, but check if its world is loaded first
|
destinationDimension.setLinkDestination(link, x, adjustedY, z);
|
||||||
|
sourceDimension.setLinkDestination(reverse, source.getX(), source.getY(), source.getZ());
|
||||||
|
|
||||||
|
// Try placing a rift at the destination point
|
||||||
|
mod_pocketDim.blockRift.tryPlacingRift(world, x, adjustedY, z);
|
||||||
|
|
||||||
|
// Try placing a rift at the source point
|
||||||
|
// We don't need to check if sourceWorld is null - that's already handled.
|
||||||
World sourceWorld = DimensionManager.getWorld(sourceDimension.id());
|
World sourceWorld = DimensionManager.getWorld(sourceDimension.id());
|
||||||
if (sourceWorld != null &&
|
mod_pocketDim.blockRift.tryPlacingRift(sourceWorld, source.getX(), source.getY(), source.getZ());
|
||||||
!mod_pocketDim.blockRift.isBlockImmune(sourceWorld, source.getX(), source.getY(), source.getZ()))
|
|
||||||
{
|
|
||||||
sourceWorld.setBlock(source.getX(), source.getY(), source.getZ(), mod_pocketDim.blockRift.blockID);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!player.capabilities.isCreativeMode)
|
if (!player.capabilities.isCreativeMode)
|
||||||
{
|
{
|
||||||
stack.stackSize--;
|
stack.stackSize--;
|
||||||
}
|
}
|
||||||
clearSource(stack);
|
clearSource(stack);
|
||||||
mod_pocketDim.sendChat(player,("Rift Created"));
|
mod_pocketDim.sendChat(player, "Rift Created");
|
||||||
world.playSoundAtEntity(player,mod_pocketDim.modid+":riftEnd", 0.6f, 1);
|
world.playSoundAtEntity(player, mod_pocketDim.modid + ":riftEnd", 0.6f, 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//The link signature has not been used. Store its current target as the first location.
|
//The link signature has not been used. Store its current target as the first location.
|
||||||
setSource(stack, x, adjustedY, z,orientation, PocketManager.getDimensionData(world));
|
setSource(stack, x, adjustedY, z, orientation, PocketManager.createDimensionData(world));
|
||||||
mod_pocketDim.sendChat(player,("Location Stored in Rift Signature"));
|
mod_pocketDim.sendChat(player,("Location Stored in Rift Signature"));
|
||||||
world.playSoundAtEntity(player,mod_pocketDim.modid+":riftStart", 0.6f, 1);
|
world.playSoundAtEntity(player,mod_pocketDim.modid+":riftStart", 0.6f, 1);
|
||||||
}
|
}
|
||||||
@@ -113,6 +110,7 @@ public class ItemRiftSignature extends Item
|
|||||||
/**
|
/**
|
||||||
* allows items to add custom lines of information to the mouseover description
|
* allows items to add custom lines of information to the mouseover description
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly(Side.CLIENT)
|
||||||
public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4)
|
public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4)
|
||||||
@@ -140,26 +138,28 @@ public class ItemRiftSignature extends Item
|
|||||||
*/
|
*/
|
||||||
public static int adjustYForSpecialBlocks(World world, int x, int y, int z)
|
public static int adjustYForSpecialBlocks(World world, int x, int y, int z)
|
||||||
{
|
{
|
||||||
y=y-2;//get the block the player actually clicked on
|
int targetY = y - 2; // Get the block the player actually clicked on
|
||||||
Block block = Block.blocksList[world.getBlockId(x, y, z)];
|
Block block = Block.blocksList[world.getBlockId(x, targetY, z)];
|
||||||
if(block==null)
|
if (block == null)
|
||||||
{
|
{
|
||||||
return y+2;
|
return targetY + 2;
|
||||||
}
|
}
|
||||||
if(block.isBlockReplaceable(world, x, y, z))
|
if (block.isBlockReplaceable(world, x, targetY, z))
|
||||||
{
|
{
|
||||||
return y+1;//move block placement down (-2+1) one so its directly over things like snow
|
return targetY + 1; // Move block placement down (-2+1) one so its directly over things like snow
|
||||||
}
|
}
|
||||||
if(block instanceof BaseDimDoor)
|
if (block instanceof BaseDimDoor)
|
||||||
{
|
{
|
||||||
if(world.getBlockId(x, y-1, z)==block.blockID&&world.getBlockMetadata(x, y, z)==8)
|
if (((BaseDimDoor) block).isUpperDoorBlock(world.getBlockMetadata(x, targetY, z)))
|
||||||
{
|
{
|
||||||
return y;//move rift placement down two so its in the right place on the door.
|
return targetY; // Move rift placement down two so its in the right place on the door.
|
||||||
}
|
}
|
||||||
return y+1;
|
// Move rift placement down one so its in the right place on the door.
|
||||||
|
return targetY + 1;
|
||||||
}
|
}
|
||||||
return y+2;
|
return targetY + 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setSource(ItemStack itemStack, int x, int y, int z, int orientation, NewDimData dimension)
|
public static void setSource(ItemStack itemStack, int x, int y, int z, int orientation, NewDimData dimension)
|
||||||
{
|
{
|
||||||
NBTTagCompound tag = new NBTTagCompound();
|
NBTTagCompound tag = new NBTTagCompound();
|
||||||
@@ -200,11 +200,12 @@ public class ItemRiftSignature extends Item
|
|||||||
Integer orientation = tag.getInteger("orientation");
|
Integer orientation = tag.getInteger("orientation");
|
||||||
Integer dimID = tag.getInteger("linkDimID");
|
Integer dimID = tag.getInteger("linkDimID");
|
||||||
|
|
||||||
if (x != null && y != null && z != null && dimID != null)
|
if (x != null && y != null && z != null && orientation != null && dimID != null)
|
||||||
{
|
{
|
||||||
return new Point4DOrientation(x, y, z,orientation, dimID);
|
return new Point4DOrientation(x, y, z, orientation, dimID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Mark the item as uninitialized if its source couldn't be read
|
||||||
itemStack.setItemDamage(0);
|
itemStack.setItemDamage(0);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@@ -214,10 +215,11 @@ public class ItemRiftSignature extends Item
|
|||||||
{
|
{
|
||||||
private Point4D point;
|
private Point4D point;
|
||||||
private int orientation;
|
private int orientation;
|
||||||
|
|
||||||
Point4DOrientation(int x, int y, int z, int orientation, int dimID)
|
Point4DOrientation(int x, int y, int z, int orientation, int dimID)
|
||||||
{
|
{
|
||||||
this.point= new Point4D(x,y,z,dimID);
|
this.point = new Point4D(x, y, z, dimID);
|
||||||
this.orientation=orientation;
|
this.orientation = orientation;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getX()
|
int getX()
|
||||||
@@ -239,10 +241,16 @@ public class ItemRiftSignature extends Item
|
|||||||
{
|
{
|
||||||
return point.getDimension();
|
return point.getDimension();
|
||||||
}
|
}
|
||||||
|
|
||||||
int getOrientation()
|
int getOrientation()
|
||||||
{
|
{
|
||||||
return orientation;
|
return orientation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Point4D getPoint()
|
||||||
|
{
|
||||||
|
return point;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.items;
|
package StevenDimDoors.mod_pocketDim.items;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.minecraft.client.renderer.texture.IconRegister;
|
import net.minecraft.client.renderer.texture.IconRegister;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
@@ -11,10 +10,9 @@ import net.minecraft.world.World;
|
|||||||
import net.minecraftforge.common.DimensionManager;
|
import net.minecraftforge.common.DimensionManager;
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
|
||||||
import cpw.mods.fml.relauncher.Side;
|
import cpw.mods.fml.relauncher.Side;
|
||||||
import cpw.mods.fml.relauncher.SideOnly;
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
|
|
||||||
@@ -40,69 +38,124 @@ public class ItemStabilizedRiftSignature extends ItemRiftSignature
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We don't check for replaceable blocks. The user can deal with that. <_<
|
// Adjust Y so the rift is at head level, depending on the presence of certain blocks
|
||||||
y += 2; //Increase y by 2 to place the rift at head level
|
int adjustedY = adjustYForSpecialBlocks(world, x, y + 2, z);
|
||||||
if (!player.canPlayerEdit(x, y, z, side, stack))
|
if (!player.canPlayerEdit(x, adjustedY, z, side, stack))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
Point4DOrientation source = getSource(stack);
|
int orientation = MathHelper.floor_double((player.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3;
|
||||||
int adjustedY = adjustYForSpecialBlocks(world,x,y,z);
|
|
||||||
|
|
||||||
// Check if the Stabilized Rift Signature has been initialized
|
// Check if the Stabilized Rift Signature has been initialized
|
||||||
int orientation = MathHelper.floor_double((player.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3;
|
Point4DOrientation source = getSource(stack);
|
||||||
if (source != null)
|
if (source != null)
|
||||||
{
|
{
|
||||||
// Yes, it's initialized. Check if the player is in creative
|
|
||||||
// or if the player can pay with Stable Fabric to create a rift.
|
|
||||||
if (!player.capabilities.isCreativeMode && !player.inventory.hasItem(mod_pocketDim.itemStableFabric.itemID))
|
|
||||||
{
|
|
||||||
mod_pocketDim.sendChat(player, "You don't have any Stable Fabric!");
|
|
||||||
// I won't do this, but this is the chance to localize chat
|
|
||||||
// messages sent to the player; look at ChatMessageComponent
|
|
||||||
// and how MFR does it with items like the safari net launcher
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//The link was used before and already has an endpoint stored. Create links connecting the two endpoints.
|
// Yes, it's initialized.
|
||||||
NewDimData sourceDimension = PocketManager.getDimensionData(source.getDimension());
|
NewDimData sourceDimension = PocketManager.getDimensionData(source.getDimension());
|
||||||
NewDimData destinationDimension = PocketManager.getDimensionData(world);
|
NewDimData destinationDimension = PocketManager.createDimensionData(world);
|
||||||
DimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.NORMAL,source.getOrientation());
|
DimLink reverse = destinationDimension.getLink(x, adjustedY, z);
|
||||||
DimLink reverse = destinationDimension.createLink(x, adjustedY, z, LinkTypes.NORMAL,orientation);
|
DimLink link;
|
||||||
destinationDimension.setDestination(link, x, adjustedY, z);
|
|
||||||
sourceDimension.setDestination(reverse, source.getX(), source.getY(), source.getZ());
|
|
||||||
|
|
||||||
//Try placing a rift at the destination point
|
// Check whether the SRS is being used to restore one of its previous
|
||||||
if (!mod_pocketDim.blockRift.isBlockImmune(world, x, adjustedY, z))
|
// link pairs. In other words, the SRS is being used on a location
|
||||||
|
// that already has a link pointing to the SRS's source, with the
|
||||||
|
// intention of overwriting the source-side link to point there.
|
||||||
|
// Those benign redirection operations will be handled for free.
|
||||||
|
|
||||||
|
if (reverse != null && source.getPoint().equals(reverse.destination()))
|
||||||
{
|
{
|
||||||
world.setBlock(x, adjustedY, z, mod_pocketDim.blockRift.blockID);
|
// Only the source-to-destination link is needed.
|
||||||
|
link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkType.NORMAL, source.getOrientation());
|
||||||
|
destinationDimension.setLinkDestination(link, x, adjustedY, z);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Check if the player is in creative mode,
|
||||||
|
// or if the player can pay with an Ender Pearl to create a rift.
|
||||||
|
if (!player.capabilities.isCreativeMode &&
|
||||||
|
!player.inventory.consumeInventoryItem(Item.enderPearl.itemID))
|
||||||
|
{
|
||||||
|
mod_pocketDim.sendChat(player, "You don't have any Ender Pearls!");
|
||||||
|
// I won't do this, but this is the chance to localize chat
|
||||||
|
// messages sent to the player; look at ChatMessageComponent
|
||||||
|
// and how MFR does it with items like the safari net launcher
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create links connecting the two endpoints.
|
||||||
|
link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkType.NORMAL, source.getOrientation());
|
||||||
|
reverse = destinationDimension.createLink(x, adjustedY, z, LinkType.NORMAL, orientation);
|
||||||
|
destinationDimension.setLinkDestination(link, x, adjustedY, z);
|
||||||
|
sourceDimension.setLinkDestination(reverse, source.getX(), source.getY(), source.getZ());
|
||||||
|
|
||||||
|
// Try placing a rift at the destination point
|
||||||
|
mod_pocketDim.blockRift.tryPlacingRift(world, x, adjustedY, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Try placing a rift at the source point, but check if its world is loaded first
|
// Try placing a rift at the source point
|
||||||
|
// We don't need to check if sourceWorld is null - that's already handled.
|
||||||
World sourceWorld = DimensionManager.getWorld(sourceDimension.id());
|
World sourceWorld = DimensionManager.getWorld(sourceDimension.id());
|
||||||
if (sourceWorld != null &&
|
|
||||||
!mod_pocketDim.blockRift.isBlockImmune(sourceWorld, source.getX(), source.getY(), source.getZ()))
|
|
||||||
{
|
|
||||||
sourceWorld.setBlock(source.getX(), source.getY(), source.getZ(), mod_pocketDim.blockRift.blockID);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!player.capabilities.isCreativeMode)
|
mod_pocketDim.blockRift.tryPlacingRift(sourceWorld, source.getX(), source.getY(), source.getZ());
|
||||||
{
|
mod_pocketDim.sendChat(player, "Rift Created");
|
||||||
player.inventory.consumeInventoryItem(mod_pocketDim.itemStableFabric.itemID);
|
world.playSoundAtEntity(player, "mods.DimDoors.sfx.riftEnd", 0.6f, 1);
|
||||||
}
|
|
||||||
mod_pocketDim.sendChat(player,"Rift Created");
|
|
||||||
world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftEnd", 0.6f, 1);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//The link signature has not been used. Store its current target as the first location.
|
// The link signature has not been used. Store its current target as the first location.
|
||||||
setSource(stack, x, adjustedY, z, orientation, PocketManager.getDimensionData(world));
|
setSource(stack, x, adjustedY, z, orientation, PocketManager.createDimensionData(world));
|
||||||
mod_pocketDim.sendChat(player,"Location Stored in Stabilized Rift Signature");
|
mod_pocketDim.sendChat(player, "Location Stored in Stabilized Rift Signature");
|
||||||
world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftStart", 0.6f, 1);
|
world.playSoundAtEntity(player, "mods.DimDoors.sfx.riftStart", 0.6f, 1);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean useFromDispenser(ItemStack stack, World world, int x, int y, int z)
|
||||||
|
{
|
||||||
|
// Stabilized Rift Signatures can only be used from dispensers to restore
|
||||||
|
// a previous link pair. The operation would be free for a player, so
|
||||||
|
// dispensers can also perform it for free. Otherwise, the item does nothing.
|
||||||
|
if (world.isRemote)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adjust Y so the rift is at head level, depending on the presence of certain blocks
|
||||||
|
int adjustedY = adjustYForSpecialBlocks(world, x, y + 2, z);
|
||||||
|
Point4DOrientation source = getSource(stack);
|
||||||
|
|
||||||
|
// The SRS must have been initialized
|
||||||
|
if (source != null)
|
||||||
|
{
|
||||||
|
NewDimData sourceDimension = PocketManager.getDimensionData(source.getDimension());
|
||||||
|
NewDimData destinationDimension = PocketManager.createDimensionData(world);
|
||||||
|
DimLink reverse = destinationDimension.getLink(x, adjustedY, z);
|
||||||
|
DimLink link;
|
||||||
|
|
||||||
|
// Check whether the SRS is being used to restore one of its previous
|
||||||
|
// link pairs. In other words, the SRS is being used on a location
|
||||||
|
// that already has a link pointing to the SRS's source, with the
|
||||||
|
// intention of overwriting the source-side link to point there.
|
||||||
|
if (reverse != null && source.getPoint().equals(reverse.destination()))
|
||||||
|
{
|
||||||
|
// Only the source-to-destination link is needed.
|
||||||
|
link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkType.NORMAL, source.getOrientation());
|
||||||
|
destinationDimension.setLinkDestination(link, x, adjustedY, z);
|
||||||
|
|
||||||
|
// Try placing a rift at the source point
|
||||||
|
// We don't need to check if sourceWorld is null - that's already handled.
|
||||||
|
World sourceWorld = DimensionManager.getWorld(sourceDimension.id());
|
||||||
|
mod_pocketDim.blockRift.tryPlacingRift(sourceWorld, source.getX(), source.getY(), source.getZ());
|
||||||
|
|
||||||
|
// This call doesn't seem to be working...
|
||||||
|
world.playSoundEffect(x + 0.5, adjustedY + 0.5, z + 0.5, "mods.DimDoors.sfx.riftEnd", 0.6f, 1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* allows items to add custom lines of information to the mouseover description
|
* allows items to add custom lines of information to the mouseover description
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ public class ItemUnstableDoor extends BaseItemDoor
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected BaseDimDoor getDoortoItemMapping()
|
protected BaseDimDoor getDoorBlock()
|
||||||
{
|
{
|
||||||
return (BaseDimDoor) mod_pocketDim.unstableDoor;
|
return (BaseDimDoor) mod_pocketDim.unstableDoor;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ public class ItemWarpDoor extends BaseItemDoor
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected BaseDimDoor getDoortoItemMapping()
|
protected BaseDimDoor getDoorBlock()
|
||||||
{
|
{
|
||||||
return (BaseDimDoor) mod_pocketDim.warpDoor;
|
return (BaseDimDoor) mod_pocketDim.warpDoor;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package StevenDimDoors.mod_pocketDim.items.behaviors;
|
||||||
|
|
||||||
|
import net.minecraft.block.BlockDispenser;
|
||||||
|
import net.minecraft.dispenser.BehaviorDefaultDispenseItem;
|
||||||
|
import net.minecraft.dispenser.IBlockSource;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import StevenDimDoors.mod_pocketDim.items.ItemStabilizedRiftSignature;
|
||||||
|
|
||||||
|
public class DispenserBehaviorStabilizedRS extends BehaviorDefaultDispenseItem
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public ItemStack dispenseStack(IBlockSource dispenser, ItemStack stack)
|
||||||
|
{
|
||||||
|
// Search for a non-air block up to 3 blocks in front of a dispenser.
|
||||||
|
// If it's found, call ItemStabilizedRiftSignature.useFromDispenser().
|
||||||
|
int x = dispenser.getXInt();
|
||||||
|
int y = dispenser.getYInt();
|
||||||
|
int z = dispenser.getZInt();
|
||||||
|
EnumFacing facing = BlockDispenser.getFacing(dispenser.getBlockMetadata());
|
||||||
|
int dx = facing.getFrontOffsetX();
|
||||||
|
int dy = facing.getFrontOffsetY();
|
||||||
|
int dz = facing.getFrontOffsetZ();
|
||||||
|
World world = dispenser.getWorld();
|
||||||
|
|
||||||
|
for (int k = 1; k <= 3; k++)
|
||||||
|
{
|
||||||
|
x += dx;
|
||||||
|
y += dy;
|
||||||
|
z += dz;
|
||||||
|
if (!world.isAirBlock(x, y, z))
|
||||||
|
{
|
||||||
|
// Found a block. Activate the item.
|
||||||
|
ItemStabilizedRiftSignature.useFromDispenser(stack, world, x, y, z);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// The item stack isn't modified
|
||||||
|
return stack;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -54,7 +54,7 @@ public class itemRiftRemover extends Item
|
|||||||
int hx = hit.blockX;
|
int hx = hit.blockX;
|
||||||
int hy = hit.blockY;
|
int hy = hit.blockY;
|
||||||
int hz = hit.blockZ;
|
int hz = hit.blockZ;
|
||||||
NewDimData dimension = PocketManager.getDimensionData(world);
|
NewDimData dimension = PocketManager.createDimensionData(world);
|
||||||
DimLink link = dimension.getLink(hx, hy, hz);
|
DimLink link = dimension.getLink(hx, hy, hz);
|
||||||
if (world.getBlockId(hx, hy, hz) == mod_pocketDim.blockRift.blockID && link != null &&
|
if (world.getBlockId(hx, hy, hz) == mod_pocketDim.blockRift.blockID && link != null &&
|
||||||
player.canPlayerEdit(hx, hy, hz, hit.sideHit, stack))
|
player.canPlayerEdit(hx, hy, hz, hit.sideHit, stack))
|
||||||
@@ -85,7 +85,7 @@ public class itemRiftRemover extends Item
|
|||||||
y = hit.blockY;
|
y = hit.blockY;
|
||||||
z = hit.blockZ;
|
z = hit.blockZ;
|
||||||
|
|
||||||
NewDimData dimension = PocketManager.getDimensionData(world);
|
NewDimData dimension = PocketManager.createDimensionData(world);
|
||||||
DimLink link = dimension.getLink(x, y, z);
|
DimLink link = dimension.getLink(x, y, z);
|
||||||
if (world.getBlockId(x, y, z) == mod_pocketDim.blockRift.blockID && link != null &&
|
if (world.getBlockId(x, y, z) == mod_pocketDim.blockRift.blockID && link != null &&
|
||||||
player.canPlayerEdit(x, y, z, side, stack))
|
player.canPlayerEdit(x, y, z, side, stack))
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package StevenDimDoors.mod_pocketDim;
|
package StevenDimDoors.mod_pocketDim;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.material.Material;
|
import net.minecraft.block.material.Material;
|
||||||
import net.minecraft.creativetab.CreativeTabs;
|
import net.minecraft.creativetab.CreativeTabs;
|
||||||
@@ -19,10 +18,12 @@ import net.minecraftforge.common.MinecraftForge;
|
|||||||
import StevenDimDoors.mod_pocketDim.blocks.BlockDimWall;
|
import StevenDimDoors.mod_pocketDim.blocks.BlockDimWall;
|
||||||
import StevenDimDoors.mod_pocketDim.blocks.BlockDimWallPerm;
|
import StevenDimDoors.mod_pocketDim.blocks.BlockDimWallPerm;
|
||||||
import StevenDimDoors.mod_pocketDim.blocks.BlockDoorGold;
|
import StevenDimDoors.mod_pocketDim.blocks.BlockDoorGold;
|
||||||
|
import StevenDimDoors.mod_pocketDim.blocks.BlockDoorQuartz;
|
||||||
import StevenDimDoors.mod_pocketDim.blocks.BlockGoldDimDoor;
|
import StevenDimDoors.mod_pocketDim.blocks.BlockGoldDimDoor;
|
||||||
import StevenDimDoors.mod_pocketDim.blocks.BlockLimbo;
|
import StevenDimDoors.mod_pocketDim.blocks.BlockLimbo;
|
||||||
import StevenDimDoors.mod_pocketDim.blocks.BlockRift;
|
import StevenDimDoors.mod_pocketDim.blocks.BlockRift;
|
||||||
import StevenDimDoors.mod_pocketDim.blocks.DimensionalDoor;
|
import StevenDimDoors.mod_pocketDim.blocks.DimensionalDoor;
|
||||||
|
import StevenDimDoors.mod_pocketDim.blocks.PersonalDimDoor;
|
||||||
import StevenDimDoors.mod_pocketDim.blocks.TransTrapdoor;
|
import StevenDimDoors.mod_pocketDim.blocks.TransTrapdoor;
|
||||||
import StevenDimDoors.mod_pocketDim.blocks.TransientDoor;
|
import StevenDimDoors.mod_pocketDim.blocks.TransientDoor;
|
||||||
import StevenDimDoors.mod_pocketDim.blocks.UnstableDoor;
|
import StevenDimDoors.mod_pocketDim.blocks.UnstableDoor;
|
||||||
@@ -30,7 +31,6 @@ import StevenDimDoors.mod_pocketDim.blocks.WarpDoor;
|
|||||||
import StevenDimDoors.mod_pocketDim.commands.CommandCreateDungeonRift;
|
import StevenDimDoors.mod_pocketDim.commands.CommandCreateDungeonRift;
|
||||||
import StevenDimDoors.mod_pocketDim.commands.CommandCreatePocket;
|
import StevenDimDoors.mod_pocketDim.commands.CommandCreatePocket;
|
||||||
import StevenDimDoors.mod_pocketDim.commands.CommandCreateRandomRift;
|
import StevenDimDoors.mod_pocketDim.commands.CommandCreateRandomRift;
|
||||||
import StevenDimDoors.mod_pocketDim.commands.CommandDeleteAllLinks;
|
|
||||||
import StevenDimDoors.mod_pocketDim.commands.CommandDeleteRifts;
|
import StevenDimDoors.mod_pocketDim.commands.CommandDeleteRifts;
|
||||||
import StevenDimDoors.mod_pocketDim.commands.CommandExportDungeon;
|
import StevenDimDoors.mod_pocketDim.commands.CommandExportDungeon;
|
||||||
import StevenDimDoors.mod_pocketDim.commands.CommandListDungeons;
|
import StevenDimDoors.mod_pocketDim.commands.CommandListDungeons;
|
||||||
@@ -42,9 +42,12 @@ import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
|||||||
import StevenDimDoors.mod_pocketDim.helpers.ChunkLoaderHelper;
|
import StevenDimDoors.mod_pocketDim.helpers.ChunkLoaderHelper;
|
||||||
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.ItemDDKey;
|
||||||
import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor;
|
import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor;
|
||||||
import StevenDimDoors.mod_pocketDim.items.ItemGoldDimDoor;
|
import StevenDimDoors.mod_pocketDim.items.ItemGoldDimDoor;
|
||||||
import StevenDimDoors.mod_pocketDim.items.ItemGoldDoor;
|
import StevenDimDoors.mod_pocketDim.items.ItemGoldDoor;
|
||||||
|
import StevenDimDoors.mod_pocketDim.items.ItemPersonalDoor;
|
||||||
|
import StevenDimDoors.mod_pocketDim.items.ItemQuartzDoor;
|
||||||
import StevenDimDoors.mod_pocketDim.items.ItemRiftBlade;
|
import StevenDimDoors.mod_pocketDim.items.ItemRiftBlade;
|
||||||
import StevenDimDoors.mod_pocketDim.items.ItemRiftSignature;
|
import StevenDimDoors.mod_pocketDim.items.ItemRiftSignature;
|
||||||
import StevenDimDoors.mod_pocketDim.items.ItemStabilizedRiftSignature;
|
import StevenDimDoors.mod_pocketDim.items.ItemStabilizedRiftSignature;
|
||||||
@@ -53,25 +56,24 @@ import StevenDimDoors.mod_pocketDim.items.ItemUnstableDoor;
|
|||||||
import StevenDimDoors.mod_pocketDim.items.ItemWarpDoor;
|
import StevenDimDoors.mod_pocketDim.items.ItemWarpDoor;
|
||||||
import StevenDimDoors.mod_pocketDim.items.ItemWorldThread;
|
import StevenDimDoors.mod_pocketDim.items.ItemWorldThread;
|
||||||
import StevenDimDoors.mod_pocketDim.items.itemRiftRemover;
|
import StevenDimDoors.mod_pocketDim.items.itemRiftRemover;
|
||||||
import StevenDimDoors.mod_pocketDim.ticking.CommonTickHandler;
|
|
||||||
import StevenDimDoors.mod_pocketDim.ticking.CustomLimboPopulator;
|
import StevenDimDoors.mod_pocketDim.ticking.CustomLimboPopulator;
|
||||||
import StevenDimDoors.mod_pocketDim.ticking.FastRiftRegenerator;
|
import StevenDimDoors.mod_pocketDim.ticking.LimboDecayScheduler;
|
||||||
import StevenDimDoors.mod_pocketDim.ticking.LimboDecay;
|
|
||||||
import StevenDimDoors.mod_pocketDim.ticking.MobMonolith;
|
import StevenDimDoors.mod_pocketDim.ticking.MobMonolith;
|
||||||
import StevenDimDoors.mod_pocketDim.ticking.RiftRegenerator;
|
import StevenDimDoors.mod_pocketDim.ticking.RiftRegenerator;
|
||||||
|
import StevenDimDoors.mod_pocketDim.ticking.ServerTickHandler;
|
||||||
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor;
|
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor;
|
||||||
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoorGold;
|
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoorGold;
|
||||||
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift;
|
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift;
|
||||||
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityTransTrapdoor;
|
import StevenDimDoors.mod_pocketDim.tileentities.TileEntityTransTrapdoor;
|
||||||
import StevenDimDoors.mod_pocketDim.util.DDLogger;
|
|
||||||
import StevenDimDoors.mod_pocketDim.world.BiomeGenLimbo;
|
import StevenDimDoors.mod_pocketDim.world.BiomeGenLimbo;
|
||||||
import StevenDimDoors.mod_pocketDim.world.BiomeGenPocket;
|
import StevenDimDoors.mod_pocketDim.world.BiomeGenPocket;
|
||||||
import StevenDimDoors.mod_pocketDim.world.DDBiomeGenBase;
|
import StevenDimDoors.mod_pocketDim.world.DDBiomeGenBase;
|
||||||
|
import StevenDimDoors.mod_pocketDim.world.LimboDecay;
|
||||||
import StevenDimDoors.mod_pocketDim.world.LimboProvider;
|
import StevenDimDoors.mod_pocketDim.world.LimboProvider;
|
||||||
|
import StevenDimDoors.mod_pocketDim.world.PersonalPocketProvider;
|
||||||
import StevenDimDoors.mod_pocketDim.world.PocketProvider;
|
import StevenDimDoors.mod_pocketDim.world.PocketProvider;
|
||||||
import StevenDimDoors.mod_pocketDim.world.gateways.GatewayGenerator;
|
import StevenDimDoors.mod_pocketDim.world.gateways.GatewayGenerator;
|
||||||
import StevenDimDoors.mod_pocketDimClient.ClientPacketHandler;
|
import StevenDimDoors.mod_pocketDimClient.ClientPacketHandler;
|
||||||
import StevenDimDoors.mod_pocketDimClient.ClientTickHandler;
|
|
||||||
import cpw.mods.fml.common.Mod;
|
import cpw.mods.fml.common.Mod;
|
||||||
import cpw.mods.fml.common.Mod.EventHandler;
|
import cpw.mods.fml.common.Mod.EventHandler;
|
||||||
import cpw.mods.fml.common.Mod.Instance;
|
import cpw.mods.fml.common.Mod.Instance;
|
||||||
@@ -99,16 +101,21 @@ serverPacketHandlerSpec =
|
|||||||
@SidedPacketHandler(channels = {PacketConstants.CHANNEL_NAME}, packetHandler = ServerPacketHandler.class))
|
@SidedPacketHandler(channels = {PacketConstants.CHANNEL_NAME}, packetHandler = ServerPacketHandler.class))
|
||||||
public class mod_pocketDim
|
public class mod_pocketDim
|
||||||
{
|
{
|
||||||
public static final String version = "1.6.4-R2.2.3";
|
public static final String version = "@VERSION@";
|
||||||
public static final String modid = "dimdoors";
|
public static final String modid = "dimdoors";
|
||||||
|
|
||||||
|
//TODO need a place to stick all these constants
|
||||||
|
public static final int NETHER_DIMENSION_ID = -1;
|
||||||
|
|
||||||
//need to clean up
|
//need to clean up
|
||||||
@SidedProxy(clientSide = "StevenDimDoors.mod_pocketDimClient.ClientProxy", serverSide = "StevenDimDoors.mod_pocketDim.CommonProxy")
|
@SidedProxy(clientSide = "StevenDimDoors.mod_pocketDimClient.ClientProxy", serverSide = "StevenDimDoors.mod_pocketDim.CommonProxy")
|
||||||
public static CommonProxy proxy;
|
public static CommonProxy proxy;
|
||||||
|
|
||||||
@Instance("PocketDimensions")
|
@Instance(mod_pocketDim.modid)
|
||||||
public static mod_pocketDim instance = new mod_pocketDim();
|
public static mod_pocketDim instance;
|
||||||
|
|
||||||
|
public static Block quartzDoor;
|
||||||
|
public static Block personalDimDoor;
|
||||||
public static Block transientDoor;
|
public static Block transientDoor;
|
||||||
public static Block warpDoor;
|
public static Block warpDoor;
|
||||||
public static Block goldenDoor;
|
public static Block goldenDoor;
|
||||||
@@ -132,7 +139,10 @@ public class mod_pocketDim
|
|||||||
public static Item itemRiftSignature;
|
public static Item itemRiftSignature;
|
||||||
public static Item itemStableFabric;
|
public static Item itemStableFabric;
|
||||||
public static Item itemUnstableDoor;
|
public static Item itemUnstableDoor;
|
||||||
public static Item itemStabilizedLinkSignature;
|
public static Item itemDDKey;
|
||||||
|
public static Item itemQuartzDoor;
|
||||||
|
public static Item itemPersonalDoor;
|
||||||
|
public static Item itemStabilizedRiftSignature;
|
||||||
|
|
||||||
public static BiomeGenBase limboBiome;
|
public static BiomeGenBase limboBiome;
|
||||||
public static BiomeGenBase pocketBiome;
|
public static BiomeGenBase pocketBiome;
|
||||||
@@ -142,9 +152,13 @@ public class mod_pocketDim
|
|||||||
public static DDProperties properties;
|
public static DDProperties properties;
|
||||||
public static DDWorldProperties worldProperties;
|
public static DDWorldProperties worldProperties;
|
||||||
public static CustomLimboPopulator spawner; //Added this field temporarily. Will be refactored out later.
|
public static CustomLimboPopulator spawner; //Added this field temporarily. Will be refactored out later.
|
||||||
public static FastRiftRegenerator fastRiftRegenerator;
|
public static RiftRegenerator riftRegenerator;
|
||||||
public static GatewayGenerator gatewayGenerator;
|
public static GatewayGenerator gatewayGenerator;
|
||||||
public static DeathTracker deathTracker;
|
public static DeathTracker deathTracker;
|
||||||
|
private static ServerTickHandler serverTickHandler;
|
||||||
|
private static LimboDecayScheduler limboDecayScheduler;
|
||||||
|
private static LimboDecay limboDecay;
|
||||||
|
private static EventHookContainer hooks;
|
||||||
|
|
||||||
//TODO this is a temporary workaround for saving data
|
//TODO this is a temporary workaround for saving data
|
||||||
private String currrentSaveRootDirectory;
|
private String currrentSaveRootDirectory;
|
||||||
@@ -167,14 +181,13 @@ public class mod_pocketDim
|
|||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPreInitialization(FMLPreInitializationEvent event)
|
public void onPreInitialization(FMLPreInitializationEvent event)
|
||||||
{
|
{
|
||||||
instance = this;
|
|
||||||
//This should be the FIRST thing that gets done.
|
//This should be the FIRST thing that gets done.
|
||||||
String path = event.getSuggestedConfigurationFile().getAbsolutePath().replace(modid, "DimDoors");
|
String path = event.getSuggestedConfigurationFile().getAbsolutePath().replace(modid, "DimDoors");
|
||||||
|
|
||||||
properties = DDProperties.initialize(new File(path));
|
properties = DDProperties.initialize(new File(path));
|
||||||
|
|
||||||
//Now do other stuff
|
//Now do other stuff
|
||||||
EventHookContainer hooks = new EventHookContainer(properties);
|
hooks = new EventHookContainer(properties);
|
||||||
MinecraftForge.EVENT_BUS.register(hooks);
|
MinecraftForge.EVENT_BUS.register(hooks);
|
||||||
MinecraftForge.TERRAIN_GEN_BUS.register(hooks);
|
MinecraftForge.TERRAIN_GEN_BUS.register(hooks);
|
||||||
}
|
}
|
||||||
@@ -182,31 +195,34 @@ public class mod_pocketDim
|
|||||||
@EventHandler
|
@EventHandler
|
||||||
public void onInitialization(FMLInitializationEvent event)
|
public void onInitialization(FMLInitializationEvent event)
|
||||||
{
|
{
|
||||||
CommonTickHandler commonTickHandler = new CommonTickHandler();
|
// Initialize ServerTickHandler instance
|
||||||
TickRegistry.registerTickHandler(new ClientTickHandler(), Side.CLIENT);
|
serverTickHandler = new ServerTickHandler();
|
||||||
TickRegistry.registerTickHandler(commonTickHandler, Side.SERVER);
|
TickRegistry.registerTickHandler(serverTickHandler, Side.SERVER);
|
||||||
|
|
||||||
//MonolithSpawner should be initialized before any provider instances are created
|
// Initialize LimboDecay instance: required for BlockLimbo
|
||||||
//Register the other regular tick receivers as well
|
limboDecay = new LimboDecay(properties);
|
||||||
spawner = new CustomLimboPopulator(commonTickHandler, properties);
|
|
||||||
new RiftRegenerator(commonTickHandler); //No need to store the reference
|
|
||||||
LimboDecay decay = new LimboDecay(commonTickHandler, properties);
|
|
||||||
fastRiftRegenerator = new FastRiftRegenerator(commonTickHandler);
|
|
||||||
|
|
||||||
|
// Initialize blocks and items
|
||||||
transientDoor = new TransientDoor(properties.TransientDoorID, Material.iron, properties).setHardness(1.0F) .setUnlocalizedName("transientDoor");
|
transientDoor = new TransientDoor(properties.TransientDoorID, Material.iron, properties).setHardness(1.0F) .setUnlocalizedName("transientDoor");
|
||||||
goldenDimensionalDoor = new BlockGoldDimDoor(properties.GoldenDimensionalDoorID, Material.iron, properties).setHardness(1.0F) .setUnlocalizedName("dimDoorGold");
|
goldenDimensionalDoor = new BlockGoldDimDoor(properties.GoldenDimensionalDoorID, Material.iron, properties).setHardness(1.0F) .setUnlocalizedName("dimDoorGold");
|
||||||
|
|
||||||
|
quartzDoor = new BlockDoorQuartz(properties.QuartzDoorID, Material.rock).setHardness(0.1F).setUnlocalizedName("doorQuartz");
|
||||||
|
personalDimDoor = new PersonalDimDoor(properties.PersonalDimDoorID, Material.rock,properties).setHardness(0.1F).setUnlocalizedName("dimDoorPersonal");
|
||||||
|
|
||||||
goldenDoor = new BlockDoorGold(properties.GoldenDoorID, Material.iron).setHardness(0.1F).setUnlocalizedName("doorGold");
|
goldenDoor = new BlockDoorGold(properties.GoldenDoorID, Material.iron).setHardness(0.1F).setUnlocalizedName("doorGold");
|
||||||
blockDimWall = new BlockDimWall(properties.FabricBlockID, 0, Material.iron).setLightValue(1.0F).setHardness(0.1F).setUnlocalizedName("blockDimWall");
|
blockDimWall = new BlockDimWall(properties.FabricBlockID, 0, Material.iron).setLightValue(1.0F).setHardness(0.1F).setUnlocalizedName("blockDimWall");
|
||||||
blockDimWallPerm = (new BlockDimWallPerm(properties.PermaFabricBlockID, 0, Material.iron)).setLightValue(1.0F).setBlockUnbreakable().setResistance(6000000.0F).setUnlocalizedName("blockDimWallPerm");
|
blockDimWallPerm = (new BlockDimWallPerm(properties.PermaFabricBlockID, 0, Material.iron)).setLightValue(1.0F).setBlockUnbreakable().setResistance(6000000.0F).setUnlocalizedName("blockDimWallPerm");
|
||||||
warpDoor = new WarpDoor(properties.WarpDoorID, Material.wood, properties).setHardness(1.0F) .setUnlocalizedName("dimDoorWarp");
|
warpDoor = new WarpDoor(properties.WarpDoorID, Material.wood, properties).setHardness(1.0F) .setUnlocalizedName("dimDoorWarp");
|
||||||
blockRift = (BlockRift) (new BlockRift(properties.RiftBlockID, 0, Material.air, properties).setHardness(1.0F) .setUnlocalizedName("rift"));
|
blockRift = (BlockRift) (new BlockRift(properties.RiftBlockID, 0, Material.air, properties).setHardness(1.0F) .setUnlocalizedName("rift"));
|
||||||
blockLimbo = new BlockLimbo(properties.LimboBlockID, 15, Material.iron, properties.LimboDimensionID, decay).setHardness(.2F).setUnlocalizedName("BlockLimbo").setLightValue(.0F);
|
blockLimbo = new BlockLimbo(properties.LimboBlockID, 15, Material.iron, properties.LimboDimensionID, limboDecay).setHardness(.2F).setUnlocalizedName("BlockLimbo").setLightValue(.0F);
|
||||||
unstableDoor = (new UnstableDoor(properties.UnstableDoorID, Material.iron, properties).setHardness(.2F).setUnlocalizedName("chaosDoor").setLightValue(.0F) );
|
unstableDoor = (new UnstableDoor(properties.UnstableDoorID, Material.iron, properties).setHardness(.2F).setUnlocalizedName("chaosDoor").setLightValue(.0F) );
|
||||||
dimensionalDoor = (DimensionalDoor) (new DimensionalDoor(properties.DimensionalDoorID, Material.iron, properties).setHardness(1.0F).setResistance(2000.0F) .setUnlocalizedName("dimDoor"));
|
dimensionalDoor = (DimensionalDoor) (new DimensionalDoor(properties.DimensionalDoorID, Material.iron, properties).setHardness(1.0F).setResistance(2000.0F) .setUnlocalizedName("dimDoor"));
|
||||||
transTrapdoor = (TransTrapdoor) (new TransTrapdoor(properties.TransTrapdoorID, Material.wood).setHardness(1.0F) .setUnlocalizedName("dimHatch"));
|
transTrapdoor = (TransTrapdoor) (new TransTrapdoor(properties.TransTrapdoorID, Material.wood).setHardness(1.0F) .setUnlocalizedName("dimHatch"));
|
||||||
|
|
||||||
itemGoldenDoor = (new ItemGoldDoor(properties.GoldenDoorID, Material.wood)).setUnlocalizedName("itemGoldDoor");
|
itemDDKey = (new ItemDDKey(properties.DDKeyItemID)).setUnlocalizedName("itemDDKey");
|
||||||
|
itemQuartzDoor = (new ItemQuartzDoor(properties.QuartzDoorID, Material.rock)).setUnlocalizedName("itemQuartzDoor");
|
||||||
|
itemPersonalDoor = (new ItemPersonalDoor(properties.PersonalDimDoorID, Material.rock, (ItemDoor)this.itemQuartzDoor)).setUnlocalizedName("itemQuartzDimDoor");
|
||||||
|
itemGoldenDoor = (new ItemGoldDoor(properties.GoldenDoorItemID, Material.wood)).setUnlocalizedName("itemGoldDoor");
|
||||||
itemGoldenDimensionalDoor = (new ItemGoldDimDoor(properties.GoldenDimensionalDoorItemID, Material.iron, (ItemDoor)this.itemGoldenDoor)).setUnlocalizedName("itemGoldDimDoor");
|
itemGoldenDimensionalDoor = (new ItemGoldDimDoor(properties.GoldenDimensionalDoorItemID, Material.iron, (ItemDoor)this.itemGoldenDoor)).setUnlocalizedName("itemGoldDimDoor");
|
||||||
itemDimensionalDoor = (ItemDimensionalDoor) (new ItemDimensionalDoor(properties.DimensionalDoorItemID, Material.iron, (ItemDoor)Item.doorIron)).setUnlocalizedName("itemDimDoor");
|
itemDimensionalDoor = (ItemDimensionalDoor) (new ItemDimensionalDoor(properties.DimensionalDoorItemID, Material.iron, (ItemDoor)Item.doorIron)).setUnlocalizedName("itemDimDoor");
|
||||||
itemWarpDoor = (new ItemWarpDoor(properties.WarpDoorItemID, Material.wood,(ItemDoor)Item.doorWood)).setUnlocalizedName("itemDimDoorWarp");
|
itemWarpDoor = (new ItemWarpDoor(properties.WarpDoorItemID, Material.wood,(ItemDoor)Item.doorWood)).setUnlocalizedName("itemDimDoorWarp");
|
||||||
@@ -215,7 +231,7 @@ public class mod_pocketDim
|
|||||||
itemStableFabric = (new ItemStableFabric(properties.StableFabricItemID, 0)).setUnlocalizedName("itemStableFabric");
|
itemStableFabric = (new ItemStableFabric(properties.StableFabricItemID, 0)).setUnlocalizedName("itemStableFabric");
|
||||||
itemUnstableDoor = (new ItemUnstableDoor(properties.UnstableDoorItemID, Material.iron, null)).setUnlocalizedName("itemChaosDoor");
|
itemUnstableDoor = (new ItemUnstableDoor(properties.UnstableDoorItemID, Material.iron, null)).setUnlocalizedName("itemChaosDoor");
|
||||||
itemRiftBlade = (new ItemRiftBlade(properties.RiftBladeItemID, properties)).setUnlocalizedName("ItemRiftBlade");
|
itemRiftBlade = (new ItemRiftBlade(properties.RiftBladeItemID, properties)).setUnlocalizedName("ItemRiftBlade");
|
||||||
itemStabilizedLinkSignature = (new ItemStabilizedRiftSignature(properties.StabilizedRiftSignatureItemID)).setUnlocalizedName("itemStabilizedRiftSig");
|
itemStabilizedRiftSignature = (new ItemStabilizedRiftSignature(properties.StabilizedRiftSignatureItemID)).setUnlocalizedName("itemStabilizedRiftSig");
|
||||||
itemWorldThread = (new ItemWorldThread(properties.WorldThreadItemID)).setUnlocalizedName("itemWorldThread");
|
itemWorldThread = (new ItemWorldThread(properties.WorldThreadItemID)).setUnlocalizedName("itemWorldThread");
|
||||||
|
|
||||||
// Check if other biomes have been registered with the same IDs we want. If so, crash Minecraft
|
// Check if other biomes have been registered with the same IDs we want. If so, crash Minecraft
|
||||||
@@ -226,6 +242,8 @@ public class mod_pocketDim
|
|||||||
mod_pocketDim.limboBiome = (new BiomeGenLimbo(properties.LimboBiomeID));
|
mod_pocketDim.limboBiome = (new BiomeGenLimbo(properties.LimboBiomeID));
|
||||||
mod_pocketDim.pocketBiome = (new BiomeGenPocket(properties.PocketBiomeID));
|
mod_pocketDim.pocketBiome = (new BiomeGenPocket(properties.PocketBiomeID));
|
||||||
|
|
||||||
|
GameRegistry.registerBlock(quartzDoor, "Quartz Door");
|
||||||
|
GameRegistry.registerBlock(personalDimDoor, "Personal Dimensional Door");
|
||||||
GameRegistry.registerBlock(goldenDoor, "Golden Door");
|
GameRegistry.registerBlock(goldenDoor, "Golden Door");
|
||||||
GameRegistry.registerBlock(goldenDimensionalDoor, "Golden Dimensional Door");
|
GameRegistry.registerBlock(goldenDimensionalDoor, "Golden Dimensional Door");
|
||||||
GameRegistry.registerBlock(unstableDoor, "Unstable Door");
|
GameRegistry.registerBlock(unstableDoor, "Unstable Door");
|
||||||
@@ -243,6 +261,8 @@ public class mod_pocketDim
|
|||||||
throw new IllegalStateException("There is a provider ID conflict between PocketProvider from Dimensional Doors and another provider type. Fix your configuration!");
|
throw new IllegalStateException("There is a provider ID conflict between PocketProvider from Dimensional Doors and another provider type. Fix your configuration!");
|
||||||
if (!DimensionManager.registerProviderType(properties.LimboProviderID, LimboProvider.class, false))
|
if (!DimensionManager.registerProviderType(properties.LimboProviderID, LimboProvider.class, false))
|
||||||
throw new IllegalStateException("There is a provider ID conflict between LimboProvider from Dimensional Doors and another provider type. Fix your configuration!");
|
throw new IllegalStateException("There is a provider ID conflict between LimboProvider from Dimensional Doors and another provider type. Fix your configuration!");
|
||||||
|
if (!DimensionManager.registerProviderType(properties.PersonalPocketProviderID, PersonalPocketProvider.class, false))
|
||||||
|
throw new IllegalStateException("There is a provider ID conflict between PersonalPocketProvider from Dimensional Doors and another provider type. Fix your configuration!");
|
||||||
|
|
||||||
DimensionManager.registerDimension(properties.LimboDimensionID, properties.LimboProviderID);
|
DimensionManager.registerDimension(properties.LimboDimensionID, properties.LimboProviderID);
|
||||||
|
|
||||||
@@ -262,19 +282,24 @@ public class mod_pocketDim
|
|||||||
LanguageRegistry.addName(itemRiftSignature, "Rift Signature");
|
LanguageRegistry.addName(itemRiftSignature, "Rift Signature");
|
||||||
LanguageRegistry.addName(itemGoldenDoor, "Golden Door");
|
LanguageRegistry.addName(itemGoldenDoor, "Golden Door");
|
||||||
LanguageRegistry.addName(itemGoldenDimensionalDoor, "Golden Dimensional Door");
|
LanguageRegistry.addName(itemGoldenDimensionalDoor, "Golden Dimensional Door");
|
||||||
LanguageRegistry.addName(itemStabilizedLinkSignature, "Stabilized Rift Signature");
|
LanguageRegistry.addName(itemStabilizedRiftSignature, "Stabilized Rift Signature");
|
||||||
LanguageRegistry.addName(itemRiftRemover, "Rift Remover");
|
LanguageRegistry.addName(itemRiftRemover, "Rift Remover");
|
||||||
LanguageRegistry.addName(itemStableFabric, "Stable Fabric");
|
LanguageRegistry.addName(itemStableFabric, "Stable Fabric");
|
||||||
LanguageRegistry.addName(itemUnstableDoor, "Unstable Door");
|
LanguageRegistry.addName(itemUnstableDoor, "Unstable Door");
|
||||||
LanguageRegistry.addName(itemDimensionalDoor, "Dimensional Door");
|
LanguageRegistry.addName(itemDimensionalDoor, "Dimensional Door");
|
||||||
LanguageRegistry.addName(itemRiftBlade, "Rift Blade");
|
LanguageRegistry.addName(itemRiftBlade, "Rift Blade");
|
||||||
LanguageRegistry.addName(itemWorldThread, "World Thread");
|
LanguageRegistry.addName(itemWorldThread, "World Thread");
|
||||||
|
LanguageRegistry.addName(itemDDKey, "Rift Key");
|
||||||
|
LanguageRegistry.addName(itemQuartzDoor, "Quartz Door");
|
||||||
|
LanguageRegistry.addName(itemPersonalDoor, "Personal Dimensional Door");
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add names for multiblock inventory item
|
* Add names for multiblock inventory item
|
||||||
*/
|
*/
|
||||||
LanguageRegistry.addName(new ItemStack(blockDimWall, 1, 0), "Fabric of Reality");
|
LanguageRegistry.addName(new ItemStack(blockDimWall, 1, 0), "Fabric of Reality");
|
||||||
LanguageRegistry.addName(new ItemStack(blockDimWall, 1, 1), "Ancient Fabric");
|
LanguageRegistry.addName(new ItemStack(blockDimWall, 1, 1), "Ancient Fabric");
|
||||||
|
LanguageRegistry.addName(new ItemStack(blockDimWall, 1, 2), "Altered Fabric");
|
||||||
|
|
||||||
LanguageRegistry.instance().addStringLocalization("itemGroup.dimDoorsCustomTab", "en_US", "Dimensional Doors Items");
|
LanguageRegistry.instance().addStringLocalization("itemGroup.dimDoorsCustomTab", "en_US", "Dimensional Doors Items");
|
||||||
|
|
||||||
@@ -286,9 +311,12 @@ public class mod_pocketDim
|
|||||||
EntityRegistry.registerModEntity(MobMonolith.class, "Monolith", properties.MonolithEntityID, this, 70, 1, true);
|
EntityRegistry.registerModEntity(MobMonolith.class, "Monolith", properties.MonolithEntityID, this, 70, 1, true);
|
||||||
EntityList.IDtoClassMapping.put(properties.MonolithEntityID, MobMonolith.class);
|
EntityList.IDtoClassMapping.put(properties.MonolithEntityID, MobMonolith.class);
|
||||||
EntityList.entityEggs.put(properties.MonolithEntityID, new EntityEggInfo(properties.MonolithEntityID, 0, 0xffffff));
|
EntityList.entityEggs.put(properties.MonolithEntityID, new EntityEggInfo(properties.MonolithEntityID, 0, 0xffffff));
|
||||||
LanguageRegistry.instance().addStringLocalization("entity.DimDoors.Obelisk.name", "Monolith");
|
LanguageRegistry.instance().addStringLocalization("entity.dimdoors.Monolith.name", "Monolith");
|
||||||
|
|
||||||
CraftingManager.registerRecipes(properties);
|
CraftingManager.registerRecipes(properties);
|
||||||
|
CraftingManager.registerDispenserBehaviors();
|
||||||
|
GameRegistry.registerCraftingHandler(new CraftingManager());
|
||||||
|
|
||||||
DungeonHelper.initialize();
|
DungeonHelper.initialize();
|
||||||
gatewayGenerator = new GatewayGenerator(properties);
|
gatewayGenerator = new GatewayGenerator(properties);
|
||||||
GameRegistry.registerWorldGenerator(mod_pocketDim.gatewayGenerator);
|
GameRegistry.registerWorldGenerator(mod_pocketDim.gatewayGenerator);
|
||||||
@@ -317,7 +345,14 @@ public class mod_pocketDim
|
|||||||
deathTracker.writeToFile();
|
deathTracker.writeToFile();
|
||||||
deathTracker = null;
|
deathTracker = null;
|
||||||
worldProperties = null;
|
worldProperties = null;
|
||||||
this.currrentSaveRootDirectory=null;
|
currrentSaveRootDirectory = null;
|
||||||
|
|
||||||
|
// Unregister all tick receivers from serverTickHandler to avoid leaking
|
||||||
|
// scheduled tasks between single-player game sessions
|
||||||
|
serverTickHandler.unregisterReceivers();
|
||||||
|
spawner = null;
|
||||||
|
riftRegenerator = null;
|
||||||
|
limboDecayScheduler = null;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -335,6 +370,14 @@ public class mod_pocketDim
|
|||||||
|
|
||||||
// Initialize a new DeathTracker
|
// Initialize a new DeathTracker
|
||||||
deathTracker = new DeathTracker(currrentSaveRootDirectory + "/DimensionalDoors/data/deaths.txt");
|
deathTracker = new DeathTracker(currrentSaveRootDirectory + "/DimensionalDoors/data/deaths.txt");
|
||||||
|
|
||||||
|
// Register regular tick receivers
|
||||||
|
// CustomLimboPopulator should be initialized before any provider instances are created
|
||||||
|
spawner = new CustomLimboPopulator(serverTickHandler, properties);
|
||||||
|
riftRegenerator = new RiftRegenerator(serverTickHandler, blockRift);
|
||||||
|
limboDecayScheduler = new LimboDecayScheduler(serverTickHandler, limboDecay);
|
||||||
|
|
||||||
|
hooks.setSessionFields(worldProperties, riftRegenerator);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
@@ -345,19 +388,14 @@ public class mod_pocketDim
|
|||||||
event.registerServerCommand( CommandCreateDungeonRift.instance() );
|
event.registerServerCommand( CommandCreateDungeonRift.instance() );
|
||||||
event.registerServerCommand( CommandListDungeons.instance() );
|
event.registerServerCommand( CommandListDungeons.instance() );
|
||||||
event.registerServerCommand( CommandCreateRandomRift.instance() );
|
event.registerServerCommand( CommandCreateRandomRift.instance() );
|
||||||
event.registerServerCommand( CommandDeleteAllLinks.instance() );
|
|
||||||
//CommandDeleteDimensionData.instance().register(event);
|
|
||||||
event.registerServerCommand( CommandDeleteRifts.instance() );
|
event.registerServerCommand( CommandDeleteRifts.instance() );
|
||||||
event.registerServerCommand( CommandExportDungeon.instance() );
|
event.registerServerCommand( CommandExportDungeon.instance() );
|
||||||
//CommandPrintDimensionData.instance().register(event);
|
|
||||||
//CommandPruneDimensions.instance().register(event);
|
|
||||||
event.registerServerCommand( CommandCreatePocket.instance() );
|
event.registerServerCommand( CommandCreatePocket.instance() );
|
||||||
event.registerServerCommand( CommandTeleportPlayer.instance() );
|
event.registerServerCommand( CommandTeleportPlayer.instance() );
|
||||||
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ChunkLoaderHelper.loadChunkForcedWorlds(event);
|
ChunkLoaderHelper.loadForcedChunkWorlds(event);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,12 +7,13 @@ import java.util.ArrayList;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map.Entry;
|
||||||
import net.minecraftforge.common.DimensionManager;
|
import net.minecraftforge.common.DimensionManager;
|
||||||
import StevenDimDoors.mod_pocketDim.Point3D;
|
import StevenDimDoors.mod_pocketDim.Point3D;
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
import StevenDimDoors.mod_pocketDim.core.DimensionType;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
import StevenDimDoors.mod_pocketDim.dungeon.DungeonData;
|
import StevenDimDoors.mod_pocketDim.dungeon.DungeonData;
|
||||||
@@ -20,7 +21,6 @@ import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper;
|
|||||||
import StevenDimDoors.mod_pocketDim.util.DDLogger;
|
import StevenDimDoors.mod_pocketDim.util.DDLogger;
|
||||||
import StevenDimDoors.mod_pocketDim.util.FileFilters;
|
import StevenDimDoors.mod_pocketDim.util.FileFilters;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
|
|
||||||
import com.google.common.io.Files;
|
import com.google.common.io.Files;
|
||||||
|
|
||||||
public class DDSaveHandler
|
public class DDSaveHandler
|
||||||
@@ -59,6 +59,15 @@ public class DDSaveHandler
|
|||||||
PocketManager.createAndRegisterBlacklist(blacklist);
|
PocketManager.createAndRegisterBlacklist(blacklist);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Load the personal pockets mapping
|
||||||
|
File personalPocketMap = new File(basePath+"personalPockets.txt");
|
||||||
|
HashMap<String, Integer> ppMap = new HashMap<String, Integer>();
|
||||||
|
if(personalPocketMap.exists())
|
||||||
|
{
|
||||||
|
PersonalPocketMappingProcessor ppMappingProcessor = new PersonalPocketMappingProcessor();
|
||||||
|
ppMap = readPersonalPocketsMapping(personalPocketMap,ppMappingProcessor);
|
||||||
|
}
|
||||||
|
|
||||||
// List any dimension data files and read each dimension
|
// List any dimension data files and read each dimension
|
||||||
DimDataProcessor reader = new DimDataProcessor();
|
DimDataProcessor reader = new DimDataProcessor();
|
||||||
HashMap<Integer, PackedDimData> packedDims = new HashMap<Integer, PackedDimData>();
|
HashMap<Integer, PackedDimData> packedDims = new HashMap<Integer, PackedDimData>();
|
||||||
@@ -82,7 +91,17 @@ public class DDSaveHandler
|
|||||||
{
|
{
|
||||||
linksToUnpack.addAll(packedDim.Links);
|
linksToUnpack.addAll(packedDim.Links);
|
||||||
}
|
}
|
||||||
return unpackDimData(packedDims) && unpackLinkData(linksToUnpack);
|
unpackDimData(packedDims);
|
||||||
|
unpackLinkData(linksToUnpack);
|
||||||
|
|
||||||
|
HashMap<String, NewDimData> personalPocketsMap = new HashMap<String, NewDimData>();
|
||||||
|
for(Entry<String, Integer> pair : ppMap.entrySet())
|
||||||
|
{
|
||||||
|
personalPocketsMap.put(pair.getKey(), PocketManager.getDimensionData(pair.getValue()));
|
||||||
|
}
|
||||||
|
PocketManager.setPersonalPocketsMapping(personalPocketsMap);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -139,7 +158,7 @@ public class DDSaveHandler
|
|||||||
}
|
}
|
||||||
if(isMissing)
|
if(isMissing)
|
||||||
{
|
{
|
||||||
packedDim=(new PackedDimData(packedDim.ID, packedDim.Depth, packedDim.PackDepth, packedDim.ParentID, packedDim.RootID, packedDim.Orientation, packedDim.IsDungeon, packedDim.IsFilled, packedDim.DungeonData, packedDim.Origin, children, packedDim.Links, packedDim.Tails));
|
packedDim=(new PackedDimData(packedDim.ID, packedDim.Depth, packedDim.PackDepth, packedDim.ParentID, packedDim.RootID, packedDim.Orientation, DimensionType.getTypeFromIndex(packedDim.DimensionType), packedDim.IsFilled, packedDim.DungeonData, packedDim.Origin, children, packedDim.Links, packedDim.Tails));
|
||||||
packedDims.put(packedDim.ID, packedDim);
|
packedDims.put(packedDim.ID, packedDim);
|
||||||
}
|
}
|
||||||
return children;
|
return children;
|
||||||
@@ -157,12 +176,12 @@ public class DDSaveHandler
|
|||||||
{
|
{
|
||||||
ArrayList<Integer> fosterChildren = new ArrayList<Integer>();
|
ArrayList<Integer> fosterChildren = new ArrayList<Integer>();
|
||||||
fosterChildren.add(packedDim.ID);
|
fosterChildren.add(packedDim.ID);
|
||||||
|
DimensionType type = DimensionType.getTypeFromIndex(packedDim.DimensionType);
|
||||||
//fix pockets without parents
|
//fix pockets without parents
|
||||||
if(!packedDims.containsKey(packedDim.ParentID))
|
if(!packedDims.containsKey(packedDim.ParentID))
|
||||||
{
|
{
|
||||||
//Fix the orphan by changing its root to its parent, re-connecting it to the list
|
//Fix the orphan by changing its root to its parent, re-connecting it to the list
|
||||||
packedDim=(new PackedDimData(packedDim.ID, 1, packedDim.PackDepth, packedDim.RootID, packedDim.RootID, packedDim.Orientation, packedDim.IsDungeon, packedDim.IsFilled, packedDim.DungeonData, packedDim.Origin, packedDim.ChildIDs, packedDim.Links, packedDim.Tails));
|
packedDim=(new PackedDimData(packedDim.ID, 1, packedDim.PackDepth, packedDim.RootID, packedDim.RootID, packedDim.Orientation,type, packedDim.IsFilled, packedDim.DungeonData, packedDim.Origin, packedDim.ChildIDs, packedDim.Links, packedDim.Tails));
|
||||||
packedDims.put(packedDim.ID, packedDim);
|
packedDims.put(packedDim.ID, packedDim);
|
||||||
}
|
}
|
||||||
//fix pockets whose parents have forgotten about them
|
//fix pockets whose parents have forgotten about them
|
||||||
@@ -171,7 +190,7 @@ public class DDSaveHandler
|
|||||||
{
|
{
|
||||||
//find the root, and fix it by adding the orphan's ID to its children
|
//find the root, and fix it by adding the orphan's ID to its children
|
||||||
fosterChildren.addAll(fosterParent.ChildIDs);
|
fosterChildren.addAll(fosterParent.ChildIDs);
|
||||||
fosterParent=(new PackedDimData(fosterParent.ID, fosterParent.Depth, fosterParent.PackDepth, fosterParent.ParentID, fosterParent.RootID, fosterParent.Orientation, fosterParent.IsDungeon, fosterParent.IsFilled, fosterParent.DungeonData, fosterParent.Origin, fosterChildren, fosterParent.Links, fosterParent.Tails));
|
fosterParent=(new PackedDimData(fosterParent.ID, fosterParent.Depth, fosterParent.PackDepth, fosterParent.ParentID, fosterParent.RootID, fosterParent.Orientation, type, fosterParent.IsFilled, fosterParent.DungeonData, fosterParent.Origin, fosterChildren, fosterParent.Links, fosterParent.Tails));
|
||||||
packedDims.put(fosterParent.ID, fosterParent);
|
packedDims.put(fosterParent.ID, fosterParent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,18 +209,14 @@ public class DDSaveHandler
|
|||||||
if(packedLink.parent.equals(fakePoint))
|
if(packedLink.parent.equals(fakePoint))
|
||||||
{
|
{
|
||||||
NewDimData data = PocketManager.getDimensionData(packedLink.source.getDimension());
|
NewDimData data = PocketManager.getDimensionData(packedLink.source.getDimension());
|
||||||
int linkType = packedLink.tail.linkType;
|
LinkType linkType = LinkType.getLinkTypeFromIndex(packedLink.tail.linkType);
|
||||||
|
|
||||||
if((linkType < LinkTypes.ENUM_MIN || linkType > LinkTypes.ENUM_MAX) && linkType != LinkTypes.CLIENT_SIDE)
|
|
||||||
{
|
|
||||||
linkType = LinkTypes.NORMAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
DimLink link = data.createLink(packedLink.source, linkType, packedLink.orientation);
|
DimLink link = data.createLink(packedLink.source, linkType, packedLink.orientation, packedLink.lock);
|
||||||
Point4D destination = packedLink.tail.destination;
|
Point4D destination = packedLink.tail.destination;
|
||||||
if(destination!=null)
|
if(destination!=null)
|
||||||
{
|
{
|
||||||
PocketManager.getDimensionData(destination.getDimension()).setDestination(link, destination.getX(),destination.getY(),destination.getZ());
|
PocketManager.createDimensionDataDangerously(destination.getDimension()).setLinkDestination(link, destination.getX(),destination.getY(),destination.getZ());
|
||||||
}
|
}
|
||||||
unpackedLinks.add(packedLink);
|
unpackedLinks.add(packedLink);
|
||||||
}
|
}
|
||||||
@@ -213,10 +228,10 @@ public class DDSaveHandler
|
|||||||
{
|
{
|
||||||
for(PackedLinkData packedLink : linksToUnpack)
|
for(PackedLinkData packedLink : linksToUnpack)
|
||||||
{
|
{
|
||||||
NewDimData data = PocketManager.getDimensionData(packedLink.source.getDimension());
|
NewDimData data = PocketManager.createDimensionDataDangerously(packedLink.source.getDimension());
|
||||||
if(data.getLink(packedLink.parent)!=null)
|
if(data.getLink(packedLink.parent)!=null)
|
||||||
{
|
{
|
||||||
data.createChildLink(packedLink.source.getX(), packedLink.source.getY(), packedLink.source.getZ(), data.getLink(packedLink.parent));
|
data.createChildLink(packedLink.source, data.getLink(packedLink.parent), packedLink.lock);
|
||||||
}
|
}
|
||||||
unpackedLinks.add(packedLink);
|
unpackedLinks.add(packedLink);
|
||||||
}
|
}
|
||||||
@@ -270,6 +285,9 @@ public class DDSaveHandler
|
|||||||
// Create and write the blackList
|
// Create and write the blackList
|
||||||
writeBlacklist(blacklist, savePath);
|
writeBlacklist(blacklist, savePath);
|
||||||
|
|
||||||
|
//create and write personal pocket mapping
|
||||||
|
writePersonalPocketMap(PocketManager.getPersonalPocketMapping(), savePath);
|
||||||
|
|
||||||
// Write the dimension save data
|
// Write the dimension save data
|
||||||
boolean succeeded = true;
|
boolean succeeded = true;
|
||||||
DimDataProcessor writer = new DimDataProcessor();
|
DimDataProcessor writer = new DimDataProcessor();
|
||||||
@@ -312,6 +330,32 @@ public class DDSaveHandler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean writePersonalPocketMap(HashMap<String, NewDimData> hashMap, String savePath)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
HashMap<String, Integer> ppMap = new HashMap<String, Integer>();
|
||||||
|
|
||||||
|
for(Entry<String, NewDimData> pair : hashMap.entrySet())
|
||||||
|
{
|
||||||
|
ppMap.put(pair.getKey(), pair.getValue().id());
|
||||||
|
}
|
||||||
|
PersonalPocketMappingProcessor writer = new PersonalPocketMappingProcessor();
|
||||||
|
File tempFile = new File(savePath + "/personalPockets.tmp");
|
||||||
|
File saveFile = new File(savePath + "/personalPockets.txt");
|
||||||
|
writer.writeToFile(tempFile, ppMap);
|
||||||
|
saveFile.delete();
|
||||||
|
tempFile.renameTo(saveFile);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.err.println("Could not save personal pockets mapping. The following error occurred:");
|
||||||
|
printException(e, true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static boolean writeDimension(IPackable<PackedDimData> dimension, DimDataProcessor writer, String basePath, String backupPath)
|
private static boolean writeDimension(IPackable<PackedDimData> dimension, DimDataProcessor writer, String basePath, String backupPath)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -378,7 +422,6 @@ public class DDSaveHandler
|
|||||||
|
|
||||||
public static List<Integer> readBlacklist(File blacklistFile, BlacklistProcessor reader)
|
public static List<Integer> readBlacklist(File blacklistFile, BlacklistProcessor reader)
|
||||||
{
|
{
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return reader.readFromFile(blacklistFile);
|
return reader.readFromFile(blacklistFile);
|
||||||
@@ -388,6 +431,18 @@ public class DDSaveHandler
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HashMap<String,Integer> readPersonalPocketsMapping(File ppMap, PersonalPocketMappingProcessor reader)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return reader.readFromFile(ppMap);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,33 +4,53 @@ import java.io.IOException;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import StevenDimDoors.mod_pocketDim.core.DimensionType;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
|
||||||
import com.google.gson.GsonBuilder;
|
|
||||||
import com.google.gson.stream.JsonReader;
|
|
||||||
import com.google.gson.stream.JsonToken;
|
|
||||||
|
|
||||||
import StevenDimDoors.mod_pocketDim.Point3D;
|
|
||||||
import StevenDimDoors.mod_pocketDim.util.BaseConfigurationProcessor;
|
import StevenDimDoors.mod_pocketDim.util.BaseConfigurationProcessor;
|
||||||
import StevenDimDoors.mod_pocketDim.util.ConfigurationProcessingException;
|
import StevenDimDoors.mod_pocketDim.util.ConfigurationProcessingException;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.util.JSONValidator;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import com.google.gson.JsonParser;
|
||||||
|
import com.google.gson.stream.JsonReader;
|
||||||
|
|
||||||
public class DimDataProcessor extends BaseConfigurationProcessor<PackedDimData>
|
public class DimDataProcessor extends BaseConfigurationProcessor<PackedDimData>
|
||||||
{
|
{
|
||||||
|
public final String JSON_VERSION_PROPERTY_NAME = "SAVE_DATA_VERSION_ID_INSTANCE";
|
||||||
|
private HashMap<Integer, JsonObject> SAVE_DATA_SCHEMA;
|
||||||
|
private static final JsonParser jsonParser = new JsonParser();
|
||||||
|
|
||||||
|
public static final String BASE_SCHEMA_PATH = "/assets/dimdoors/text/";
|
||||||
|
|
||||||
|
|
||||||
|
//TODO dont load the schemas every time
|
||||||
|
public DimDataProcessor()
|
||||||
|
{
|
||||||
|
SAVE_DATA_SCHEMA = new HashMap<Integer, JsonObject>();
|
||||||
|
|
||||||
|
//Load the old schema/s
|
||||||
|
SAVE_DATA_SCHEMA.put(982405775, loadSchema(BASE_SCHEMA_PATH+"Dim_Data_Schema_v982405775.json"));
|
||||||
|
|
||||||
|
//load the current schema
|
||||||
|
SAVE_DATA_SCHEMA.put(PackedDimData.SAVE_DATA_VERSION_ID, loadSchema(BASE_SCHEMA_PATH+"Dim_Data_Schema_v1-0-0.json"));
|
||||||
|
|
||||||
|
}
|
||||||
@Override
|
@Override
|
||||||
public PackedDimData readFromStream(InputStream inputStream)
|
public PackedDimData readFromStream(InputStream inputStream)
|
||||||
throws ConfigurationProcessingException
|
throws ConfigurationProcessingException
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
//read in the json save file represeting a single dimension
|
||||||
JsonReader reader = new JsonReader(new InputStreamReader(inputStream, "UTF-8"));
|
JsonReader reader = new JsonReader(new InputStreamReader(inputStream, "UTF-8"));
|
||||||
PackedDimData data = this.createDImDataFromJson(reader);
|
PackedDimData data = this.readDimDataJson(reader);
|
||||||
reader.close();
|
reader.close();
|
||||||
return data;
|
return data;
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (IOException e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
throw new ConfigurationProcessingException("Could not read packedDimData");
|
throw new ConfigurationProcessingException("Could not read packedDimData");
|
||||||
@@ -42,259 +62,132 @@ public class DimDataProcessor extends BaseConfigurationProcessor<PackedDimData>
|
|||||||
public void writeToStream(OutputStream outputStream, PackedDimData data)
|
public void writeToStream(OutputStream outputStream, PackedDimData data)
|
||||||
throws ConfigurationProcessingException
|
throws ConfigurationProcessingException
|
||||||
{
|
{
|
||||||
/** Print out dimData using the GSON built in serializer. I dont feel bad doing this because
|
//create a json object from a packedDimData instance
|
||||||
* 1- We can read it
|
|
||||||
* 2- We are manually reading the data in.
|
|
||||||
* 3- The error messages tell us exactly where its failing, so its easy to fix
|
|
||||||
*/
|
|
||||||
|
|
||||||
GsonBuilder gsonBuilder = new GsonBuilder();
|
GsonBuilder gsonBuilder = new GsonBuilder();
|
||||||
Gson gson = gsonBuilder.setPrettyPrinting().create();
|
gsonBuilder.setPrettyPrinting();
|
||||||
|
Gson gson = gsonBuilder.create();
|
||||||
|
JsonElement ele = gson.toJsonTree(data);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
outputStream.write(gson.toJson(data).getBytes("UTF-8"));
|
//ensure our json object corresponds to our schema
|
||||||
|
JSONValidator.validate(getSaveDataSchema(ele.getAsJsonObject()), ele);
|
||||||
|
outputStream.write(gson.toJson(ele).getBytes("UTF-8"));
|
||||||
outputStream.close();
|
outputStream.close();
|
||||||
}
|
}
|
||||||
catch (IOException e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
// not sure if this is kosher, we need it to explode, but not by throwing the IO exception.
|
// not sure if this is kosher, we need it to explode, but not by throwing the IO exception.
|
||||||
throw new ConfigurationProcessingException("Incorrectly formatted save data");
|
throw new ConfigurationProcessingException("Could not access save data");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Nightmare method that takes a JsonReader pointed at a serialized instance of PackedDimData
|
* validates the save file against it's current version, then updates and validates it again if it needs it
|
||||||
|
* then it loads it
|
||||||
* @param reader
|
* @param reader
|
||||||
* @return
|
* @return
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public PackedDimData createDImDataFromJson(JsonReader reader) throws IOException
|
public PackedDimData readDimDataJson(JsonReader reader) throws IOException
|
||||||
{
|
{
|
||||||
int ID;
|
//read the save file into a Json element
|
||||||
boolean IsDungeon;
|
JsonElement ele = jsonParser.parse(reader);
|
||||||
boolean IsFilled;
|
|
||||||
int Depth;
|
|
||||||
int PackDepth;
|
|
||||||
int ParentID;
|
|
||||||
int RootID;
|
|
||||||
PackedDungeonData Dungeon = null;
|
|
||||||
Point3D Origin;
|
|
||||||
int Orientation;
|
|
||||||
List<Integer> ChildIDs;
|
|
||||||
List<PackedLinkData> Links;
|
|
||||||
List<PackedLinkTail> Tails = new ArrayList<PackedLinkTail>();
|
|
||||||
|
|
||||||
reader.beginObject();
|
//get the schema that corresponds to the save file's listed version number
|
||||||
|
JsonObject schema = this.getSaveDataSchema(ele.getAsJsonObject());
|
||||||
|
|
||||||
reader.nextName();
|
//validate the save file against its schema
|
||||||
if (reader.nextLong() != PackedDimData.SAVE_DATA_VERSION_ID)
|
JSONValidator.validate(schema, ele);
|
||||||
{
|
|
||||||
throw new IOException("Save data version mismatch");
|
|
||||||
}
|
|
||||||
|
|
||||||
reader.nextName();
|
//handle updating old save data
|
||||||
ID = reader.nextInt();
|
ele = processSaveData(schema, ele.getAsJsonObject());
|
||||||
|
|
||||||
reader.nextName();
|
//convert the updated and verified json into an instance of PackedDimData
|
||||||
IsDungeon = reader.nextBoolean();
|
GsonBuilder gsonBuilder = new GsonBuilder();
|
||||||
|
return gsonBuilder.create().fromJson(ele, PackedDimData.class);
|
||||||
reader.nextName();
|
|
||||||
IsFilled = reader.nextBoolean();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
Depth = reader.nextInt();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
PackDepth = reader.nextInt();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
ParentID=reader.nextInt();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
RootID= reader.nextInt();
|
|
||||||
|
|
||||||
if(reader.nextName().equals("DungeonData"))
|
|
||||||
{
|
|
||||||
Dungeon = createDungeonDataFromJson(reader);
|
|
||||||
reader.nextName();
|
|
||||||
}
|
|
||||||
|
|
||||||
Origin = createPointFromJson(reader);
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
Orientation = reader.nextInt();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
ChildIDs = this.createIntListFromJson(reader);
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
Links = this.createLinksListFromJson(reader);
|
|
||||||
|
|
||||||
return new PackedDimData(ID, Depth, PackDepth, ParentID, RootID, Orientation, IsDungeon, IsFilled, Dungeon, Origin, ChildIDs, Links, Tails);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Point3D createPointFromJson(JsonReader reader) throws IOException
|
/**
|
||||||
|
* Gets the schema that corresponds to a version of our save data
|
||||||
|
* @param obj
|
||||||
|
* @return
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public JsonObject getSaveDataSchema(JsonObject obj)
|
||||||
{
|
{
|
||||||
reader.beginObject();
|
JsonObject schema = this.SAVE_DATA_SCHEMA.get(obj.get(JSON_VERSION_PROPERTY_NAME).getAsInt());
|
||||||
|
|
||||||
reader.nextName();
|
if(schema == null)
|
||||||
int x = reader.nextInt();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
int y = reader.nextInt();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
int z = reader.nextInt();
|
|
||||||
|
|
||||||
reader.endObject();
|
|
||||||
|
|
||||||
return new Point3D(x,y,z);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Point4D createPoint4DFromJson(JsonReader reader) throws IOException
|
|
||||||
{
|
|
||||||
reader.beginObject();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
int x = reader.nextInt();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
int y = reader.nextInt();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
int z = reader.nextInt();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
int dimension = reader.nextInt();
|
|
||||||
|
|
||||||
reader.endObject();
|
|
||||||
|
|
||||||
return new Point4D(x,y,z,dimension);
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<Integer> createIntListFromJson(JsonReader reader) throws IOException
|
|
||||||
{
|
|
||||||
List<Integer> list = new ArrayList<Integer>();
|
|
||||||
reader.beginArray();
|
|
||||||
|
|
||||||
while (reader.peek() != JsonToken.END_ARRAY)
|
|
||||||
{
|
{
|
||||||
list.add(reader.nextInt());
|
throw new IllegalStateException("Invalid save data version");
|
||||||
|
|
||||||
}
|
|
||||||
reader.endArray();
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<PackedLinkData> createLinksListFromJson(JsonReader reader) throws IOException
|
|
||||||
{
|
|
||||||
List<PackedLinkData> list = new ArrayList<PackedLinkData>();
|
|
||||||
|
|
||||||
reader.beginArray();
|
|
||||||
|
|
||||||
while (reader.peek() != JsonToken.END_ARRAY)
|
|
||||||
{
|
|
||||||
list.add(createLinkDataFromJson(reader));
|
|
||||||
}
|
|
||||||
reader.endArray();
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
private PackedLinkData createLinkDataFromJson(JsonReader reader) throws IOException
|
|
||||||
{
|
|
||||||
Point4D source;
|
|
||||||
Point3D parent;
|
|
||||||
PackedLinkTail tail;
|
|
||||||
int orientation;
|
|
||||||
List<Point3D> children = new ArrayList<Point3D>();
|
|
||||||
|
|
||||||
reader.beginObject();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
source = this.createPoint4DFromJson(reader);
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
parent = this.createPointFromJson(reader);
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
tail = this.createLinkTailFromJson(reader);
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
orientation = reader.nextInt();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
reader.beginArray();
|
|
||||||
|
|
||||||
while (reader.peek() != JsonToken.END_ARRAY)
|
|
||||||
{
|
|
||||||
children.add(this.createPointFromJson(reader));
|
|
||||||
}
|
|
||||||
reader.endArray();
|
|
||||||
reader.endObject();
|
|
||||||
|
|
||||||
return new PackedLinkData(source, parent, tail, orientation, children);
|
|
||||||
}
|
|
||||||
private PackedDungeonData createDungeonDataFromJson(JsonReader reader) throws IOException
|
|
||||||
{
|
|
||||||
int Weight;
|
|
||||||
boolean IsOpen;
|
|
||||||
boolean IsInternal;
|
|
||||||
String SchematicPath;
|
|
||||||
String SchematicName;
|
|
||||||
String DungeonTypeName;
|
|
||||||
String DungeonPackName;
|
|
||||||
|
|
||||||
reader.beginObject();
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
JsonToken test = reader.peek();
|
|
||||||
|
|
||||||
if(reader.peek() == JsonToken.END_OBJECT)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
reader.nextName();
|
return schema;
|
||||||
Weight=reader.nextInt();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
IsOpen=reader.nextBoolean();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
IsInternal=reader.nextBoolean();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
SchematicPath=reader.nextString();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
SchematicName=reader.nextString();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
DungeonTypeName=reader.nextString();
|
|
||||||
|
|
||||||
reader.nextName();
|
|
||||||
DungeonPackName=reader.nextString();
|
|
||||||
|
|
||||||
reader.endObject();
|
|
||||||
return new PackedDungeonData(Weight, IsOpen, IsInternal, SchematicPath, SchematicName, DungeonTypeName, DungeonPackName);
|
|
||||||
}
|
}
|
||||||
private PackedLinkTail createLinkTailFromJson(JsonReader reader) throws IOException
|
|
||||||
{
|
|
||||||
Point4D destination = null;
|
|
||||||
int linkType;
|
|
||||||
reader.beginObject();
|
|
||||||
reader.nextName();
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
/**
|
||||||
JsonToken test = reader.peek();
|
* Internally load the save data schema so we dont load them every single time we validate save data
|
||||||
if (reader.peek() == JsonToken.BEGIN_OBJECT)
|
* @param path
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private JsonObject loadSchema(String path)
|
||||||
|
{
|
||||||
|
InputStream in = this.getClass().getResourceAsStream(path);
|
||||||
|
JsonReader reader = new JsonReader(new InputStreamReader(in));
|
||||||
|
|
||||||
|
JsonObject schema = jsonParser.parse(reader).getAsJsonObject();
|
||||||
|
try
|
||||||
{
|
{
|
||||||
destination = this.createPoint4DFromJson(reader);
|
reader.close();
|
||||||
reader.nextName();
|
in.close();
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
System.err.println("Could not load Json Save Data definitions");
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new IllegalStateException("Could not load Json Save Data definitions");
|
||||||
}
|
}
|
||||||
|
|
||||||
linkType = reader.nextInt();
|
return schema;
|
||||||
reader.endObject();
|
}
|
||||||
|
|
||||||
return new PackedLinkTail(destination, linkType);
|
/**
|
||||||
|
* I use this method to update old save data files to the new format before actually loading them.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public JsonObject processSaveData(JsonObject schema, JsonObject save)
|
||||||
|
{
|
||||||
|
if(save.get(JSON_VERSION_PROPERTY_NAME).getAsInt()== 982405775)
|
||||||
|
{
|
||||||
|
DimensionType type;
|
||||||
|
|
||||||
|
//see if the dim is a pocket
|
||||||
|
if(save.get("RootID").getAsInt() != save.get("ID").getAsInt())
|
||||||
|
{
|
||||||
|
if(save.get("IsDungeon").getAsBoolean())
|
||||||
|
{
|
||||||
|
type = DimensionType.DUNGEON;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
type = DimensionType.POCKET;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
type = DimensionType.ROOT;
|
||||||
|
}
|
||||||
|
|
||||||
|
save.remove("IsDungeon");
|
||||||
|
save.addProperty("DimensionType",type.index);
|
||||||
|
save.remove(this.JSON_VERSION_PROPERTY_NAME);
|
||||||
|
save.addProperty(this.JSON_VERSION_PROPERTY_NAME, PackedDimData.SAVE_DATA_VERSION_ID);
|
||||||
|
return processSaveData(this.getSaveDataSchema(save), save);
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONValidator.validate(this.getSaveDataSchema(save), save);
|
||||||
|
return save;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,17 +2,16 @@ package StevenDimDoors.mod_pocketDim.saving;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import StevenDimDoors.mod_pocketDim.DimData;
|
import StevenDimDoors.mod_pocketDim.DimData;
|
||||||
import StevenDimDoors.mod_pocketDim.LinkData;
|
import StevenDimDoors.mod_pocketDim.LinkData;
|
||||||
import StevenDimDoors.mod_pocketDim.Point3D;
|
|
||||||
|
|
||||||
import StevenDimDoors.mod_pocketDim.ObjectSaveInputStream;
|
import StevenDimDoors.mod_pocketDim.ObjectSaveInputStream;
|
||||||
|
import StevenDimDoors.mod_pocketDim.Point3D;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.DimensionType;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
|
|
||||||
public class OldSaveImporter
|
public class OldSaveImporter
|
||||||
@@ -39,35 +38,83 @@ public class OldSaveImporter
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//build the child list
|
||||||
|
HashMap<Integer, ArrayList<Integer>> parentChildMapping = new HashMap<Integer, ArrayList<Integer>>();
|
||||||
|
for(DimData data : dimMap.values())
|
||||||
|
{
|
||||||
|
if(data.isPocket)
|
||||||
|
{
|
||||||
|
LinkData link = data.exitDimLink;
|
||||||
|
|
||||||
|
if(parentChildMapping.containsKey(link.destDimID))
|
||||||
|
{
|
||||||
|
parentChildMapping.get(link.destDimID).add(data.dimID);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
parentChildMapping.put(link.destDimID, new ArrayList<Integer>());
|
||||||
|
parentChildMapping.get(link.destDimID).add(data.dimID);
|
||||||
|
}
|
||||||
|
parentChildMapping.remove(data.dimID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for(DimData data : dimMap.values())
|
for(DimData data : dimMap.values())
|
||||||
{
|
{
|
||||||
List<PackedLinkData> newPackedLinkData = new ArrayList<PackedLinkData>();
|
List<PackedLinkData> newPackedLinkData = new ArrayList<PackedLinkData>();
|
||||||
List<Integer> childDims = new ArrayList<Integer>();
|
List<Integer> childDims;
|
||||||
|
if(parentChildMapping.containsKey(data.dimID))
|
||||||
|
{
|
||||||
|
childDims =parentChildMapping.get(data.dimID);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
childDims = new ArrayList<Integer>();
|
||||||
|
}
|
||||||
|
|
||||||
for(LinkData link : data.getLinksInDim())
|
for(LinkData link : data.getLinksInDim())
|
||||||
{
|
{
|
||||||
Point4D source = new Point4D(link.locXCoord,link.locYCoord,link.locZCoord,link.locDimID);
|
Point4D source = new Point4D(link.locXCoord,link.locYCoord,link.locZCoord,link.locDimID);
|
||||||
Point4D destintion = new Point4D(link.destXCoord,link.destYCoord,link.destZCoord,link.destDimID);
|
Point4D destintion = new Point4D(link.destXCoord,link.destYCoord,link.destZCoord,link.destDimID);
|
||||||
PackedLinkTail tail = new PackedLinkTail(destintion, link.linkOrientation);
|
PackedLinkTail tail = new PackedLinkTail(destintion, LinkType.NORMAL);
|
||||||
List<Point3D> children = new ArrayList<Point3D>();
|
List<Point3D> children = new ArrayList<Point3D>();
|
||||||
|
|
||||||
PackedLinkData newPackedLink = new PackedLinkData(source, new Point3D(-1,-1,-1), tail, link.linkOrientation,children);
|
PackedLinkData newPackedLink = new PackedLinkData(source, new Point3D(-1,-1,-1), tail, link.linkOrientation,children, null);
|
||||||
|
|
||||||
newPackedLinkData.add(newPackedLink);
|
newPackedLinkData.add(newPackedLink);
|
||||||
allPackedLinks.add(newPackedLink);
|
allPackedLinks.add(newPackedLink);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
PackedDimData dim;
|
||||||
|
DimensionType type;
|
||||||
|
|
||||||
PackedDimData dim = new PackedDimData(data.dimID, data.depth, data.depth, data.exitDimLink.locDimID, data.exitDimLink.locDimID, 0, data.dungeonGenerator!=null, data.hasBeenFilled, null, new Point3D(0,64,0), childDims, newPackedLinkData, null);
|
if(data.isPocket)
|
||||||
|
{
|
||||||
|
if(data.dungeonGenerator!=null)
|
||||||
|
{
|
||||||
|
type = DimensionType.DUNGEON;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
type = DimensionType.POCKET;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
type = DimensionType.ROOT;
|
||||||
|
}
|
||||||
|
if(data.isPocket)
|
||||||
|
{
|
||||||
|
dim = new PackedDimData(data.dimID, data.depth, data.depth, data.exitDimLink.locDimID, data.exitDimLink.locDimID, 0, type, data.hasBeenFilled, null, new Point3D(0,64,0), childDims, newPackedLinkData, null);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dim = new PackedDimData(data.dimID, data.depth, data.depth, data.dimID, data.dimID, 0, type, data.hasBeenFilled, null, new Point3D(0,64,0), childDims, newPackedLinkData, null);
|
||||||
|
}
|
||||||
newPackedDimData.put(dim.ID,dim);
|
newPackedDimData.put(dim.ID,dim);
|
||||||
|
|
||||||
DDSaveHandler.unpackDimData(newPackedDimData);
|
|
||||||
DDSaveHandler.unpackLinkData(allPackedLinks);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DDSaveHandler.unpackDimData(newPackedDimData);
|
||||||
|
DDSaveHandler.unpackLinkData(allPackedLinks);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,14 +3,15 @@ package StevenDimDoors.mod_pocketDim.saving;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import StevenDimDoors.mod_pocketDim.Point3D;
|
import StevenDimDoors.mod_pocketDim.Point3D;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.DimensionType;
|
||||||
|
|
||||||
public class PackedDimData
|
public class PackedDimData
|
||||||
{
|
{
|
||||||
// These fields will be public since this is a simple data container
|
// These fields will be public since this is a simple data container
|
||||||
public final static long SAVE_DATA_VERSION_ID = 982405775L;
|
public final static int SAVE_DATA_VERSION_ID = 100;
|
||||||
public final long SAVE_DATA_VERSION_ID_INSTANCE = SAVE_DATA_VERSION_ID;
|
public final long SAVE_DATA_VERSION_ID_INSTANCE = SAVE_DATA_VERSION_ID;
|
||||||
public final int ID;
|
public final int ID;
|
||||||
public final boolean IsDungeon;
|
public final int DimensionType;
|
||||||
public final boolean IsFilled;
|
public final boolean IsFilled;
|
||||||
public final int Depth;
|
public final int Depth;
|
||||||
public final int PackDepth;
|
public final int PackDepth;
|
||||||
@@ -26,7 +27,7 @@ public class PackedDimData
|
|||||||
// FIXME Missing dungeon data, not sure how to include it
|
// FIXME Missing dungeon data, not sure how to include it
|
||||||
|
|
||||||
public PackedDimData(int id, int depth, int packDepth, int parentID, int rootID, int orientation,
|
public PackedDimData(int id, int depth, int packDepth, int parentID, int rootID, int orientation,
|
||||||
boolean isDungeon, boolean isFilled,PackedDungeonData dungeonData, Point3D origin, List<Integer> childIDs, List<PackedLinkData> links,
|
DimensionType type, boolean isFilled,PackedDungeonData dungeonData, Point3D origin, List<Integer> childIDs, List<PackedLinkData> links,
|
||||||
List<PackedLinkTail> tails)
|
List<PackedLinkTail> tails)
|
||||||
{
|
{
|
||||||
ID = id;
|
ID = id;
|
||||||
@@ -35,7 +36,7 @@ public class PackedDimData
|
|||||||
ParentID = parentID;
|
ParentID = parentID;
|
||||||
RootID = rootID;
|
RootID = rootID;
|
||||||
Orientation = orientation;
|
Orientation = orientation;
|
||||||
IsDungeon = isDungeon;
|
DimensionType = type.index;
|
||||||
IsFilled = isFilled;
|
IsFilled = isFilled;
|
||||||
DungeonData = dungeonData;
|
DungeonData = dungeonData;
|
||||||
Origin = origin;
|
Origin = origin;
|
||||||
@@ -49,4 +50,6 @@ public class PackedDimData
|
|||||||
{
|
{
|
||||||
return "ID= "+this.ID;
|
return "ID= "+this.ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package StevenDimDoors.mod_pocketDim.saving;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import StevenDimDoors.mod_pocketDim.Point3D;
|
import StevenDimDoors.mod_pocketDim.Point3D;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.DDLock;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
|
|
||||||
public class PackedLinkData
|
public class PackedLinkData
|
||||||
@@ -12,13 +13,15 @@ public class PackedLinkData
|
|||||||
public final PackedLinkTail tail;
|
public final PackedLinkTail tail;
|
||||||
public final int orientation;
|
public final int orientation;
|
||||||
public final List<Point3D> children;
|
public final List<Point3D> children;
|
||||||
|
public final DDLock lock;
|
||||||
|
|
||||||
public PackedLinkData(Point4D source, Point3D parent, PackedLinkTail tail, int orientation, List<Point3D> children)
|
public PackedLinkData(Point4D source, Point3D parent, PackedLinkTail tail, int orientation, List<Point3D> children, DDLock lock)
|
||||||
{
|
{
|
||||||
this.source=source;
|
this.source=source;
|
||||||
this.parent=parent;
|
this.parent=parent;
|
||||||
this.tail=tail;
|
this.tail=tail;
|
||||||
this.orientation=orientation;
|
this.orientation=orientation;
|
||||||
this.children=children;
|
this.children=children;
|
||||||
|
this.lock = lock;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.saving;
|
package StevenDimDoors.mod_pocketDim.saving;
|
||||||
|
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
|
|
||||||
public class PackedLinkTail
|
public class PackedLinkTail
|
||||||
@@ -7,10 +8,10 @@ public class PackedLinkTail
|
|||||||
public final Point4D destination;
|
public final Point4D destination;
|
||||||
public final int linkType;
|
public final int linkType;
|
||||||
|
|
||||||
public PackedLinkTail(Point4D destination, int linkType)
|
public PackedLinkTail(Point4D destination, LinkType linkType)
|
||||||
{
|
{
|
||||||
this.destination=destination;
|
this.destination=destination;
|
||||||
this.linkType=linkType;
|
this.linkType=linkType.index;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
package StevenDimDoors.mod_pocketDim.saving;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.google.gson.stream.JsonReader;
|
||||||
|
import com.google.gson.stream.JsonToken;
|
||||||
|
|
||||||
|
import StevenDimDoors.mod_pocketDim.util.BaseConfigurationProcessor;
|
||||||
|
import StevenDimDoors.mod_pocketDim.util.ConfigurationProcessingException;
|
||||||
|
|
||||||
|
public class PersonalPocketMappingProcessor extends BaseConfigurationProcessor<HashMap<String, Integer>>
|
||||||
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HashMap<String, Integer> readFromStream(InputStream inputStream) throws ConfigurationProcessingException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
JsonReader reader = new JsonReader(new InputStreamReader(inputStream, "UTF-8"));
|
||||||
|
HashMap<String, Integer> data = this.createPersonalPocketsMapFromJson(reader);
|
||||||
|
reader.close();
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new ConfigurationProcessingException("Could not read personal pocket mapping");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private HashMap<String, Integer> createPersonalPocketsMapFromJson(JsonReader reader) throws IOException
|
||||||
|
{
|
||||||
|
HashMap<String, Integer> ppMap;
|
||||||
|
ppMap = this.createMapFromJson(reader);
|
||||||
|
return ppMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
private HashMap<String, Integer> createMapFromJson(JsonReader reader) throws IOException
|
||||||
|
{
|
||||||
|
HashMap<String, Integer> map = new HashMap<String, Integer>();
|
||||||
|
|
||||||
|
reader.beginObject();
|
||||||
|
while(reader.peek()!= JsonToken.END_OBJECT)
|
||||||
|
{
|
||||||
|
map.put(reader.nextName(), reader.nextInt());
|
||||||
|
}
|
||||||
|
reader.endObject();
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToStream(OutputStream outputStream, HashMap<String, Integer> data) throws ConfigurationProcessingException
|
||||||
|
{
|
||||||
|
GsonBuilder gsonBuilder = new GsonBuilder();
|
||||||
|
Gson gson = gsonBuilder.setPrettyPrinting().create();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
outputStream.write(gson.toJson(data).getBytes("UTF-8"));
|
||||||
|
outputStream.close();
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
// not sure if this is kosher, we need it to explode, but not by throwing the IO exception.
|
||||||
|
throw new ConfigurationProcessingException("Incorrectly formatted save data");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -70,6 +70,8 @@ public class BlockRotator
|
|||||||
|
|
||||||
hasOrientations[mod_pocketDim.dimensionalDoor.blockID] = true;
|
hasOrientations[mod_pocketDim.dimensionalDoor.blockID] = true;
|
||||||
hasOrientations[mod_pocketDim.warpDoor.blockID] = true;
|
hasOrientations[mod_pocketDim.warpDoor.blockID] = true;
|
||||||
|
hasOrientations[mod_pocketDim.goldenDimensionalDoor.blockID] = true;
|
||||||
|
hasOrientations[mod_pocketDim.personalDimDoor.blockID] = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.ticking;
|
package StevenDimDoors.mod_pocketDim.ticking;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
|
|
||||||
@@ -31,7 +30,7 @@ public class CustomLimboPopulator implements IRegularTickReceiver {
|
|||||||
{
|
{
|
||||||
this.properties = properties;
|
this.properties = properties;
|
||||||
this.locations = new ConcurrentLinkedQueue<ChunkLocation>();
|
this.locations = new ConcurrentLinkedQueue<ChunkLocation>();
|
||||||
sender.registerForTicking(this, MONOLITH_SPAWNING_INTERVAL, false);
|
sender.registerReceiver(this, MONOLITH_SPAWNING_INTERVAL, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -65,7 +64,7 @@ public class CustomLimboPopulator implements IRegularTickReceiver {
|
|||||||
limboWorld = PocketManager.loadDimension(properties.LimboDimensionID);
|
limboWorld = PocketManager.loadDimension(properties.LimboDimensionID);
|
||||||
}
|
}
|
||||||
placeMonolithsInLimbo(limboWorld, location.ChunkX, location.ChunkZ);
|
placeMonolithsInLimbo(limboWorld, location.ChunkX, location.ChunkZ);
|
||||||
mod_pocketDim.instance.gatewayGenerator.generate(limboWorld.rand, location.ChunkX, location.ChunkZ,
|
mod_pocketDim.gatewayGenerator.generate(limboWorld.rand, location.ChunkX, location.ChunkZ,
|
||||||
limboWorld, limboWorld.getChunkProvider(), limboWorld.getChunkProvider());
|
limboWorld, limboWorld.getChunkProvider(), limboWorld.getChunkProvider());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1,53 +0,0 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.ticking;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Random;
|
|
||||||
|
|
||||||
import net.minecraft.world.World;
|
|
||||||
import net.minecraftforge.common.DimensionManager;
|
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
|
||||||
|
|
||||||
public class FastRiftRegenerator implements IRegularTickReceiver {
|
|
||||||
|
|
||||||
private static final int RIFT_REGENERATION_INTERVAL = 10; //Regenerate scheduled rifts every 10 ticks
|
|
||||||
private static Random random = new Random();
|
|
||||||
|
|
||||||
private ArrayList<Point4D> locationsToRegen = new ArrayList<Point4D>();
|
|
||||||
|
|
||||||
public FastRiftRegenerator(IRegularTickSender sender)
|
|
||||||
{
|
|
||||||
sender.registerForTicking(this, RIFT_REGENERATION_INTERVAL, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void notifyTick()
|
|
||||||
{
|
|
||||||
regenerateScheduledRifts();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void regenerateScheduledRifts()
|
|
||||||
{
|
|
||||||
if (!locationsToRegen.isEmpty())
|
|
||||||
{
|
|
||||||
List<Integer> loadedWorlds = (List<Integer>) Arrays.asList(DimensionManager.getIDs());
|
|
||||||
for (Point4D point: locationsToRegen)
|
|
||||||
{
|
|
||||||
if (loadedWorlds.contains(point.getDimension()) && PocketManager.getLink(point) != null)
|
|
||||||
{
|
|
||||||
World world = DimensionManager.getWorld(point.getDimension());
|
|
||||||
mod_pocketDim.blockRift.regenerateRift(world, point.getX(), point.getY(), point.getZ(), random);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
locationsToRegen.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void registerRiftForRegen(int x, int y, int z, int dimID)
|
|
||||||
{
|
|
||||||
this.locationsToRegen.add(new Point4D(x, y, z, dimID));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -3,6 +3,7 @@ package StevenDimDoors.mod_pocketDim.ticking;
|
|||||||
|
|
||||||
public interface IRegularTickSender {
|
public interface IRegularTickSender {
|
||||||
|
|
||||||
public void registerForTicking(IRegularTickReceiver receiver, int interval, boolean onTickStart);
|
public void registerReceiver(IRegularTickReceiver receiver, int interval, boolean onTickStart);
|
||||||
|
public void unregisterReceivers();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package StevenDimDoors.mod_pocketDim.ticking;
|
||||||
|
|
||||||
|
import StevenDimDoors.mod_pocketDim.world.LimboDecay;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles scheduling of periodic fast Limbo decay operations.
|
||||||
|
*/
|
||||||
|
public class LimboDecayScheduler implements IRegularTickReceiver {
|
||||||
|
|
||||||
|
private static final int LIMBO_DECAY_INTERVAL = 10; //Apply fast decay every 10 ticks
|
||||||
|
|
||||||
|
private LimboDecay decay;
|
||||||
|
|
||||||
|
public LimboDecayScheduler(IRegularTickSender tickSender, LimboDecay decay)
|
||||||
|
{
|
||||||
|
this.decay = decay;
|
||||||
|
tickSender.registerReceiver(this, LIMBO_DECAY_INTERVAL, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies fast Limbo decay periodically.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void notifyTick()
|
||||||
|
{
|
||||||
|
decay.applyRandomFastDecay();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,22 +2,16 @@ package StevenDimDoors.mod_pocketDim.ticking;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.block.material.Material;
|
|
||||||
import net.minecraft.entity.DataWatcher;
|
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.EntityFlying;
|
import net.minecraft.entity.EntityFlying;
|
||||||
import net.minecraft.entity.EntityLiving;
|
|
||||||
import net.minecraft.entity.SharedMonsterAttributes;
|
import net.minecraft.entity.SharedMonsterAttributes;
|
||||||
import net.minecraft.entity.monster.IMob;
|
import net.minecraft.entity.monster.IMob;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.util.AxisAlignedBB;
|
import net.minecraft.util.AxisAlignedBB;
|
||||||
import net.minecraft.util.ChunkCoordinates;
|
|
||||||
import net.minecraft.util.DamageSource;
|
import net.minecraft.util.DamageSource;
|
||||||
import net.minecraft.util.MathHelper;
|
import net.minecraft.util.MathHelper;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.common.ForgeHooks;
|
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DDTeleporter;
|
import StevenDimDoors.mod_pocketDim.core.DDTeleporter;
|
||||||
@@ -27,26 +21,31 @@ import StevenDimDoors.mod_pocketDim.world.PocketProvider;
|
|||||||
|
|
||||||
public class MobMonolith extends EntityFlying implements IMob
|
public class MobMonolith extends EntityFlying implements IMob
|
||||||
{
|
{
|
||||||
public static final int MAX_AGGRO_RANGE = 35;
|
private static final short MAX_AGGRO = 250;
|
||||||
public static final int MAX_SOUND_COOLDOWN = 200;
|
private static final short MAX_AGGRO_CAP = 100;
|
||||||
public static final float MAX_AGGRO = 100;
|
private static final short MIN_AGGRO_CAP = 25;
|
||||||
public static final int TEXTURE_STATES = 18;
|
private static final int MAX_TEXTURE_STATE = 18;
|
||||||
|
private static final int MAX_SOUND_COOLDOWN = 200;
|
||||||
|
private static final int MAX_AGGRO_RANGE = 35;
|
||||||
|
private static final int AGGRO_WATCHER_INDEX = 16;
|
||||||
|
|
||||||
|
private static final float WIDTH = 3f;
|
||||||
|
private static final float HEIGHT = 3f;
|
||||||
|
private static final float EYE_HEIGHT = HEIGHT / 2;
|
||||||
|
|
||||||
public float pitchLevel;
|
public float pitchLevel;
|
||||||
|
private short aggro = 0;
|
||||||
public float aggro = 0;
|
private int soundTime = 0;
|
||||||
private float soundTime = 0;
|
private final short aggroCap;
|
||||||
private byte textureState = 0;
|
|
||||||
|
|
||||||
private int aggroMax;
|
|
||||||
|
|
||||||
private static DDProperties properties = null;
|
private static DDProperties properties = null;
|
||||||
|
|
||||||
public MobMonolith(World par1World)
|
public MobMonolith(World world)
|
||||||
{
|
{
|
||||||
super(par1World);
|
super(world);
|
||||||
this.setSize(3F, 3F);
|
this.setSize(WIDTH, HEIGHT);
|
||||||
this.noClip=true;
|
this.noClip = true;
|
||||||
this.aggroMax = rand.nextInt(245)+200;
|
this.aggroCap = (short) MathHelper.getRandomIntegerInRange(this.rand, MIN_AGGRO_CAP, MAX_AGGRO_CAP);
|
||||||
if (properties == null)
|
if (properties == null)
|
||||||
properties = DDProperties.instance();
|
properties = DDProperties.instance();
|
||||||
}
|
}
|
||||||
@@ -60,16 +59,19 @@ public class MobMonolith extends EntityFlying implements IMob
|
|||||||
@Override
|
@Override
|
||||||
public boolean attackEntityFrom(DamageSource par1DamageSource, float par2)
|
public boolean attackEntityFrom(DamageSource par1DamageSource, float par2)
|
||||||
{
|
{
|
||||||
if (par1DamageSource == DamageSource.inWall)
|
if (par1DamageSource != DamageSource.inWall)
|
||||||
{
|
{
|
||||||
this.posY = posY + 1;
|
this.aggro = MAX_AGGRO;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this.aggro = this.aggroMax;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canBreatheUnderwater()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AxisAlignedBB getBoundingBox()
|
public AxisAlignedBB getBoundingBox()
|
||||||
{
|
{
|
||||||
@@ -92,7 +94,7 @@ public class MobMonolith extends EntityFlying implements IMob
|
|||||||
protected void applyEntityAttributes()
|
protected void applyEntityAttributes()
|
||||||
{
|
{
|
||||||
super.applyEntityAttributes();
|
super.applyEntityAttributes();
|
||||||
this.getAttributeMap().getAttributeInstance(SharedMonsterAttributes.maxHealth).setAttribute(10);
|
this.getAttributeMap().getAttributeInstance(SharedMonsterAttributes.maxHealth).setAttribute(57005);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -104,22 +106,15 @@ public class MobMonolith extends EntityFlying implements IMob
|
|||||||
@Override
|
@Override
|
||||||
public float getEyeHeight()
|
public float getEyeHeight()
|
||||||
{
|
{
|
||||||
return this.height +2F;
|
return EYE_HEIGHT;
|
||||||
}
|
|
||||||
|
|
||||||
public void setEntityPosition(Entity entity, double x, double y, double z)
|
|
||||||
{
|
|
||||||
entity.lastTickPosX = entity.prevPosX = entity.posX = x;
|
|
||||||
entity.lastTickPosY = entity.prevPosY = entity.posY = y + entity.yOffset;
|
|
||||||
entity.lastTickPosZ = entity.prevPosZ = entity.posZ = z;
|
|
||||||
entity.setPosition(x, y, z);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void entityInit()
|
protected void entityInit()
|
||||||
{
|
{
|
||||||
super.entityInit();
|
super.entityInit();
|
||||||
this.dataWatcher.addObject(16, Byte.valueOf((byte)0));
|
// Add a short for the aggro level
|
||||||
|
this.dataWatcher.addObject(AGGRO_WATCHER_INDEX, Short.valueOf((short) 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -131,73 +126,105 @@ public class MobMonolith extends EntityFlying implements IMob
|
|||||||
@Override
|
@Override
|
||||||
public void onEntityUpdate()
|
public void onEntityUpdate()
|
||||||
{
|
{
|
||||||
|
// Remove this Monolith if it's not in Limbo or in a pocket dimension
|
||||||
if (!(this.worldObj.provider instanceof LimboProvider || this.worldObj.provider instanceof PocketProvider))
|
if (!(this.worldObj.provider instanceof LimboProvider || this.worldObj.provider instanceof PocketProvider))
|
||||||
{
|
{
|
||||||
this.setDead();
|
this.setDead();
|
||||||
|
super.onEntityUpdate();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
super.onEntityUpdate();
|
super.onEntityUpdate();
|
||||||
|
|
||||||
EntityPlayer entityPlayer = this.worldObj.getClosestPlayerToEntity(this,MAX_AGGRO_RANGE);
|
// Check for players and update aggro levels even if there are no players in range
|
||||||
|
EntityPlayer player = this.worldObj.getClosestPlayerToEntity(this, MAX_AGGRO_RANGE);
|
||||||
|
boolean visibility = (player != null) ? player.canEntityBeSeen(this) : false;
|
||||||
|
this.updateAggroLevel(player, visibility);
|
||||||
|
|
||||||
//need to always manage aggro level, even if player is out of range.
|
// Change orientation and face a player if one is in range
|
||||||
this.setAggroLevel(entityPlayer);
|
if (player != null)
|
||||||
|
|
||||||
//these things only matter if the player is in range.
|
|
||||||
if (entityPlayer != null)
|
|
||||||
{
|
{
|
||||||
this.faceEntity(entityPlayer, 1, 1);
|
this.facePlayer(player);
|
||||||
this.playSounds(entityPlayer);
|
if (!this.worldObj.isRemote && !(this.worldObj.provider instanceof LimboProvider))
|
||||||
//teleport the player if the conditions are met
|
|
||||||
if (aggro >= MAX_AGGRO && !this.worldObj.isRemote && properties.MonolithTeleportationEnabled && !entityPlayer.capabilities.isCreativeMode)
|
|
||||||
{
|
{
|
||||||
Point4D destination = LimboProvider.getLimboSkySpawn(entityPlayer, properties);
|
// Play sounds on the server side, if the player isn't in Limbo.
|
||||||
DDTeleporter.teleportEntity(entityPlayer, destination, false);
|
// Limbo is excluded to avoid drowning out its background music.
|
||||||
this.aggro = 0;
|
// Also, since it's a large open area with many Monoliths, some
|
||||||
entityPlayer.worldObj.playSoundAtEntity(entityPlayer,mod_pocketDim.modid+":crack",13, 1);
|
// of the sounds that would usually play for a moment would
|
||||||
|
// keep playing constantly and would get very annoying.
|
||||||
|
this.playSounds(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (visibility)
|
||||||
|
{
|
||||||
|
// Only spawn particles on the client side and outside Limbo
|
||||||
|
if (this.worldObj.isRemote && !(this.worldObj.provider instanceof LimboProvider))
|
||||||
|
{
|
||||||
|
this.spawnParticles(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Teleport the target player if various conditions are met
|
||||||
|
if (aggro >= MAX_AGGRO && !this.worldObj.isRemote &&
|
||||||
|
properties.MonolithTeleportationEnabled && !player.capabilities.isCreativeMode &&
|
||||||
|
!(this.worldObj.provider instanceof LimboProvider))
|
||||||
|
{
|
||||||
|
this.aggro = 0;
|
||||||
|
Point4D destination = LimboProvider.getLimboSkySpawn(player, properties);
|
||||||
|
DDTeleporter.teleportEntity(player, destination, false);
|
||||||
|
player.worldObj.playSoundAtEntity(player, mod_pocketDim.modid + ":crack", 13, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setAggroLevel(EntityPlayer player)
|
private void updateAggroLevel(EntityPlayer player, boolean visibility)
|
||||||
{
|
{
|
||||||
//aggro constantly decreases at a rate that varies with the current amount of aggro.
|
// If we're working on the server side, adjust aggro level
|
||||||
if(aggro > 0)
|
// If we're working on the client side, retrieve aggro level from dataWatcher
|
||||||
|
if (!this.worldObj.isRemote)
|
||||||
{
|
{
|
||||||
this.aggro = this.aggro -(this.aggro/25);
|
// Server side...
|
||||||
}
|
// Rapidly increase the aggro level if this Monolith can see the player
|
||||||
if(player != null)
|
if (visibility)
|
||||||
{
|
|
||||||
//monoliths increase aggro slightly if the player is near, but slowly and to a cap.
|
|
||||||
float distance = this.getDistanceToEntity(player);
|
|
||||||
aggro+= 1.5-(distance/this.MAX_AGGRO_RANGE);
|
|
||||||
|
|
||||||
//rapidly increase aggro if the monolith has line of sight to the player.
|
|
||||||
if(player.canEntityBeSeen(this))
|
|
||||||
{
|
{
|
||||||
//prevent monoliths from teleporting the player in limbo
|
if (this.worldObj.provider instanceof LimboProvider)
|
||||||
if(this.worldObj.provider instanceof LimboProvider)
|
|
||||||
{
|
{
|
||||||
aggro+=1.5;
|
aggro++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.spawnParticles(player);
|
// Aggro increases faster outside of Limbo
|
||||||
aggro+=3;
|
aggro += 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (aggro > aggroCap)
|
||||||
|
{
|
||||||
|
// Decrease aggro over time
|
||||||
|
aggro--;
|
||||||
|
}
|
||||||
|
else if (player != null && (aggro < aggroCap))
|
||||||
|
{
|
||||||
|
// Increase aggro if a player is within range and aggro < aggroCap
|
||||||
|
aggro++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Clamp the aggro level
|
||||||
|
aggro = (short) MathHelper.clamp_int(aggro, 0, MAX_AGGRO);
|
||||||
|
this.dataWatcher.updateObject(AGGRO_WATCHER_INDEX, Short.valueOf(aggro));
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Client side...
|
||||||
|
aggro = this.dataWatcher.getWatchableObjectShort(AGGRO_WATCHER_INDEX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//convert the aggro counter to one of the texture states, and set it.
|
public int getTextureState()
|
||||||
this.textureState = (byte) ((this.TEXTURE_STATES/this.MAX_AGGRO)*this.aggro);
|
{
|
||||||
if(this.textureState>TEXTURE_STATES)
|
// Determine texture state from aggro progress
|
||||||
{
|
return MathHelper.clamp_int(MAX_TEXTURE_STATE * aggro / MAX_AGGRO, 0, MAX_TEXTURE_STATE);
|
||||||
textureState = TEXTURE_STATES;
|
|
||||||
}
|
|
||||||
if (!this.worldObj.isRemote)
|
|
||||||
{
|
|
||||||
this.dataWatcher.updateObject(16, Byte.valueOf(this.textureState));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -206,28 +233,29 @@ public class MobMonolith extends EntityFlying implements IMob
|
|||||||
*/
|
*/
|
||||||
private void playSounds(EntityPlayer entityPlayer)
|
private void playSounds(EntityPlayer entityPlayer)
|
||||||
{
|
{
|
||||||
float aggroPercent = (aggro/MAX_AGGRO);
|
float aggroPercent = this.getAggroProgress();
|
||||||
if(this.soundTime<=0)
|
if (this.soundTime <= 0)
|
||||||
{
|
{
|
||||||
this.playSound(mod_pocketDim.modid+":monk", 1F, 1F);
|
this.playSound(mod_pocketDim.modid + ":monk", 1F, 1F);
|
||||||
this.soundTime=100;
|
this.soundTime = 100;
|
||||||
}
|
}
|
||||||
if ((aggroPercent>.70)&&this.soundTime<100)
|
if ((aggroPercent > 0.70) && this.soundTime < 100)
|
||||||
{
|
{
|
||||||
this.worldObj.playSoundEffect(entityPlayer.posX, entityPlayer.posY, entityPlayer.posZ,mod_pocketDim.modid+":tearing",1F, (float) (1+this.rand.nextGaussian()));
|
this.worldObj.playSoundEffect(entityPlayer.posX, entityPlayer.posY, entityPlayer.posZ, mod_pocketDim.modid + ":tearing", 1F, (float) (1 + this.rand.nextGaussian()));
|
||||||
this.soundTime=100+this.rand.nextInt(75);
|
this.soundTime = 100 + this.rand.nextInt(75);
|
||||||
}
|
}
|
||||||
if ((aggroPercent>.90)&&this.soundTime<200)
|
if ((aggroPercent > 0.80) && this.soundTime < 200)
|
||||||
{
|
{
|
||||||
this.worldObj.playSoundEffect(entityPlayer.posX, entityPlayer.posY, entityPlayer.posZ,mod_pocketDim.modid+":tearing",7, 1F);
|
this.worldObj.playSoundEffect(entityPlayer.posX, entityPlayer.posY, entityPlayer.posZ, mod_pocketDim.modid + ":tearing", 7, 1F);
|
||||||
this.soundTime=250;
|
this.soundTime = 250;
|
||||||
}
|
}
|
||||||
this.soundTime--;
|
this.soundTime--;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void spawnParticles(EntityPlayer player)
|
private void spawnParticles(EntityPlayer player)
|
||||||
{
|
{
|
||||||
for (int i = 1; i < (10*(aggro/MAX_AGGRO)); ++i)
|
int count = 10 * aggro / MAX_AGGRO;
|
||||||
|
for (int i = 1; i < count; ++i)
|
||||||
{
|
{
|
||||||
player.worldObj.spawnParticle("portal", player.posX + (this.rand.nextDouble() - 0.5D) * this.width,
|
player.worldObj.spawnParticle("portal", player.posX + (this.rand.nextDouble() - 0.5D) * this.width,
|
||||||
player.posY + this.rand.nextDouble() * player.height - 0.75D,
|
player.posY + this.rand.nextDouble() * player.height - 0.75D,
|
||||||
@@ -237,43 +265,38 @@ public class MobMonolith extends EntityFlying implements IMob
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public float getAggroProgress()
|
||||||
public void faceEntity(Entity par1Entity, float par2, float par3)
|
|
||||||
{
|
{
|
||||||
double d0 = par1Entity.posX - this.posX;
|
return ((float) aggro) / MAX_AGGRO;
|
||||||
double d1 = par1Entity.posZ - this.posZ;
|
}
|
||||||
double d2 = (par1Entity.posY + par1Entity.getEyeHeight()) - (this.posY +this.getEyeHeight());
|
|
||||||
|
private void facePlayer(EntityPlayer player)
|
||||||
|
{
|
||||||
|
double d0 = player.posX - this.posX;
|
||||||
|
double d1 = player.posZ - this.posZ;
|
||||||
|
double d2 = (player.posY + player.getEyeHeight()) - (this.posY + this.getEyeHeight());
|
||||||
double d3 = MathHelper.sqrt_double(d0 * d0 + d1 * d1);
|
double d3 = MathHelper.sqrt_double(d0 * d0 + d1 * d1);
|
||||||
float f2 = (float)(Math.atan2(d1, d0) * 180.0D / Math.PI) - 90.0F;
|
float f2 = (float)(Math.atan2(d1, d0) * 180.0D / Math.PI) - 90.0F;
|
||||||
this.pitchLevel = (float)-((Math.atan(d2/d3) )* 180.0D / Math.PI);
|
this.pitchLevel = (float) -((Math.atan(d2/d3) )* 180.0D / Math.PI);
|
||||||
|
|
||||||
this.rotationYaw = f2;
|
this.rotationYaw = f2;
|
||||||
this.rotationYawHead=f2;
|
this.rotationYawHead = f2;
|
||||||
this.renderYawOffset=this.rotationYaw;
|
this.renderYawOffset = this.rotationYaw;
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
|
|
||||||
{
|
|
||||||
super.writeEntityToNBT(par1NBTTagCompound);
|
|
||||||
par1NBTTagCompound.setFloat("soundTime", this.soundTime);
|
|
||||||
par1NBTTagCompound.setFloat("aggro", this.aggro);
|
|
||||||
par1NBTTagCompound.setInteger("aggroMax", this.aggroMax);
|
|
||||||
par1NBTTagCompound.setByte("textureState", this.textureState);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
|
public void writeEntityToNBT(NBTTagCompound rootTag)
|
||||||
{
|
{
|
||||||
super.readEntityFromNBT(par1NBTTagCompound);
|
super.writeEntityToNBT(rootTag);
|
||||||
this.soundTime = par1NBTTagCompound.getFloat("soundTime");
|
rootTag.setInteger("Aggro", this.aggro);
|
||||||
|
}
|
||||||
|
|
||||||
//make them load with half aggro so they dont instantly teleport players
|
@Override
|
||||||
this.aggro = par1NBTTagCompound.getFloat("aggro")/2;
|
public void readEntityFromNBT(NBTTagCompound rootTag)
|
||||||
this.aggroMax = par1NBTTagCompound.getInteger("aggroMax");
|
{
|
||||||
this.textureState = par1NBTTagCompound.getByte("textureState");
|
super.readEntityFromNBT(rootTag);
|
||||||
|
|
||||||
|
// Load Monoliths with half aggro so they don't teleport players instantly
|
||||||
|
this.aggro = (short) (rootTag.getInteger("Aggro") / 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -282,7 +305,7 @@ public class MobMonolith extends EntityFlying implements IMob
|
|||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, AxisAlignedBB.getBoundingBox( this.posX-15, posY-4, this.posZ-15, this.posX+15, this.posY+15, this.posZ+15));
|
List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, AxisAlignedBB.getBoundingBox( this.posX-15, posY-4, this.posZ-15, this.posX+15, this.posY+15, this.posZ+15));
|
||||||
|
|
||||||
if(this.worldObj.provider.dimensionId==DDProperties.instance().LimboDimensionID)
|
if (this.worldObj.provider.dimensionId == DDProperties.instance().LimboDimensionID)
|
||||||
{
|
{
|
||||||
if(list.size()>0)
|
if(list.size()>0)
|
||||||
{
|
{
|
||||||
@@ -302,9 +325,4 @@ public class MobMonolith extends EntityFlying implements IMob
|
|||||||
this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty() &&
|
this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty() &&
|
||||||
!this.worldObj.isAnyLiquid(this.boundingBox);
|
!this.worldObj.isAnyLiquid(this.boundingBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
public DataWatcher getDataWatcher()
|
|
||||||
{
|
|
||||||
return this.dataWatcher;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,56 +1,121 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.ticking;
|
package StevenDimDoors.mod_pocketDim.ticking;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.PriorityQueue;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
|
import net.minecraft.util.MathHelper;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.common.DimensionManager;
|
import net.minecraftforge.common.DimensionManager;
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.blocks.BlockRift;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
|
|
||||||
public class RiftRegenerator implements IRegularTickReceiver {
|
public class RiftRegenerator implements IRegularTickReceiver {
|
||||||
|
|
||||||
private static final int RIFT_REGENERATION_INTERVAL = 200; //Regenerate random rifts every 200 ticks
|
// Ranges of regeneration delays, in seconds
|
||||||
private static final int RIFTS_REGENERATED_PER_DIMENSION = 5;
|
private static final int MIN_FAST_DELAY = 1;
|
||||||
|
private static final int MAX_FAST_DELAY = 3;
|
||||||
|
private static final int MIN_SLOW_DELAY = 5;
|
||||||
|
private static final int MAX_SLOW_DELAY = 15;
|
||||||
|
private static final int MIN_RESCHEDULE_DELAY = 4 * 60;
|
||||||
|
private static final int MAX_RESCHEDULE_DELAY = 6 * 60;
|
||||||
|
|
||||||
|
private static final int TICKS_PER_SECOND = 20;
|
||||||
|
private static final int RIFT_REGENERATION_INTERVAL = 1; // Check the regeneration queue every tick
|
||||||
private static Random random = new Random();
|
private static Random random = new Random();
|
||||||
|
|
||||||
public RiftRegenerator(IRegularTickSender sender)
|
private long tickCount = 0;
|
||||||
|
private PriorityQueue<RiftTicket> ticketQueue;
|
||||||
|
private BlockRift blockRift;
|
||||||
|
|
||||||
|
public RiftRegenerator(IRegularTickSender sender, BlockRift blockRift)
|
||||||
{
|
{
|
||||||
sender.registerForTicking(this, RIFT_REGENERATION_INTERVAL, false);
|
this.ticketQueue = new PriorityQueue<RiftTicket>();
|
||||||
|
this.blockRift = blockRift;
|
||||||
|
sender.registerReceiver(this, RIFT_REGENERATION_INTERVAL, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void notifyTick()
|
public void notifyTick()
|
||||||
{
|
{
|
||||||
regenerateRiftsInLoadedWorlds();
|
processTicketQueue();
|
||||||
|
tickCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void regenerateRiftsInLoadedWorlds()
|
public void scheduleSlowRegeneration(DimLink link)
|
||||||
{
|
{
|
||||||
// Regenerate rifts that have been replaced (not permanently removed) by players
|
scheduleRegeneration(link, MIN_SLOW_DELAY, MAX_SLOW_DELAY);
|
||||||
// Only do this in dimensions that are currently loaded
|
|
||||||
List<Integer> loadedWorlds = (List<Integer>) Arrays.asList(DimensionManager.getIDs());
|
|
||||||
for (Integer dimensionID : loadedWorlds)
|
|
||||||
{
|
|
||||||
NewDimData dimension = PocketManager.getDimensionData(dimensionID);
|
|
||||||
if (dimension.linkCount() > 0)
|
|
||||||
{
|
|
||||||
World world = DimensionManager.getWorld(dimension.id());
|
|
||||||
|
|
||||||
if (world != null)
|
|
||||||
{
|
|
||||||
for (int count = 0; count < RIFTS_REGENERATED_PER_DIMENSION; count++)
|
|
||||||
{
|
|
||||||
DimLink link = dimension.getRandomLink();
|
|
||||||
Point4D source = link.source();
|
|
||||||
mod_pocketDim.blockRift.regenerateRift(world, source.getX(), source.getY(), source.getZ(), random);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void scheduleSlowRegeneration(int x, int y, int z, World world)
|
||||||
|
{
|
||||||
|
scheduleRegeneration(PocketManager.getLink(x, y, z, world), MIN_SLOW_DELAY, MAX_SLOW_DELAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void scheduleFastRegeneration(int x, int y, int z, World world)
|
||||||
|
{
|
||||||
|
scheduleRegeneration(PocketManager.getLink(x, y, z, world), MIN_FAST_DELAY, MAX_FAST_DELAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void scheduleRegeneration(DimLink link, int minDelay, int maxDelay)
|
||||||
|
{
|
||||||
|
if (link != null)
|
||||||
|
{
|
||||||
|
int tickDelay = MathHelper.getRandomIntegerInRange(random, minDelay * TICKS_PER_SECOND, maxDelay * TICKS_PER_SECOND);
|
||||||
|
ticketQueue.add(new RiftTicket(link.source(), tickCount + tickDelay));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processTicketQueue()
|
||||||
|
{
|
||||||
|
RiftTicket ticket;
|
||||||
|
while (!ticketQueue.isEmpty() && ticketQueue.peek().timestamp() <= tickCount)
|
||||||
|
{
|
||||||
|
ticket = ticketQueue.remove();
|
||||||
|
regenerateRift(ticket.location());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void regenerateRift(Point4D location)
|
||||||
|
{
|
||||||
|
int x = location.getX();
|
||||||
|
int y = location.getY();
|
||||||
|
int z = location.getZ();
|
||||||
|
|
||||||
|
// Try to regenerate a rift, or possibly reschedule its regeneration.
|
||||||
|
// The world for the given location must be loaded.
|
||||||
|
World world = DimensionManager.getWorld(location.getDimension());
|
||||||
|
if (world == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// There must be a link at the given location.
|
||||||
|
DimLink link = PocketManager.getLink(location);
|
||||||
|
if (link == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// The chunk at the given location must be loaded.
|
||||||
|
// Note: ChunkProviderServer.chunkExists() returns whether a chunk is
|
||||||
|
// loaded, not whether it has already been created.
|
||||||
|
if (!world.getChunkProvider().chunkExists(x >> 4, z >> 4))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// If the location is occupied by an immune DD block, then don't regenerate.
|
||||||
|
if (blockRift.isModBlockImmune(world, x, y, z))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// If the location is occupied by an immune block, then reschedule.
|
||||||
|
if (blockRift.isBlockImmune(world, x, y, z))
|
||||||
|
{
|
||||||
|
scheduleRegeneration(link, MIN_RESCHEDULE_DELAY, MAX_RESCHEDULE_DELAY);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// All of the necessary conditions have been met. Restore the rift!
|
||||||
|
int blockID = world.getBlockId(x, y, z);
|
||||||
|
if (world.setBlock(x, y, z, blockRift.blockID))
|
||||||
|
blockRift.dropWorldThread(blockID, world, x, y, z, random);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package StevenDimDoors.mod_pocketDim.ticking;
|
||||||
|
|
||||||
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
|
|
||||||
|
public class RiftTicket implements Comparable<RiftTicket> {
|
||||||
|
|
||||||
|
private long timestamp;
|
||||||
|
private Point4D location;
|
||||||
|
|
||||||
|
public RiftTicket(Point4D location, long timestamp)
|
||||||
|
{
|
||||||
|
this.timestamp = timestamp;
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(RiftTicket other)
|
||||||
|
{
|
||||||
|
if (this.timestamp < other.timestamp)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else if (this.timestamp > other.timestamp)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long timestamp()
|
||||||
|
{
|
||||||
|
return timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Point4D location()
|
||||||
|
{
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -7,26 +7,31 @@ import StevenDimDoors.mod_pocketDim.core.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;
|
||||||
|
|
||||||
public class CommonTickHandler implements ITickHandler, IRegularTickSender
|
public class ServerTickHandler implements ITickHandler, IRegularTickSender
|
||||||
{
|
{
|
||||||
private static final String PROFILING_LABEL = "Dimensional Doors: Common Tick";
|
private static final String PROFILING_LABEL = "Dimensional Doors: Server Tick";
|
||||||
|
|
||||||
private int tickCount = 0;
|
private int tickCount = 0;
|
||||||
private ArrayList<RegularTickReceiverInfo> receivers;
|
private ArrayList<RegularTickReceiverInfo> receivers;
|
||||||
|
|
||||||
|
public ServerTickHandler()
|
||||||
public CommonTickHandler()
|
|
||||||
{
|
{
|
||||||
this.receivers = new ArrayList<RegularTickReceiverInfo>();
|
this.receivers = new ArrayList<RegularTickReceiverInfo>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerForTicking(IRegularTickReceiver receiver, int interval, boolean onTickStart)
|
public void registerReceiver(IRegularTickReceiver receiver, int interval, boolean onTickStart)
|
||||||
{
|
{
|
||||||
RegularTickReceiverInfo info = new RegularTickReceiverInfo(receiver, interval, onTickStart);
|
RegularTickReceiverInfo info = new RegularTickReceiverInfo(receiver, interval, onTickStart);
|
||||||
receivers.add(info);
|
receivers.add(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unregisterReceivers()
|
||||||
|
{
|
||||||
|
receivers.clear();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void tickStart(EnumSet<TickType> type, Object... tickData)
|
public void tickStart(EnumSet<TickType> type, Object... tickData)
|
||||||
{
|
{
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package StevenDimDoors.mod_pocketDim.tileentities;
|
||||||
|
import java.util.Random;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
|
||||||
|
public abstract class DDTileEntityBase extends TileEntity
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return an array of floats representing RGBA color where 1.0 = 255.
|
||||||
|
*/
|
||||||
|
public abstract float[] getRenderColor(Random rand);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,9 +1,15 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.tileentities;
|
package StevenDimDoors.mod_pocketDim.tileentities;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.network.packet.Packet;
|
||||||
import StevenDimDoors.mod_pocketDim.ServerPacketHandler;
|
import StevenDimDoors.mod_pocketDim.ServerPacketHandler;
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.blocks.IDimDoor;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
|
|
||||||
|
import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.network.packet.Packet;
|
import net.minecraft.network.packet.Packet;
|
||||||
@@ -11,47 +17,33 @@ import net.minecraft.network.packet.Packet130UpdateSign;
|
|||||||
import net.minecraft.network.packet.Packet250CustomPayload;
|
import net.minecraft.network.packet.Packet250CustomPayload;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
|
||||||
public class TileEntityDimDoor extends TileEntity
|
|
||||||
|
|
||||||
|
public class TileEntityDimDoor extends DDTileEntityBase
|
||||||
{
|
{
|
||||||
public boolean openOrClosed;
|
public boolean openOrClosed;
|
||||||
public int orientation;
|
public int orientation;
|
||||||
public boolean hasExit;
|
public boolean hasExit;
|
||||||
|
public byte lockStatus;
|
||||||
public boolean isDungeonChainLink;
|
public boolean isDungeonChainLink;
|
||||||
public boolean hasGennedPair=false;
|
public boolean hasGennedPair=false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canUpdate()
|
public boolean canUpdate()
|
||||||
{
|
{
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateEntity()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@Override
|
@Override
|
||||||
public Packet getDescriptionPacket()
|
public Packet getDescriptionPacket()
|
||||||
{
|
{
|
||||||
if(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj)!=null)
|
if(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj)!=null)
|
||||||
{
|
{
|
||||||
return ServerPacketHandler.createLinkPacket(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj).link());
|
return ServerPacketHandler.createLinkPacket(new ClientLinkData(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj)));
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void invalidate()
|
|
||||||
{
|
|
||||||
this.tileEntityInvalid = true;
|
|
||||||
|
|
||||||
if(this.worldObj.getBlockId(xCoord, yCoord, zCoord)==0&&!this.worldObj.isRemote)
|
|
||||||
{
|
|
||||||
if(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj)!=null)
|
|
||||||
{
|
|
||||||
mod_pocketDim.instance.fastRiftRegenerator.registerRiftForRegen(xCoord, yCoord, zCoord, this.worldObj.provider.dimensionId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void readFromNBT(NBTTagCompound nbt)
|
public void readFromNBT(NBTTagCompound nbt)
|
||||||
{
|
{
|
||||||
@@ -83,5 +75,22 @@ public class TileEntityDimDoor extends TileEntity
|
|||||||
nbt.setBoolean("hasGennedPair", hasGennedPair);
|
nbt.setBoolean("hasGennedPair", hasGennedPair);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float[] getRenderColor(Random rand)
|
||||||
|
{
|
||||||
|
float[] rgbaColor = {1,1,1,1};
|
||||||
|
if (this.worldObj.provider.dimensionId == mod_pocketDim.NETHER_DIMENSION_ID)
|
||||||
|
{
|
||||||
|
rgbaColor[0] = rand.nextFloat() * 0.5F + 0.4F;
|
||||||
|
rgbaColor[1] = rand.nextFloat() * 0.05F;
|
||||||
|
rgbaColor[2] = rand.nextFloat() * 0.05F;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rgbaColor[0] = rand.nextFloat() * 0.5F + 0.1F;
|
||||||
|
rgbaColor[1] = rand.nextFloat() * 0.4F + 0.4F;
|
||||||
|
rgbaColor[2] = rand.nextFloat() * 0.6F + 0.5F;
|
||||||
|
}
|
||||||
|
return rgbaColor;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,87 +1,95 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.tileentities;
|
package StevenDimDoors.mod_pocketDim.tileentities;
|
||||||
|
|
||||||
import net.minecraft.world.ChunkCoordIntPair;
|
|
||||||
import net.minecraftforge.common.ForgeChunkManager;
|
import net.minecraftforge.common.ForgeChunkManager;
|
||||||
import net.minecraftforge.common.ForgeChunkManager.Ticket;
|
import net.minecraftforge.common.ForgeChunkManager.Ticket;
|
||||||
import net.minecraftforge.common.ForgeChunkManager.Type;
|
|
||||||
import StevenDimDoors.mod_pocketDim.IChunkLoader;
|
import StevenDimDoors.mod_pocketDim.IChunkLoader;
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.helpers.ChunkLoaderHelper;
|
||||||
import StevenDimDoors.mod_pocketDim.world.PocketBuilder;
|
import StevenDimDoors.mod_pocketDim.world.PocketBuilder;
|
||||||
|
|
||||||
public class TileEntityDimDoorGold extends TileEntityDimDoor implements IChunkLoader
|
public class TileEntityDimDoorGold extends TileEntityDimDoor implements IChunkLoader
|
||||||
{
|
{
|
||||||
private Ticket chunkTicket;
|
private Ticket chunkTicket;
|
||||||
|
private boolean initialized = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canUpdate()
|
public boolean canUpdate()
|
||||||
{
|
{
|
||||||
return true;
|
return !initialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isInitialized()
|
||||||
|
{
|
||||||
|
return initialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateEntity()
|
public void updateEntity()
|
||||||
{ // every tick?
|
{
|
||||||
if (PocketManager.getDimensionData(this.worldObj) != null &&
|
if (!initialized)
|
||||||
PocketManager.getDimensionData(this.worldObj).isPocketDimension() &&
|
|
||||||
!this.worldObj.isRemote)
|
|
||||||
{
|
{
|
||||||
if(PocketManager.getLink(this.xCoord,this.yCoord,this.zCoord,this.worldObj)==null)
|
initialize(null);
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (this.chunkTicket == null)
|
|
||||||
{
|
|
||||||
chunkTicket = ForgeChunkManager.requestTicket(mod_pocketDim.instance, worldObj, Type.NORMAL);
|
|
||||||
if(chunkTicket == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
chunkTicket.getModData().setInteger("goldDimDoorX", xCoord);
|
|
||||||
chunkTicket.getModData().setInteger("goldDimDoorY", yCoord);
|
|
||||||
chunkTicket.getModData().setInteger("goldDimDoorZ", zCoord);
|
|
||||||
forceChunkLoading(chunkTicket,this.xCoord,this.zCoord);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void forceChunkLoading(Ticket chunkTicket,int x,int z)
|
public void initialize(Ticket ticket)
|
||||||
{
|
{
|
||||||
Point4D origin = PocketManager.getDimensionData(this.worldObj).origin();
|
initialized = true;
|
||||||
int orientation = PocketManager.getDimensionData(this.worldObj).orientation();
|
chunkTicket = ticket;
|
||||||
|
|
||||||
int xOffset=0;
|
// Only do anything if this function is running on the server side
|
||||||
int zOffset=0;
|
// NOTE: We don't have to check whether this block is the upper door
|
||||||
|
// block or the lower one because only one of them should have a
|
||||||
switch(orientation)
|
// link associated with it.
|
||||||
|
if (!worldObj.isRemote)
|
||||||
{
|
{
|
||||||
case 0:
|
NewDimData dimension = PocketManager.createDimensionData(worldObj);
|
||||||
xOffset = PocketBuilder.DEFAULT_POCKET_SIZE/2;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
zOffset = PocketBuilder.DEFAULT_POCKET_SIZE/2;
|
|
||||||
|
|
||||||
break;
|
// Check whether a ticket has already been assigned to this door
|
||||||
case 2:
|
if (chunkTicket == null)
|
||||||
xOffset = -PocketBuilder.DEFAULT_POCKET_SIZE/2;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
zOffset = -PocketBuilder.DEFAULT_POCKET_SIZE/2;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
for(int chunkX = -2; chunkX<3;chunkX++)
|
|
||||||
{
|
|
||||||
for(int chunkZ = -2; chunkZ<3;chunkZ++)
|
|
||||||
{
|
{
|
||||||
ForgeChunkManager.forceChunk(chunkTicket, new ChunkCoordIntPair((origin.getX()+xOffset >> 4)+chunkX, (origin.getZ()+zOffset >> 4)+chunkZ));
|
// No ticket yet.
|
||||||
|
// Check if this area should be loaded and request a new ticket.
|
||||||
|
if (isValidChunkLoaderSetup(dimension))
|
||||||
|
{
|
||||||
|
chunkTicket = ChunkLoaderHelper.createTicket(xCoord, yCoord, zCoord, worldObj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// A ticket has already been provided.
|
||||||
|
// Check if this area should be loaded. If not, release the ticket.
|
||||||
|
if (!isValidChunkLoaderSetup(dimension))
|
||||||
|
{
|
||||||
|
ForgeChunkManager.releaseTicket(chunkTicket);
|
||||||
|
chunkTicket = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If chunkTicket isn't null at this point, then this is a valid door setup.
|
||||||
|
// The last step is to request force loading of the pocket's chunks.
|
||||||
|
if (chunkTicket != null)
|
||||||
|
{
|
||||||
|
ChunkLoaderHelper.forcePocketChunks(dimension, chunkTicket);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isValidChunkLoaderSetup(NewDimData dimension)
|
||||||
|
{
|
||||||
|
// Check the various conditions that make this a valid door setup.
|
||||||
|
// 1. The door must be inside the pocket's XZ boundaries,
|
||||||
|
// to prevent loading of chunks with a distant door
|
||||||
|
// 2. The dimension must be a pocket dimension
|
||||||
|
// 3. The door must be linked so that it's clear that it's not a normal door
|
||||||
|
|
||||||
|
return (dimension.isPocketDimension() && dimension.getLink(xCoord, yCoord, zCoord) != null &&
|
||||||
|
PocketBuilder.calculateDefaultBounds(dimension).contains(xCoord, yCoord, zCoord));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void invalidate()
|
public void invalidate()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.tileentities;
|
package StevenDimDoors.mod_pocketDim.tileentities;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import cpw.mods.fml.common.FMLCommonHandler;
|
|
||||||
import cpw.mods.fml.common.network.PacketDispatcher;
|
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.entity.DataWatcher;
|
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.monster.EntityEnderman;
|
import net.minecraft.entity.monster.EntityEnderman;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
@@ -19,12 +10,7 @@ import net.minecraft.nbt.NBTTagCompound;
|
|||||||
import net.minecraft.network.INetworkManager;
|
import net.minecraft.network.INetworkManager;
|
||||||
import net.minecraft.network.packet.Packet;
|
import net.minecraft.network.packet.Packet;
|
||||||
import net.minecraft.network.packet.Packet132TileEntityData;
|
import net.minecraft.network.packet.Packet132TileEntityData;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
|
||||||
import net.minecraft.util.AxisAlignedBB;
|
import net.minecraft.util.AxisAlignedBB;
|
||||||
import net.minecraft.util.MathHelper;
|
|
||||||
import net.minecraft.util.MovingObjectPosition;
|
|
||||||
import net.minecraft.util.Vec3;
|
|
||||||
import net.minecraft.world.World;
|
|
||||||
import StevenDimDoors.mod_pocketDim.ServerPacketHandler;
|
import StevenDimDoors.mod_pocketDim.ServerPacketHandler;
|
||||||
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
@@ -32,8 +18,9 @@ import StevenDimDoors.mod_pocketDim.core.DimLink;
|
|||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
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.watcher.ClientLinkData;
|
||||||
|
|
||||||
public class TileEntityRift extends TileEntity
|
public class TileEntityRift extends DDTileEntityBase
|
||||||
{
|
{
|
||||||
private static final int RIFT_INTERACTION_RANGE = 5;
|
private static final int RIFT_INTERACTION_RANGE = 5;
|
||||||
private static final int MAX_ANCESTOR_LINKS = 2;
|
private static final int MAX_ANCESTOR_LINKS = 2;
|
||||||
@@ -44,121 +31,87 @@ public class TileEntityRift extends TileEntity
|
|||||||
private static final int MAX_RIFT_SPREAD_CHANCE = 256;
|
private static final int MAX_RIFT_SPREAD_CHANCE = 256;
|
||||||
private static final int HOSTILE_ENDERMAN_CHANCE = 1;
|
private static final int HOSTILE_ENDERMAN_CHANCE = 1;
|
||||||
private static final int MAX_HOSTILE_ENDERMAN_CHANCE = 3;
|
private static final int MAX_HOSTILE_ENDERMAN_CHANCE = 3;
|
||||||
|
private static final int UPDATE_PERIOD = 200;
|
||||||
|
private static final int CLOSING_PERIOD = 40;
|
||||||
|
|
||||||
private static Random random = new Random();
|
private static Random random = new Random();
|
||||||
|
|
||||||
private int age = 0;
|
private int updateTimer;
|
||||||
private int updateTimer = 0;
|
private int closeTimer = 0;
|
||||||
private int riftCloseTimer = 0;
|
|
||||||
public int xOffset = 0;
|
public int xOffset = 0;
|
||||||
public int yOffset = 0;
|
public int yOffset = 0;
|
||||||
public int zOffset = 0;
|
public int zOffset = 0;
|
||||||
public boolean shouldClose = false;
|
public boolean shouldClose = false;
|
||||||
private boolean hasUpdated = false;
|
public Point4D nearestRiftLocation = null;
|
||||||
|
|
||||||
public DimLink nearestRiftData;
|
|
||||||
public int spawnedEndermenID = 0;
|
public int spawnedEndermenID = 0;
|
||||||
public HashMap<Integer, double[]> renderingCenters = new HashMap<Integer, double[]>();
|
|
||||||
|
public TileEntityRift()
|
||||||
|
{
|
||||||
|
// Vary the update times of rifts to prevent all the rifts in a cluster
|
||||||
|
// from updating at the same time.
|
||||||
|
updateTimer = random.nextInt(UPDATE_PERIOD);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateEntity()
|
public void updateEntity()
|
||||||
{
|
{
|
||||||
//Determines if rift should render white closing particles and spread closing effect to other rifts nearby
|
if (PocketManager.getLink(xCoord, yCoord, zCoord, worldObj.provider.dimensionId) == null)
|
||||||
if (this.shouldClose)
|
|
||||||
{
|
{
|
||||||
closeRift();
|
|
||||||
}
|
|
||||||
else if( PocketManager.getLink(xCoord, yCoord, zCoord, worldObj.provider.dimensionId) == null)
|
|
||||||
{
|
|
||||||
this.invalidate();
|
|
||||||
if (worldObj.getBlockId(xCoord, yCoord, zCoord) == mod_pocketDim.blockRift.blockID)
|
if (worldObj.getBlockId(xCoord, yCoord, zCoord) == mod_pocketDim.blockRift.blockID)
|
||||||
{
|
{
|
||||||
worldObj.setBlockToAir(xCoord, yCoord, zCoord);
|
worldObj.setBlockToAir(xCoord, yCoord, zCoord);
|
||||||
worldObj.removeBlockTileEntity(xCoord, yCoord, zCoord);
|
|
||||||
this.invalidate();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (worldObj.getBlockId(xCoord, yCoord, zCoord) != mod_pocketDim.blockRift.blockID)
|
if (worldObj.getBlockId(xCoord, yCoord, zCoord) != mod_pocketDim.blockRift.blockID)
|
||||||
{
|
{
|
||||||
worldObj.removeBlockTileEntity(xCoord, yCoord, zCoord);
|
invalidate();
|
||||||
this.invalidate();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//The code for the new rift rendering hooks in here, as well as in the ClientProxy to bind the TESR to the rift.
|
// Check if this rift should render white closing particles and
|
||||||
//It is inactive for now.
|
// spread the closing effect to other rifts nearby.
|
||||||
/**
|
if (shouldClose)
|
||||||
if(rand.nextInt(15) == 1)
|
|
||||||
{
|
|
||||||
age = age + 1;
|
|
||||||
this.calculateNextRenderQuad(age, rand);
|
|
||||||
}
|
|
||||||
this.clearBlocksOnRift();
|
|
||||||
**/
|
|
||||||
|
|
||||||
//This code should execute once every 10 seconds
|
|
||||||
if (updateTimer > 200)
|
|
||||||
{
|
{
|
||||||
this.spawnEndermen();
|
closeRift();
|
||||||
this.grow(mod_pocketDim.properties);
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (updateTimer >= UPDATE_PERIOD)
|
||||||
|
{
|
||||||
|
spawnEndermen(mod_pocketDim.properties);
|
||||||
updateTimer = 0;
|
updateTimer = 0;
|
||||||
}
|
}
|
||||||
else if(updateTimer==0)
|
else if (updateTimer == UPDATE_PERIOD / 2)
|
||||||
{
|
{
|
||||||
this.calculateOldParticleOffset(); //this also calculates the distance for the particle stuff.
|
updateNearestRift();
|
||||||
|
spread(mod_pocketDim.properties);
|
||||||
}
|
}
|
||||||
updateTimer++;
|
updateTimer++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private void spawnEndermen(DDProperties properties)
|
||||||
public boolean canUpdate()
|
|
||||||
{
|
{
|
||||||
return true;
|
if (worldObj.isRemote || !properties.RiftsSpawnEndermenEnabled)
|
||||||
}
|
|
||||||
|
|
||||||
private void clearBlocksOnRift()
|
|
||||||
{
|
|
||||||
//clears blocks for the new rending effect
|
|
||||||
for (double[] coord : this.renderingCenters.values())
|
|
||||||
{
|
|
||||||
int x = MathHelper.floor_double(coord[0] + 0.5);
|
|
||||||
int y = MathHelper.floor_double(coord[1] + 0.5);
|
|
||||||
int z = MathHelper.floor_double(coord[2] + 0.5);
|
|
||||||
|
|
||||||
// Right side
|
|
||||||
if (!mod_pocketDim.blockRift.isBlockImmune(worldObj, this.xCoord + x, this.yCoord + y, this.zCoord + z))
|
|
||||||
{
|
|
||||||
worldObj.setBlockToAir(this.xCoord + x, this.yCoord + y, this.zCoord + z);
|
|
||||||
}
|
|
||||||
// Left side
|
|
||||||
if (!mod_pocketDim.blockRift.isBlockImmune(worldObj, this.xCoord - x, this.yCoord - y, this.zCoord - z))
|
|
||||||
{
|
|
||||||
worldObj.setBlockToAir(this.xCoord - x, this.yCoord - y, this.zCoord - z);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void spawnEndermen()
|
|
||||||
{
|
|
||||||
if (worldObj.isRemote)
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
NewDimData dimension = PocketManager.getDimensionData(worldObj);
|
// Ensure that this rift is only spawning one Enderman at a time, to prevent hordes of Endermen
|
||||||
|
|
||||||
//Ensure that this rift is only spawning one enderman at a time, to prevent hordes of endermen
|
|
||||||
Entity entity = worldObj.getEntityByID(this.spawnedEndermenID);
|
Entity entity = worldObj.getEntityByID(this.spawnedEndermenID);
|
||||||
if (entity != null && entity instanceof EntityEnderman)
|
if (entity != null && entity instanceof EntityEnderman)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//enderman will only spawn in groups of rifts
|
|
||||||
if (random.nextInt(MAX_ENDERMAN_SPAWNING_CHANCE) < ENDERMAN_SPAWNING_CHANCE)
|
if (random.nextInt(MAX_ENDERMAN_SPAWNING_CHANCE) < ENDERMAN_SPAWNING_CHANCE)
|
||||||
{
|
{
|
||||||
|
// Endermen will only spawn from groups of rifts
|
||||||
if (updateNearestRift())
|
if (updateNearestRift())
|
||||||
{
|
{
|
||||||
List<Entity> list = worldObj.getEntitiesWithinAABB(EntityEnderman.class,
|
List<Entity> list = worldObj.getEntitiesWithinAABB(EntityEnderman.class,
|
||||||
@@ -183,122 +136,69 @@ public class TileEntityRift extends TileEntity
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean updateNearestRift()
|
|
||||||
{
|
|
||||||
nearestRiftData = PocketManager.getDimensionData(worldObj).findNearestRift(this.worldObj, 5, xCoord, yCoord, zCoord);
|
|
||||||
return (nearestRiftData != null);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void closeRift()
|
private void closeRift()
|
||||||
{
|
{
|
||||||
NewDimData dimension = PocketManager.getDimensionData(worldObj);
|
NewDimData dimension = PocketManager.createDimensionData(worldObj);
|
||||||
if (riftCloseTimer == 20)
|
if (closeTimer == CLOSING_PERIOD / 2)
|
||||||
{
|
{
|
||||||
ArrayList<DimLink> rifts= dimension.findRiftsInRange(worldObj, 6, xCoord, yCoord, zCoord);
|
for (DimLink riftLink : dimension.findRiftsInRange(worldObj, 6, xCoord, yCoord, zCoord))
|
||||||
if (rifts.size()>0)
|
|
||||||
{
|
{
|
||||||
for(DimLink riftToClose : rifts)
|
Point4D location = riftLink.source();
|
||||||
|
TileEntityRift rift = (TileEntityRift) worldObj.getBlockTileEntity(location.getX(), location.getY(), location.getZ());
|
||||||
|
if (rift != null && !rift.shouldClose)
|
||||||
{
|
{
|
||||||
Point4D location = riftToClose.source();
|
rift.shouldClose = true;
|
||||||
TileEntityRift rift = (TileEntityRift) worldObj.getBlockTileEntity(location.getX(), location.getY(), location.getZ());
|
rift.onInventoryChanged();
|
||||||
if (rift != null)
|
|
||||||
{
|
|
||||||
rift.shouldClose = true;
|
|
||||||
rift.onInventoryChanged();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (riftCloseTimer > 40)
|
if (closeTimer >= CLOSING_PERIOD && !worldObj.isRemote)
|
||||||
{
|
{
|
||||||
this.invalidate();
|
DimLink link = PocketManager.getLink(this.xCoord, this.yCoord, this.zCoord, worldObj);
|
||||||
if(!this.worldObj.isRemote)
|
if (link != null)
|
||||||
{
|
{
|
||||||
DimLink link = PocketManager.getLink(this.xCoord, this.yCoord, this.zCoord, worldObj);
|
dimension.deleteLink(link);
|
||||||
if(link!=null)
|
|
||||||
{
|
|
||||||
dimension.deleteLink(link);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
worldObj.setBlockToAir(xCoord, yCoord, zCoord);
|
worldObj.setBlockToAir(xCoord, yCoord, zCoord);
|
||||||
worldObj.playSound(xCoord, yCoord, zCoord, "mods.DimDoors.sfx.riftClose", (float) .7, 1, true);
|
worldObj.playSound(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "mods.DimDoors.sfx.riftClose", 0.7f, 1, false);
|
||||||
this.worldObj.removeBlockTileEntity(xCoord, yCoord, zCoord);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
riftCloseTimer++;
|
closeTimer++;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void calculateOldParticleOffset()
|
public boolean updateNearestRift()
|
||||||
{
|
{
|
||||||
updateNearestRift();
|
Point4D previousNearest = nearestRiftLocation;
|
||||||
if (nearestRiftData != null)
|
DimLink nearestRiftLink = PocketManager.createDimensionData(worldObj).findNearestRift(
|
||||||
|
worldObj, RIFT_INTERACTION_RANGE, xCoord, yCoord, zCoord);
|
||||||
|
|
||||||
|
nearestRiftLocation = (nearestRiftLink == null) ? null : nearestRiftLink.source();
|
||||||
|
|
||||||
|
// If the nearest rift location changed, then update particle offsets
|
||||||
|
if (previousNearest != nearestRiftLocation &&
|
||||||
|
(previousNearest == null || nearestRiftLocation == null || !previousNearest.equals(nearestRiftLocation)))
|
||||||
{
|
{
|
||||||
Point4D location = nearestRiftData.source();
|
updateParticleOffsets();
|
||||||
this.xOffset = this.xCoord - location.getX();
|
}
|
||||||
this.yOffset = this.yCoord - location.getY();
|
return (nearestRiftLocation != null);
|
||||||
this.zOffset = this.zCoord - location.getZ();
|
}
|
||||||
int distance = Math.abs(xOffset) + Math.abs(yOffset) + Math.abs(zOffset);
|
|
||||||
|
private void updateParticleOffsets()
|
||||||
|
{
|
||||||
|
if (nearestRiftLocation != null)
|
||||||
|
{
|
||||||
|
this.xOffset = this.xCoord - nearestRiftLocation.getX();
|
||||||
|
this.yOffset = this.yCoord - nearestRiftLocation.getY();
|
||||||
|
this.zOffset = this.zCoord - nearestRiftLocation.getZ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.xOffset=0;
|
this.xOffset = 0;
|
||||||
this.yOffset=0;
|
this.yOffset = 0;
|
||||||
this.xOffset=0;
|
this.xOffset = 0;
|
||||||
}
|
}
|
||||||
this.onInventoryChanged();
|
this.onInventoryChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void calculateNextRenderQuad(float age, Random rand)
|
|
||||||
{
|
|
||||||
int maxSize = MathHelper.floor_double((Math.log(Math.pow(age+1,2))));
|
|
||||||
int iteration=0;
|
|
||||||
while(iteration< maxSize)
|
|
||||||
{
|
|
||||||
iteration++;
|
|
||||||
double fl =Math.log(iteration+1)/(iteration);
|
|
||||||
double[] coords= new double[4];
|
|
||||||
double noise = ((rand.nextGaussian())/(2+iteration/3+1));
|
|
||||||
|
|
||||||
if(!this.renderingCenters.containsKey(iteration-1))
|
|
||||||
{
|
|
||||||
if (rand.nextBoolean())
|
|
||||||
{
|
|
||||||
coords[0] = fl*1.5;
|
|
||||||
coords[1] = rand.nextGaussian()/5;
|
|
||||||
coords[2] = 0;
|
|
||||||
coords[3] = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
coords[0] = 0;
|
|
||||||
coords[1] = rand.nextGaussian()/5;
|
|
||||||
coords[2] = fl*1.5;
|
|
||||||
coords[3] = 0;
|
|
||||||
}
|
|
||||||
this.renderingCenters.put(iteration-1,coords);
|
|
||||||
iteration--;
|
|
||||||
}
|
|
||||||
else if(!this.renderingCenters.containsKey(iteration))
|
|
||||||
{
|
|
||||||
if(this.renderingCenters.get(iteration-1)[3]==0)
|
|
||||||
{
|
|
||||||
coords[0]=noise/2+this.renderingCenters.get(iteration-1)[0];
|
|
||||||
coords[1]=noise/2+this.renderingCenters.get(iteration-1)[1];
|
|
||||||
coords[2]= this.renderingCenters.get(iteration-1)[2]+fl;
|
|
||||||
coords[3] = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
coords[0]=this.renderingCenters.get(iteration-1)[0]+fl;
|
|
||||||
coords[1]=noise/2+this.renderingCenters.get(iteration-1)[1];
|
|
||||||
coords[2]=noise/2+this.renderingCenters.get(iteration-1)[2];
|
|
||||||
coords[3] = 1;
|
|
||||||
}
|
|
||||||
this.renderingCenters.put(iteration,coords);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean shouldRenderInPass(int pass)
|
public boolean shouldRenderInPass(int pass)
|
||||||
{
|
{
|
||||||
@@ -311,13 +211,10 @@ public class TileEntityRift extends TileEntity
|
|||||||
{
|
{
|
||||||
return countAncestorLinks(link.parent()) + 1;
|
return countAncestorLinks(link.parent()) + 1;
|
||||||
}
|
}
|
||||||
else
|
return 0;
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void grow(DDProperties properties)
|
public void spread(DDProperties properties)
|
||||||
{
|
{
|
||||||
if (worldObj.isRemote || !properties.RiftSpreadEnabled
|
if (worldObj.isRemote || !properties.RiftSpreadEnabled
|
||||||
|| random.nextInt(MAX_RIFT_SPREAD_CHANCE) < RIFT_SPREAD_CHANCE || this.shouldClose)
|
|| random.nextInt(MAX_RIFT_SPREAD_CHANCE) < RIFT_SPREAD_CHANCE || this.shouldClose)
|
||||||
@@ -325,7 +222,7 @@ public class TileEntityRift extends TileEntity
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
NewDimData dimension = PocketManager.getDimensionData(worldObj);
|
NewDimData dimension = PocketManager.createDimensionData(worldObj);
|
||||||
DimLink link = dimension.getLink(xCoord, yCoord, zCoord);
|
DimLink link = dimension.getLink(xCoord, yCoord, zCoord);
|
||||||
|
|
||||||
if (link.childCount() >= MAX_CHILD_LINKS || countAncestorLinks(link) >= MAX_ANCESTOR_LINKS)
|
if (link.childCount() >= MAX_CHILD_LINKS || countAncestorLinks(link) >= MAX_ANCESTOR_LINKS)
|
||||||
@@ -348,13 +245,10 @@ public class TileEntityRift extends TileEntity
|
|||||||
public void readFromNBT(NBTTagCompound nbt)
|
public void readFromNBT(NBTTagCompound nbt)
|
||||||
{
|
{
|
||||||
super.readFromNBT(nbt);
|
super.readFromNBT(nbt);
|
||||||
this.renderingCenters = new HashMap<Integer, double[]>();
|
this.updateTimer = nbt.getInteger("updateTimer");
|
||||||
this.updateTimer = nbt.getInteger("count");
|
|
||||||
this.riftCloseTimer = nbt.getInteger("count2");
|
|
||||||
this.xOffset = nbt.getInteger("xOffset");
|
this.xOffset = nbt.getInteger("xOffset");
|
||||||
this.yOffset = nbt.getInteger("yOffset");
|
this.yOffset = nbt.getInteger("yOffset");
|
||||||
this.zOffset = nbt.getInteger("zOffset");
|
this.zOffset = nbt.getInteger("zOffset");
|
||||||
this.age = nbt.getInteger("age");
|
|
||||||
this.shouldClose = nbt.getBoolean("shouldClose");
|
this.shouldClose = nbt.getBoolean("shouldClose");
|
||||||
this.spawnedEndermenID = nbt.getInteger("spawnedEndermenID");
|
this.spawnedEndermenID = nbt.getInteger("spawnedEndermenID");
|
||||||
}
|
}
|
||||||
@@ -363,9 +257,7 @@ public class TileEntityRift extends TileEntity
|
|||||||
public void writeToNBT(NBTTagCompound nbt)
|
public void writeToNBT(NBTTagCompound nbt)
|
||||||
{
|
{
|
||||||
super.writeToNBT(nbt);
|
super.writeToNBT(nbt);
|
||||||
nbt.setInteger("age", this.age);
|
nbt.setInteger("updateTimer", this.updateTimer);
|
||||||
nbt.setInteger("count", this.updateTimer);
|
|
||||||
nbt.setInteger("count2", this.riftCloseTimer);
|
|
||||||
nbt.setInteger("xOffset", this.xOffset);
|
nbt.setInteger("xOffset", this.xOffset);
|
||||||
nbt.setInteger("yOffset", this.yOffset);
|
nbt.setInteger("yOffset", this.yOffset);
|
||||||
nbt.setInteger("zOffset", this.zOffset);
|
nbt.setInteger("zOffset", this.zOffset);
|
||||||
@@ -373,11 +265,12 @@ public class TileEntityRift extends TileEntity
|
|||||||
nbt.setInteger("spawnedEndermenID", this.spawnedEndermenID);
|
nbt.setInteger("spawnedEndermenID", this.spawnedEndermenID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Packet getDescriptionPacket()
|
public Packet getDescriptionPacket()
|
||||||
{
|
{
|
||||||
if (PocketManager.getLink(xCoord, yCoord, zCoord, worldObj) != null)
|
if (PocketManager.getLink(xCoord, yCoord, zCoord, worldObj) != null)
|
||||||
{
|
{
|
||||||
return ServerPacketHandler.createLinkPacket(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj).link());
|
return ServerPacketHandler.createLinkPacket(new ClientLinkData(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj)));
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -387,4 +280,10 @@ public class TileEntityRift extends TileEntity
|
|||||||
{
|
{
|
||||||
readFromNBT(pkt.data);
|
readFromNBT(pkt.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float[] getRenderColor(Random rand)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,44 +1,33 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.tileentities;
|
package StevenDimDoors.mod_pocketDim.tileentities;
|
||||||
|
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import java.util.Random;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
|
||||||
|
|
||||||
public class TileEntityTransTrapdoor extends TileEntity
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
|
|
||||||
|
public class TileEntityTransTrapdoor extends DDTileEntityBase
|
||||||
{
|
{
|
||||||
public boolean hasRift;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canUpdate()
|
public boolean canUpdate()
|
||||||
{
|
{
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateEntity()
|
public float[] getRenderColor(Random rand)
|
||||||
{
|
{
|
||||||
|
float[] rgbaColor = {1,1,1,1};
|
||||||
}
|
if (this.worldObj.provider.dimensionId == mod_pocketDim.NETHER_DIMENSION_ID)
|
||||||
|
|
||||||
@Override
|
|
||||||
public void readFromNBT(NBTTagCompound nbt)
|
|
||||||
{
|
|
||||||
super.readFromNBT(nbt);
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
this.hasRift = nbt.getBoolean("hasRift");
|
rgbaColor[0] = worldObj.rand.nextFloat() * 0.5F + 0.4F;
|
||||||
|
rgbaColor[1] = worldObj.rand.nextFloat() * 0.05F;
|
||||||
|
rgbaColor[2] = worldObj.rand.nextFloat() * 0.05F;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
else
|
||||||
{
|
{
|
||||||
|
rgbaColor[0] = worldObj.rand.nextFloat() * 0.5F + 0.1F;
|
||||||
|
rgbaColor[1] = worldObj.rand.nextFloat() * 0.4F + 0.4F;
|
||||||
|
rgbaColor[2] = worldObj.rand.nextFloat() * 0.6F + 0.5F;
|
||||||
}
|
}
|
||||||
}
|
return rgbaColor;
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeToNBT(NBTTagCompound nbt)
|
|
||||||
{
|
|
||||||
super.writeToNBT(nbt);
|
|
||||||
nbt.setBoolean("hasRift", this.hasRift);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,544 @@
|
|||||||
|
package StevenDimDoors.mod_pocketDim.util;
|
||||||
|
|
||||||
|
import static java.util.Collections.singleton;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import com.google.gson.JsonArray;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import com.google.gson.JsonParseException;
|
||||||
|
import com.google.gson.JsonPrimitive;
|
||||||
|
|
||||||
|
public class JSONValidator
|
||||||
|
{
|
||||||
|
|
||||||
|
static final public String TYPE = "type";
|
||||||
|
static final public String ANY = "any";
|
||||||
|
static final public String PROPERTIES = "properties";
|
||||||
|
static final public String OPTIONAL = "optional";
|
||||||
|
static final public String ADDITIONAL_PROPERTIES = "additionalProperties";
|
||||||
|
static final public String MIN_LENGTH = "minLength";
|
||||||
|
static final public String MAX_LENGTH = "maxLength";
|
||||||
|
static final public String MINIMUM = "minimum";
|
||||||
|
static final public String MAXIMUM = "maximum";
|
||||||
|
static final public String PATTERN = "pattern";
|
||||||
|
static final public String ITEMS = "items";
|
||||||
|
static final public String ENUM = "enum";
|
||||||
|
static final public String REQUIRED = "required";
|
||||||
|
|
||||||
|
|
||||||
|
JsonObject schema;
|
||||||
|
|
||||||
|
public JsonObject getSchema()
|
||||||
|
{
|
||||||
|
return schema;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JSONValidator(JsonObject schema)
|
||||||
|
{
|
||||||
|
this.schema = schema;
|
||||||
|
}
|
||||||
|
|
||||||
|
static class WrongType extends JsonParseException
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
WrongType(String msg)
|
||||||
|
{
|
||||||
|
super(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static WrongType generate(String path, Set<Type> types, Type found)
|
||||||
|
{
|
||||||
|
boolean first = true;
|
||||||
|
String typeList = "'unknown'";
|
||||||
|
for (Type type : types)
|
||||||
|
{
|
||||||
|
if (first)
|
||||||
|
{
|
||||||
|
typeList = "'" + type.getTypeString() + "'";
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
typeList += " or '" + type.getTypeString() + "'";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new WrongType("Invalid: Expected type " + typeList + " at '" + path + "', but " + "found type '" + found.getTypeString() + "'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static enum Type
|
||||||
|
{
|
||||||
|
STRING("string"), NUMBER("number"), INTEGER("integer"), BOOLEAN("boolean"), OBJECT("object"), ARRAY("array"), NULL("null");
|
||||||
|
|
||||||
|
String typeString;
|
||||||
|
|
||||||
|
Type(String typeString)
|
||||||
|
{
|
||||||
|
this.typeString = typeString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTypeString()
|
||||||
|
{
|
||||||
|
return typeString;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Set<Type> anyTypeSet()
|
||||||
|
{
|
||||||
|
HashSet<Type> hashSet = new HashSet<Type>();
|
||||||
|
hashSet.add(Type.STRING);
|
||||||
|
hashSet.add(Type.NUMBER);
|
||||||
|
hashSet.add(Type.INTEGER);
|
||||||
|
hashSet.add(Type.BOOLEAN);
|
||||||
|
hashSet.add(Type.OBJECT);
|
||||||
|
hashSet.add(Type.ARRAY);
|
||||||
|
hashSet.add(Type.NULL);
|
||||||
|
return hashSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Set<Type> getSimpleType(String path, String type)
|
||||||
|
{
|
||||||
|
for (Type t : Type.values())
|
||||||
|
{
|
||||||
|
if (t.getTypeString().equals(type))
|
||||||
|
{
|
||||||
|
if (t != Type.NUMBER)
|
||||||
|
{
|
||||||
|
return singleton(t);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
HashSet<Type> set = new HashSet<Type>();
|
||||||
|
set.add(Type.NUMBER);
|
||||||
|
set.add(Type.INTEGER);
|
||||||
|
return set;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ANY.equals(type))
|
||||||
|
{
|
||||||
|
return anyTypeSet();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unknown type, spec says to allow any.
|
||||||
|
return anyTypeSet();
|
||||||
|
}
|
||||||
|
|
||||||
|
static Set<Type> getTypeSet(String path, JsonObject schema) throws JsonParseException
|
||||||
|
{
|
||||||
|
JsonElement typeElement = schema.get(TYPE);
|
||||||
|
|
||||||
|
if (typeElement == null)
|
||||||
|
{
|
||||||
|
// Spec says that a missing type object means accept any type.
|
||||||
|
return anyTypeSet();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeElement.isJsonPrimitive())
|
||||||
|
{
|
||||||
|
JsonPrimitive primitive = typeElement.getAsJsonPrimitive();
|
||||||
|
if (primitive.isString())
|
||||||
|
{
|
||||||
|
return getSimpleType(path, primitive.getAsString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeElement.isJsonArray())
|
||||||
|
{
|
||||||
|
HashSet<Type> set = new HashSet<Type>();
|
||||||
|
JsonArray array = typeElement.getAsJsonArray();
|
||||||
|
for (JsonElement element : array)
|
||||||
|
{
|
||||||
|
if (element.isJsonPrimitive())
|
||||||
|
{
|
||||||
|
JsonPrimitive primitive = element.getAsJsonPrimitive();
|
||||||
|
if (primitive.isString())
|
||||||
|
{
|
||||||
|
set.addAll(getSimpleType(path, primitive.getAsString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unknown type. Accept all.
|
||||||
|
return anyTypeSet();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't know what this is, assume any.
|
||||||
|
return anyTypeSet();
|
||||||
|
}
|
||||||
|
|
||||||
|
static Type getType(JsonElement element)
|
||||||
|
{
|
||||||
|
if (element.isJsonArray())
|
||||||
|
{
|
||||||
|
return Type.ARRAY;
|
||||||
|
}
|
||||||
|
if (element.isJsonObject())
|
||||||
|
{
|
||||||
|
return Type.OBJECT;
|
||||||
|
}
|
||||||
|
if (element.isJsonNull())
|
||||||
|
{
|
||||||
|
return Type.NULL;
|
||||||
|
}
|
||||||
|
JsonPrimitive primitive = element.getAsJsonPrimitive();
|
||||||
|
if (primitive.isString())
|
||||||
|
{
|
||||||
|
return Type.STRING;
|
||||||
|
}
|
||||||
|
if (primitive.isBoolean())
|
||||||
|
{
|
||||||
|
return Type.BOOLEAN;
|
||||||
|
}
|
||||||
|
if (primitive.isNumber())
|
||||||
|
{
|
||||||
|
BigDecimal decimal = primitive.getAsBigDecimal();
|
||||||
|
int scale = decimal.scale();
|
||||||
|
if (scale > 0)
|
||||||
|
{
|
||||||
|
return Type.NUMBER;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return Type.INTEGER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't know. Punt and call it a string.
|
||||||
|
return Type.STRING;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void validateObject(String path, JsonObject schema, JsonObject obj) throws JsonParseException
|
||||||
|
{
|
||||||
|
Set<String> propertiesSeen = new HashSet<String>();
|
||||||
|
|
||||||
|
JsonArray required = schema.getAsJsonArray(REQUIRED);
|
||||||
|
JsonObject properties = schema.getAsJsonObject(PROPERTIES);
|
||||||
|
|
||||||
|
if (properties == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<Map.Entry<String, JsonElement>> propertySet = properties.entrySet();
|
||||||
|
ArrayList<String> requiredFields = new ArrayList<String>();
|
||||||
|
|
||||||
|
for(JsonElement st : required.getAsJsonArray())
|
||||||
|
{
|
||||||
|
requiredFields.add(st.getAsString());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Map.Entry<String, JsonElement> property : propertySet)
|
||||||
|
{
|
||||||
|
String name = property.getKey();
|
||||||
|
String newPath = path + "['" + name + "']";
|
||||||
|
JsonElement element = property.getValue();
|
||||||
|
propertiesSeen.add(name);
|
||||||
|
|
||||||
|
if (!element.isJsonObject())
|
||||||
|
{
|
||||||
|
throw new JsonParseException("Bad Schema: property definition not an object at '" + newPath + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonObject definition = element.getAsJsonObject();
|
||||||
|
|
||||||
|
JsonElement newTarget = obj.get(name);
|
||||||
|
|
||||||
|
if (newTarget == null)
|
||||||
|
{
|
||||||
|
JsonPrimitive optional = definition.getAsJsonPrimitive(OPTIONAL);
|
||||||
|
boolean needed = ((optional==null) && requiredFields.contains(name)) || (optional != null && !optional.getAsBoolean());
|
||||||
|
|
||||||
|
if (needed)
|
||||||
|
{
|
||||||
|
throw new JsonParseException("Invalid: Required property '" + newPath + "' not found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
validate(newPath, definition, newTarget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonElement additionalProperties = schema.get(ADDITIONAL_PROPERTIES);
|
||||||
|
JsonObject additionalSchema = null;
|
||||||
|
if (additionalProperties == null)
|
||||||
|
{
|
||||||
|
additionalSchema = new JsonObject();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (additionalProperties.isJsonObject())
|
||||||
|
{
|
||||||
|
additionalSchema = additionalProperties.getAsJsonObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* if (additionalSchema == null) {
|
||||||
|
* logger.debug("No additional schema for '"+path+"'"); } else {
|
||||||
|
* logger.debug("Additional schema for '"+path+"': "+
|
||||||
|
* additionalSchema.toString()); }
|
||||||
|
*/
|
||||||
|
|
||||||
|
Set<Map.Entry<String, JsonElement>> objectProperties = obj.entrySet();
|
||||||
|
for (Map.Entry<String, JsonElement> property : objectProperties)
|
||||||
|
{
|
||||||
|
String name = property.getKey();
|
||||||
|
String newPath = path + "['" + name + "']";
|
||||||
|
if (!propertiesSeen.contains(name))
|
||||||
|
{
|
||||||
|
if (additionalSchema == null)
|
||||||
|
{
|
||||||
|
throw new JsonParseException("Invalid: Found additional property '" + newPath + "'");
|
||||||
|
}
|
||||||
|
validate(newPath, additionalSchema, property.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Integer getInt(String path, String attributeName, JsonObject schema) throws JsonParseException
|
||||||
|
{
|
||||||
|
JsonElement attributeElement = schema.get(attributeName);
|
||||||
|
|
||||||
|
if (attributeElement == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!attributeElement.isJsonPrimitive())
|
||||||
|
{
|
||||||
|
throw new JsonParseException("Bad Schema: '" + attributeName + "' attribute is not an integer at '" + path + "'");
|
||||||
|
}
|
||||||
|
JsonPrimitive attributePrimitive = attributeElement.getAsJsonPrimitive();
|
||||||
|
if (!attributePrimitive.isNumber())
|
||||||
|
{
|
||||||
|
throw new JsonParseException("Bad Schema: '" + attributeName + "' attribute is not an integer at '" + path + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
return attributePrimitive.getAsInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
static String getString(String path, String attributeName, JsonObject schema) throws JsonParseException
|
||||||
|
{
|
||||||
|
JsonElement attributeElement = schema.get(attributeName);
|
||||||
|
|
||||||
|
if (attributeElement == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!attributeElement.isJsonPrimitive())
|
||||||
|
{
|
||||||
|
throw new JsonParseException("Bad Schema: '" + attributeName + "' attribute is not a string at '" + path + "'");
|
||||||
|
}
|
||||||
|
JsonPrimitive attributePrimitive = attributeElement.getAsJsonPrimitive();
|
||||||
|
if (!attributePrimitive.isString())
|
||||||
|
{
|
||||||
|
throw new JsonParseException("Bad Schema: '" + attributeName + "' attribute is not a string at '" + path + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
return attributePrimitive.getAsString();
|
||||||
|
}
|
||||||
|
|
||||||
|
static BigDecimal getBigDecimal(String path, String attributeName, JsonObject schema) throws JsonParseException
|
||||||
|
{
|
||||||
|
JsonElement attributeElement = schema.get(attributeName);
|
||||||
|
|
||||||
|
if (attributeElement == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!attributeElement.isJsonPrimitive())
|
||||||
|
{
|
||||||
|
throw new JsonParseException("Bad Schema: '" + attributeName + "' attribute is not a number at '" + path + "'");
|
||||||
|
}
|
||||||
|
JsonPrimitive attributePrimitive = attributeElement.getAsJsonPrimitive();
|
||||||
|
if (!attributePrimitive.isNumber())
|
||||||
|
{
|
||||||
|
throw new JsonParseException("Bad Schema: '" + attributeName + "' attribute is not a number at '" + path + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
return attributePrimitive.getAsBigDecimal();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void validateString(String path, JsonObject schema, String str) throws JsonParseException
|
||||||
|
{
|
||||||
|
Integer minLength = getInt(path, MIN_LENGTH, schema);
|
||||||
|
Integer maxLength = getInt(path, MAX_LENGTH, schema);
|
||||||
|
|
||||||
|
if ((minLength != null) && (str.length() < minLength))
|
||||||
|
{
|
||||||
|
throw new JsonParseException("Invalid: String '" + path + "' is too short. The string needs to be more than " + minLength + " characters");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((maxLength != null) && (str.length() > maxLength))
|
||||||
|
{
|
||||||
|
throw new JsonParseException("Invalid: String '" + path + "' is too long. The string needs to be less than " + maxLength + " characters");
|
||||||
|
}
|
||||||
|
|
||||||
|
String pattern = getString(path, PATTERN, schema);
|
||||||
|
if ((pattern != null) && (!str.matches(pattern)))
|
||||||
|
{
|
||||||
|
throw new JsonParseException("Invalid: String '" + path + "' does not match pattern '" + pattern + "'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void validateTuple(String path, JsonArray tupleSchema, JsonObject additionalSchema, JsonArray array) throws JsonParseException
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void validateArray(String path, JsonObject schema, JsonArray array) throws JsonParseException
|
||||||
|
{
|
||||||
|
JsonElement additionalProperties = schema.get(ADDITIONAL_PROPERTIES);
|
||||||
|
JsonObject additionalSchema = null;
|
||||||
|
if (additionalProperties == null)
|
||||||
|
{
|
||||||
|
additionalSchema = new JsonObject();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (additionalProperties.isJsonObject())
|
||||||
|
{
|
||||||
|
additionalSchema = additionalProperties.getAsJsonObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonElement itemsElement = schema.get(ITEMS);
|
||||||
|
if (itemsElement == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemsElement.isJsonArray())
|
||||||
|
{
|
||||||
|
validateTuple(path, itemsElement.getAsJsonArray(), additionalSchema, array);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonObject itemsSchema = null;
|
||||||
|
if (itemsElement.isJsonObject())
|
||||||
|
{
|
||||||
|
itemsSchema = itemsElement.getAsJsonObject();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Bogus items parameter, assume everything is valid.
|
||||||
|
itemsSchema = new JsonObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
for (JsonElement element : array)
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
String curPath = path + "[" + i + "]";
|
||||||
|
validate(curPath, itemsSchema, element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void validateEnum(String path, JsonObject schema, JsonElement element) throws JsonParseException
|
||||||
|
{
|
||||||
|
JsonElement enumElement = schema.get(ENUM);
|
||||||
|
if (enumElement == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!enumElement.isJsonArray())
|
||||||
|
{}
|
||||||
|
|
||||||
|
JsonArray enumArray = enumElement.getAsJsonArray();
|
||||||
|
|
||||||
|
for (JsonElement curElement : enumArray)
|
||||||
|
{
|
||||||
|
if (element.equals(curElement))
|
||||||
|
{
|
||||||
|
// We found a valid value.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new JsonParseException("Invalid: Property '" + path + "' is not one of the enum values.");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void validateNumber(String path, JsonObject schema, BigDecimal number) throws JsonParseException
|
||||||
|
{
|
||||||
|
BigDecimal minimum = getBigDecimal(path, MINIMUM, schema);
|
||||||
|
if (minimum != null)
|
||||||
|
{
|
||||||
|
if (number.compareTo(minimum) < 0)
|
||||||
|
{
|
||||||
|
throw new JsonParseException("Invalid: Property '" + path + "' has a value of '" + number + "' which is less than the minimum of '" + minimum
|
||||||
|
+ "'.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BigDecimal maximum = getBigDecimal(path, MAXIMUM, schema);
|
||||||
|
if (maximum != null)
|
||||||
|
{
|
||||||
|
if (number.compareTo(maximum) > 0)
|
||||||
|
{
|
||||||
|
throw new JsonParseException("Invalid: Property '" + path + "' has a value of '" + number + "' which is greater than the maximum of '"
|
||||||
|
+ maximum + "'.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void validate(String path, JsonObject schema, JsonElement element) throws JsonParseException
|
||||||
|
{
|
||||||
|
Set<Type> typeSet = getTypeSet(path, schema);
|
||||||
|
|
||||||
|
Type type = getType(element);
|
||||||
|
if (!typeSet.contains(type))
|
||||||
|
{
|
||||||
|
throw WrongType.generate(path, typeSet, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case BOOLEAN:
|
||||||
|
case NULL:
|
||||||
|
break;
|
||||||
|
case NUMBER:
|
||||||
|
case INTEGER:
|
||||||
|
validateNumber(path, schema, element.getAsBigDecimal());
|
||||||
|
break;
|
||||||
|
case ARRAY:
|
||||||
|
validateArray(path, schema, element.getAsJsonArray());
|
||||||
|
break;
|
||||||
|
case STRING:
|
||||||
|
validateString(path, schema, element.getAsString());
|
||||||
|
break;
|
||||||
|
case OBJECT:
|
||||||
|
validateObject(path, schema, element.getAsJsonObject());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Unknown type
|
||||||
|
throw new JsonParseException("Internal Error");
|
||||||
|
}
|
||||||
|
|
||||||
|
validateEnum(path, schema, element);
|
||||||
|
}
|
||||||
|
|
||||||
|
static public void validate(JsonObject schema, JsonElement element) throws JsonParseException
|
||||||
|
{
|
||||||
|
validate("$", schema, element);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void validate(JsonElement element) throws JsonParseException
|
||||||
|
{
|
||||||
|
validate(getSchema(), element);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -141,12 +141,14 @@ public final class Point4D implements Comparable<Point4D>
|
|||||||
|
|
||||||
public Point3D toPoint3D()
|
public Point3D toPoint3D()
|
||||||
{
|
{
|
||||||
return new Point3D(this.x,this.y,this.z);
|
return new Point3D(this.x, this.y, this.z);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int[] toIntArray()
|
public int[] toIntArray()
|
||||||
{
|
{
|
||||||
return new int[]{x,y,z,dimension};
|
return new int[] {x, y, z, dimension};
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean equals(Point4D other)
|
public boolean equals(Point4D other)
|
||||||
{
|
{
|
||||||
if (this == other)
|
if (this == other)
|
||||||
|
|||||||
@@ -3,37 +3,42 @@ package StevenDimDoors.mod_pocketDim.watcher;
|
|||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.DimensionType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
|
|
||||||
public class ClientDimData
|
public class ClientDimData
|
||||||
{
|
{
|
||||||
//We'll use public fields since this is just a data container and it's immutable
|
//We'll use public fields since this is just a data container and it's immutable
|
||||||
public final int ID;
|
public final int ID;
|
||||||
public final int RootID;
|
public final int rootID;
|
||||||
|
public final DimensionType type;
|
||||||
|
|
||||||
public ClientDimData(int id, int rootID)
|
public ClientDimData(int id, int rootID, DimensionType type)
|
||||||
{
|
{
|
||||||
ID = id;
|
ID = id;
|
||||||
RootID = rootID;
|
this.rootID = rootID;
|
||||||
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ClientDimData(NewDimData dimension)
|
public ClientDimData(NewDimData dimension)
|
||||||
{
|
{
|
||||||
ID = dimension.id();
|
ID = dimension.id();
|
||||||
RootID = dimension.root().id();
|
this.rootID = dimension.root().id();
|
||||||
|
this.type = dimension.type();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void write(DataOutputStream output) throws IOException
|
public void write(DataOutputStream output) throws IOException
|
||||||
{
|
{
|
||||||
output.writeInt(ID);
|
output.writeInt(ID);
|
||||||
output.writeInt(RootID);
|
output.writeInt(rootID);
|
||||||
|
output.writeInt(type.index);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ClientDimData read(DataInputStream input) throws IOException
|
public static ClientDimData read(DataInputStream input) throws IOException
|
||||||
{
|
{
|
||||||
int id = input.readInt();
|
int id = input.readInt();
|
||||||
int rootId = input.readInt();
|
int rootID = input.readInt();
|
||||||
return new ClientDimData(id, rootId);
|
int index = input.readInt();
|
||||||
|
return new ClientDimData(id, rootID, DimensionType.getTypeFromIndex(index));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,38 +3,62 @@ package StevenDimDoors.mod_pocketDim.watcher;
|
|||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.DDLock;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
|
|
||||||
public class ClientLinkData
|
public class ClientLinkData
|
||||||
{
|
{
|
||||||
public Point4D point;
|
public final Point4D point;
|
||||||
public int orientation;
|
public final DDLock lock;
|
||||||
|
public final LinkType type;
|
||||||
|
|
||||||
public ClientLinkData(DimLink link)
|
public ClientLinkData(DimLink link)
|
||||||
{
|
{
|
||||||
this.point= link.source();
|
this.point = link.source();
|
||||||
this.orientation=link.orientation();
|
this.type = link.linkType();
|
||||||
}
|
if (link.hasLock())
|
||||||
|
{
|
||||||
|
lock = link.getLock();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lock = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public ClientLinkData(Point4D point, int orientation)
|
public ClientLinkData(Point4D point, LinkType type, DDLock lock)
|
||||||
{
|
{
|
||||||
this.point = point;
|
this.point = point;
|
||||||
this.orientation=orientation;
|
this.lock = lock;
|
||||||
}
|
this.type = type;
|
||||||
|
|
||||||
public void write(DataOutputStream output) throws IOException
|
}
|
||||||
{
|
|
||||||
Point4D.write(point, output);
|
|
||||||
output.writeInt(orientation);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ClientLinkData read(DataInputStream input) throws IOException
|
public void write(DataOutputStream output) throws IOException
|
||||||
{
|
{
|
||||||
Point4D point = Point4D.read(input);
|
Point4D.write(point, output);
|
||||||
int orientation = input.readInt();
|
output.writeInt(this.type.index);
|
||||||
return new ClientLinkData(point, orientation);
|
boolean hasLock = this.lock != null;
|
||||||
}
|
output.writeBoolean(hasLock);
|
||||||
|
|
||||||
|
if (hasLock)
|
||||||
|
{
|
||||||
|
output.writeBoolean(lock.getLockState());
|
||||||
|
output.writeInt(lock.getLockKey());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ClientLinkData read(DataInputStream input) throws IOException
|
||||||
|
{
|
||||||
|
Point4D point = Point4D.read(input);
|
||||||
|
LinkType type = LinkType.getLinkTypeFromIndex(input.readInt());
|
||||||
|
DDLock lock = null;
|
||||||
|
if (input.readBoolean())
|
||||||
|
{
|
||||||
|
lock = new DDLock(input.readBoolean(), input.readInt());
|
||||||
|
}
|
||||||
|
return new ClientLinkData(point, type, lock);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,5 +3,6 @@ package StevenDimDoors.mod_pocketDim.watcher;
|
|||||||
public interface IUpdateWatcher<T>
|
public interface IUpdateWatcher<T>
|
||||||
{
|
{
|
||||||
public void onCreated(T message);
|
public void onCreated(T message);
|
||||||
|
public void update(T message);
|
||||||
public void onDeleted(T message);
|
public void onDeleted(T message);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,4 +39,13 @@ public class UpdateWatcherProxy<T> implements IUpdateWatcher<T>
|
|||||||
{
|
{
|
||||||
return watchers.remove(receiver);
|
return watchers.remove(receiver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(T message)
|
||||||
|
{
|
||||||
|
for (IUpdateWatcher<T> receiver : watchers)
|
||||||
|
{
|
||||||
|
receiver.update(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.ticking;
|
package StevenDimDoors.mod_pocketDim.world;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
@@ -13,13 +13,12 @@ import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
|||||||
* Provides methods for applying Limbo decay. Limbo decay refers to the effect that most blocks placed in Limbo
|
* Provides methods for applying Limbo decay. Limbo decay refers to the effect that most blocks placed in Limbo
|
||||||
* naturally change into stone, then cobble, then gravel, and finally Unraveled Fabric as time passes.
|
* naturally change into stone, then cobble, then gravel, and finally Unraveled Fabric as time passes.
|
||||||
*/
|
*/
|
||||||
public class LimboDecay implements IRegularTickReceiver {
|
public class LimboDecay {
|
||||||
|
|
||||||
private static final int MAX_DECAY_SPREAD_CHANCE = 100;
|
private static final int MAX_DECAY_SPREAD_CHANCE = 100;
|
||||||
private static final int DECAY_SPREAD_CHANCE = 50;
|
private static final int DECAY_SPREAD_CHANCE = 50;
|
||||||
private static final int CHUNK_SIZE = 16;
|
private static final int CHUNK_SIZE = 16;
|
||||||
private static final int SECTION_HEIGHT = 16;
|
private static final int SECTION_HEIGHT = 16;
|
||||||
private static final int LIMBO_DECAY_INTERVAL = 10; //Apply spread decay every 10 ticks
|
|
||||||
|
|
||||||
//Provides a reversed list of the block IDs that blocks cycle through during decay.
|
//Provides a reversed list of the block IDs that blocks cycle through during decay.
|
||||||
private final int[] decaySequence;
|
private final int[] decaySequence;
|
||||||
@@ -28,7 +27,7 @@ public class LimboDecay implements IRegularTickReceiver {
|
|||||||
private final DDProperties properties;
|
private final DDProperties properties;
|
||||||
private final int[] blocksImmuneToDecay;
|
private final int[] blocksImmuneToDecay;
|
||||||
|
|
||||||
public LimboDecay(IRegularTickSender tickSender, DDProperties properties)
|
public LimboDecay(DDProperties properties)
|
||||||
{
|
{
|
||||||
decaySequence = new int[] {
|
decaySequence = new int[] {
|
||||||
properties.LimboBlockID,
|
properties.LimboBlockID,
|
||||||
@@ -51,16 +50,6 @@ public class LimboDecay implements IRegularTickReceiver {
|
|||||||
|
|
||||||
this.properties = properties;
|
this.properties = properties;
|
||||||
this.random = new Random();
|
this.random = new Random();
|
||||||
tickSender.registerForTicking(this, LIMBO_DECAY_INTERVAL, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies fast Limbo decay periodically.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void notifyTick()
|
|
||||||
{
|
|
||||||
applyRandomFastDecay();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -88,7 +77,7 @@ public class LimboDecay implements IRegularTickReceiver {
|
|||||||
* Picks random blocks from each active chunk in Limbo and, if decay is applicable, converts them directly to Unraveled Fabric.
|
* Picks random blocks from each active chunk in Limbo and, if decay is applicable, converts them directly to Unraveled Fabric.
|
||||||
* This decay method is designed to stop players from avoiding Limbo decay by building floating structures.
|
* This decay method is designed to stop players from avoiding Limbo decay by building floating structures.
|
||||||
*/
|
*/
|
||||||
private void applyRandomFastDecay()
|
public void applyRandomFastDecay()
|
||||||
{
|
{
|
||||||
int x, y, z;
|
int x, y, z;
|
||||||
int sectionY;
|
int sectionY;
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
package StevenDimDoors.mod_pocketDim.world;
|
||||||
|
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
|
import net.minecraft.util.Vec3;
|
||||||
|
import net.minecraft.world.WorldProvider;
|
||||||
|
import net.minecraft.world.biome.WorldChunkManagerHell;
|
||||||
|
import net.minecraft.world.chunk.IChunkProvider;
|
||||||
|
import net.minecraftforge.client.IRenderHandler;
|
||||||
|
import net.minecraftforge.common.DimensionManager;
|
||||||
|
import StevenDimDoors.mod_pocketDim.CloudRenderBlank;
|
||||||
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
|
import StevenDimDoors.mod_pocketDim.ticking.CustomLimboPopulator;
|
||||||
|
import cpw.mods.fml.relauncher.Side;
|
||||||
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
|
|
||||||
|
public class PersonalPocketProvider extends PocketProvider
|
||||||
|
{
|
||||||
|
private DDProperties properties;
|
||||||
|
private CustomLimboPopulator spawner;
|
||||||
|
private IRenderHandler skyRenderer;
|
||||||
|
|
||||||
|
public PersonalPocketProvider()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Vec3 getSkyColor(Entity cameraEntity, float partialTicks)
|
||||||
|
{
|
||||||
|
setCloudRenderer( new CloudRenderBlank());
|
||||||
|
return this.worldObj.getWorldVec3Pool().getVecFromPool(1,1,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSurfaceWorld()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void generateLightBrightnessTable()
|
||||||
|
{
|
||||||
|
float f = 0.0F;
|
||||||
|
|
||||||
|
for (int i = 0; i <= 15; ++i)
|
||||||
|
{
|
||||||
|
float f1 = 1.0F - (float)i / 15.0F;
|
||||||
|
this.lightBrightnessTable[i] = (15);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getHorizon()
|
||||||
|
{
|
||||||
|
return worldObj.getHeight()-256;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SideOnly(Side.CLIENT)
|
||||||
|
@Override
|
||||||
|
public Vec3 getFogColor(float par1, float par2)
|
||||||
|
{
|
||||||
|
return this.worldObj.getWorldVec3Pool().getVecFromPool(1,1,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getActualHeight()
|
||||||
|
{
|
||||||
|
return -256;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,19 +1,22 @@
|
|||||||
package StevenDimDoors.mod_pocketDim.world;
|
package StevenDimDoors.mod_pocketDim.world;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.util.MathHelper;
|
import net.minecraft.util.MathHelper;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.chunk.Chunk;
|
import net.minecraft.world.chunk.Chunk;
|
||||||
import net.minecraft.world.chunk.storage.ExtendedBlockStorage;
|
import net.minecraft.world.chunk.storage.ExtendedBlockStorage;
|
||||||
import net.minecraftforge.common.DimensionManager;
|
import net.minecraftforge.common.DimensionManager;
|
||||||
import StevenDimDoors.experimental.MazeBuilder;
|
import StevenDimDoors.experimental.BoundingBox;
|
||||||
import StevenDimDoors.mod_pocketDim.Point3D;
|
import StevenDimDoors.mod_pocketDim.Point3D;
|
||||||
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
||||||
import StevenDimDoors.mod_pocketDim.blocks.IDimDoor;
|
import StevenDimDoors.mod_pocketDim.blocks.IDimDoor;
|
||||||
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
||||||
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
import StevenDimDoors.mod_pocketDim.core.DimLink;
|
||||||
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
import StevenDimDoors.mod_pocketDim.core.DimensionType;
|
||||||
|
import StevenDimDoors.mod_pocketDim.core.LinkType;
|
||||||
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
import StevenDimDoors.mod_pocketDim.dungeon.DungeonData;
|
import StevenDimDoors.mod_pocketDim.dungeon.DungeonData;
|
||||||
@@ -21,10 +24,10 @@ import StevenDimDoors.mod_pocketDim.dungeon.DungeonSchematic;
|
|||||||
import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfig;
|
import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfig;
|
||||||
import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper;
|
import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper;
|
||||||
import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper;
|
import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper;
|
||||||
|
import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor;
|
||||||
import StevenDimDoors.mod_pocketDim.schematic.BlockRotator;
|
import StevenDimDoors.mod_pocketDim.schematic.BlockRotator;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Pair;
|
import StevenDimDoors.mod_pocketDim.util.Pair;
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor;
|
|
||||||
|
|
||||||
public class PocketBuilder
|
public class PocketBuilder
|
||||||
{
|
{
|
||||||
@@ -40,87 +43,6 @@ public class PocketBuilder
|
|||||||
|
|
||||||
private PocketBuilder() { }
|
private PocketBuilder() { }
|
||||||
|
|
||||||
/**
|
|
||||||
* Method that takes an arbitrary link into a dungeon pocket and tries to regenerate it. First uses the origin to find that link,
|
|
||||||
* then uses that link to find the link that originally created the dungeon. If it cant find any of these, it
|
|
||||||
* instead makes the link that lead to this point into an exit door style link, sending the player to the overworld.
|
|
||||||
* @param dimension The dungeon to be regenerated
|
|
||||||
* @param linkIn The link leading somewhere into the dungeon.
|
|
||||||
* @param properties
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
|
|
||||||
public static boolean regenerateDungeonPocket(NewDimData dimension, DimLink linkIn, DDProperties properties)
|
|
||||||
{
|
|
||||||
if (linkIn == null)
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("link cannot be null.");
|
|
||||||
}
|
|
||||||
if (properties == null)
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("properties cannot be null.");
|
|
||||||
}
|
|
||||||
//The link that is at the origin of the dungeon
|
|
||||||
DimLink originLink = dimension.getLink(dimension.origin());
|
|
||||||
Point4D oldLinkPos = linkIn.source();
|
|
||||||
if(originLink==null)
|
|
||||||
{
|
|
||||||
int orientation = linkIn.orientation();
|
|
||||||
originLink=dimension.createLink(oldLinkPos, LinkTypes.SAFE_EXIT, (orientation+2)%4);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
//The link that originally created the dungeon on the way in
|
|
||||||
DimLink incomingLink = PocketManager.getLink(originLink.destination());
|
|
||||||
if(incomingLink==null||incomingLink.linkType()!=LinkTypes.DUNGEON||!(originLink.linkType()==LinkTypes.REVERSE))
|
|
||||||
{
|
|
||||||
int orientation = linkIn.orientation();
|
|
||||||
dimension.deleteLink(originLink);
|
|
||||||
dimension.createLink(oldLinkPos, LinkTypes.SAFE_EXIT, (orientation+2)%4);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
NewDimData parent = PocketManager.getDimensionData(incomingLink.source().getDimension());
|
|
||||||
|
|
||||||
if (!dimension.isDungeon())
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("destination must be dungeon");
|
|
||||||
}
|
|
||||||
if (dimension.isFilled())
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("destination must be empty");
|
|
||||||
}
|
|
||||||
if (!dimension.isInitialized())
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("destination must already exist");
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
//Load a world
|
|
||||||
World world = PocketManager.loadDimension(dimension.id());
|
|
||||||
|
|
||||||
if (world == null || world.provider == null)
|
|
||||||
{
|
|
||||||
System.err.println("Could not initialize dimension for a dungeon!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
DungeonSchematic schematic = loadAndValidateDungeon(dimension.dungeon(), properties);
|
|
||||||
if (schematic == null)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Point3D destination = new Point3D(incomingLink.destination());
|
|
||||||
schematic.copyToWorld(world, destination, originLink.orientation(), incomingLink, random, properties, false);
|
|
||||||
dimension.setFilled(true);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean buildDungeonPocket(DungeonData dungeon, NewDimData dimension, DimLink link, DungeonSchematic schematic, World world, DDProperties properties)
|
private static boolean buildDungeonPocket(DungeonData dungeon, NewDimData dimension, DimLink link, DungeonSchematic schematic, World world, DDProperties properties)
|
||||||
{
|
{
|
||||||
//Calculate the destination point
|
//Calculate the destination point
|
||||||
@@ -179,7 +101,7 @@ public class PocketBuilder
|
|||||||
|
|
||||||
// Register a new dimension
|
// Register a new dimension
|
||||||
NewDimData parent = PocketManager.getDimensionData(link.source().getDimension());
|
NewDimData parent = PocketManager.getDimensionData(link.source().getDimension());
|
||||||
NewDimData dimension = PocketManager.registerPocket(parent, true);
|
NewDimData dimension = PocketManager.registerPocket(parent, DimensionType.DUNGEON);
|
||||||
|
|
||||||
//Load a world
|
//Load a world
|
||||||
World world = PocketManager.loadDimension(dimension.id());
|
World world = PocketManager.loadDimension(dimension.id());
|
||||||
@@ -222,7 +144,7 @@ public class PocketBuilder
|
|||||||
DungeonSchematic schematic = pair.getSecond();
|
DungeonSchematic schematic = pair.getSecond();
|
||||||
|
|
||||||
//Register a new dimension
|
//Register a new dimension
|
||||||
NewDimData dimension = PocketManager.registerPocket(parent, true);
|
NewDimData dimension = PocketManager.registerPocket(parent, DimensionType.DUNGEON);
|
||||||
|
|
||||||
//Load a world
|
//Load a world
|
||||||
World world = PocketManager.loadDimension(dimension.id());
|
World world = PocketManager.loadDimension(dimension.id());
|
||||||
@@ -328,9 +250,9 @@ public class PocketBuilder
|
|||||||
schematic.getLength() <= DungeonHelper.MAX_DUNGEON_LENGTH);
|
schematic.getLength() <= DungeonHelper.MAX_DUNGEON_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean generateNewPocket(DimLink link, DDProperties properties, Block door)
|
public static boolean generateNewPocket(DimLink link, DDProperties properties, Block door, DimensionType type)
|
||||||
{
|
{
|
||||||
return generateNewPocket(link, DEFAULT_POCKET_SIZE, DEFAULT_POCKET_WALL_THICKNESS, properties, door);
|
return generateNewPocket(link, DEFAULT_POCKET_SIZE, DEFAULT_POCKET_WALL_THICKNESS, properties, door, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int getDoorOrientation(Point4D source, DDProperties properties)
|
private static int getDoorOrientation(Point4D source, DDProperties properties)
|
||||||
@@ -342,10 +264,8 @@ public class PocketBuilder
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Check if the block below that point is actually a door
|
//Check if the block below that point is actually a door
|
||||||
int blockID = world.getBlockId(source.getX(), source.getY() - 1, source.getZ());
|
Block block = Block.blocksList[world.getBlockId(source.getX(), source.getY() - 1, source.getZ())];
|
||||||
if (blockID != properties.DimensionalDoorID && blockID != properties.WarpDoorID &&
|
if (block==null || !(block instanceof IDimDoor))
|
||||||
blockID != properties.TransientDoorID &&
|
|
||||||
blockID != properties.GoldenDimensionalDoorID)
|
|
||||||
{
|
{
|
||||||
throw new IllegalStateException("The link's source is not a door block. It should be impossible to traverse a rift without a door!");
|
throw new IllegalStateException("The link's source is not a door block. It should be impossible to traverse a rift without a door!");
|
||||||
}
|
}
|
||||||
@@ -355,7 +275,7 @@ public class PocketBuilder
|
|||||||
return orientation;
|
return orientation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean generateNewPocket(DimLink link, int size, int wallThickness, DDProperties properties, Block door)
|
public static void validatePocketSetup(DimLink link, int size, int wallThickness, DDProperties properties, Block door)
|
||||||
{
|
{
|
||||||
if (link == null)
|
if (link == null)
|
||||||
{
|
{
|
||||||
@@ -392,12 +312,79 @@ public class PocketBuilder
|
|||||||
{
|
{
|
||||||
throw new IllegalArgumentException("size must be large enough to fit the specified wall thickness and some air space.");
|
throw new IllegalArgumentException("size must be large enough to fit the specified wall thickness and some air space.");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**I know this is almost a copy of generateNewPocket, but we might want to change other things.
|
||||||
|
*
|
||||||
|
* @param link
|
||||||
|
* @param properties
|
||||||
|
* @param player
|
||||||
|
* @param door
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static boolean generateNewPersonalPocket(DimLink link, DDProperties properties,Entity player, Block door)
|
||||||
|
{
|
||||||
|
//incase a chicken walks in or something
|
||||||
|
if(!(player instanceof EntityPlayer))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int wallThickness = DEFAULT_POCKET_WALL_THICKNESS;
|
||||||
|
int size = DEFAULT_POCKET_SIZE;
|
||||||
|
|
||||||
|
validatePocketSetup(link, size, wallThickness, properties, door);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
//Register a new dimension
|
//Register a new dimension
|
||||||
NewDimData parent = PocketManager.getDimensionData(link.source().getDimension());
|
NewDimData parent = PocketManager.getDimensionData(link.source().getDimension());
|
||||||
NewDimData dimension = PocketManager.registerPocket(parent, false);
|
NewDimData dimension = PocketManager.registerPocket(parent, DimensionType.PERSONAL, player.getEntityName());
|
||||||
|
|
||||||
|
|
||||||
|
//Load a world
|
||||||
|
World world = PocketManager.loadDimension(dimension.id());
|
||||||
|
|
||||||
|
if (world == null || world.provider == null)
|
||||||
|
{
|
||||||
|
System.err.println("Could not initialize dimension for a pocket!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Calculate the destination point
|
||||||
|
Point4D source = link.source();
|
||||||
|
int destinationY = yCoordHelper.adjustDestinationY(link.source().getY(), world.getHeight(), wallThickness + 1, size);
|
||||||
|
int orientation = getDoorOrientation(source, properties);
|
||||||
|
|
||||||
|
//Place a link leading back out of the pocket
|
||||||
|
DimLink reverseLink = dimension.createLink(source.getX(), destinationY, source.getZ(), LinkType.REVERSE,(link.orientation()+2)%4);
|
||||||
|
parent.setLinkDestination(reverseLink, source.getX(), source.getY(), source.getZ());
|
||||||
|
|
||||||
|
//Build the actual pocket area
|
||||||
|
buildPocket(world, source.getX(), destinationY, source.getZ(), orientation, size, wallThickness, properties, door);
|
||||||
|
|
||||||
|
//Finish up destination initialization
|
||||||
|
dimension.initializePocket(source.getX(), destinationY, source.getZ(), orientation, link);
|
||||||
|
dimension.setFilled(true);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean generateNewPocket(DimLink link, int size, int wallThickness, DDProperties properties, Block door, DimensionType type)
|
||||||
|
{
|
||||||
|
validatePocketSetup(link, size, wallThickness, properties, door);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
//Register a new dimension
|
||||||
|
NewDimData parent = PocketManager.getDimensionData(link.source().getDimension());
|
||||||
|
NewDimData dimension = PocketManager.registerPocket(parent, type);
|
||||||
|
|
||||||
|
|
||||||
//Load a world
|
//Load a world
|
||||||
World world = PocketManager.loadDimension(dimension.id());
|
World world = PocketManager.loadDimension(dimension.id());
|
||||||
@@ -414,8 +401,9 @@ public class PocketBuilder
|
|||||||
int orientation = getDoorOrientation(source, properties);
|
int orientation = getDoorOrientation(source, properties);
|
||||||
|
|
||||||
//Place a link leading back out of the pocket
|
//Place a link leading back out of the pocket
|
||||||
DimLink reverseLink = dimension.createLink(source.getX(), destinationY, source.getZ(), LinkTypes.REVERSE,(link.orientation()+2)%4);
|
|
||||||
parent.setDestination(reverseLink, source.getX(), source.getY(), source.getZ());
|
DimLink reverseLink = dimension.createLink(source.getX(), destinationY, source.getZ(), LinkType.REVERSE,(link.orientation()+2)%4);
|
||||||
|
parent.setLinkDestination(reverseLink, source.getX(), source.getY(), source.getZ());
|
||||||
|
|
||||||
//Build the actual pocket area
|
//Build the actual pocket area
|
||||||
buildPocket(world, source.getX(), destinationY, source.getZ(), orientation, size, wallThickness, properties, door);
|
buildPocket(world, source.getX(), destinationY, source.getZ(), orientation, size, wallThickness, properties, door);
|
||||||
@@ -466,23 +454,31 @@ public class PocketBuilder
|
|||||||
BlockRotator.transformPoint(center, door, orientation - BlockRotator.EAST_DOOR_METADATA, door);
|
BlockRotator.transformPoint(center, door, orientation - BlockRotator.EAST_DOOR_METADATA, door);
|
||||||
|
|
||||||
//Build the outer layer of Eternal Fabric
|
//Build the outer layer of Eternal Fabric
|
||||||
buildBox(world, center.getX(), center.getY(), center.getZ(), (size / 2), properties.PermaFabricBlockID, false, 0);
|
buildBox(world, center.getX(), center.getY(), center.getZ(), (size / 2), properties.PermaFabricBlockID, 0, false, 0);
|
||||||
|
|
||||||
|
//check if we are building a personal pocket
|
||||||
|
int metadata = 0;
|
||||||
|
if(world.provider instanceof PersonalPocketProvider)
|
||||||
|
{
|
||||||
|
metadata = 2;
|
||||||
|
}
|
||||||
|
|
||||||
//Build the (wallThickness - 1) layers of Fabric of Reality
|
//Build the (wallThickness - 1) layers of Fabric of Reality
|
||||||
for (int layer = 1; layer < wallThickness; layer++)
|
for (int layer = 1; layer < wallThickness; layer++)
|
||||||
{
|
{
|
||||||
buildBox(world, center.getX(), center.getY(), center.getZ(), (size / 2) - layer, properties.FabricBlockID,
|
buildBox(world, center.getX(), center.getY(), center.getZ(), (size / 2) - layer, mod_pocketDim.blockDimWall.blockID, metadata,
|
||||||
layer < (wallThickness - 1) && properties.TNFREAKINGT_Enabled, properties.NonTntWeight);
|
layer < (wallThickness - 1) && properties.TNFREAKINGT_Enabled, properties.NonTntWeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
//MazeBuilder.generate(world, x, y, z, random);
|
//MazeBuilder.generate(world, x, y, z, random);
|
||||||
|
|
||||||
//Build the door
|
//Build the door
|
||||||
int doorOrientation = BlockRotator.transformMetadata(BlockRotator.EAST_DOOR_METADATA, orientation - BlockRotator.EAST_DOOR_METADATA + 2, properties.DimensionalDoorID);
|
int doorOrientation = BlockRotator.transformMetadata(BlockRotator.EAST_DOOR_METADATA, orientation - BlockRotator.EAST_DOOR_METADATA + 2, doorBlock.blockID);
|
||||||
ItemDimensionalDoor.placeDoorBlock(world, x, y - 1, z, doorOrientation, doorBlock);
|
ItemDimensionalDoor.placeDoorBlock(world, x, y - 1, z, doorOrientation, doorBlock);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void buildBox(World world, int centerX, int centerY, int centerZ, int radius, int blockID, boolean placeTnt, int nonTntWeight)
|
private static void buildBox(World world, int centerX, int centerY, int centerZ, int radius, int blockID, int metadata, boolean placeTnt, int nonTntWeight)
|
||||||
{
|
{
|
||||||
int x, y, z;
|
int x, y, z;
|
||||||
|
|
||||||
@@ -499,14 +495,14 @@ public class PocketBuilder
|
|||||||
{
|
{
|
||||||
for (z = startZ; z <= endZ; z++)
|
for (z = startZ; z <= endZ; z++)
|
||||||
{
|
{
|
||||||
setBlockDirectlySpecial(world, x, startY, z, blockID, 0, placeTnt, nonTntWeight);
|
setBlockDirectlySpecial(world, x, startY, z, blockID, metadata, placeTnt, nonTntWeight);
|
||||||
setBlockDirectlySpecial(world, x, endY, z, blockID, 0, placeTnt, nonTntWeight);
|
setBlockDirectlySpecial(world, x, endY, z, blockID, metadata, placeTnt, nonTntWeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (y = startY; y <= endY; y++)
|
for (y = startY; y <= endY; y++)
|
||||||
{
|
{
|
||||||
setBlockDirectlySpecial(world, x, y, startZ, blockID, 0, placeTnt, nonTntWeight);
|
setBlockDirectlySpecial(world, x, y, startZ, blockID, metadata, placeTnt, nonTntWeight);
|
||||||
setBlockDirectlySpecial(world, x, y, endZ, blockID, 0, placeTnt, nonTntWeight);
|
setBlockDirectlySpecial(world, x, y, endZ, blockID, metadata, placeTnt, nonTntWeight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -514,8 +510,8 @@ public class PocketBuilder
|
|||||||
{
|
{
|
||||||
for (z = startZ; z <= endZ; z++)
|
for (z = startZ; z <= endZ; z++)
|
||||||
{
|
{
|
||||||
setBlockDirectlySpecial(world, startX, y, z, blockID, 0, placeTnt, nonTntWeight);
|
setBlockDirectlySpecial(world, startX, y, z, blockID, metadata, placeTnt, nonTntWeight);
|
||||||
setBlockDirectlySpecial(world, endX, y, z, blockID, 0, placeTnt, nonTntWeight);
|
setBlockDirectlySpecial(world, endX, y, z, blockID, metadata, placeTnt, nonTntWeight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -559,4 +555,39 @@ public class PocketBuilder
|
|||||||
extBlockStorage.setExtBlockMetadata(localX, y & 15, localZ, metadata);
|
extBlockStorage.setExtBlockMetadata(localX, y & 15, localZ, metadata);
|
||||||
chunk.setChunkModified();
|
chunk.setChunkModified();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static BoundingBox calculateDefaultBounds(NewDimData pocket)
|
||||||
|
{
|
||||||
|
// Calculate the XZ bounds of this pocket assuming that it has the default size
|
||||||
|
// The Y bounds will be set to encompass the height of a chunk.
|
||||||
|
|
||||||
|
int minX = 0;
|
||||||
|
int minZ = 0;
|
||||||
|
Point4D origin = pocket.origin();
|
||||||
|
int orientation = pocket.orientation();
|
||||||
|
if (orientation < 0 || orientation > 3)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("pocket has an invalid orientation value.");
|
||||||
|
}
|
||||||
|
switch (orientation)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
minX = origin.getX() - DEFAULT_POCKET_WALL_THICKNESS + 1;
|
||||||
|
minZ = origin.getZ() - DEFAULT_POCKET_SIZE / 2;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
minX = origin.getX() - DEFAULT_POCKET_SIZE / 2;
|
||||||
|
minZ = origin.getZ() - DEFAULT_POCKET_WALL_THICKNESS + 1;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
minX = origin.getX() + DEFAULT_POCKET_WALL_THICKNESS - DEFAULT_POCKET_SIZE;
|
||||||
|
minZ = origin.getZ() - DEFAULT_POCKET_SIZE / 2;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
minX = origin.getX() - DEFAULT_POCKET_SIZE / 2;
|
||||||
|
minZ = origin.getZ() + DEFAULT_POCKET_WALL_THICKNESS - DEFAULT_POCKET_SIZE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return new BoundingBox(minX, 0, minZ, DEFAULT_POCKET_SIZE, 255, DEFAULT_POCKET_SIZE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ public class PocketGenerator extends ChunkProviderGenerate
|
|||||||
@Override
|
@Override
|
||||||
public List getPossibleCreatures(EnumCreatureType var1, int var2, int var3, int var4)
|
public List getPossibleCreatures(EnumCreatureType var1, int var2, int var3, int var4)
|
||||||
{
|
{
|
||||||
NewDimData dimension = PocketManager.getDimensionData(this.worldObj);
|
NewDimData dimension = PocketManager.createDimensionData(this.worldObj);
|
||||||
if (dimension != null && dimension.dungeon() != null && !dimension.dungeon().isOpen())
|
if (dimension != null && dimension.dungeon() != null && !dimension.dungeon().isOpen())
|
||||||
{
|
{
|
||||||
return this.worldObj.getBiomeGenForCoords(var2, var3).getSpawnableList(var1);
|
return this.worldObj.getBiomeGenForCoords(var2, var3).getSpawnableList(var1);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user