From b393c763a9cdf16dc763c4054478748b5489bc8f Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 9 Mar 2014 10:07:35 -0400 Subject: [PATCH 01/14] Minor Change Minor change to configuration explanation --- src/main/java/StevenDimDoors/mod_pocketDim/DDProperties.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/DDProperties.java b/src/main/java/StevenDimDoors/mod_pocketDim/DDProperties.java index 0c61faf..f0494ce 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/DDProperties.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/DDProperties.java @@ -157,7 +157,7 @@ public class DDProperties "Sets whether groups of connected rifts will spawn Endermen").getBoolean(true); LimboEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Limbo", true, - "Sets whether the Limbo dimension is activated").getBoolean(true); + "Sets whether players are teleported to Limbo when they die in any pocket dimension").getBoolean(true); LimboReturnsInventoryEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Limbo Returns Inventory", true, "Sets whether players keep their inventories upon dying and respawning in Limbo").getBoolean(true); HardcoreLimboEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Hardcore Limbo", false, From 946ac37a27ab0026b1147a863a9f866435d1420f Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 11 Mar 2014 01:31:10 -0400 Subject: [PATCH 02/14] Changes to Schematics Added SK-RaceTheLight to our schematics. Changed the weights on Cere-FloatingAltar and Cere-PuzzleWall to 75 (previously 100). Fixed what appears to be a mistake pasted into ruins.txt and also updated it for the latest dungeons. --- src/main/resources/schematics/ruins.txt | 6 +++--- ...omplexHall_Cere-PuzzleWall_Open_75.schematic} | Bin ...DeadEnd_Cere-FloatingAltar_Open_75.schematic} | Bin .../Trap_SK-RaceTheLight_Closed_50.schematic | Bin 0 -> 1604 bytes 4 files changed, 3 insertions(+), 3 deletions(-) rename src/main/resources/schematics/ruins/{ComplexHall_Cere-PuzzleWall_Open.schematic => ComplexHall_Cere-PuzzleWall_Open_75.schematic} (100%) rename src/main/resources/schematics/ruins/{DeadEnd_Cere-FloatingAltar_Open_100.schematic => DeadEnd_Cere-FloatingAltar_Open_75.schematic} (100%) create mode 100644 src/main/resources/schematics/ruins/Trap_SK-RaceTheLight_Closed_50.schematic diff --git a/src/main/resources/schematics/ruins.txt b/src/main/resources/schematics/ruins.txt index 2641e62..f922cbb 100644 --- a/src/main/resources/schematics/ruins.txt +++ b/src/main/resources/schematics/ruins.txt @@ -1,4 +1,5 @@ /schematics/ruins/complexHall_buggyTopEntry1_open_100.schematic +/schematics/ruins/ComplexHall_Cere-PuzzleWall_Open_75.schematic /schematics/ruins/complexHall_exitRuinsWithHiddenDoor_open_100.schematic /schematics/ruins/complexHall_hallwayHiddenTreasure_closed_100.schematic /schematics/ruins/complexHall_largeBrokenHall_closed_100.schematic @@ -15,6 +16,7 @@ /schematics/ruins/complexHall_tntPuzzleTrap_closed_50.schematic /schematics/ruins/deadEnd_azersDungeonO_closed_100.schematic /schematics/ruins/deadEnd_brokenPillarsO_open_100.schematic +/schematics/ruins/DeadEnd_Cere-FloatingAltar_Open_75.schematic /schematics/ruins/deadEnd_diamondTowerTemple1_open_100.schematic /schematics/ruins/deadEnd_fallingTrapO_open_100.schematic /schematics/ruins/deadEnd_hiddenStaircaseO_open_100.schematic @@ -72,6 +74,7 @@ /schematics/ruins/trap_pistonSmasherHall_closed_100.schematic /schematics/ruins/Trap_SK-FakeTNTTrap-B_Closed_50.schematic /schematics/ruins/Trap_SK-NicolesTower_Open_50.schematic +/schematics/ruins/Trap_SK-RaceTheLight_Closed_50.schematic /schematics/ruins/Trap_SK-RestlessCorridor_Open_40.schematic /schematics/ruins/Trap_SK-SimpleLeftTrap_Closed_50.schematic /schematics/ruins/Trap_SK-SimpleRightTrap_Closed_50.schematic @@ -79,6 +82,3 @@ /schematics/ruins/Trap_SK-TrappedStairsUp_Closed_50.schematic /schematics/ruins/Trap_SK-UTrapRight_Open_50.schematic /schematics/ruins/trap_wallFallcomboPistonHall_closed_200.schematic -/schematics/ruins/DeadEnd_Floating-Altar_Open_100.schematic -/schematics/ruins/complexHall_exitRuinsWithHiddenDoor_open_100 -.schematic diff --git a/src/main/resources/schematics/ruins/ComplexHall_Cere-PuzzleWall_Open.schematic b/src/main/resources/schematics/ruins/ComplexHall_Cere-PuzzleWall_Open_75.schematic similarity index 100% rename from src/main/resources/schematics/ruins/ComplexHall_Cere-PuzzleWall_Open.schematic rename to src/main/resources/schematics/ruins/ComplexHall_Cere-PuzzleWall_Open_75.schematic diff --git a/src/main/resources/schematics/ruins/DeadEnd_Cere-FloatingAltar_Open_100.schematic b/src/main/resources/schematics/ruins/DeadEnd_Cere-FloatingAltar_Open_75.schematic similarity index 100% rename from src/main/resources/schematics/ruins/DeadEnd_Cere-FloatingAltar_Open_100.schematic rename to src/main/resources/schematics/ruins/DeadEnd_Cere-FloatingAltar_Open_75.schematic diff --git a/src/main/resources/schematics/ruins/Trap_SK-RaceTheLight_Closed_50.schematic b/src/main/resources/schematics/ruins/Trap_SK-RaceTheLight_Closed_50.schematic new file mode 100644 index 0000000000000000000000000000000000000000..44df526533179a4e94cce055107c1164381976a7 GIT binary patch literal 1604 zcmV-K2D|wmiwFP!000000PUU6Zrer>#)pz<{j;q&X#@09G-n3B63C@Z<)A67A_W|v zCkG%b)*>R4fo-60n&l? z#ns5Zv3%#M35_$$w*Y?ffkYyasw_RwuJ?hIh4i`(++(YE1H=V&VGvCb0^&1dK%-o# zZtZ#pN~3xs5W7(ikGZDTYgvQ#9Ow*yxPk?`Iv_qHy0&ux@ArH_cv`l?xYKQC8|mEJ zb1mGc1INJm>-hk!;2w*3hOTR>W+aI4jM~bKoy(8ri{{SBMfS0Op zW4DJMaUAs8Nw}DCbe#Q+o|+lO3p*_CI=kM9@{4O>uO3}a1S%q+f!5oD8HH4f7Vg=p z$1V!C5kH6Jn^8zrHSFlhQU>t9lL^+s2tX@Bz>QYvW+-!4r7C-E-*BM#U$^0_J{;)6 z6#$JrnSr&^1Wz2Ls%Y3ZrM;yr?F144bvKW+m;c&c+wg3IB<{7K;+WUh0Q+rN;UcPh zcXzsyDSg;wrF7jcx}c{S+XIy<|Fyjc!oIW6Hjt{$$V2F9Lt!TsL+FW9%rlBaB9TZW z5{X12kw_#Gi9{li)T#}w7q0L4jy;RM7HvWMH_NxDjy0Zv{(L+cS#3Cc?TqdCWu4$v zKej>t)wgfrnwm3&gO}c9Vo&Sv;PupUXMft$zUPgH-a9vVNxcr*U*Wjm@x$Wz`{1zy zqMaH@r><}(9qDu^-01-6bfm1)v2dr_qEjc~_`JB&_iiTE)bhQc!Qrc0e{$zmE!!sa}NF)-8 zL?V$&tfnwgS+OI%TdFx(c_Im#^Nw=>Fxd+bzrn0*Uv8eP21Eo*RzWjWtK7lr?#Azf zY$w~R1ITu=T_umy)fog5fK)=&;NYe0 zT#tNsTm$_NXXuaMyCxjO|F)o%|D)wSBLV~jK*@x^LFRP?sthRY2rz;l0>J!Ma!~QK ze+k8c@L+%WY<$iO7$pGFz=FE(~+a3Q9W$&Uqk+)Dtd1D5x( zjz<=0-^H~Zc-qUf6G(uaroF<~b_25=15n8LlniWbJ6+oq0*SOs0H7H~N_%Cm?MlHZ z0#5Hv1uOP{#DD4EQ1NJ5D1PI83Vy2x$%2Roy9sUD5_v~$6vj6~h C<|bwU literal 0 HcmV?d00001 From 836eb8a7e09798763d8de63b69f506f22354c260 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 11 Mar 2014 05:38:40 -0400 Subject: [PATCH 03/14] Added Support for Cluster and Gateway Filters Added a per-save config file called DimDoorsWorld.cfg. Its corresponding class is DDWorldProperties. This class supports whitelisting and blacklisting dimensions for Rift Cluster and Rift Gateway generation. Note that our ban against generating gateways in the Nether and The End still applies regardless of those settings. The new config file is loaded before the server starts initializing terrain. Also moved DDProperties to another package alongside DDWorldProperties - that required updating references in most of the mod's files. --- .../experimental/SphereDecayOperation.java | 2 +- .../mod_pocketDim/CraftingManager.java | 1 + .../StevenDimDoors/mod_pocketDim/DDLoot.java | 1 + .../StevenDimDoors/mod_pocketDim/DimData.java | 2 + .../mod_pocketDim/EventHookContainer.java | 1 + .../mod_pocketDim/blocks/BaseDimDoor.java | 2 +- .../blocks/BlockDimWallPerm.java | 2 +- .../mod_pocketDim/blocks/BlockDoorGold.java | 2 +- .../blocks/BlockGoldDimDoor.java | 2 +- .../mod_pocketDim/blocks/BlockRift.java | 2 +- .../mod_pocketDim/blocks/DimensionalDoor.java | 2 +- .../mod_pocketDim/blocks/TransientDoor.java | 2 +- .../mod_pocketDim/blocks/UnstableDoor.java | 2 +- .../mod_pocketDim/blocks/WarpDoor.java | 2 +- .../commands/CommandExportDungeon.java | 2 +- .../{ => config}/DDProperties.java | 6 +- .../config/DDWorldProperties.java | 68 ++++++++++++++ .../mod_pocketDim/config/DimensionFilter.java | 93 +++++++++++++++++++ .../mod_pocketDim/core/DDTeleporter.java | 2 +- .../mod_pocketDim/core/NewDimData.java | 2 +- .../mod_pocketDim/core/PocketManager.java | 2 +- .../dungeon/DungeonSchematic.java | 2 +- .../dungeon/FillContainersOperation.java | 2 +- .../mod_pocketDim/helpers/DungeonHelper.java | 2 +- .../mod_pocketDim/items/BaseItemDoor.java | 2 +- .../mod_pocketDim/items/ItemRiftBlade.java | 2 +- .../mod_pocketDim/mod_pocketDim.java | 30 ++++-- .../ticking/CustomLimboPopulator.java | 2 +- .../mod_pocketDim/ticking/LimboDecay.java | 2 +- .../mod_pocketDim/ticking/MobMonolith.java | 2 +- .../tileentities/TileEntityRift.java | 2 +- .../mod_pocketDim/world/CustomCaveGen.java | 2 +- .../mod_pocketDim/world/LimboGenerator.java | 2 +- .../mod_pocketDim/world/LimboProvider.java | 2 +- .../mod_pocketDim/world/PocketBuilder.java | 2 +- .../mod_pocketDim/world/PocketProvider.java | 2 +- .../fortresses/DDNetherFortressGenerator.java | 2 +- .../DDStructureNetherBridgeStart.java | 2 +- .../world/gateways/BaseGateway.java | 2 +- .../world/gateways/GatewayGenerator.java | 27 +++--- .../world/gateways/GatewayLimbo.java | 2 +- .../gateways/GatewaySandstonePillars.java | 2 +- .../world/gateways/GatewayTwoPillars.java | 2 +- .../mod_pocketDimClient/RenderDimDoor.java | 2 +- .../RenderTransTrapdoor.java | 2 +- 45 files changed, 240 insertions(+), 61 deletions(-) rename src/main/java/StevenDimDoors/mod_pocketDim/{ => config}/DDProperties.java (97%) create mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/config/DDWorldProperties.java create mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/config/DimensionFilter.java diff --git a/src/main/java/StevenDimDoors/experimental/SphereDecayOperation.java b/src/main/java/StevenDimDoors/experimental/SphereDecayOperation.java index 95587b6..0af0bac 100644 --- a/src/main/java/StevenDimDoors/experimental/SphereDecayOperation.java +++ b/src/main/java/StevenDimDoors/experimental/SphereDecayOperation.java @@ -12,8 +12,8 @@ import net.minecraft.tileentity.TileEntityChest; import net.minecraft.tileentity.TileEntityDispenser; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDLoot; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.schematic.WorldOperation; /** diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java b/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java index 9109f16..086054a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java @@ -1,5 +1,6 @@ package StevenDimDoors.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java b/src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java index 74dc5e9..599786f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java @@ -12,6 +12,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.WeightedRandom; import net.minecraft.util.WeightedRandomChestContent; import net.minecraftforge.common.ChestGenHooks; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.util.WeightedContainer; /* diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/DimData.java b/src/main/java/StevenDimDoors/mod_pocketDim/DimData.java index 7648161..cd57285 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/DimData.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/DimData.java @@ -8,6 +8,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import StevenDimDoors.mod_pocketDim.config.DDProperties; + import net.minecraft.util.MathHelper; import net.minecraft.world.World; @Deprecated diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 8f6c4a3..d3b09f4 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -19,6 +19,7 @@ import net.minecraftforge.event.entity.living.LivingFallEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.terraingen.InitMapGenEvent; import net.minecraftforge.event.world.WorldEvent; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.items.BaseItemDoor; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java index ee37ab0..9c56e91 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java @@ -17,8 +17,8 @@ import net.minecraft.util.Icon; import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java index 5047d9e..42a2d1e 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java @@ -11,8 +11,8 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import StevenDimDoors.mod_pocketDim.util.Point4D; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java index 54972e4..1e8f91e 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java @@ -4,8 +4,8 @@ import java.util.Random; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import net.minecraft.block.BlockDoor; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.IconFlipped; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java index b4ffd21..5a788db 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java @@ -1,7 +1,7 @@ package StevenDimDoors.mod_pocketDim.blocks; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java index 5f6f896..4e307cd 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java @@ -20,9 +20,9 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fluids.IFluidBlock; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java index f8869ea..42d25f6 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java @@ -3,7 +3,7 @@ package StevenDimDoors.mod_pocketDim.blocks; import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java index bac5c5d..fb0a187 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java @@ -6,7 +6,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java index cf2b699..e59a94c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java @@ -3,7 +3,7 @@ package StevenDimDoors.mod_pocketDim.blocks; import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java index 7decebf..6f7d881 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java @@ -3,7 +3,7 @@ package StevenDimDoors.mod_pocketDim.blocks; import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java index 86008cd..4c0ad4d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java @@ -4,7 +4,7 @@ import java.io.File; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayer; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; public class CommandExportDungeon extends DDCommandBase diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/DDProperties.java b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java similarity index 97% rename from src/main/java/StevenDimDoors/mod_pocketDim/DDProperties.java rename to src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java index f0494ce..18378df 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/DDProperties.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java @@ -1,4 +1,4 @@ -package StevenDimDoors.mod_pocketDim; +package StevenDimDoors.mod_pocketDim.config; import java.io.File; @@ -87,7 +87,6 @@ public class DDProperties * Other Flags */ - public final boolean WorldRiftGenerationEnabled; public final boolean RiftSpreadEnabled; public final boolean RiftGriefingEnabled; public final boolean RiftsSpawnEndermenEnabled; @@ -204,9 +203,6 @@ public class DDProperties LimboDimensionID = config.get(CATEGORY_DIMENSION, "Limbo Dimension ID", -23).getInt(); PocketProviderID = config.get(CATEGORY_PROVIDER, "Pocket Provider ID", 24).getInt(); LimboProviderID = config.get(CATEGORY_PROVIDER, "Limbo Provider ID", 13).getInt(); - - WorldRiftGenerationEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Rift World Generation", true, - "Sets whether dungeon rifts generate in dimensions other than Limbo").getBoolean(true); MonolithTeleportationEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Monolith Teleportation", true, "Sets whether Monoliths can teleport players").getBoolean(true); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDWorldProperties.java b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDWorldProperties.java new file mode 100644 index 0000000..f669ded --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDWorldProperties.java @@ -0,0 +1,68 @@ +package StevenDimDoors.mod_pocketDim.config; + +import java.io.File; + +import net.minecraftforge.common.Configuration; + +public class DDWorldProperties +{ + /** + * World Generation Settings + */ + + public final DimensionFilter RiftClusterDimensions; + public final DimensionFilter RiftGatewayDimensions; + + //Names of categories + private static final String CATEGORY_WORLD_GENERATION = "world generation"; + + public DDWorldProperties(File configFile) + { + // TODO: For the next major update (e.g. to MC 1.7), please move all world-specific settings + // into this config file instead of using the global ID file. + + Configuration config = new Configuration(configFile); + config.load(); + + config.addCustomCategoryComment(CATEGORY_WORLD_GENERATION, + "The following settings require lists of dimensions in a specific format. " + + "A list must consist of ranges separated by commas. A range may be a single number to indicate " + + "just one dimension or two numbers in the form \"X - Y\". Spaces are permitted " + + "but not required. Example: -100, -10 - -1, 20 - 30"); + + RiftClusterDimensions = loadFilter(config, "Rift Cluster", "Rift Clusters"); + RiftGatewayDimensions = loadFilter(config, "Rift Gateway", "Rift Gateways"); + + config.save(); + } + + private static DimensionFilter loadFilter(Configuration config, String prefix, String description) + { + boolean enableBlacklist = config.get(CATEGORY_WORLD_GENERATION, "Enable " + prefix + " Blacklist", true, + "Sets whether " + description + " will not generate in certain blacklisted dimensions. " + + "If set to false, then " + description + " will follow a whitelist instead.").getBoolean(true); + + String whitelist = config.get(CATEGORY_WORLD_GENERATION, prefix + " Whitelist", "", + "A list of the only dimensions in which " + description + " may generate.").getString(); + + String blacklist = config.get(CATEGORY_WORLD_GENERATION, prefix + " Blacklist", "", + "A list of dimensions in which " + description + " may not generate.").getString(); + + try + { + if (enableBlacklist) + { + return DimensionFilter.parseBlacklist(blacklist); + } + else + { + return DimensionFilter.parseWhitelist(whitelist); + } + } + catch (Exception inner) + { + throw new RuntimeException("An error occurred while loading a whitelist or blacklist setting for " + + description + ". Please make sure that your configuration file is set up correctly.", inner); + } + } +} \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/config/DimensionFilter.java b/src/main/java/StevenDimDoors/mod_pocketDim/config/DimensionFilter.java new file mode 100644 index 0000000..53b8b3e --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/config/DimensionFilter.java @@ -0,0 +1,93 @@ +package StevenDimDoors.mod_pocketDim.config; + +import com.google.common.collect.Range; +import com.google.common.collect.RangeSet; +import com.google.common.collect.TreeRangeSet; + +public class DimensionFilter +{ + private RangeSet blacklist; + + private DimensionFilter(RangeSet blacklist) + { + this.blacklist = blacklist; + } + + public boolean isAccepted(int dimensionID) + { + return !blacklist.contains(dimensionID); + } + + public boolean isRejected(int dimensionID) + { + return blacklist.contains(dimensionID); + } + + private static RangeSet parseRangeSet(String list) + { + int index; + int start; + int end; + String startPart; + String endPart; + String[] intervals; + RangeSet ranges = TreeRangeSet.create(); + + // Strip out all whitespace characters + list = list.replaceAll("\\s", ""); + if (list.isEmpty()) + { + return ranges; + } + intervals = list.split(","); + + // Iterate over all the interval strings + for (String interval : intervals) + { + // Check if the interval contains a minus sign after the first character + // That indicates that we're dealing with an interval and not a single number + if (interval.length() > 1) + { + index = interval.indexOf("-", 1); + } + else + { + index = -1; + } + try + { + if (index >= 0) + { + // Parse this as a range with two values as endpoints + startPart = interval.substring(0, index); + endPart = interval.substring(index + 1); + start = Integer.parseInt(startPart); + end = Integer.parseInt(endPart); + } + else + { + // Parse this as a single value + start = Integer.parseInt(interval); + end = start; + } + // Add the interval to the set of intervals + ranges.add( Range.closed(start, end) ); + } + catch (Exception e) + { + throw new IllegalArgumentException("\"" + interval + "\" is not a valid value or range for dimension IDs"); + } + } + return ranges; + } + + public static DimensionFilter parseWhitelist(String list) + { + return new DimensionFilter(parseRangeSet(list).complement()); + } + + public static DimensionFilter parseBlacklist(String list) + { + return new DimensionFilter(parseRangeSet(list)); + } +} diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index e4e9c7a..8905140 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -22,10 +22,10 @@ import net.minecraft.world.WorldServer; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.network.ForgePacket; import net.minecraftforge.common.network.packet.DimensionRegisterPacket; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import StevenDimDoors.mod_pocketDim.items.BaseItemDoor; import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java index 46158a8..6eb201b 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -8,8 +8,8 @@ import java.util.TreeMap; import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.util.Point4D; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 29fbf75..842c6c8 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -15,9 +15,9 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.DimensionManager; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.helpers.Compactor; import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder; import StevenDimDoors.mod_pocketDim.saving.DDSaveHandler; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 8395d9b..38848ad 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -16,9 +16,9 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntitySign; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.blocks.IDimDoor; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java index 62bec13..5a91f31 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java @@ -12,7 +12,7 @@ import net.minecraft.tileentity.TileEntityChest; import net.minecraft.tileentity.TileEntityDispenser; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDLoot; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.schematic.WorldOperation; public class FillContainersOperation extends WorldOperation diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index 3f8e7a3..56de06a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -19,8 +19,8 @@ import java.util.regex.Pattern; import net.minecraft.util.WeightedRandom; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java index 8651270..e97ad6a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java @@ -11,8 +11,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java index ceee388..a49735a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java @@ -20,8 +20,8 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.PocketManager; import com.google.common.collect.Multimap; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index a4e6844..b433abb 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -15,7 +15,6 @@ import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fluids.Fluid; import StevenDimDoors.mod_pocketDim.blocks.BlockDimWall; import StevenDimDoors.mod_pocketDim.blocks.BlockDimWallPerm; import StevenDimDoors.mod_pocketDim.blocks.BlockDoorGold; @@ -34,6 +33,8 @@ import StevenDimDoors.mod_pocketDim.commands.CommandDeleteRifts; import StevenDimDoors.mod_pocketDim.commands.CommandExportDungeon; import StevenDimDoors.mod_pocketDim.commands.CommandResetDungeons; import StevenDimDoors.mod_pocketDim.commands.CommandTeleportPlayer; +import StevenDimDoors.mod_pocketDim.config.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDWorldProperties; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.ChunkLoaderHelper; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; @@ -74,8 +75,9 @@ import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.event.FMLServerAboutToStartEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; -import cpw.mods.fml.common.event.FMLServerStoppingEvent; +import cpw.mods.fml.common.event.FMLServerStoppedEvent; import cpw.mods.fml.common.network.NetworkMod; import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler; import cpw.mods.fml.common.registry.EntityRegistry; @@ -134,6 +136,7 @@ public class mod_pocketDim public static boolean isPlayerWearingGoogles = false; public static DDProperties properties; + public static DDWorldProperties worldProperties; public static CustomLimboPopulator spawner; //Added this field temporarily. Will be refactored out later. public static FastRiftRegenerator fastRiftRegenerator; public static GatewayGenerator gatewayGenerator; @@ -296,25 +299,36 @@ public class mod_pocketDim } @EventHandler - public void onServerStopping(FMLServerStoppingEvent event) + public void onServerStopped(FMLServerStoppedEvent event) { try { PocketManager.unload(); deathTracker.writeToFile(); deathTracker = null; + worldProperties = null; } catch (Exception e) { e.printStackTrace(); } } + + @EventHandler + public void onServerAboutToStart(FMLServerAboutToStartEvent event) + { + final String saveRootDirectory = DimensionManager.getCurrentSaveRootDirectory().getAbsolutePath(); + + // Load the config file that's specific to this world + worldProperties = new DDWorldProperties(new File(saveRootDirectory + "/DimensionalDoors/DimDoorsWorld.cfg")); + + // Initialize a new DeathTracker + deathTracker = new DeathTracker(saveRootDirectory + "/DimensionalDoors/data/deaths.txt"); + } @EventHandler public void onServerStarting(FMLServerStartingEvent event) { - //TODO- load dims with forced chunks on server startup here - // Register commands with the server event.registerServerCommand( CommandResetDungeons.instance() ); event.registerServerCommand( CommandCreateDungeonRift.instance() ); @@ -327,9 +341,6 @@ public class mod_pocketDim event.registerServerCommand( CommandCreatePocket.instance() ); event.registerServerCommand( CommandTeleportPlayer.instance() ); - // Initialize a new DeathTracker - String deathTrackerFile = DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/data/deaths.txt"; - deathTracker = new DeathTracker(deathTrackerFile); try { @@ -337,7 +348,8 @@ public class mod_pocketDim } catch (Exception e) { - System.out.println("Loading chunkloaders failed"); + System.err.println("Failed to load chunk loaders for Dimensional Doors. The following error occurred:"); + System.err.println(e.toString()); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/CustomLimboPopulator.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/CustomLimboPopulator.java index 908e2e9..465e57b 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/CustomLimboPopulator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/CustomLimboPopulator.java @@ -9,8 +9,8 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.world.GameRules; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/LimboDecay.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/LimboDecay.java index c325109..e5c9420 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/LimboDecay.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/LimboDecay.java @@ -7,7 +7,7 @@ import net.minecraft.block.BlockContainer; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; /** * Provides methods for applying Limbo decay. Limbo decay refers to the effect that most blocks placed in Limbo diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java index 9119d08..ae1f7cc 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java @@ -18,8 +18,8 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.world.LimboProvider; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index 6432062..d597e9f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -25,9 +25,9 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.ServerPacketHandler; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/CustomCaveGen.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/CustomCaveGen.java index 3e892be..1f9b680 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/CustomCaveGen.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/CustomCaveGen.java @@ -6,7 +6,7 @@ import net.minecraft.block.Block; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.gen.MapGenBase; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; public class CustomCaveGen extends MapGenBase { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboGenerator.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboGenerator.java index a53faaf..dd3185f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboGenerator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboGenerator.java @@ -17,7 +17,7 @@ import net.minecraft.world.gen.feature.MapGenScatteredFeature; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.Event.Result; import net.minecraftforge.event.terraingen.ChunkProviderEvent; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.ticking.CustomLimboPopulator; public class LimboGenerator extends ChunkProviderGenerate diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java index 71e587d..3be9520 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java @@ -12,8 +12,8 @@ import net.minecraft.world.biome.WorldChunkManagerHell; import net.minecraft.world.chunk.IChunkProvider; import net.minecraftforge.client.IRenderHandler; import StevenDimDoors.mod_pocketDim.CloudRenderBlank; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.ticking.CustomLimboPopulator; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index 8a30d34..c384ec4 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -9,9 +9,9 @@ import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.storage.ExtendedBlockStorage; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.experimental.MazeBuilder; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.blocks.IDimDoor; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketProvider.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketProvider.java index 33f8c70..08924d8 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketProvider.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketProvider.java @@ -9,8 +9,8 @@ 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.DDProperties; 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; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDNetherFortressGenerator.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDNetherFortressGenerator.java index c34c5fe..644a5c1 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDNetherFortressGenerator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDNetherFortressGenerator.java @@ -1,6 +1,6 @@ package StevenDimDoors.mod_pocketDim.world.fortresses; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import net.minecraft.world.gen.structure.MapGenNetherBridge; import net.minecraft.world.gen.structure.MapGenStructureIO; import net.minecraft.world.gen.structure.StructureStart; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDStructureNetherBridgeStart.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDStructureNetherBridgeStart.java index 5736e36..bc7cc06 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDStructureNetherBridgeStart.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDStructureNetherBridgeStart.java @@ -10,7 +10,7 @@ import net.minecraft.world.gen.structure.ComponentNetherBridgeThrone; import net.minecraft.world.gen.structure.StructureBoundingBox; import net.minecraft.world.gen.structure.StructureComponent; import net.minecraft.world.gen.structure.StructureNetherBridgeStart; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; public class DDStructureNetherBridgeStart extends StructureNetherBridgeStart { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java index 0a2b47d..92572b7 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java @@ -6,9 +6,9 @@ import java.util.Random; import java.util.TreeMap; import java.util.Map.Entry; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayGenerator.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayGenerator.java index a95ee24..9936150 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayGenerator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayGenerator.java @@ -8,8 +8,8 @@ import net.minecraft.block.material.Material; import net.minecraft.world.World; import net.minecraft.world.chunk.IChunkProvider; import net.minecraftforge.common.DimensionManager; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; @@ -58,15 +58,17 @@ public class GatewayGenerator implements IWorldGenerator @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { - //Don't generate rifts or gateways if the rift generation flag is disabled, - //the current world is a pocket dimension, or the world is remote. - //Also don't generate anything in The End. - if (world.isRemote || (!properties.WorldRiftGenerationEnabled) || - (world.provider instanceof PocketProvider) || (world.provider.dimensionId == END_DIMENSION_ID)||(world.provider.dimensionId == NETHER_DIMENSION_ID)) + // Don't generate rifts or gateways if the current world is a pocket dimension or the world is remote. + // Also don't generate anything in the Nether or The End. + int dimensionID = world.provider.dimensionId; + if (world.isRemote + || (world.provider instanceof PocketProvider) + || (dimensionID == END_DIMENSION_ID) + || (dimensionID == NETHER_DIMENSION_ID)) { return; } - //This check prevents a crash related to superflat worlds not loading World 0 + // This check prevents a crash related to superflat worlds not loading World 0 if (DimensionManager.getWorld(OVERWORLD_DIMENSION_ID) == null) { return; @@ -78,8 +80,10 @@ public class GatewayGenerator implements IWorldGenerator DimLink link; NewDimData dimension; - //Randomly decide whether to place a cluster of rifts here - if (random.nextInt(MAX_CLUSTER_GENERATION_CHANCE) < properties.ClusterGenerationChance) + // Check if we're allowed to generate rift clusters in this dimension. + // If so, randomly decide whether to one. + if (mod_pocketDim.worldProperties.RiftClusterDimensions.isAccepted(dimensionID) + && random.nextInt(MAX_CLUSTER_GENERATION_CHANCE) < properties.ClusterGenerationChance) { link = null; dimension = null; @@ -113,9 +117,10 @@ public class GatewayGenerator implements IWorldGenerator while (random.nextInt(MAX_CLUSTER_GROWTH_CHANCE) < CLUSTER_GROWTH_CHANCE); } - // Randomly decide whether to place a Rift Gateway here. + // Check if we can place a Rift Gateway in this dimension, then randomly decide whether to place one. // This only happens if a rift cluster was NOT generated. - else if (random.nextInt(MAX_GATEWAY_GENERATION_CHANCE) < properties.GatewayGenerationChance) + else if (mod_pocketDim.worldProperties.RiftGatewayDimensions.isAccepted(dimensionID) && + random.nextInt(MAX_GATEWAY_GENERATION_CHANCE) < properties.GatewayGenerationChance) { valid = false; x = y = z = 0; //Stop the compiler from freaking out diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java index 8c54e2c..6dbf10b 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java @@ -1,8 +1,8 @@ package StevenDimDoors.mod_pocketDim.world.gateways; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.items.BaseItemDoor; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewaySandstonePillars.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewaySandstonePillars.java index 32b0bfa..cab1e12 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewaySandstonePillars.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewaySandstonePillars.java @@ -3,8 +3,8 @@ package StevenDimDoors.mod_pocketDim.world.gateways; import java.util.ArrayList; import java.util.Random; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import net.minecraft.block.Block; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java index 595d522..9e1ea33 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java @@ -2,8 +2,8 @@ package StevenDimDoors.mod_pocketDim.world.gateways; import java.util.ArrayList; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.world.LimboProvider; diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java index 88358d1..6639974 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java @@ -11,8 +11,8 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java index dc65e57..0f3ea97 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java @@ -11,9 +11,9 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.blocks.TransTrapdoor; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityTransTrapdoor; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; From 73cb5ccb6c38fbc428ae2d9e3b1610d4a6d26b88 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 12 Mar 2014 05:08:49 -0400 Subject: [PATCH 04/14] Fixed Rifts Spreading through Walls Fixed the issue of rifts spreading through walls. We tried using raytracing but rifts would always "leak" out of unbreakable enclosures. With this latest change, rifts spread with the same logic that determines which blocks are reachable to them. --- .../mod_pocketDim/blocks/BlockRift.java | 84 +++++++++++++++---- .../mod_pocketDim/core/NewDimData.java | 1 - .../tileentities/TileEntityRift.java | 51 ++--------- 3 files changed, 73 insertions(+), 63 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java index 4e307cd..cc15c9f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java @@ -7,7 +7,6 @@ import java.util.Queue; import java.util.Random; import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.BlockFlowing; import net.minecraft.block.BlockFluid; import net.minecraft.block.ITileEntityProvider; @@ -27,6 +26,7 @@ import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; +import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDimClient.ClosingRiftFX; import StevenDimDoors.mod_pocketDimClient.GoggleRiftFX; import StevenDimDoors.mod_pocketDimClient.RiftFX; @@ -38,7 +38,7 @@ public class BlockRift extends Block implements ITileEntityProvider { private static final float MIN_IMMUNE_RESISTANCE = 5000.0F; private static final int BLOCK_DESTRUCTION_RANGE = 4; - private static final int BLOCK_DESTRUCTION_VOLUME = (int) Math.pow(2 * BLOCK_DESTRUCTION_RANGE + 1, 3); + private static final int RIFT_SPREAD_RANGE = 5; private static final int MAX_BLOCK_SEARCH_CHANCE = 100; private static final int BLOCK_SEARCH_CHANCE = 50; private static final int MAX_BLOCK_DESTRUCTION_CHANCE = 100; @@ -164,11 +164,30 @@ public class BlockRift extends Block implements ITileEntityProvider private void destroyNearbyBlocks(World world, int x, int y, int z, Random random) { - HashMap pointDistances = new HashMap(BLOCK_DESTRUCTION_VOLUME); - Queue points = new LinkedList(); + // Find reachable blocks that are vulnerable to rift damage (ignoring air, of course) + ArrayList targets = findReachableBlocks(world, x, y, z, BLOCK_DESTRUCTION_RANGE, false); - //Perform a breadth-first search outwards from the point at which the rift is located. Record the distances - //of the points we visit to stop the search at its maximum range. + // For each block, randomly decide whether to destroy it. + // The randomness makes it so the destroyed area appears "noisy" if the rift is exposed to a large surface. + for (Point3D target : targets) + { + if (random.nextInt(MAX_BLOCK_DESTRUCTION_CHANCE) < BLOCK_DESTRUCTION_CHANCE) + { + spawnWorldThread(world.getBlockId(target.getX(), target.getY(), target.getZ()), world, x, y, z, random); + world.destroyBlock(target.getX(), target.getY(), target.getZ(), false); + } + } + } + + private ArrayList findReachableBlocks(World world, int x, int y, int z, int range, boolean includeAir) + { + int searchVolume = (int) Math.pow(2 * range + 1, 3); + HashMap pointDistances = new HashMap(searchVolume); + Queue points = new LinkedList(); + ArrayList targets = new ArrayList(); + + // Perform a breadth-first search outwards from the point at which the rift is located. + // Record the distances of the points we visit to stop the search at its maximum range. pointDistances.put(new Point3D(x, y, z), 0); addAdjacentBlocks(x, y, z, 0, pointDistances, points); while (!points.isEmpty()) @@ -176,10 +195,14 @@ public class BlockRift extends Block implements ITileEntityProvider Point3D current = points.remove(); int distance = pointDistances.get(current); - //If the current block is air, continue searching. Otherwise, try destroying the block. + // If the current block is air, continue searching. Otherwise, add the block to our list. if (world.isAirBlock(current.getX(), current.getY(), current.getZ())) { - //Make sure we stay within the search range + if (includeAir) + { + targets.add(current); + } + // Make sure we stay within the search range if (distance < BLOCK_DESTRUCTION_RANGE) { addAdjacentBlocks(current.getX(), current.getY(), current.getZ(), distance, pointDistances, points); @@ -187,18 +210,16 @@ public class BlockRift extends Block implements ITileEntityProvider } else { - //Check if the current block is immune to destruction by rifts. If not, randomly decide whether to destroy it. - //The randomness makes it so the destroyed area appears "noisy" if the rift is exposed to a large surface. - if (!isBlockImmune(world, current.getX(), current.getY(), current.getZ()) && - random.nextInt(MAX_BLOCK_DESTRUCTION_CHANCE) < BLOCK_DESTRUCTION_CHANCE) + // Check if the current block is immune to destruction by rifts. If not, add it to our list. + if (!isBlockImmune(world, current.getX(), current.getY(), current.getZ())) { - this.spawnWorldThread(world.getBlockId(current.getX(), current.getY(), current.getZ()), world, x, y, z, random); - world.destroyBlock(current.getX(), current.getY(), current.getZ(), false); + targets.add(current); } } } + return targets; } - + private void spawnWorldThread(int blockID, World world, int x, int y, int z, Random random) { if (blockID != 0 && (random.nextInt(MAX_WORLD_THREAD_CHANCE) < WORLD_THREAD_CHANCE) @@ -236,11 +257,40 @@ public class BlockRift extends Block implements ITileEntityProvider if (!this.isBlockImmune(world, x, y, z) && world.getChunkProvider().chunkExists(x >> 4, z >> 4)) { int blockID = world.getBlockId(x, y, z); - world.setBlock(x, y, z, properties.RiftBlockID); - this.spawnWorldThread(blockID, world, x, y, z, random); + if (world.setBlock(x, y, z, properties.RiftBlockID)) + spawnWorldThread(blockID, world, x, y, z, random); } } + public boolean spreadRift(NewDimData dimension, DimLink parent, World world, Random random) + { + int x, y, z, blockID; + Point4D source = parent.source(); + + // Find reachable blocks that are vulnerable to rift damage and include air + ArrayList targets = findReachableBlocks(world, source.getX(), source.getY(), source.getZ(), + RIFT_SPREAD_RANGE, true); + + if (!targets.isEmpty()) + { + // Choose randomly from among the possible locations where we can spawn a new rift + Point3D target = targets.get( random.nextInt(targets.size()) ); + x = target.getX(); + y = target.getY(); + z = target.getZ(); + + // Create a child, replace the block with a rift, and consider dropping World Thread + blockID = world.getBlockId(x, y, z); + if (world.setBlock(x, y, z, properties.RiftBlockID)) + { + dimension.createChildLink(x, y, z, parent); + spawnWorldThread(blockID, world, x, y, z, random); + return true; + } + } + return false; + } + /** * Lets pistons push through rifts, destroying them */ diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java index 6eb201b..ba977d5 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -15,7 +15,6 @@ import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; -@SuppressWarnings("deprecation") public abstract class NewDimData { private static class InnerDimLink extends DimLink diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index d597e9f..dd6f08e 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -35,8 +35,6 @@ import StevenDimDoors.mod_pocketDim.util.Point4D; public class TileEntityRift extends TileEntity { - private static final int MAX_SPREAD_ATTEMPTS = 3; - private static final int MAX_SEARCH_ATTEMPTS = 50; private static final int MAX_ANCESTOR_LINKS = 3; private static final int ENDERMAN_SPAWNING_CHANCE = 1; private static final int MAX_ENDERMAN_SPAWNING_CHANCE = 32; @@ -100,7 +98,7 @@ public class TileEntityRift extends TileEntity //This code should execute once every 10 seconds if (updateTimer > 200) { - this.spawnEndermen(); + //this.spawnEndermen(); this.grow(mod_pocketDim.properties); updateTimer = 0; } @@ -334,53 +332,16 @@ public class TileEntityRift extends TileEntity return; } - // The probability of rifts trying to spread increases if more rifts are nearby - // Players should see rifts spread faster within clusters than at the edges of clusters + // The probability of rifts trying to spread increases if more rifts are nearby. + // Players should see rifts spread faster within clusters than at the edges of clusters. // Also, single rifts CANNOT spread. - int nearRifts = dimension.findRiftsInRange(this.worldObj, 5, xCoord, yCoord, zCoord).size(); + int nearRifts = dimension.findRiftsInRange(worldObj, 5, xCoord, yCoord, zCoord).size(); if (nearRifts == 0 || random.nextInt(nearRifts) == 0) { return; } - - int x, y, z; - int spreadAttempts = 0; - for (int searchAttempts = 0; searchAttempts < MAX_SEARCH_ATTEMPTS; searchAttempts++) - { - x = xCoord + MathHelper.getRandomIntegerInRange(random, -6, 6); - y = yCoord + MathHelper.getRandomIntegerInRange(random, -4, 4); - z = zCoord + MathHelper.getRandomIntegerInRange(random, -6, 6); - - if (y >= 0 && y < worldObj.getActualHeight() && worldObj.isAirBlock(x, y, z)) - { - Vec3 position = worldObj.getWorldVec3Pool().getVecFromPool(xCoord, yCoord, zCoord); - Vec3 spreadTarget = worldObj.getWorldVec3Pool().getVecFromPool(x, y, z); - MovingObjectPosition hit = worldObj.clip(position, spreadTarget, false); - if (hit == null || !mod_pocketDim.blockRift.isBlockImmune(worldObj, hit.blockX, hit.blockY, hit.blockZ)) - { - if(hit!=null) - { - dimension.createChildLink(hit.blockX, hit.blockY, hit.blockZ, link); - this.worldObj.setBlock(hit.blockX, hit.blockY, hit.blockZ, mod_pocketDim.blockRift.blockID); - } - else - { - dimension.createChildLink(x,y,z,link); - this.worldObj.setBlock(x,y,z, mod_pocketDim.blockRift.blockID); - } - hasGrownRifts = true; - break; - } - else - { - spreadAttempts++; - if (spreadAttempts >= MAX_SPREAD_ATTEMPTS) - { - break; - } - } - } - } + + hasGrownRifts = mod_pocketDim.blockRift.spreadRift(dimension, link, worldObj, random); } @Override From 5db2b35850d28ab32f6aca31fdc5cf9426020616 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 12 Mar 2014 05:12:46 -0400 Subject: [PATCH 05/14] Minor Fix I forgot to uncomment the line for rifts spawning Endermen. --- .../mod_pocketDim/tileentities/TileEntityRift.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index dd6f08e..a0031f3 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -98,7 +98,7 @@ public class TileEntityRift extends TileEntity //This code should execute once every 10 seconds if (updateTimer > 200) { - //this.spawnEndermen(); + this.spawnEndermen(); this.grow(mod_pocketDim.properties); updateTimer = 0; } From 8d28dc15171748e3f646c3b643ce9905e68f076c Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 12 Mar 2014 06:06:45 -0400 Subject: [PATCH 06/14] Fixed Uncontrolled Rift Spread Switched rifts over to using link.childCount() to track spread instead of the hasGrownRifts flag in the tile entity. The flag had the flaw that if the rift was replaced by a block, the flag would reset and the rift could spread again. I think I remember this being intended as punishment for messing with rifts but it's a problem when combined with World Thread farming. --- .../tileentities/TileEntityRift.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index a0031f3..4b7a600 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -35,11 +35,14 @@ import StevenDimDoors.mod_pocketDim.util.Point4D; public class TileEntityRift extends TileEntity { - private static final int MAX_ANCESTOR_LINKS = 3; + private static final int MAX_ANCESTOR_LINKS = 2; + private static final int MAX_CHILD_LINKS = 1; private static final int ENDERMAN_SPAWNING_CHANCE = 1; private static final int MAX_ENDERMAN_SPAWNING_CHANCE = 32; private static final int RIFT_SPREAD_CHANCE = 1; private static final int MAX_RIFT_SPREAD_CHANCE = 256; + private static final int HOSTILE_ENDERMAN_CHANCE = 1; + private static final int MAX_HOSTILE_ENDERMAN_CHANCE = 3; private static Random random = new Random(); @@ -51,7 +54,6 @@ public class TileEntityRift extends TileEntity public int zOffset = 0; public boolean shouldClose = false; private boolean hasUpdated = false; - private boolean hasGrownRifts = false; public DimLink nearestRiftData; public int spawnedEndermenID = 0; @@ -107,8 +109,6 @@ public class TileEntityRift extends TileEntity this.calculateOldParticleOffset(); //this also calculates the distance for the particle stuff. } updateTimer++; - - } @Override @@ -169,10 +169,10 @@ public class TileEntityRift extends TileEntity enderman.setLocationAndAngles(xCoord + 0.5, yCoord - 1, zCoord + 0.5, 5, 6); worldObj.spawnEntityInWorld(enderman); - if(this.worldObj.rand.nextInt(3)==0) + if (random.nextInt(MAX_HOSTILE_ENDERMAN_CHANCE) < HOSTILE_ENDERMAN_CHANCE) { EntityPlayer player = this.worldObj.getClosestPlayerToEntity(enderman, 50); - if(player!=null) + if (player != null) { enderman.setTarget(player); } @@ -318,7 +318,7 @@ public class TileEntityRift extends TileEntity public void grow(DDProperties properties) { - if (worldObj.isRemote || hasGrownRifts || !properties.RiftSpreadEnabled + if (worldObj.isRemote || !properties.RiftSpreadEnabled || random.nextInt(MAX_RIFT_SPREAD_CHANCE) < RIFT_SPREAD_CHANCE || this.shouldClose) { return; @@ -327,7 +327,7 @@ public class TileEntityRift extends TileEntity NewDimData dimension = PocketManager.getDimensionData(worldObj); DimLink link = dimension.getLink(xCoord, yCoord, zCoord); - if (countAncestorLinks(link) > MAX_ANCESTOR_LINKS) + if (link.childCount() >= MAX_CHILD_LINKS || countAncestorLinks(link) > MAX_ANCESTOR_LINKS) { return; } @@ -340,8 +340,7 @@ public class TileEntityRift extends TileEntity { return; } - - hasGrownRifts = mod_pocketDim.blockRift.spreadRift(dimension, link, worldObj, random); + mod_pocketDim.blockRift.spreadRift(dimension, link, worldObj, random); } @Override @@ -354,7 +353,6 @@ public class TileEntityRift extends TileEntity this.xOffset = nbt.getInteger("xOffset"); this.yOffset = nbt.getInteger("yOffset"); this.zOffset = nbt.getInteger("zOffset"); - this.hasGrownRifts = nbt.getBoolean("grownRifts"); this.age = nbt.getInteger("age"); this.shouldClose = nbt.getBoolean("shouldClose"); this.spawnedEndermenID = nbt.getInteger("spawnedEndermenID"); @@ -367,7 +365,6 @@ public class TileEntityRift extends TileEntity nbt.setInteger("age", this.age); nbt.setInteger("count", this.updateTimer); nbt.setInteger("count2", this.riftCloseTimer); - nbt.setBoolean("grownRifts",this.hasGrownRifts); nbt.setInteger("xOffset", this.xOffset); nbt.setInteger("yOffset", this.yOffset); nbt.setInteger("zOffset", this.zOffset); From 3a91d9a6ec8980ae33c4f47347d76b6b8ffbd9d9 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 12 Mar 2014 07:05:23 -0400 Subject: [PATCH 07/14] Minor Adjustments to Rift Spread Made a small correction to the condition on max ancestors. Also thoroughly tested this code to ensure that it really does limit rift spread. Currently, 2 initial rifts will cause 4 more rifts to be created eventually. --- .../mod_pocketDim/tileentities/TileEntityRift.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index 4b7a600..135235e 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -35,6 +35,7 @@ import StevenDimDoors.mod_pocketDim.util.Point4D; public class TileEntityRift extends TileEntity { + private static final int RIFT_INTERACTION_RANGE = 5; private static final int MAX_ANCESTOR_LINKS = 2; private static final int MAX_CHILD_LINKS = 1; private static final int ENDERMAN_SPAWNING_CHANCE = 1; @@ -327,7 +328,7 @@ public class TileEntityRift extends TileEntity NewDimData dimension = PocketManager.getDimensionData(worldObj); 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) { return; } @@ -335,7 +336,7 @@ public class TileEntityRift extends TileEntity // The probability of rifts trying to spread increases if more rifts are nearby. // Players should see rifts spread faster within clusters than at the edges of clusters. // Also, single rifts CANNOT spread. - int nearRifts = dimension.findRiftsInRange(worldObj, 5, xCoord, yCoord, zCoord).size(); + int nearRifts = dimension.findRiftsInRange(worldObj, RIFT_INTERACTION_RANGE, xCoord, yCoord, zCoord).size(); if (nearRifts == 0 || random.nextInt(nearRifts) == 0) { return; From f1eff42a33048e64fd3a02b6b530b3a8d561ae2b Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 12 Mar 2014 10:27:32 -0400 Subject: [PATCH 08/14] Improvements to Crafting Recipes Added a configuration option for adjusting the number of World Threads needed to create one Stable Fabric. A few users have asked for this to be available. The default setting is our usual 8 thread for each fabric. Also overhauled our recipes to remove blank item slots, allowing them to be crafted on any line of the grid, as long as all the items are aligned properly. --- .../mod_pocketDim/CraftingManager.java | 133 +++++++++--------- .../mod_pocketDim/config/DDProperties.java | 5 + 2 files changed, 68 insertions(+), 70 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java b/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java index 086054a..24e58df 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java @@ -9,89 +9,82 @@ import static StevenDimDoors.mod_pocketDim.mod_pocketDim.*; public class CraftingManager { - + private CraftingManager() { } + public static void registerRecipes(DDProperties properties) - { - if (properties.CraftingDimensionalDoorAllowed) - { - GameRegistry.addRecipe(new ItemStack(itemDimensionalDoor, 1), new Object[] - { - " ", "yxy", " ", 'x', mod_pocketDim.itemStableFabric, 'y', Item.doorIron - }); - } - if(properties.CraftingUnstableDoorAllowed) - { - GameRegistry.addRecipe(new ItemStack(itemUnstableDoor, 1), new Object[] - { - " ", "yxy", " ", 'x', Item.eyeOfEnder, 'y', mod_pocketDim.itemDimensionalDoor - }); - } - if(properties.CraftingWarpDoorAllowed) - { - GameRegistry.addRecipe(new ItemStack(itemWarpDoor, 1), new Object[] - { - " ", "yxy", " ", 'x', mod_pocketDim.itemStableFabric, 'y', Item.doorWood - }); - } - if(properties.CraftingTransTrapdoorAllowed) - { - GameRegistry.addRecipe(new ItemStack(transTrapdoor, 1), new Object[] - { - " y ", " x ", " y ", 'x', mod_pocketDim.itemStableFabric, 'y', Block.trapdoor - }); - } - if(properties.CraftingRiftSignatureAllowed) - { - GameRegistry.addRecipe(new ItemStack(itemRiftSignature, 1), new Object[] - { - " y ", "yxy", " y ", 'x', mod_pocketDim.itemStableFabric, 'y', Item.ingotIron - }); - } - - if(properties.CraftingRiftRemoverAllowed) - { - GameRegistry.addRecipe(new ItemStack(itemRiftRemover, 1), new Object[] - { - "yyy", "yxy", "yyy", 'x', mod_pocketDim.itemStableFabric, 'y', Item.ingotGold - }); - } - - if (properties.CraftingRiftBladeAllowed) - { - GameRegistry.addRecipe(new ItemStack(itemRiftBlade, 1), new Object[] - { - " x ", " x ", " y ", 'x', mod_pocketDim.itemStableFabric, 'y', Item.blazeRod - }); - } - + { if (properties.CraftingStableFabricAllowed) { - GameRegistry.addRecipe(new ItemStack(itemStableFabric, 1), new Object[] - { - "yyy", "yxy", "yyy", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread - }); + switch (properties.WorldThreadRequirementLevel) + { + case 1: + GameRegistry.addShapelessRecipe(new ItemStack(itemStableFabric, 1), + Item.enderPearl, mod_pocketDim.itemWorldThread); + break; + case 2: + GameRegistry.addRecipe(new ItemStack(itemStableFabric, 1), + "yxy", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread); + break; + case 3: + GameRegistry.addRecipe(new ItemStack(itemStableFabric, 1), + " y ", "yxy", " y ", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread); + break; + default: + GameRegistry.addRecipe(new ItemStack(itemStableFabric, 1), + "yyy", "yxy", "yyy", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread); + break; + } } + if (properties.CraftingDimensionalDoorAllowed) + { + GameRegistry.addRecipe(new ItemStack(itemDimensionalDoor, 1), + "yxy", 'x', mod_pocketDim.itemStableFabric, 'y', Item.doorIron); + } + if (properties.CraftingUnstableDoorAllowed) + { + GameRegistry.addRecipe(new ItemStack(itemUnstableDoor, 1), + "yxy", 'x', Item.eyeOfEnder, 'y', mod_pocketDim.itemDimensionalDoor); + } + if (properties.CraftingWarpDoorAllowed) + { + GameRegistry.addRecipe(new ItemStack(itemWarpDoor, 1), + "yxy", 'x', mod_pocketDim.itemStableFabric, 'y', Item.doorWood); + } + if (properties.CraftingTransTrapdoorAllowed) + { + GameRegistry.addRecipe(new ItemStack(transTrapdoor, 1), + "y", "x", "y", 'x', mod_pocketDim.itemStableFabric, 'y', Block.trapdoor); + } + if (properties.CraftingRiftSignatureAllowed) + { + GameRegistry.addRecipe(new ItemStack(itemRiftSignature, 1), + " y ", "yxy", " y ", 'x', mod_pocketDim.itemStableFabric, 'y', Item.ingotIron); + } + if (properties.CraftingRiftRemoverAllowed) + { + GameRegistry.addRecipe(new ItemStack(itemRiftRemover, 1), + "yyy", "yxy", "yyy", 'x', mod_pocketDim.itemStableFabric, 'y', Item.ingotGold); + } + if (properties.CraftingRiftBladeAllowed) + { + GameRegistry.addRecipe(new ItemStack(itemRiftBlade, 1), + "x", "x", "y", 'x', mod_pocketDim.itemStableFabric, 'y', Item.blazeRod); + } if (properties.CraftingStabilizedRiftSignatureAllowed) { - GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemStabilizedLinkSignature,1), new Object[] - { - " y ", "yxy", " y ", 'x', mod_pocketDim.itemRiftSignature, 'y', mod_pocketDim.itemStableFabric - }); + GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemStabilizedLinkSignature,1), + " y ", "yxy", " y ", 'x', mod_pocketDim.itemRiftSignature, 'y', mod_pocketDim.itemStableFabric); } if (properties.CraftingGoldenDimensionalDoorAllowed) { - GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemGoldenDimensionalDoor,1), new Object[] - { - " ", "xyx", " ", 'x', mod_pocketDim.itemGoldenDoor, 'y', Item.eyeOfEnder - }); + GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemGoldenDimensionalDoor,1), + "yxy", 'x', mod_pocketDim.itemGoldenDoor, 'y', mod_pocketDim.itemStableFabric); } if (properties.CraftingGoldenDoorAllowed) { - GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemGoldenDoor, 1), new Object[] - { - "yy ", "yy ", "yy ", 'y', Item.ingotGold - }); + GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemGoldenDoor, 1), + "yy", "yy", "yy", 'y', Item.ingotGold); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java index 18378df..67b1b11 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java @@ -108,6 +108,7 @@ public class DDProperties public final int FortressGatewayGenerationChance; public final int MonolithSpawningChance; public final int LimboReturnRange; + public final int WorldThreadRequirementLevel; public final String CustomSchematicDirectory; @@ -144,6 +145,10 @@ public class DDProperties 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); + 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 " + + "integer from 1 to 4. The levels change the recipe to use 1, 2, 4, or 8 threads, respectively. The default level is 4.").getInt(); + RiftBladeLootEnabled = config.get(CATEGORY_LOOT, "Enable Rift Blade Loot", true).getBoolean(true); FabricOfRealityLootEnabled = config.get(CATEGORY_LOOT, "Enable Fabric of Reality Loot", true).getBoolean(true); WorldThreadLootEnabled = config.get(CATEGORY_LOOT, "Enable World Thread Loot", true).getBoolean(true); From f40e1e0a91a399de3e421926194a7924a38006a5 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 13 Mar 2014 05:43:26 -0400 Subject: [PATCH 09/14] Change to Dungeon Exits Chances Changed dungeon exits so that they have a minimum 15% chance of exiting to the Overworld if a dungeon's root dimension isn't the Overworld. Also made a minor change to the existing special case for the Nether - the minimum 20% chance only applies if the root dimension isn't the Nether. --- .../StevenDimDoors/mod_pocketDim/core/DDTeleporter.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index 8905140..bdb7fd7 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -40,9 +40,12 @@ public class DDTeleporter { private static final Random random = new Random(); private static final int NETHER_DIMENSION_ID = -1; + private static final int OVERWORLD_DIMENSION_ID = 0; private static final int END_DIMENSION_ID = 1; private static final int MAX_NETHER_EXIT_CHANCE = 100; private static final int NETHER_EXIT_CHANCE = 20; //20% chance to compensate for frequent exit failures - the Nether often doesn't have enough space for an exit + private static final int MAX_OVERWORLD_EXIT_CHANCE = 100; + private static final int OVERWORLD_EXIT_CHANCE = 15; private static final int MAX_ROOT_SHIFT_CHANCE = 100; private static final int START_ROOT_SHIFT_CHANCE = 0; private static final int ROOT_SHIFT_CHANCE_PER_LEVEL = 5; @@ -633,7 +636,11 @@ public class DDTeleporter if (random.nextInt(MAX_ROOT_SHIFT_CHANCE) < shiftChance) { - if (random.nextInt(MAX_NETHER_EXIT_CHANCE) < NETHER_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); + } + 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); } From 01fe9cc87eb9ca8844fd493b876fd62cbea3f72b Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 13 Mar 2014 05:47:04 -0400 Subject: [PATCH 10/14] Added Config Setting for Limbo Escape Added a configuration option for toggling whether players can teleport out of Limbo by walking over Eternal Fabric. This became viable after Rift Gateways began generating in Limbo again. Keybounce has expressed an interest in using option to deal with the issue of players returning home since his Overworld won't have gateways. --- .../mod_pocketDim/blocks/BlockDimWallPerm.java | 3 ++- .../mod_pocketDim/config/DDWorldProperties.java | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java index 42a2d1e..d3dac45 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java @@ -51,7 +51,8 @@ public class BlockDimWallPerm extends Block @Override public void onEntityWalking(World world, int x, int y, int z, Entity entity) { - if (!world.isRemote && world.provider.dimensionId == properties.LimboDimensionID) + if (!world.isRemote && world.provider.dimensionId == properties.LimboDimensionID + && mod_pocketDim.worldProperties.LimboEscapeEnabled) { World overworld = DimensionManager.getWorld(0); if (overworld != null && entity instanceof EntityPlayerMP) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDWorldProperties.java b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDWorldProperties.java index f669ded..db2a498 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDWorldProperties.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDWorldProperties.java @@ -13,6 +13,12 @@ public class DDWorldProperties public final DimensionFilter RiftClusterDimensions; public final DimensionFilter RiftGatewayDimensions; + /** + * General Flags + */ + public final boolean LimboEscapeEnabled; + + //Names of categories private static final String CATEGORY_WORLD_GENERATION = "world generation"; @@ -33,6 +39,11 @@ public class DDWorldProperties RiftClusterDimensions = loadFilter(config, "Rift Cluster", "Rift Clusters"); RiftGatewayDimensions = loadFilter(config, "Rift Gateway", "Rift Gateways"); + LimboEscapeEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Limbo Escape", true, + "Sets whether players are teleported out of Limbo when walking over the Eternal Fabric that " + + "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); + config.save(); } From 941cecb372b153fab6a21ecf0f86423beeffdaa1 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 13 Mar 2014 05:58:02 -0400 Subject: [PATCH 11/14] Tweaks to Loot Set loot chests to generate 6 stacks of items instead of 5 stacks. Increased the maximum amount of World Thread per stack from 8 to 12 threads. Increased the chance of encountering a grave chest to 1 in 6 instead of 1 in 7. --- src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java | 6 +++--- .../mod_pocketDim/dungeon/FillContainersOperation.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java b/src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java index 599786f..50f4fb6 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java @@ -20,7 +20,7 @@ import StevenDimDoors.mod_pocketDim.util.WeightedContainer; */ public class DDLoot { - private static final String[] SPECIAL_SKULL_OWNERS = new String[] { "stevenrs11", "kamikazekiwi3", "Jaitsu", "XCompWiz", "skyboy026", "Wylker" }; + private static final String[] SPECIAL_SKULL_OWNERS = new String[] { "stevenrs11", "kamikazekiwi3", "fbt", "Jaitsu", "XCompWiz", "skyboy026", "Wylker" }; private static final double MIN_ITEM_DAMAGE = 0.3; private static final double MAX_ITEM_DAMAGE = 0.9; @@ -31,7 +31,7 @@ public class DDLoot { public static final String DIMENSIONAL_DUNGEON_CHEST = "dimensionalDungeonChest"; public static ChestGenHooks DungeonChestInfo = null; - private static final int CHEST_SIZE = 5; + private static final int CHEST_SIZE = 6; private DDLoot() { } @@ -56,7 +56,7 @@ public class DDLoot { addContent(true, items, Item.appleGold.itemID, 10); addContent(properties.FabricOfRealityLootEnabled, items, mod_pocketDim.blockDimWall.blockID, 20, 16, 64); - addContent(properties.WorldThreadLootEnabled, items, mod_pocketDim.itemWorldThread.itemID, 80, 2, 8); + addContent(properties.WorldThreadLootEnabled, items, mod_pocketDim.itemWorldThread.itemID, 80, 2, 12); // Add all the items to our dungeon chest addItemsToContainer(DungeonChestInfo, items); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java index 5a91f31..f124225 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java @@ -20,8 +20,8 @@ public class FillContainersOperation extends WorldOperation private Random random; private DDProperties properties; - private static final int GRAVE_CHEST_CHANCE = 100; - private static final int MAX_GRAVE_CHEST_CHANCE = 700; + private static final int GRAVE_CHEST_CHANCE = 1; + private static final int MAX_GRAVE_CHEST_CHANCE = 6; public FillContainersOperation(Random random, DDProperties properties) { From 7a043dfa65cb6e3efdedc4d7c4b7c5ab347e9be6 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Fri, 14 Mar 2014 06:41:42 -0400 Subject: [PATCH 12/14] Added Crash on Provider ID Conflict Added a check so that Dimensional Doors crashes if another registers our provider IDs. This will show people that something needs fixing instead of us risking strange bugs. --- .../java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index b433abb..1069181 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -232,8 +232,11 @@ public class mod_pocketDim GameRegistry.registerBlock(blockDimWall, ItemBlockDimWall.class, "Fabric of Reality"); - DimensionManager.registerProviderType(properties.PocketProviderID, PocketProvider.class, false); - DimensionManager.registerProviderType(properties.LimboProviderID, LimboProvider.class, false); + if (!DimensionManager.registerProviderType(properties.PocketProviderID, PocketProvider.class, false)) + 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)) + throw new IllegalStateException("There is a provider ID conflict between LimboProvider from Dimensional Doors and another provider type. Fix your configuration!"); + DimensionManager.registerDimension(properties.LimboDimensionID, properties.LimboProviderID); LanguageRegistry.addName(goldenDoor, "Golden Door"); From cc46d90ed4d48d3e8d08517d077722a2ad24d1eb Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Fri, 14 Mar 2014 07:07:35 -0400 Subject: [PATCH 13/14] Updated Rift Blade Code Removed duplicate code from ItemRiftBlade. It was code that duplicated the functionality of ItemSword since ItemRiftBlade didn't extend ItemSword originally. Also updated the tooltip text to remove mentions of the old door-rotating ability. That's not provided anymore since doors are easily broken and replaced now. Extended teleport range slightly. --- .../mod_pocketDim/items/ItemRiftBlade.java | 46 ++----------------- 1 file changed, 3 insertions(+), 43 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java index a49735a..d846251 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java @@ -36,41 +36,9 @@ public class ItemRiftBlade extends ItemSword super(itemID, EnumToolMaterial.EMERALD); this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); - this.setMaxStackSize(1); - this.setMaxDamage(500); - this.hasSubtypes = false; this.properties = properties; } - - @Override - @SideOnly(Side.CLIENT) - public boolean isFull3D() - { - return true; - } - - @Override - public float getStrVsBlock(ItemStack par1ItemStack, Block par2Block) - { - if (par2Block.blockID == Block.web.blockID) - { - return 15.0F; - } - else - { - Material material = par2Block.blockMaterial; - return material != Material.plants && material != Material.vine && material != Material.coral && material != Material.leaves && material != Material.pumpkin ? 1.0F : 1.5F; - } - } - - @Override - public Multimap getItemAttributeModifiers() - { - Multimap multimap = super.getItemAttributeModifiers(); - multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", (double)7, 0)); - return multimap; - } - + @Override @SideOnly(Side.CLIENT) public boolean hasEffect(ItemStack par1ItemStack) @@ -78,13 +46,6 @@ public class ItemRiftBlade extends ItemSword return true; } - @Override - public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLiving, EntityLivingBase par3EntityLiving) - { - par1ItemStack.damageItem(1, par3EntityLiving); - return true; - } - @Override public MovingObjectPosition getMovingObjectPositionFromPlayer(World par1World, EntityPlayer par2EntityPlayer, boolean par3) { @@ -147,7 +108,7 @@ public class ItemRiftBlade extends ItemSword if (!world.isRemote) { @SuppressWarnings("unchecked") - List list = world.getEntitiesWithinAABB(EntityLiving.class, AxisAlignedBB.getBoundingBox(player.posX-8,player.posY-8, player.posZ-8, player.posX+8,player.posY+8, player.posZ+8)); + List list = world.getEntitiesWithinAABB(EntityLiving.class, AxisAlignedBB.getBoundingBox(player.posX-10,player.posY-10, player.posZ-10, player.posX+10,player.posY+10, player.posZ+10)); list.remove(player); for (EntityLiving ent : list) @@ -223,8 +184,7 @@ public class ItemRiftBlade extends ItemSword @SideOnly(Side.CLIENT) public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - par3List.add("Creates temporary doors"); - par3List.add("on rifts, rotates doors,"); + par3List.add("Opens temporary doors on rifts"); par3List.add("and has a teleport attack."); } } From 7e8fe10c7db17d9c5e718511b8b8038cf37235d3 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Fri, 14 Mar 2014 08:35:44 -0400 Subject: [PATCH 14/14] Split dd-rift into Separate Commands Split dd-rift into dd-rift, dd-random, and dd-list --- .../commands/CommandCreateDungeonRift.java | 73 ++++------- .../commands/CommandCreateRandomRift.java | 117 ++++++++++++++++++ .../commands/CommandListDungeons.java | 74 +++++++++++ .../mod_pocketDim/helpers/DungeonHelper.java | 10 +- .../mod_pocketDim/mod_pocketDim.java | 4 + 5 files changed, 225 insertions(+), 53 deletions(-) create mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateRandomRift.java create mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandListDungeons.java diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java index 23e0b64..d5ba8dd 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java @@ -21,7 +21,7 @@ public class CommandCreateDungeonRift extends DDCommandBase private CommandCreateDungeonRift() { - super("dd-rift", ""); + super("dd-rift", ""); } public static CommandCreateDungeonRift instance() @@ -41,7 +41,7 @@ public class CommandCreateDungeonRift extends DDCommandBase if (sender.worldObj.isRemote) { return DDCommandResult.SUCCESS; - } + } if (command.length == 0) { return DDCommandResult.TOO_FEW_ARGUMENTS; @@ -50,61 +50,38 @@ public class CommandCreateDungeonRift extends DDCommandBase { return DDCommandResult.TOO_MANY_ARGUMENTS; } + + DimLink link; + DungeonData result; + int x = MathHelper.floor_double(sender.posX); + int y = MathHelper.floor_double(sender.posY); + int z = MathHelper.floor_double (sender.posZ); + int orientation = MathHelper.floor_double((sender.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3; - if (command[0].equals("list")) + result = findDungeonByPartialName(command[0], dungeonHelper.getRegisteredDungeons()); + if (result == null) { - Collection dungeonNames = dungeonHelper.getDungeonNames(); - for (String name : dungeonNames) - { - sendChat(sender, name); - } - sendChat(sender, ""); + result = findDungeonByPartialName(command[0], dungeonHelper.getUntaggedDungeons()); + } + //Check if we found any matches + if (result != null) + { + //Create a rift to our selected dungeon and notify the player + dimension = PocketManager.getDimensionData(sender.worldObj); + link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation); + PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, result); + sender.worldObj.setBlock(x, y + 1, z, mod_pocketDim.blockRift.blockID, 0, 3); + sendChat(sender, "Created a rift to \"" + result.schematicName() + "\" dungeon (Dimension ID = " + link.destination().getDimension() + ")."); } else { - DimLink link; - DungeonData result; - int x = MathHelper.floor_double(sender.posX); - int y = MathHelper.floor_double(sender.posY); - int z = MathHelper.floor_double (sender.posZ); - int orientation = MathHelper.floor_double((sender.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3; - - if (command[0].equals("random")) - { - - dimension = PocketManager.getDimensionData(sender.worldObj); - link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation); - sender.worldObj.setBlock(x, y + 1, z,mod_pocketDim.blockRift.blockID, 0, 3); - sendChat(sender, "Created a rift to a random dungeon."); - } - else - { - result = findDungeonByPartialName(command[0], dungeonHelper.getRegisteredDungeons()); - if (result == null) - { - result = findDungeonByPartialName(command[0], dungeonHelper.getUntaggedDungeons()); - } - //Check if we found any matches - if (result != null) - { - //Create a rift to our selected dungeon and notify the player - dimension = PocketManager.getDimensionData(sender.worldObj); - link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation); - PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, result); - sender.worldObj.setBlock(x, y + 1, z, mod_pocketDim.blockRift.blockID, 0, 3); - sendChat(sender, "Created a rift to \"" + result.schematicName() + "\" dungeon (Dimension ID = " + link.destination().getDimension() + ")."); - } - else - { - //No matches! - return new DDCommandResult("Error: The specified dungeon was not found. Use 'list' to see a list of the available dungeons."); - } - } + //No matches! + return new DDCommandResult("Error: The specified dungeon was not found. Use 'dd-list' to see a list of the available dungeons."); } return DDCommandResult.SUCCESS; } - private DungeonData findDungeonByPartialName(String query, Collection dungeons) + private static DungeonData findDungeonByPartialName(String query, Collection dungeons) { //Search for the shortest dungeon name that contains the lowercase query string. String dungeonName; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateRandomRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateRandomRift.java new file mode 100644 index 0000000..013921b --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateRandomRift.java @@ -0,0 +1,117 @@ +package StevenDimDoors.mod_pocketDim.commands; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Random; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.MathHelper; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; +import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; +import StevenDimDoors.mod_pocketDim.world.PocketBuilder; + +public class CommandCreateRandomRift extends DDCommandBase +{ + private static CommandCreateRandomRift instance = null; + private static Random random = new Random(); + + private CommandCreateRandomRift() + { + super("dd-random", ""); + } + + public static CommandCreateRandomRift instance() + { + if (instance == null) + instance = new CommandCreateRandomRift(); + + return instance; + } + + @Override + protected DDCommandResult processCommand(EntityPlayer sender, String[] command) + { + NewDimData dimension; + DungeonHelper dungeonHelper = DungeonHelper.instance(); + + if (sender.worldObj.isRemote) + { + return DDCommandResult.SUCCESS; + } + if (command.length > 1) + { + return DDCommandResult.TOO_MANY_ARGUMENTS; + } + + DimLink link; + DungeonData result; + int x = MathHelper.floor_double(sender.posX); + int y = MathHelper.floor_double(sender.posY); + int z = MathHelper.floor_double (sender.posZ); + int orientation = MathHelper.floor_double((sender.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3; + + if (command.length == 0) + { + dimension = PocketManager.getDimensionData(sender.worldObj); + link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation); + sender.worldObj.setBlock(x, y + 1, z,mod_pocketDim.blockRift.blockID, 0, 3); + sendChat(sender, "Created a rift to a random dungeon."); + } + else + { + result = getRandomDungeonByPartialName(command[0], dungeonHelper.getRegisteredDungeons()); + if (result == null) + { + result = getRandomDungeonByPartialName(command[0], dungeonHelper.getUntaggedDungeons()); + } + //Check if we found any matches + if (result != null) + { + //Create a rift to our selected dungeon and notify the player + dimension = PocketManager.getDimensionData(sender.worldObj); + link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation); + PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, result); + sender.worldObj.setBlock(x, y + 1, z, mod_pocketDim.blockRift.blockID, 0, 3); + sendChat(sender, "Created a rift to \"" + result.schematicName() + "\" dungeon (Dimension ID = " + link.destination().getDimension() + ")."); + } + else + { + //No matches! + return new DDCommandResult("Error: The specified dungeon was not found. Use 'list' to see a list of the available dungeons."); + } + } + return DDCommandResult.SUCCESS; + } + + private static DungeonData getRandomDungeonByPartialName(String query, Collection dungeons) + { + // Search for all dungeons that contain the lowercase query string. + String dungeonName; + String normalQuery = query.toLowerCase(); + ArrayList matches = new ArrayList(); + + for (DungeonData dungeon : dungeons) + { + // We need to extract the file's name. Comparing against schematicPath could + // yield false matches if the query string is contained within the path. + dungeonName = dungeon.schematicName().toLowerCase(); + if (dungeonName.contains(normalQuery)) + { + matches.add(dungeon); + } + } + if (matches.isEmpty()) + { + return null; + } + else + { + return matches.get( random.nextInt(matches.size()) ); + } + } +} \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandListDungeons.java b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandListDungeons.java new file mode 100644 index 0000000..043d0fd --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandListDungeons.java @@ -0,0 +1,74 @@ +package StevenDimDoors.mod_pocketDim.commands; + +import java.util.ArrayList; + +import net.minecraft.entity.player.EntityPlayer; +import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; + +public class CommandListDungeons extends DDCommandBase +{ + private static CommandListDungeons instance = null; + + private CommandListDungeons() + { + super("dd-list", ""); + } + + public static CommandListDungeons instance() + { + if (instance == null) + instance = new CommandListDungeons(); + + return instance; + } + + @Override + protected DDCommandResult processCommand(EntityPlayer sender, String[] command) + { + int page; + int index; + int limit; + int pageCount; + ArrayList dungeonNames; + + if (sender.worldObj.isRemote) + { + return DDCommandResult.SUCCESS; + } + if (command.length > 1) + { + return DDCommandResult.TOO_MANY_ARGUMENTS; + } + if (command.length == 0) + { + page = 1; + } + else + { + try + { + page = Integer.parseInt(command[0]); + } + catch (NumberFormatException e) + { + return DDCommandResult.INVALID_ARGUMENTS; + } + } + dungeonNames = DungeonHelper.instance().getDungeonNames(); + pageCount = (dungeonNames.size() - 1) / 10 + 1; + if (page < 1 || page > pageCount) + { + return DDCommandResult.INVALID_ARGUMENTS; + } + sendChat(sender, "List of dungeons (page " + page + " of " + pageCount + "):"); + index = (page - 1) * 10; + limit = Math.min(index + 10, dungeonNames.size()); + for (; index < limit; index++) + { + sendChat(sender, dungeonNames.get(index)); + } + sendChat(sender, ""); + + return DDCommandResult.SUCCESS; + } +} \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index 56de06a..545168d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -577,11 +577,11 @@ public class DungeonHelper return selection; } - public Collection getDungeonNames() { - - //Use a HashSet to guarantee that all dungeon names will be distinct. - //This shouldn't be necessary if we keep proper lists without repetitions, - //but it's a fool-proof workaround. + public ArrayList getDungeonNames() + { + // Use a HashSet to guarantee that all dungeon names will be distinct. + // This shouldn't be necessary if we keep proper lists without repetitions, + // but it's a fool-proof workaround. HashSet dungeonNames = new HashSet(); dungeonNames.addAll( parseDungeonNames(registeredDungeons) ); dungeonNames.addAll( parseDungeonNames(untaggedDungeons) ); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 1069181..a5f2e8a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -28,9 +28,11 @@ import StevenDimDoors.mod_pocketDim.blocks.UnstableDoor; import StevenDimDoors.mod_pocketDim.blocks.WarpDoor; import StevenDimDoors.mod_pocketDim.commands.CommandCreateDungeonRift; import StevenDimDoors.mod_pocketDim.commands.CommandCreatePocket; +import StevenDimDoors.mod_pocketDim.commands.CommandCreateRandomRift; import StevenDimDoors.mod_pocketDim.commands.CommandDeleteAllLinks; import StevenDimDoors.mod_pocketDim.commands.CommandDeleteRifts; import StevenDimDoors.mod_pocketDim.commands.CommandExportDungeon; +import StevenDimDoors.mod_pocketDim.commands.CommandListDungeons; import StevenDimDoors.mod_pocketDim.commands.CommandResetDungeons; import StevenDimDoors.mod_pocketDim.commands.CommandTeleportPlayer; import StevenDimDoors.mod_pocketDim.config.DDProperties; @@ -335,6 +337,8 @@ public class mod_pocketDim // Register commands with the server event.registerServerCommand( CommandResetDungeons.instance() ); event.registerServerCommand( CommandCreateDungeonRift.instance() ); + event.registerServerCommand( CommandListDungeons.instance() ); + event.registerServerCommand( CommandCreateRandomRift.instance() ); event.registerServerCommand( CommandDeleteAllLinks.instance() ); //CommandDeleteDimensionData.instance().register(event); event.registerServerCommand( CommandDeleteRifts.instance() );