From d1a2476a4e503d931f187760cced5db7b280ad6a Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Fri, 14 Mar 2014 17:22:55 -0400 Subject: [PATCH 01/27] Quick Fix for Limbo Music Crash The following small change deals with a strange background-music-related crash. Wasn't this issue fixed for Jaitsu and Aether II? I'm not sure what's the cause but I've added a check to prevent the NPE. Please deal with this most robustly in the future. --- .../mod_pocketDim/EventHookContainer.java | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java index d3b09f4..02f3aea 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -218,24 +218,29 @@ public class EventHookContainer public void playMusicForDim(World world) { - if(world.isRemote) + if (world.isRemote) { SoundManager sndManager = FMLClientHandler.instance().getClient().sndManager; - if(world.provider instanceof LimboProvider) - { - sndManager.sndSystem.stop("BgMusic"); - SoundPoolEntry soundPoolEntry = sndManager.soundPoolSounds.getRandomSoundFromSoundPool(mod_pocketDim.modid+":creepy"); - if(soundPoolEntry!=null) - { - sndManager.sndSystem.backgroundMusic("LimboMusic", soundPoolEntry.getSoundUrl(), soundPoolEntry.getSoundName(), false); - sndManager.sndSystem.play("LimboMusic"); - } - } - else if(!(world.provider instanceof LimboProvider)) - { - sndManager.sndSystem.stop("LimboMusic"); - } + // SenseiKiwi: I've added the following check as a quick fix for a reported crash. + // This needs to work without a hitch or we have to stop trying to replace the background music... + if (sndManager != null && sndManager.sndSystem != null) + { + if (world.provider instanceof LimboProvider) + { + sndManager.sndSystem.stop("BgMusic"); + SoundPoolEntry soundPoolEntry = sndManager.soundPoolSounds.getRandomSoundFromSoundPool(mod_pocketDim.modid+":creepy"); + if (soundPoolEntry != null) + { + sndManager.sndSystem.backgroundMusic("LimboMusic", soundPoolEntry.getSoundUrl(), soundPoolEntry.getSoundName(), false); + sndManager.sndSystem.play("LimboMusic"); + } + } + else if (!(world.provider instanceof LimboProvider)) + { + sndManager.sndSystem.stop("LimboMusic"); + } + } } } } \ No newline at end of file -- 2.39.5 From 4f2f86535b3e43ebf7f13c0817d7e9c864e06e29 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 15 Mar 2014 03:54:41 -0400 Subject: [PATCH 02/27] Minor Changes Cleaned up the code for placing Vanilla doors on rifts in EventHookContainer. Unfortunately, there's a section that I don't understand and that I feel has a bug. Remember that comments are very helpful. --- .../mod_pocketDim/EventHookContainer.java | 39 ++++++++++--------- .../mod_pocketDim/mod_pocketDim.java | 4 +- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 02f3aea..bfe6cf8 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -81,42 +81,43 @@ public class EventHookContainer @ForgeSubscribe public void onPlayerEvent(PlayerInteractEvent event) { - //Handle placement of vanilla doors on rifts - if(!event.entity.worldObj.isRemote) + // Handle placing Vanilla doors on rifts + if (!event.entity.worldObj.isRemote) { World world = event.entity.worldObj; - ItemStack item = event.entityPlayer.inventory.getCurrentItem(); - if(item!=null) + ItemStack stack = event.entityPlayer.inventory.getCurrentItem(); + if (stack != null) { - if(item.getItem() instanceof ItemDoor&&!(item.getItem() instanceof BaseItemDoor)) + Item item = stack.getItem(); + if (item instanceof ItemDoor && !(item instanceof BaseItemDoor)) { Block doorToPlace = null; - if(item.itemID == Item.doorIron.itemID) + if (stack.itemID == Item.doorIron.itemID) { - doorToPlace =mod_pocketDim.dimensionalDoor; + doorToPlace = mod_pocketDim.dimensionalDoor; } - else if(item.itemID == Item.doorWood.itemID) + else if (stack.itemID == Item.doorWood.itemID) { - doorToPlace =mod_pocketDim.warpDoor; + doorToPlace = mod_pocketDim.warpDoor; } - else if(item.itemID == mod_pocketDim.itemGoldenDoor.itemID) + else if (stack.itemID == mod_pocketDim.itemGoldenDoor.itemID) { - doorToPlace =mod_pocketDim.goldenDimensionalDoor; + doorToPlace = mod_pocketDim.goldenDimensionalDoor; } - if(((BaseItemDoor) mod_pocketDim.itemDimensionalDoor).tryPlacingDoor(doorToPlace, world, event.entityPlayer,item)) + + // SenseiKiwi: Why do we have a condition like this? And the event isn't cancelled if we take the else portion. + // Comments would have been very helpful. + if (mod_pocketDim.itemDimensionalDoor.tryPlacingDoor(doorToPlace, world, event.entityPlayer, stack)) { - if(!event.entityPlayer.capabilities.isCreativeMode) + if (!event.entityPlayer.capabilities.isCreativeMode) { - item.stackSize--; - } - if(!event.entity.worldObj.isRemote) - { - event.setCanceled(true); + stack.stackSize--; } + event.setCanceled(true); } else { - BaseItemDoor.tryItemUse(doorToPlace, item, event.entityPlayer, world, event.x, event.y, event.z, event.face, true, true); + BaseItemDoor.tryItemUse(doorToPlace, stack, event.entityPlayer, world, event.x, event.y, event.z, event.face, true, true); } } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index a5f2e8a..09bb6d6 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -124,7 +124,7 @@ public class mod_pocketDim public static Item itemWorldThread; public static Item itemRiftBlade; - public static Item itemDimensionalDoor; + public static ItemDimensionalDoor itemDimensionalDoor; public static Item itemWarpDoor; public static Item itemRiftRemover; public static Item itemRiftSignature; @@ -203,7 +203,7 @@ public class mod_pocketDim itemGoldenDimensionalDoor = (new ItemGoldDimDoor(properties.GoldenDimensionalDoorItemID, Material.iron)).setUnlocalizedName("itemGoldDimDoor"); itemGoldenDoor = (new ItemGoldDoor(properties.GoldenDoorID, Material.wood)).setUnlocalizedName("itemGoldDoor"); - itemDimensionalDoor = (new ItemDimensionalDoor(properties.DimensionalDoorItemID, Material.iron)).setUnlocalizedName("itemDimDoor"); + itemDimensionalDoor = (ItemDimensionalDoor) (new ItemDimensionalDoor(properties.DimensionalDoorItemID, Material.iron)).setUnlocalizedName("itemDimDoor"); itemWarpDoor = (new ItemWarpDoor(properties.WarpDoorItemID, Material.wood)).setUnlocalizedName("itemDimDoorWarp"); itemRiftSignature = (new ItemRiftSignature(properties.RiftSignatureItemID)).setUnlocalizedName("itemLinkSignature"); itemRiftRemover = (new itemRiftRemover(properties.RiftRemoverItemID, Material.wood)).setUnlocalizedName("itemRiftRemover"); -- 2.39.5 From 84eee1b15528b7c6d2f16fe2b55058f80506f054 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 16 Mar 2014 04:13:20 -0400 Subject: [PATCH 03/27] Added More Dungeons Added Cere-JumpPass, Cere-TransferTunnel, Cere-GreatHall, SK-WatchedForkLeft, and SK-WatchedForkRight. Made a minor change to SK-RaceTheLight. --- src/main/resources/schematics/ruins.txt | 4 ++++ ...omplexHall_Cere-JumpPass_Open_75.schematic | Bin 0 -> 675 bytes ...l_Cere-TransferTunnel_Closed_100.schematic | Bin 0 -> 2163 bytes .../Hub_Cere-GreatHall_Open_40.schematic | Bin 0 -> 8088 bytes ...all_SK-WatchedForkLeft_Closed_80.schematic | Bin 0 -> 2022 bytes ...ll_SK-WatchedForkRight_Closed_80.schematic | Bin 0 -> 2066 bytes .../Trap_SK-RaceTheLight_Closed_50.schematic | Bin 1604 -> 1565 bytes 7 files changed, 4 insertions(+) create mode 100644 src/main/resources/schematics/ruins/ComplexHall_Cere-JumpPass_Open_75.schematic create mode 100644 src/main/resources/schematics/ruins/ComplexHall_Cere-TransferTunnel_Closed_100.schematic create mode 100644 src/main/resources/schematics/ruins/Hub_Cere-GreatHall_Open_40.schematic create mode 100644 src/main/resources/schematics/ruins/SimpleHall_SK-WatchedForkLeft_Closed_80.schematic create mode 100644 src/main/resources/schematics/ruins/SimpleHall_SK-WatchedForkRight_Closed_80.schematic diff --git a/src/main/resources/schematics/ruins.txt b/src/main/resources/schematics/ruins.txt index f922cbb..fb199f5 100644 --- a/src/main/resources/schematics/ruins.txt +++ b/src/main/resources/schematics/ruins.txt @@ -1,5 +1,6 @@ /schematics/ruins/complexHall_buggyTopEntry1_open_100.schematic /schematics/ruins/ComplexHall_Cere-PuzzleWall_Open_75.schematic +/schematics/ruins/ComplexHall_Cere-TransferTunnel_Closed_100.schematic /schematics/ruins/complexHall_exitRuinsWithHiddenDoor_open_100.schematic /schematics/ruins/complexHall_hallwayHiddenTreasure_closed_100.schematic /schematics/ruins/complexHall_largeBrokenHall_closed_100.schematic @@ -36,6 +37,7 @@ /schematics/ruins/exit_smallExitPrison_open_100.schematic /schematics/ruins/hub_4WayBasicHall_closed_200.schematic /schematics/ruins/hub_4WayHallExit_closed_200.schematic +/schematics/ruins/Hub_Cere-GreatHall_Open_40.schematic /schematics/ruins/hub_doorTotemRuins_open_100.schematic /schematics/ruins/hub_fortRuins_open_100.schematic /schematics/ruins/hub_hallwayTrapRooms1_closed_100.schematic @@ -61,6 +63,8 @@ /schematics/ruins/SimpleHall_SK-SpiralHallway_Open_100.schematic /schematics/ruins/SimpleHall_SK-UTurnLeft_Open_50.schematic /schematics/ruins/SimpleHall_SK-UTurnRight_Open_50.schematic +/schematics/ruins/SimpleHall_SK-WatchedForkLeft_Closed_80.schematic +/schematics/ruins/SimpleHall_SK-WatchedForkRight_Closed_80.schematic /schematics/ruins/simpleHall_smallSimpleLeft_closed_100.schematic /schematics/ruins/simpleHall_smallSimpleRight_closed_100.schematic /schematics/ruins/trap_fakeTNTTrap_closed_100.schematic diff --git a/src/main/resources/schematics/ruins/ComplexHall_Cere-JumpPass_Open_75.schematic b/src/main/resources/schematics/ruins/ComplexHall_Cere-JumpPass_Open_75.schematic new file mode 100644 index 0000000000000000000000000000000000000000..9c242b6300ed23dde961216341d744a80a24921e GIT binary patch literal 675 zcmV;U0$lwciwFP!000000PR`bZqqOnJ}IPW_9HX|f``a8_oJNvX=q3wah)_)V=Z;6 z#Hbsukhhss?UqO3QE*4oriqmhfHnjm> z{Q(691qB5K1%>^DzBNeg(KJd*yHd8C!mc3gO3&}13#NJ_wMvJhS7afd+UUUP+mGU8 z&PwAlXMfnf>2B`inQf?0OnVlq7d7D z1p2u@^K27NeqbLZVMi>gKY$)~;cU&{j_`C81fd3}o*jKcgdq2ujYD>rj)M>*LT!oz z!cu!07%b%C22;@BHI7EV$OHvs=-HTDVsg#clVFC(RXFs62)S$v?Kew2W#cUybvE9> zf3HnVKwBo>umb8|D4HhKTRPH*9*XEH<6S1hsBBx4ubq~$-S47yA`|7cgH?vH$~a~( ztNtY-6Y9Zx1I%;R{pbhd>xhN?-QguU6c}9_sD-EHc6XR{B|J|$FrUv8FY^tl`t$5D z<2)S-4*9ot0ru+ujPS&xFzA8)6T9pq;H?4uoI>!cL9v6Ny~cAjkCB^%di->t1760 zQq0PZwVfq`pzoG2cmu0==Mp%g1Dar&M=9FPyX&%1)VoPq5< z}V-&4^RcUQ4q^D=)BEeH=pN02*6!X}p}W&6Iw9fuR;m&r&SCn|4ulIZAkbC78CIH|Uh1SPUkZy&ba!UKxN}s|XnJ-4x>>1B=s`%c{0?`ymfE6jLMSWlB6w~Od z&iYuys+IH~p^3;A3A4s}fHSt@eUb6Zd?R%0MZEWulW4T-;tju1$G-mF^ObG^xREYH z2c#?SnQ*VS{m}i#te>ZsQa|pYDf@IX4W}C=3-bBX*AiMmS7(FE1T4C-i^eW@$55MP z3-K|g{EXhlC}hZo8sDUR=lI0@dO;%AZiK}MX|3n6wgyN=4GCzyeX+ixp#u1H%Z(Re zb-Z5i-JP|@m7avLv58HSeAwXa33TsTLo>VE0mC%%rn#@MxG~YjM$D3_fBL|1wx*Fj z2YQ6$odqwsgwC{j%-8rHzt0Puj;5CXL5zPx5oDd>C*&nQ_v}k&U?W4^!cwv zb2b~hd$5jg-l{U{Vy#T1Gk4M>N#)vy{bkhD?zFWT`&Ul6 z7ask7I$>^h>UpwL>uMFe&7Sn;5_wb->ZITk$uX({gpI+W*Sw^zGECWZVp7RgUWgv- z-9AyfL@ko2y;U>hp7`UN8y~oQDgH*$r-D^@isYSi^JeUX&+LTd@&rZYekLMUjj#R& zpKYGkXx`EI_cL|TpSvc%&3{n_D#K|=1PtXkDyX$ESi5ug8ttO90i(hzy2au|MaZsq zqUNZ@qbJ9vE?sgR^9pYN!S4O+;;B*SkDveLW>nZr^%a0=A-D~?=m5+YP{`I#%vuJQ z%{F$ESS1T6WAn(88B}h|HKc!Ti{kr@u*KJI;;#HFLOcAvw1-?hcxYv@Jt|w=7WGmA z28yQl${-on#BGqdW^9^K6i zI-O(_zw-&I%V?ZEs5mn+rwPD>A9U|RM73%FFLNpAc#-ctdI)s}DQu5F@@V z=0K{KL~t`$P|{g4p}&Py-!)+3zwvXr3Ak)($0RLVA`FBuXJjXj+CXXRVFDYQhep=i zb^_~1C_Sgi#Xx!sELv^qr#YTno&DGWJ!>!dsR`i;>Jz#ZR!#5oZ^i4d9;Bs8S@eez z5xvX_z-)BXOO|yYov!Eb9^)>Jro4%(EkWNo%zDp+aZm^zP2FAi2cLW$OpJ+;IAc;5tpOKYqLfOQT)ekH)< z>U&-pNyZJX<6`k2Xf=9QIxFeJmrrUor%)3o)P%sMZF^yPzlsC4ExdFBg>e&u<4Q z2DgYr;eP%{5ZBDd4rU+-e)oUJ|5{@D>((mo{<^IieFlKKK%r3aw;+%X007fKp!p$w QrCZuMvD*)9BDQJ$0(1W=vH$=8 literal 0 HcmV?d00001 diff --git a/src/main/resources/schematics/ruins/Hub_Cere-GreatHall_Open_40.schematic b/src/main/resources/schematics/ruins/Hub_Cere-GreatHall_Open_40.schematic new file mode 100644 index 0000000000000000000000000000000000000000..e639e589fbdb90122736f608ac7b7c37f8a85431 GIT binary patch literal 8088 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/schematics/ruins/SimpleHall_SK-WatchedForkLeft_Closed_80.schematic b/src/main/resources/schematics/ruins/SimpleHall_SK-WatchedForkLeft_Closed_80.schematic new file mode 100644 index 0000000000000000000000000000000000000000..4601cc00dfbd11c7029c8be51093928a91235c28 GIT binary patch literal 2022 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 Jr~5Ymz(1dc5vc$G 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 -- 2.39.5 From cfd48e796a2c247acf312f21fb62a865687d62e5 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 16 Mar 2014 10:01:35 -0400 Subject: [PATCH 04/27] Added Settings and Minor Preemptive Fix Added a setting to DDProperties for controlling the max distance that players can be moved randomly when they're sent to Limbo. We previously had a setting for the same except for leaving Limbo. Cleaned up some of the related code a little. Added another setting for the chance of rifts dropping World Thread on block destruction. Also fixed a potential NPE in EventHookContainer that could arise theoretically arise if a non-Vanilla door was attached to a rift. --- .../mod_pocketDim/EventHookContainer.java | 28 ++++++++++--------- .../mod_pocketDim/blocks/BlockRift.java | 14 +++++----- .../mod_pocketDim/config/DDProperties.java | 11 +++++++- .../mod_pocketDim/ticking/MobMonolith.java | 3 +- .../mod_pocketDim/world/LimboProvider.java | 25 +++++++---------- 5 files changed, 43 insertions(+), 38 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java index bfe6cf8..b03e35f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -89,7 +89,7 @@ public class EventHookContainer if (stack != null) { Item item = stack.getItem(); - if (item instanceof ItemDoor && !(item instanceof BaseItemDoor)) + if (item instanceof ItemDoor) { Block doorToPlace = null; if (stack.itemID == Item.doorIron.itemID) @@ -105,19 +105,22 @@ public class EventHookContainer doorToPlace = mod_pocketDim.goldenDimensionalDoor; } - // SenseiKiwi: Why do we have a condition like this? And the event isn't cancelled if we take the else portion. - // Comments would have been very helpful. - if (mod_pocketDim.itemDimensionalDoor.tryPlacingDoor(doorToPlace, world, event.entityPlayer, stack)) + if (doorToPlace != null) { - if (!event.entityPlayer.capabilities.isCreativeMode) + // SenseiKiwi: Why do we have a condition like this? And the event isn't cancelled if we take the else portion. + // Comments would have been very helpful. + if (mod_pocketDim.itemDimensionalDoor.tryPlacingDoor(doorToPlace, world, event.entityPlayer, stack)) { - stack.stackSize--; + if (!event.entityPlayer.capabilities.isCreativeMode) + { + stack.stackSize--; + } + event.setCanceled(true); + } + else + { + BaseItemDoor.tryItemUse(doorToPlace, stack, event.entityPlayer, world, event.x, event.y, event.z, event.face, true, true); } - event.setCanceled(true); - } - else - { - BaseItemDoor.tryItemUse(doorToPlace, stack, event.entityPlayer, world, event.x, event.y, event.z, event.face, true, true); } } } @@ -198,8 +201,7 @@ public class EventHookContainer player.extinguish(); player.clearActivePotions(); player.setHealth(player.getMaxHealth()); - ChunkCoordinates coords = LimboProvider.getLimboSkySpawn(player.worldObj.rand); - Point4D destination = new Point4D((int) (coords.posX + player.posX), coords.posY, (int) (coords.posZ + player.posZ ), mod_pocketDim.properties.LimboDimensionID); + Point4D destination = LimboProvider.getLimboSkySpawn(player, properties); DDTeleporter.teleportEntity(player, destination, false); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java index cc15c9f..ada00b6 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java @@ -43,8 +43,8 @@ public class BlockRift extends Block implements ITileEntityProvider private static final int BLOCK_SEARCH_CHANCE = 50; private static final int MAX_BLOCK_DESTRUCTION_CHANCE = 100; private static final int BLOCK_DESTRUCTION_CHANCE = 50; - private static final int WORLD_THREAD_CHANCE = 5; - private static final int MAX_WORLD_THREAD_CHANCE = 100; + + public static final int MAX_WORLD_THREAD_DROP_CHANCE = 1000; private final DDProperties properties; private final ArrayList blocksImmuneToRift; @@ -173,7 +173,7 @@ public class BlockRift extends Block implements ITileEntityProvider { if (random.nextInt(MAX_BLOCK_DESTRUCTION_CHANCE) < BLOCK_DESTRUCTION_CHANCE) { - spawnWorldThread(world.getBlockId(target.getX(), target.getY(), target.getZ()), world, x, y, z, random); + dropWorldThread(world.getBlockId(target.getX(), target.getY(), target.getZ()), world, x, y, z, random); world.destroyBlock(target.getX(), target.getY(), target.getZ(), false); } } @@ -220,9 +220,9 @@ public class BlockRift extends Block implements ITileEntityProvider return targets; } - private void spawnWorldThread(int blockID, World world, int x, int y, int z, Random random) + private void dropWorldThread(int blockID, World world, int x, int y, int z, Random random) { - if (blockID != 0 && (random.nextInt(MAX_WORLD_THREAD_CHANCE) < WORLD_THREAD_CHANCE) + if (blockID != 0 && (random.nextInt(MAX_WORLD_THREAD_DROP_CHANCE) < properties.WorldThreadDropChance) && !(Block.blocksList[blockID] instanceof BlockFlowing || Block.blocksList[blockID] instanceof BlockFluid || Block.blocksList[blockID] instanceof IFluidBlock)) @@ -258,7 +258,7 @@ public class BlockRift extends Block implements ITileEntityProvider { int blockID = world.getBlockId(x, y, z); if (world.setBlock(x, y, z, properties.RiftBlockID)) - spawnWorldThread(blockID, world, x, y, z, random); + dropWorldThread(blockID, world, x, y, z, random); } } @@ -284,7 +284,7 @@ public class BlockRift extends Block implements ITileEntityProvider if (world.setBlock(x, y, z, properties.RiftBlockID)) { dimension.createChildLink(x, y, z, parent); - spawnWorldThread(blockID, world, x, y, z, random); + dropWorldThread(blockID, world, x, y, z, random); return true; } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java index 67b1b11..3aaa69a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java @@ -3,6 +3,7 @@ package StevenDimDoors.mod_pocketDim.config; import java.io.File; import net.minecraftforge.common.Configuration; +import StevenDimDoors.mod_pocketDim.blocks.BlockRift; import StevenDimDoors.mod_pocketDim.ticking.CustomLimboPopulator; import StevenDimDoors.mod_pocketDim.world.fortresses.DDStructureNetherBridgeStart; import StevenDimDoors.mod_pocketDim.world.gateways.GatewayGenerator; @@ -107,6 +108,8 @@ public class DDProperties public final int GatewayGenerationChance; public final int FortressGatewayGenerationChance; public final int MonolithSpawningChance; + public final int WorldThreadDropChance; + public final int LimboEntryRange; public final int LimboReturnRange; public final int WorldThreadRequirementLevel; public final String CustomSchematicDirectory; @@ -166,8 +169,10 @@ public class DDProperties "Sets whether players keep their inventories upon dying and respawning in Limbo").getBoolean(true); HardcoreLimboEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Hardcore Limbo", false, "Sets whether players that die in Limbo will respawn there").getBoolean(false); + LimboEntryRange = config.get(Configuration.CATEGORY_GENERAL, "Limbo Entry Range", 500, + "Sets the farthest distance that players may be moved at random when sent to Limbo. Must be greater than or equal to 0.").getInt(); LimboReturnRange = config.get(Configuration.CATEGORY_GENERAL, "Limbo Return Range", 500, - "Sets the farthest distance that Limbo can send you upon returning to the Overworld").getInt(); + "Sets the farthest distance that players may be moved at random when sent from Limbo to the Overworld. Must be greater than or equal to 0.").getInt(); DoorRenderingEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Door Rendering", true).getBoolean(true); TNFREAKINGT_Enabled = config.get(Configuration.CATEGORY_GENERAL, "EXPLOSIONS!!???!!!?!?!!", false).getBoolean(false); @@ -227,6 +232,10 @@ public class DDProperties FortressGatewayGenerationChance = config.get(Configuration.CATEGORY_GENERAL, "Fortress Gateway Generation Chance", 33, "Sets the chance (out of " + DDStructureNetherBridgeStart.MAX_GATEWAY_GENERATION_CHANCE + ") that a Rift Gateway will " + "generate as part of a Nether Fortress. The default chance is 33.").getInt(); + + WorldThreadDropChance = config.get(Configuration.CATEGORY_GENERAL, "World Thread Drop Chance", 50, + "Sets the chance (out of " + BlockRift.MAX_WORLD_THREAD_DROP_CHANCE + ") that a rift will " + + "drop World Thread when it destroys a block. The default chance is 50.").getInt(); LimboBiomeID = config.get(CATEGORY_BIOME, "Limbo Biome ID", 251).getInt(); PocketBiomeID = config.get(CATEGORY_BIOME, "Pocket Biome ID", 250).getInt(); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java index ae1f7cc..36df4dc 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java @@ -195,8 +195,7 @@ public class MobMonolith extends EntityFlying implements IMob } else if (!this.worldObj.isRemote && properties.MonolithTeleportationEnabled && !entityPlayer.capabilities.isCreativeMode) { - ChunkCoordinates coords = LimboProvider.getLimboSkySpawn(entityPlayer.worldObj.rand); - Point4D destination = new Point4D((int) (coords.posX+entityPlayer.posX), coords.posY, (int) (coords.posZ+entityPlayer.posZ ), mod_pocketDim.properties.LimboDimensionID); + Point4D destination = LimboProvider.getLimboSkySpawn(entityPlayer, properties); DDTeleporter.teleportEntity(entityPlayer, destination, false); this.aggro = 0; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java index 3be9520..76ae6cb 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java @@ -3,8 +3,10 @@ package StevenDimDoors.mod_pocketDim.world; import java.util.Random; import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.world.WorldProvider; import net.minecraft.world.biome.BiomeGenBase; @@ -15,6 +17,7 @@ import StevenDimDoors.mod_pocketDim.CloudRenderBlank; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.ticking.CustomLimboPopulator; +import StevenDimDoors.mod_pocketDim.util.Point4D; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -174,26 +177,18 @@ public class LimboProvider extends WorldProvider return false; } - public static ChunkCoordinates getLimboSkySpawn(Random rand) + public static Point4D getLimboSkySpawn(EntityPlayer player, DDProperties properties) { - ChunkCoordinates var5 = new ChunkCoordinates(0,0,0); - - - int spawnFuzz = 1000; - int spawnFuzzHalf = spawnFuzz / 2; - - { - var5.posX += rand.nextInt(spawnFuzz) - spawnFuzzHalf; - var5.posZ += rand.nextInt(spawnFuzz) - spawnFuzzHalf; - var5.posY = 700; - } - - return var5; + int x = (int) (player.posX) + MathHelper.getRandomIntegerInRange(player.worldObj.rand, -properties.LimboEntryRange, properties.LimboEntryRange); + int z = (int) (player.posZ) + MathHelper.getRandomIntegerInRange(player.worldObj.rand, -properties.LimboEntryRange, properties.LimboEntryRange); + return new Point4D(x, 700, z, properties.LimboDimensionID); } @Override public ChunkCoordinates getRandomizedSpawnPoint() { - return getLimboSkySpawn(this.worldObj.rand); + int x = MathHelper.getRandomIntegerInRange(this.worldObj.rand, -500, 500); + int z = MathHelper.getRandomIntegerInRange(this.worldObj.rand, -500, 500); + return new ChunkCoordinates(x, 700, z); } } \ No newline at end of file -- 2.39.5 From 188ec6d68b61194d762a8aaa56ac931b6064696b Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 16 Mar 2014 10:08:37 -0400 Subject: [PATCH 05/27] Minor Change Minor name change --- .../java/StevenDimDoors/mod_pocketDim/EventHookContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java index b03e35f..f52fa18 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -40,7 +40,7 @@ public class EventHookContainer } @ForgeSubscribe(priority = EventPriority.LOW) - public void onMapGen(InitMapGenEvent event) + public void onInitMapGen(InitMapGenEvent event) { // Replace the Nether fortress generator with our own only if any gateways would ever generate. // This allows admins to disable our fortress overriding without disabling all gateways. -- 2.39.5 From 1e5e8dcf2b440a8a561174025c97304f70f48004 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 16 Mar 2014 22:44:13 -0400 Subject: [PATCH 06/27] Added Subtree Searches for Dungeon Packs Added a new setting to dungeon pack configs called "DuplicateSearchLevels", which allows us to configure how many levels up of the dungeon tree should be checked to avoid duplicating rooms used in that subtree. In other words, it lets us avoid repeating rooms used in neighboring branches of the dungeon. The setting has been added but it's not fully supported yet - some additional code is needed in DungeonHelper and it's not trivial to implement. I took a break because doing it wrong could break dungeon selection. --- .../dungeon/pack/DungeonPack.java | 34 ++++++++++++++++--- .../dungeon/pack/DungeonPackConfig.java | 12 +++++++ .../dungeon/pack/DungeonPackConfigReader.java | 15 ++++++++ .../mod_pocketDim/helpers/DungeonHelper.java | 9 ++++- src/main/resources/schematics/ruins/rules.txt | 2 ++ 5 files changed, 67 insertions(+), 5 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java index af997fa..44ea2d1 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java @@ -21,6 +21,7 @@ public class DungeonPack //FIXME: Do not release this code as an update without dealing with disowned types! private static final int MAX_HISTORY_LENGTH = 30; + private static final int MAX_SUBTREE_LIST_SIZE = 30; private final String name; private final HashMap nameToTypeMapping; @@ -136,15 +137,30 @@ public class DungeonPack int maxSearchLength = config.allowDuplicatesInChain() ? maxRuleLength : MAX_HISTORY_LENGTH; ArrayList history = DungeonHelper.getDungeonChainHistory(dimension, this, maxSearchLength); - return getNextDungeon(history, random); + + ArrayList subtreeHistory; + /*if (config.getDuplicateSearchLevels() > 0) + { + subtreeHistory = DungeonHelper.getFlatDungeonTree( + DungeonHelper.getAncestor(dimension, config.getDuplicateSearchLevels()), + MAX_SUBTREE_LIST_SIZE); + } + else + { + subtreeHistory = new ArrayList(); + }*/ + subtreeHistory = new ArrayList(); + + return getNextDungeon(history, subtreeHistory, random); } - private DungeonData getNextDungeon(ArrayList history, Random random) + private DungeonData getNextDungeon(ArrayList history, ArrayList subtreeHistory, Random random) { //Extract the dungeon types that have been used from history and convert them into an array of IDs int index; int[] typeHistory = new int[history.size()]; HashSet excludedDungeons = null; + boolean doExclude = !config.allowDuplicatesInChain() || !subtreeHistory.isEmpty(); for (index = 0; index < typeHistory.length; index++) { typeHistory[index] = history.get(index).dungeonType().ID; @@ -163,9 +179,19 @@ public class DungeonPack if (nextType != null) { //Initialize the set of excluded dungeons if needed - if (excludedDungeons == null && !config.allowDuplicatesInChain()) + if (excludedDungeons == null && doExclude) { - excludedDungeons = new HashSet(history); + if (config.allowDuplicatesInChain()) + { + excludedDungeons = new HashSet(subtreeHistory); + excludedDungeons.addAll(subtreeHistory); + } + else + { + excludedDungeons = new HashSet(2 * (history.size() + subtreeHistory.size())); + excludedDungeons.addAll(history); + excludedDungeons.addAll(subtreeHistory); + } } //List which dungeons are allowed diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java index 0074545..e5eaa54 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java @@ -11,6 +11,7 @@ public class DungeonPackConfig private boolean allowPackChangeOut; private boolean distortDoorCoordinates; private int packWeight; + private int duplicateSearchLevels; private ArrayList rules; public DungeonPackConfig() { } @@ -25,6 +26,7 @@ public class DungeonPackConfig this.allowPackChangeOut = source.allowPackChangeOut; this.distortDoorCoordinates = source.distortDoorCoordinates; this.packWeight = source.packWeight; + this.duplicateSearchLevels = source.duplicateSearchLevels; this.rules = (source.rules != null) ? (ArrayList) source.rules.clone() : null; } @@ -114,6 +116,16 @@ public class DungeonPackConfig this.packWeight = packWeight; } + public int getDuplicateSearchLevels() + { + return duplicateSearchLevels; + } + + public void setDuplicateSearchLevels(int duplicateSearchLevels) + { + this.duplicateSearchLevels = duplicateSearchLevels; + } + public boolean doDistortDoorCoordinates() { return distortDoorCoordinates; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfigReader.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfigReader.java index e24ecc6..0f8b05c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfigReader.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfigReader.java @@ -35,6 +35,8 @@ public class DungeonPackConfigReader extends BaseConfigurationProcessor= MIN_DUPLICATE_SEARCH_LEVELS && levels <= MAX_DUPLICATE_SEARCH_LEVELS) + { + config.setDuplicateSearchLevels(levels); + } + else + { + valid = false; + } + } else { valid = false; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index 545168d..419ffcd 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -615,7 +615,7 @@ public class DungeonHelper { throw new IllegalArgumentException("dimension cannot be null."); } - if(dimension.parent()==null) + if (dimension.parent() == null) { return new ArrayList(); } @@ -664,4 +664,11 @@ public class DungeonHelper } return dungeons; } + + public static NewDimData getAncestor(NewDimData dimension, int levels) + { + // Find the ancestor of a dimension located a specified number of levels up. + // If such an ancestor does not exist, return the root dimension. + return null; + } } \ No newline at end of file diff --git a/src/main/resources/schematics/ruins/rules.txt b/src/main/resources/schematics/ruins/rules.txt index a14fe17..0618858 100644 --- a/src/main/resources/schematics/ruins/rules.txt +++ b/src/main/resources/schematics/ruins/rules.txt @@ -16,6 +16,8 @@ DistortDoorCoordinates = true ## Prevent this pack from being selected for transitioning in once we've transitioned out AllowPackChangeIn = false +DuplicateSearchLevels = 1 + Rules: Exit -> DeadEnd Exit -- 2.39.5 From 151f1a93a51bd81ae2656420ac14acb6c887e87b Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 16 Mar 2014 22:55:26 -0400 Subject: [PATCH 07/27] Fixed Tooltip for ItemStabilizedRiftSignature Fixed the tooltip for the Stabilized Rift Signature - it was a copy of the Rift Signature's tooltip. --- .../mod_pocketDim/items/ItemStabilizedRiftSignature.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java index c17da83..4d1cf84 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java @@ -119,8 +119,8 @@ public class ItemStabilizedRiftSignature extends ItemRiftSignature else { par3List.add("First click stores a location,"); - par3List.add("second click creates two rifts"); - par3List.add("that link the locations together."); + par3List.add("other clicks create rifts linking"); + par3List.add("the first and last locations together."); } } } -- 2.39.5 From 3966f420db9a25979c75e0b6b79fd262a0039cad Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Mon, 17 Mar 2014 02:37:57 -0400 Subject: [PATCH 08/27] Improvements to Dungeon Selection Changed the code for dungeon selection in various classes so that rather than allocating and passing around the dimension where the dungeon will be generated, we instead pass around the parent dimension. This simplifies our code and moves us toward avoiding stray dims when dungeon selection fails and to solving the dungeon pre-generation problem with gateways. --- .../dungeon/pack/DungeonPack.java | 6 +- .../mod_pocketDim/helpers/DungeonHelper.java | 61 +++++++++++-------- .../mod_pocketDim/world/PocketBuilder.java | 35 ++++------- 3 files changed, 52 insertions(+), 50 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java index 44ea2d1..6c426d2 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java @@ -123,7 +123,7 @@ public class DungeonPack } } - public DungeonData getNextDungeon(NewDimData dimension, Random random) + public DungeonData getNextDungeon(NewDimData parent, Random random) { if (allDungeons.isEmpty()) { @@ -136,13 +136,13 @@ public class DungeonPack //for dungeon packs that can extend arbitrarily deep. We should probably set a reasonable limit anyway. int maxSearchLength = config.allowDuplicatesInChain() ? maxRuleLength : MAX_HISTORY_LENGTH; - ArrayList history = DungeonHelper.getDungeonChainHistory(dimension, this, maxSearchLength); + ArrayList history = DungeonHelper.getDungeonChainHistory(parent, this, maxSearchLength); ArrayList subtreeHistory; /*if (config.getDuplicateSearchLevels() > 0) { subtreeHistory = DungeonHelper.getFlatDungeonTree( - DungeonHelper.getAncestor(dimension, config.getDuplicateSearchLevels()), + DungeonHelper.getAncestor(parent, config.getDuplicateSearchLevels()), MAX_SUBTREE_LIST_SIZE); } else diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index 419ffcd..e2d601b 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -231,10 +231,13 @@ public class DungeonHelper return dungeonPackMapping.get(name.toUpperCase()); } - private DungeonPack getDimDungeonPack(NewDimData data) + private DungeonPack getDimDungeonPack(NewDimData dimension) { + // TODO: Drop support for dim-based packs and switch to embedding the pack + // in the link data itself. That would solve the dungeon pre-generation issue. + DungeonPack pack; - DungeonData dungeon = data.dungeon(); + DungeonData dungeon = dimension.dungeon(); if (dungeon != null) { pack = dungeon.dungeonType().Owner; @@ -247,7 +250,7 @@ public class DungeonHelper } else { - if (data.id() == NETHER_DIMENSION_ID) + if (dimension.id() == NETHER_DIMENSION_ID) { pack = NetherPack; } @@ -500,9 +503,9 @@ public class DungeonHelper } } - public DungeonData selectDungeon(NewDimData dimension, Random random) + public DungeonData selectNextDungeon(NewDimData parent, Random random) { - DungeonPack pack = getDimDungeonPack(dimension.parent()); + DungeonPack pack = getDimDungeonPack(parent); DungeonData selection; DungeonPackConfig config; DungeonPack selectedPack; @@ -512,30 +515,30 @@ public class DungeonHelper config = pack.getConfig(); selectedPack = pack; - //Are we allowed to switch to another dungeon pack? + // Are we allowed to switch to another dungeon pack? if (config.allowPackChangeOut()) { - //Calculate the chance of switching to a different pack type + // Calculate the chance of switching to a different pack type int packSwitchChance; - if (dimension.depth() == 1) + if (parent.isPocketDimension()) { - packSwitchChance = START_PACK_SWITCH_CHANCE; + packSwitchChance = MIN_PACK_SWITCH_CHANCE + parent.packDepth() * PACK_SWITCH_CHANCE_PER_LEVEL; } else { - packSwitchChance = MIN_PACK_SWITCH_CHANCE + dimension.parent().packDepth() * PACK_SWITCH_CHANCE_PER_LEVEL; + packSwitchChance = START_PACK_SWITCH_CHANCE; } - //Decide randomly whether to switch packs or not + // Decide randomly whether to switch packs or not if (random.nextInt(MAX_PACK_SWITCH_CHANCE) < packSwitchChance) { - //Find another pack + // Find another pack selectedPack = getRandomDungeonPack(pack, random); } } //Pick the next dungeon - selection = selectedPack.getNextDungeon(dimension, random); + selection = selectedPack.getNextDungeon(parent, random); } catch (Exception e) { @@ -609,34 +612,42 @@ public class DungeonHelper return names; } - public static ArrayList getDungeonChainHistory(NewDimData dimension, DungeonPack pack, int maxSize) + /** + * Lists all of the dungeons found by iterating through a dimension's ancestors. The search stops when a non-dungeon dimension is found or when the pack of a dungeon differs from the specified pack. + * @param start - the first dimension to include in the history + * @param pack - the pack to which any dungeons must belong in order to be listed + * @param maxSize - the maximum number of dungeons that can be listed + * @return a list of dungeons used in a given chain + */ + public static ArrayList getDungeonChainHistory(NewDimData start, DungeonPack pack, int maxSize) { - if (dimension == null) + if (start == null) { throw new IllegalArgumentException("dimension cannot be null."); } - if (dimension.parent() == null) - { - return new ArrayList(); - } int count = 0; - NewDimData tail = dimension.parent(); - DungeonData dungeon = tail.dungeon(); + NewDimData current = start; + DungeonData dungeon = current.dungeon(); ArrayList history = new ArrayList(); while (count < maxSize && dungeon != null && dungeon.dungeonType().Owner == pack) { history.add(dungeon); - tail = tail.parent(); - dungeon = tail.dungeon(); + current = current.parent(); + dungeon = current.dungeon(); count++; } return history; } - public static ArrayList getFlatDungeonTree(NewDimData dimension, int maxSize) + /** + * Performs a breadth-first listing of all dungeons rooted at a specified dimension. Only dungeons from the same pack as the root will be included. + * @param root - the pocket dimension that serves as the root for the dungeon tree + * @param maxSize - the maximum number of dungeons that can be listed + * @return a list of the dungeons used in a given dungeon tree + */ + public static ArrayList listDungeonsInTree(NewDimData root, int maxSize) { - NewDimData root = dimension; ArrayList dungeons = new ArrayList(); Queue pendingDimensions = new LinkedList(); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index c384ec4..877837f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -186,7 +186,6 @@ public class PocketBuilder schematic = loadAndValidateDungeon(dungeon, properties); return PocketBuilder.buildDungeonPocket(dungeon, dimension, link, schematic, world, properties); - } @@ -206,10 +205,18 @@ public class PocketBuilder throw new IllegalArgumentException("link cannot have a destination assigned already."); } - + //Choose a dungeon to generate + NewDimData parent = PocketManager.getDimensionData(link.source().getDimension()); + Pair pair = selectNextDungeon(parent, random, properties); + if (pair == null) + { + System.err.println("Could not select a dungeon for generation!"); + return false; + } + DungeonData dungeon = pair.getFirst(); + DungeonSchematic schematic = pair.getSecond(); //Register a new dimension - NewDimData parent = PocketManager.getDimensionData(link.source().getDimension()); NewDimData dimension = PocketManager.registerPocket(parent, true); //Load a world @@ -220,17 +227,7 @@ public class PocketBuilder System.err.println("Could not initialize dimension for a dungeon!"); return false; } - - //Choose a dungeon to generate - Pair pair = selectDungeon(dimension, random, properties); - if (pair == null) - { - System.err.println("Could not select a dungeon for generation!"); - return false; - } - DungeonData dungeon = pair.getFirst(); - DungeonSchematic schematic = pair.getSecond(); - + return buildDungeonPocket(dungeon, dimension, link, schematic, world, properties); } @@ -251,18 +248,12 @@ public class PocketBuilder return linkDestination; } - private static Pair selectDungeon(NewDimData dimension, Random random, DDProperties properties) + private static Pair selectNextDungeon(NewDimData parent, Random random, DDProperties properties) { - //We assume the dimension doesn't have a dungeon assigned - if (dimension.dungeon() != null) - { - throw new IllegalArgumentException("dimension cannot have a dungeon assigned already."); - } - DungeonData dungeon = null; DungeonSchematic schematic = null; - dungeon = DungeonHelper.instance().selectDungeon(dimension, random); + dungeon = DungeonHelper.instance().selectNextDungeon(parent, random); if (dungeon != null) { -- 2.39.5 From f4b619635ef56f774bf7bbb99219a3c856b1258d Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Mon, 17 Mar 2014 03:04:06 -0400 Subject: [PATCH 09/27] Rearranged dd-rift Workflow Changed dd-rift and dd-random so that rifts are only placed after a dungeon is generated successfully. We also delete the link if generation fails to clean up after ourselves. Also changed PocketBuilder.generateSelectedDungeonPocket() so that its checks are stricter and we validate dungeons before allocating a dimension. This resolves one of our old issues: "Rearrange workflow in dd-rift to prevent rifts from being created if no dungeon gets loaded and to prevent dimension registration if the dimension cannot be populated" --- .../commands/CommandCreateDungeonRift.java | 19 +++++++++++---- .../commands/CommandCreateRandomRift.java | 19 +++++++++++---- .../mod_pocketDim/world/PocketBuilder.java | 24 ++++++++----------- .../world/gateways/BaseGateway.java | 12 ++++++++-- 4 files changed, 48 insertions(+), 26 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java index d5ba8dd..b1512e3 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java @@ -63,15 +63,24 @@ public class CommandCreateDungeonRift extends DDCommandBase { result = findDungeonByPartialName(command[0], dungeonHelper.getUntaggedDungeons()); } - //Check if we found any matches + + // 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() + ")."); + if (PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, result)) + { + // Create a rift to our selected dungeon and notify the player + 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 + { + // Dungeon generation failed somehow. Notify the user and remove the useless link. + dimension.deleteLink(link); + sendChat(sender, "Dungeon generation failed unexpectedly!"); + } } else { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateRandomRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateRandomRift.java index 013921b..97cc1a5 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateRandomRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateRandomRift.java @@ -69,15 +69,24 @@ public class CommandCreateRandomRift extends DDCommandBase { result = getRandomDungeonByPartialName(command[0], dungeonHelper.getUntaggedDungeons()); } - //Check if we found any matches + + // 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() + ")."); + if (PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, result)) + { + // Create a rift to our selected dungeon and notify the player + 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 + { + // Dungeon generation failed somehow. Notify the user and remove the useless link. + dimension.deleteLink(link); + sendChat(sender, "Dungeon generation failed unexpectedly!"); + } } else { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index 877837f..860bf4c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -145,7 +145,7 @@ public class PocketBuilder return true; } - public static boolean generateSelectedDungeonPocket(DimLink link, DDProperties properties, DungeonData data) + public static boolean generateSelectedDungeonPocket(DimLink link, DDProperties properties, DungeonData dungeon) { if (link == null) { @@ -155,13 +155,20 @@ public class PocketBuilder { throw new IllegalArgumentException("properties cannot be null."); } - if (link.hasDestination()) { throw new IllegalArgumentException("link cannot have a destination assigned already."); } + if (dungeon == null) + { + throw new IllegalArgumentException("dungeon cannot be null."); + } - //Register a new dimension + // Try to load up the schematic + DungeonSchematic schematic = null; + schematic = loadAndValidateDungeon(dungeon, properties); + + // Register a new dimension NewDimData parent = PocketManager.getDimensionData(link.source().getDimension()); NewDimData dimension = PocketManager.registerPocket(parent, true); @@ -174,17 +181,6 @@ public class PocketBuilder return false; } - DungeonData dungeon = null; - DungeonSchematic schematic = null; - - dungeon = data; - if (data == null) - { - System.err.println("Could not select a dungeon for generation!"); - return false; - } - schematic = loadAndValidateDungeon(dungeon, properties); - return PocketBuilder.buildDungeonPocket(dungeon, dimension, link, schematic, world, properties); } 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 92572b7..b19e8df 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java @@ -73,7 +73,15 @@ public abstract class BaseGateway this.generateRandomBits(world, x, y, z); DimLink link = PocketManager.getDimensionData(world).createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation); - PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, this.getStartingDungeon(PocketManager.getDimensionData(world),world.rand)); + DungeonData dungeon = this.getStartingDungeon(PocketManager.getDimensionData(world), world.rand); + if (dungeon != null) + { + PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, dungeon); + } + else + { + System.err.println("Warning: Dimensional Doors was unable to assign a dungeon to a Rift Gateway."); + } return true; } @@ -107,7 +115,7 @@ public abstract class BaseGateway */ public DungeonData getStartingDungeon(NewDimData dimension, Random random) { - return getStartingPack().getNextDungeon(dimension,random); + return getStartingPack().getNextDungeon(dimension, random); } /** -- 2.39.5 From a92b07d976757052bcf3dac18dac8cf6348d480d Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Mon, 17 Mar 2014 06:34:02 -0400 Subject: [PATCH 10/27] Overhauled Gateway Code * Split off schematic-related functionality into BaseSchematicGateway. * Moved the default implementations of many methods to the base classes because having a bunch of duplicate stubs all over the place was a waste. * Removed methods that were redundant or weren't being used for anything. * Added support for importing schematics while ignoring air blocks through IBlockSetter - now our gateways are copied in without air by default. * Fixed bugs that would have prevented the sandstone gateway from generating. * Removed the code in generate() that would cause dungeon pre-generation. We should solve this by attaching data to links instead and it's not a feature that we're even using right now (everything uses the default pack). * Fully documented our functions - it's so beautiful... --- .../dungeon/DungeonSchematic.java | 4 +- .../schematic/ChunkBlockSetter.java | 9 +- .../mod_pocketDim/schematic/Schematic.java | 6 +- .../schematic/WorldBlockSetter.java | 15 +- .../world/gateways/BaseGateway.java | 193 ++++-------------- .../world/gateways/BaseSchematicGateway.java | 66 ++++++ .../world/gateways/GatewayGenerator.java | 21 +- .../world/gateways/GatewayLimbo.java | 46 +---- .../gateways/GatewaySandstonePillars.java | 48 +---- .../world/gateways/GatewayTwoPillars.java | 43 +--- 10 files changed, 158 insertions(+), 293 deletions(-) create mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseSchematicGateway.java diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 38848ad..23bd064 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -184,11 +184,11 @@ public class DungeonSchematic extends Schematic { { if (notifyClients) { - copyToWorld(world, pocketCenter, targetOrientation, entryLink, random, properties, new WorldBlockSetter(false, true)); + copyToWorld(world, pocketCenter, targetOrientation, entryLink, random, properties, new WorldBlockSetter(false, true, false)); } else { - copyToWorld(world, pocketCenter, targetOrientation, entryLink, random, properties, new ChunkBlockSetter()); + copyToWorld(world, pocketCenter, targetOrientation, entryLink, random, properties, new ChunkBlockSetter(false)); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/ChunkBlockSetter.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/ChunkBlockSetter.java index e7203fb..b00195c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/ChunkBlockSetter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/ChunkBlockSetter.java @@ -7,11 +7,16 @@ import net.minecraft.world.chunk.storage.ExtendedBlockStorage; public class ChunkBlockSetter implements IBlockSetter { - public ChunkBlockSetter() { } + private boolean ignoreAir; + + public ChunkBlockSetter(boolean ignoreAir) + { + this.ignoreAir = ignoreAir; + } public void setBlock(World world, int x, int y, int z, int blockID, int metadata) { - if (blockID != 0 && Block.blocksList[blockID] == null) + if ((blockID == 0 && ignoreAir) || (blockID != 0 && Block.blocksList[blockID] == null)) { return; } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java index 8bf7dbb..dbb912f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java @@ -362,15 +362,15 @@ public class Schematic { return filter.apply(this, this.blocks, this.metadata); } - public void copyToWorld(World world, int x, int y, int z, boolean notifyClients) + public void copyToWorld(World world, int x, int y, int z, boolean notifyClients, boolean ignoreAir) { if (notifyClients) { - copyToWorld(world, x, y, z, new WorldBlockSetter(false, true)); + copyToWorld(world, x, y, z, new WorldBlockSetter(false, true, ignoreAir)); } else { - copyToWorld(world, x, y, z, new ChunkBlockSetter()); + copyToWorld(world, x, y, z, new ChunkBlockSetter(ignoreAir)); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/WorldBlockSetter.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/WorldBlockSetter.java index 3ac4563..2ff9e08 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/WorldBlockSetter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/WorldBlockSetter.java @@ -11,16 +11,21 @@ public class WorldBlockSetter implements IBlockSetter public final int NOTIFY_CLIENT_FLAG = 2; private int flags; + private boolean ignoreAir; - public WorldBlockSetter(boolean doBlockUpdates, boolean notifyClients) + public WorldBlockSetter(boolean doBlockUpdates, boolean notifyClients, boolean ignoreAir) { - flags = 0; - flags += doBlockUpdates ? BLOCK_UPDATES_FLAG : 0; - flags += notifyClients ? NOTIFY_CLIENT_FLAG : 0; + this.flags = 0; + this.flags += doBlockUpdates ? BLOCK_UPDATES_FLAG : 0; + this.flags += notifyClients ? NOTIFY_CLIENT_FLAG : 0; + this.ignoreAir = ignoreAir; } public void setBlock(World world, int x, int y, int z, int blockID, int metadata) { - world.setBlock(x, y, z, blockID, metadata, flags); + if (!ignoreAir || blockID != 0) + { + world.setBlock(x, y, z, blockID, metadata, flags); + } } } 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 b19e8df..58567b0 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java @@ -1,144 +1,41 @@ package StevenDimDoors.mod_pocketDim.world.gateways; -import java.util.ArrayList; -import java.util.Map; -import java.util.Random; -import java.util.TreeMap; -import java.util.Map.Entry; - -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; -import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; -import StevenDimDoors.mod_pocketDim.dungeon.DungeonSchematic; -import StevenDimDoors.mod_pocketDim.dungeon.ModBlockFilter; -import StevenDimDoors.mod_pocketDim.dungeon.SpecialBlockFinder; -import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; -import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; -import StevenDimDoors.mod_pocketDim.schematic.CompoundFilter; -import StevenDimDoors.mod_pocketDim.schematic.InvalidSchematicException; -import StevenDimDoors.mod_pocketDim.schematic.ReplacementFilter; -import StevenDimDoors.mod_pocketDim.schematic.Schematic; -import StevenDimDoors.mod_pocketDim.schematic.SchematicFilter; -import StevenDimDoors.mod_pocketDim.world.PocketBuilder; -import net.minecraft.block.Block; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; +import StevenDimDoors.mod_pocketDim.config.DDProperties; public abstract class BaseGateway { - DDProperties properties; + protected DDProperties properties; public BaseGateway(DDProperties properties) { - this.properties=properties; + this.properties = properties; } /** - * Generates the gateway centered on the given coords - * @param world - * @param x - * @param y - * @param z + * Generates the gateway centered on the given coordinates + * @param world - the world in which to generate the gateway + * @param x - the x-coordinate at which to center the gateway; usually where the door is placed + * @param y - the y-coordinate of the block on which the gateway may be built + * @param z - the z-coordinate at which to center the gateway; usually where the door is placed */ - public boolean generate(World world, int x, int y, int z) - { - int orientation = 0; - - if (this.getSchematicPath()!=null) - { - //Get the correct filters - GatewayBlockFilter filter = new GatewayBlockFilter(); - DungeonSchematic schematic = this.getSchematicToBuild(world, x, y, z); - - //apply filters - schematic.applyFilter(filter); - schematic.applyImportFilters(properties); - - Point3D doorLocation = filter.getEntranceDoorLocation(); - orientation = filter.getEntranceOrientation(); - - // I suspect that the location used below is wrong. Gateways should be placed vertically based on - // the Y position of the surface where they belong. I'm pretty sure including doorLocation.getY() - // messes up the calculation. ~SenseiKiwi - - //schematic.copyToWorld(world, x - doorLocation.getX(), y, z - doorLocation.getZ()); - schematic.copyToWorld(world, x - doorLocation.getX(), y + 1 - doorLocation.getY(), z - doorLocation.getZ(), true); - } - - this.generateRandomBits(world, x, y, z); - - DimLink link = PocketManager.getDimensionData(world).createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation); - DungeonData dungeon = this.getStartingDungeon(PocketManager.getDimensionData(world), world.rand); - if (dungeon != null) - { - PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, dungeon); - } - else - { - System.err.println("Warning: Dimensional Doors was unable to assign a dungeon to a Rift Gateway."); - } - - return true; - } + public abstract boolean generate(World world, int x, int y, int z); /** - * Gets a .schematic to generate for this gateway - * @param world - * @param x - * @param y - * @param z - * @return + * Determines whether the specified biome is a valid biome in which to generate this gateway + * @param biome - the biome to be checked + * @return true true if the specified biome is a valid for generating this gateway, otherwise false */ - public DungeonSchematic getSchematicToBuild(World world, int x, int y, int z) + protected boolean isBiomeValid(BiomeGenBase biome) { - //TODO- refine selection criteria here, this is the default case - try + String biomeName = biome.biomeName.toLowerCase(); + String[] keywords = this.getBiomeKeywords(); + if (keywords != null) { - return DungeonSchematic.readFromResource(this.getSchematicPath()); - } - catch (Exception e) - { - e.printStackTrace(); - System.err.println("Could not load schematic for gateway"); - return null; - } - } - - /** - * returns a dungeon from the assigned pack to start with - * @return - */ - public DungeonData getStartingDungeon(NewDimData dimension, Random random) - { - return getStartingPack().getNextDungeon(dimension, random); - } - - /** - * determines if a given location is valid for the gateway to be generated, based on height, biome, and world. - * @param world - * @param x - * @param y - * @param z - * @param biome - * @return - */ - public boolean isLocationValid(World world, int x, int y, int z, BiomeGenBase biome) - { - return this.isBiomeValid(biome)&&areCoordsValid(world, x, y, z); - } - - public boolean isBiomeValid(BiomeGenBase biome) - { - if(this.getBiomeNames()!=null) - { - for(String biomeName : this.getBiomeNames()) + for (String keyword : keywords) { - if(biome.biomeName.contains(biomeName)) + if (biomeName.contains(keyword)) { return true; } @@ -149,43 +46,33 @@ public abstract class BaseGateway } /** - * Use this function to generate randomized bits of the structure. - * @param world - * @param x - * @param y - * @param z + * Determines whether the specified world and coordinates are a valid location for generating this gateway + * @param world - the world in which to generate the gateway + * @param x - the x-coordinate at which to center the gateway; usually where the door is placed + * @param y - the y-coordinate of the block on which the gateway may be built + * @param z - the z-coordinate at which to center the gateway; usually where the door is placed + * @return true if the location is valid, otherwise false */ - abstract void generateRandomBits(World world, int x, int y, int z); - - /** - * Decides if the given coords/world are valid - * @param world - * @param x - * @param y - * @param z - * @return - */ - public abstract boolean areCoordsValid(World world, int x, int y, int z); + public boolean isLocationValid(World world, int x, int y, int z) + { + return isBiomeValid(world.getBiomeGenForCoords(x, z)); + } /** - * @return the pack the dungeon initially generates into from this gateway. + * Gets the dungeon pack associated with this gateway + * @return the dungeon pack to use for this gateway */ - public abstract DungeonPack getStartingPack(); + /*protected DungeonPack getDungeonPack() + { + return DungeonHelper.instance().getDungeonPack("RUINS"); + }*/ /** - * Is by default a whitelist, but the isBiomeValid method - * can be overriden for specific gateways. For example, any biome containing 'forest' would be valid if we added 'forest', - * even from other mods. - * @return List of biome names that we check against. + * Gets the lowercase keywords to be used in checking whether a given biome is a valid location for this gateway + * @return an array of biome keywords to match against */ - public abstract String[] getBiomeNames(); - - /** - * @return List containing all the .schematics attached to this gateway. Selection is random by default - */ - public abstract String getSchematicPath(); - - //TODO not yet implemented - public abstract boolean isSurfaceGateway(); - + public String[] getBiomeKeywords() + { + return new String[] { "" }; + } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseSchematicGateway.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseSchematicGateway.java new file mode 100644 index 0000000..6eaa0da --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseSchematicGateway.java @@ -0,0 +1,66 @@ +package StevenDimDoors.mod_pocketDim.world.gateways; + +import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.Point3D; +import StevenDimDoors.mod_pocketDim.config.DDProperties; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.dungeon.DungeonSchematic; +import StevenDimDoors.mod_pocketDim.schematic.InvalidSchematicException; + +public abstract class BaseSchematicGateway extends BaseGateway +{ + public BaseSchematicGateway(DDProperties properties) + { + super(properties); + } + + @Override + public boolean generate(World world, int x, int y, int z) + { + DungeonSchematic schematic; + + try + { + schematic = DungeonSchematic.readFromResource(this.getSchematicPath()); + } + catch (InvalidSchematicException e) + { + System.err.println("Could not load the schematic for a gateway. The following exception occurred:"); + e.printStackTrace(); + return false; + } + + // Apply filters - the order is important! + GatewayBlockFilter gatewayFilter = new GatewayBlockFilter(); + schematic.applyFilter(gatewayFilter); + schematic.applyImportFilters(properties); + + Point3D doorLocation = gatewayFilter.getEntranceDoorLocation(); + int orientation = gatewayFilter.getEntranceOrientation(); + + // Build the gateway into the world + schematic.copyToWorld(world, x - doorLocation.getX(), y, z - doorLocation.getZ(), true, true); + this.generateRandomBits(world, x, y, z); + + // Generate a dungeon link in the door + PocketManager.getDimensionData(world).createLink(x, y + doorLocation.getY(), z, LinkTypes.DUNGEON, orientation); + + return true; + } + + /** + * Generates randomized portions of the gateway structure (e.g. rubble, foliage) + * @param world - the world in which to generate the gateway + * @param x - the x-coordinate at which to center the gateway; usually where the door is placed + * @param y - the y-coordinate of the block on which the gateway may be built + * @param z - the z-coordinate at which to center the gateway; usually where the door is placed + */ + protected void generateRandomBits(World world, int x, int y, int z) { } + + /** + * Gets the path for the schematic file to be used for this gateway. Subsequent calls to this method may return other schematic paths. + * @return the path to the schematic file for this gateway + */ + protected abstract String getSchematicPath(); +} 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 9936150..d2d9c0f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayGenerator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayGenerator.java @@ -25,7 +25,7 @@ public class GatewayGenerator implements IWorldGenerator private static final int CLUSTER_GROWTH_CHANCE = 80; private static final int MAX_CLUSTER_GROWTH_CHANCE = 100; private static final int MIN_RIFT_Y = 4; - private static final int MAX_RIFT_Y = 250; + private static final int MAX_RIFT_Y = 240; private static final int CHUNK_LENGTH = 16; private static final int GATEWAY_RADIUS = 4; private static final int MAX_GATEWAY_GENERATION_ATTEMPTS = 10; @@ -50,7 +50,6 @@ public class GatewayGenerator implements IWorldGenerator defaultGateway = new GatewayTwoPillars(properties); // Add gateways here - gateways.add(defaultGateway); gateways.add(new GatewaySandstonePillars(properties)); gateways.add(new GatewayLimbo(properties)); } @@ -135,26 +134,24 @@ public class GatewayGenerator implements IWorldGenerator valid = checkGatewayLocation(world, x, y, z); } - //Build the gateway if we found a valid location + // Build the gateway if we found a valid location if (valid) { - //TODO I feel like this is slow and should be optimized. We are linear time with total # of generation restrictions - //Create an array and copy valid gateways into it ArrayList validGateways = new ArrayList(); - for(BaseGateway gateway:gateways) + for (BaseGateway gateway : gateways) { - if(gateway.isLocationValid(world, x, y, z, world.getBiomeGenForCoords(x, z))) + if (gateway.isLocationValid(world, x, y, z)) { validGateways.add(gateway); } } - //Add default gateway if we where unable to find a suitable gateway - if(validGateways.isEmpty()) + // Add the default gateway if the rest were rejected + if (validGateways.isEmpty()) { - validGateways.add(this.defaultGateway); + validGateways.add(defaultGateway); } - //randomly select a gateway from the pool of viable gateways - validGateways.get(random.nextInt(validGateways.size())).generate(world, x, y, z); + // Randomly select a gateway from the pool of viable gateways + validGateways.get(random.nextInt(validGateways.size())).generate(world, x, y - 1, z); } } } 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 6dbf10b..c202fcd 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java @@ -3,67 +3,37 @@ package StevenDimDoors.mod_pocketDim.world.gateways; import net.minecraft.world.World; 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; import StevenDimDoors.mod_pocketDim.world.LimboProvider; public class GatewayLimbo extends BaseGateway { - - public GatewayLimbo(DDProperties properties) { + public GatewayLimbo(DDProperties properties) + { super(properties); - // TODO Auto-generated constructor stub } @Override - void generateRandomBits(World world, int x, int y, int z) + public boolean generate(World world, int x, int y, int z) { int blockID = mod_pocketDim.blockLimbo.blockID; - //Build the gateway out of Unraveled Fabric. Since nearly all the blocks in Limbo are of - //that type, there is no point replacing the ground. + // Build the gateway out of Unraveled Fabric. Since nearly all the blocks in Limbo are of + // that type, there is no point replacing the ground. world.setBlock(x, y + 2, z + 1, blockID, 0, 3); world.setBlock(x, y + 2, z - 1, blockID, 0, 3); - //Build the columns around the door + // Build the columns around the door world.setBlock(x, y + 1, z - 1, blockID, 0, 3); world.setBlock(x, y + 1, z + 1, blockID, 0, 3); world.setBlock(x, y, z - 1, blockID, 0, 3); world.setBlock(x, y, z + 1, blockID, 0, 3); BaseItemDoor.placeDoorBlock(world, x, y, z, 0, mod_pocketDim.transientDoor); - - - } - - @Override - public DungeonPack getStartingPack() { - // TODO Auto-generated method stub - return DungeonHelper.instance().getDungeonPack("RUINS"); - } - - @Override - public String[] getBiomeNames() { - // TODO Auto-generated method stub - return null; - } - - @Override - public String getSchematicPath() { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean isSurfaceGateway() { - // TODO Auto-generated method stub return true; } @Override - public boolean areCoordsValid(World world, int x, int y, int z) { - // TODO Auto-generated method stub - return world.provider instanceof LimboProvider; + public boolean isLocationValid(World world, int x, int y, int z) { + return (world.provider instanceof LimboProvider); } - } 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 cab1e12..65e53a8 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewaySandstonePillars.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewaySandstonePillars.java @@ -1,61 +1,23 @@ package StevenDimDoors.mod_pocketDim.world.gateways; -import java.util.ArrayList; -import java.util.Random; - -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; -import net.minecraft.world.World; -import net.minecraft.world.chunk.IChunkProvider; -public class GatewaySandstonePillars extends BaseGateway +public class GatewaySandstonePillars extends BaseSchematicGateway { - - private static final int GATEWAY_RADIUS = 4; - public GatewaySandstonePillars(DDProperties properties) { super(properties); - } + @Override - public boolean generate(World world, int x, int y, int z) + public String[] getBiomeKeywords() { - //simple to transform the generation location here. - //Do you think this is the best way to do this? - return super.generate(world, x, y+2, z); - } - @Override - public void generateRandomBits(World world, int x, int y, int z) - { - } - @Override - public DungeonPack getStartingPack() - { - return DungeonHelper.instance().getDungeonPack("RUINS"); - } - @Override - public String[] getBiomeNames() - { - return new String[]{"desert"}; + return new String[] { "desert" }; } + @Override public String getSchematicPath() { return "/schematics/gateways/sandstonePillars.schematic"; } - @Override - public boolean isSurfaceGateway() - { - return true; - } - @Override - public boolean areCoordsValid(World world, int x, int y, int z) { - // TODO Auto-generated method stub - return true; - } - } 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 9e1ea33..13507a4 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java @@ -1,26 +1,20 @@ package StevenDimDoors.mod_pocketDim.world.gateways; -import java.util.ArrayList; - -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; import net.minecraft.block.Block; import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.config.DDProperties; -public class GatewayTwoPillars extends BaseGateway +public class GatewayTwoPillars extends BaseSchematicGateway { - private static final int GATEWAY_RADIUS = 4; public GatewayTwoPillars(DDProperties properties) { super(properties); } + @Override - void generateRandomBits(World world, int x, int y, int z) + protected void generateRandomBits(World world, int x, int y, int z) { final int blockID = Block.stoneBrick.blockID; @@ -32,48 +26,27 @@ public class GatewayTwoPillars extends BaseGateway //Check that the block is supported by an opaque block. //This prevents us from building over a cliff, on the peak of a mountain, //or the surface of the ocean or a frozen lake. - if (world.isBlockOpaqueCube(x + xc, y - 2, z + zc)) + if (world.isBlockOpaqueCube(x + xc, y - 1, z + zc)) { //Randomly choose whether to place bricks or not. The math is designed so that the //chances of placing a block decrease as we get farther from the gateway's center. if (Math.abs(xc) + Math.abs(zc) < world.rand.nextInt(2) + 3) { //Place Stone Bricks - world.setBlock(x + xc, y - 1, z + zc, blockID, 0, 3); + world.setBlock(x + xc, y, z + zc, blockID, 0, 3); } else if (Math.abs(xc) + Math.abs(zc) < world.rand.nextInt(3) + 3) { //Place Cracked Stone Bricks - world.setBlock(x + xc, y - 1, z + zc, blockID, 2, 3); + world.setBlock(x + xc, y, z + zc, blockID, 2, 3); } } } } } - @Override - public DungeonPack getStartingPack() { - // TODO Auto-generated method stub - return DungeonHelper.instance().getDungeonPack("RUINS"); - } - @Override - public String[] getBiomeNames() { - // TODO Auto-generated method stub - return null; - } + @Override public String getSchematicPath() { - // TODO Auto-generated method stub return "/schematics/gateways/twoPillars.schematic"; } - @Override - public boolean isSurfaceGateway() { - // TODO Auto-generated method stub - return true; - } - @Override - public boolean areCoordsValid(World world, int x, int y, int z) { - // TODO Auto-generated method stub - return !(world.provider instanceof LimboProvider); - } - } -- 2.39.5 From f8982a871d84f37b2b4bfdb66e1f504e11b39490 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Mon, 17 Mar 2014 08:57:31 -0400 Subject: [PATCH 11/27] Minor Change Removed a misleading comment from the rules.txt for Balgor --- src/main/resources/schematics/balgor/rules.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/resources/schematics/balgor/rules.txt b/src/main/resources/schematics/balgor/rules.txt index bb4d683..57c87e7 100644 --- a/src/main/resources/schematics/balgor/rules.txt +++ b/src/main/resources/schematics/balgor/rules.txt @@ -8,8 +8,6 @@ Settings: AllowDuplicatesInChain = false AllowPackChangeOut = false DistortDoorCoordinates = true - -## Prevent this pack from being selected for transitioning in once we've transitioned out AllowPackChangeIn = true Rules: @@ -20,4 +18,4 @@ Rules: ? -> ComplexHall#40 Trap#60 -->ComplexHall#100 \ No newline at end of file +-> ComplexHall#100 \ No newline at end of file -- 2.39.5 From b1b1035b5f9d0cf67e71c26c70410a308d9ee649 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Mon, 17 Mar 2014 19:03:32 -0400 Subject: [PATCH 12/27] Integrated Balgor Pack and Fixed Bugs * Set up the necessary code in DungeonHelper so that Balgor is registered along with the other bundled packs. * Improved the code for registering bundled packs to reduce the number of paths we need to hardcode and to crash DD if a pack fails to load. A crash would be inevitable no matter what since bundled packs are integral to DD. * Corrected an invalid generation rule for Balgor. It's set to select random dungeons infinitely for now. I'll add an exit room later and change the rule to force an exit. Balgor is still unusable until its schematics get proper doors. * Fixed PocketBuilder to actually check the results of validating schematics before we try to build them. This was causing cryptic error messages when flawed schematics were loaded (e.g. rooms without proper doors) and could have caused serious problems during dungeon regeneration. Don't ignore validation! --- .../mod_pocketDim/helpers/DungeonHelper.java | 51 ++++++++++--------- .../mod_pocketDim/world/PocketBuilder.java | 11 +++- .../resources/schematics/balgor/rules.txt | 2 +- 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index e2d601b..487e4f4 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -4,10 +4,10 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileFilter; import java.io.FileNotFoundException; +import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -32,7 +32,6 @@ import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfig; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfigReader; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonType; import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; -import StevenDimDoors.mod_pocketDim.util.ConfigurationProcessingException; import StevenDimDoors.mod_pocketDim.util.FileFilters; import StevenDimDoors.mod_pocketDim.util.WeightedContainer; @@ -48,10 +47,7 @@ public class DungeonHelper private static final String DEFAULT_ERROR_SCHEMATIC_PATH = "/schematics/core/somethingBroke.schematic"; private static final String DUNGEON_CREATION_GUIDE_SOURCE_PATH = "/mods/DimDoors/text/How_to_add_dungeons.txt"; - private static final String RUINS_PACK_PATH = "/schematics/ruins"; - private static final String BUNDLED_RUINS_LIST_PATH = "/schematics/ruins.txt"; - private static final String NETHER_PACK_PATH = "/schematics/nether"; - private static final String BUNDLED_NETHER_LIST_PATH = "/schematics/nether.txt"; + private static final String BUNDLED_PACK_BASE_PATH = "/schematics/"; private static final String STANDARD_CONFIG_FILE_NAME = "rules.txt"; private static final int NETHER_DIMENSION_ID = -1; @@ -158,7 +154,7 @@ public class DungeonHelper return null; } - private void registerDungeonPack(String directory, Iterable schematics, boolean isInternal, boolean verbose, DungeonPackConfigReader reader) + private DungeonPack registerDungeonPack(String directory, Iterable schematics, boolean isInternal, boolean verbose, DungeonPackConfigReader reader) { //First determine the pack's name and validate it File packDirectory = new File(directory); @@ -187,7 +183,7 @@ public class DungeonHelper if (config == null) { System.err.println("Could not load config file: " + configPath); - return; + return null; } //Register the pack @@ -208,6 +204,7 @@ public class DungeonHelper { registerDungeon(schematicPath, pack, isInternal, verbose); } + return pack; } public List getRegisteredDungeons() @@ -235,6 +232,7 @@ public class DungeonHelper { // TODO: Drop support for dim-based packs and switch to embedding the pack // in the link data itself. That would solve the dungeon pre-generation issue. + // Gateways should dictate which packs are being used, not the dimensions. DungeonPack pack; DungeonData dungeon = dimension.dungeon(); @@ -436,32 +434,31 @@ public class DungeonHelper defaultError = new DungeonData(DEFAULT_ERROR_SCHEMATIC_PATH, true, DungeonType.UNKNOWN_TYPE, true, DEFAULT_DUNGEON_WEIGHT); //Open the list of dungeons packaged with our mod and register their schematics - registerBundledPack(BUNDLED_RUINS_LIST_PATH, RUINS_PACK_PATH, "Ruins", reader); - RuinsPack = getDungeonPack("Ruins"); - - registerBundledPack(BUNDLED_NETHER_LIST_PATH, NETHER_PACK_PATH, "Nether", reader); - NetherPack = getDungeonPack("Nether"); + RuinsPack = registerBundledPack("Ruins", reader); + NetherPack = registerBundledPack("Nether", reader); + registerBundledPack("Balgor", reader); System.out.println("Finished registering bundled dungeon packs"); } - private void registerBundledPack(String listPath, String packPath, String name, DungeonPackConfigReader reader) + private DungeonPack registerBundledPack(String name, DungeonPackConfigReader reader) { System.out.println("Registering bundled dungeon pack: " + name); + String packPath = BUNDLED_PACK_BASE_PATH + name.toLowerCase(); + String listPath = packPath + ".txt"; InputStream listStream = this.getClass().getResourceAsStream(listPath); - // chance of leak? + if (listStream == null) { - System.err.println("Unable to open list of bundled dungeon schematics for " + name); - return; + throw new IllegalStateException("Failed to open the list of bundled dungeon schematics for " + name); } + ArrayList schematics = new ArrayList(); try { - //Read the list of schematics that come with a bundled pack + // Read the list of schematics that come with a bundled pack BufferedReader listReader = new BufferedReader(new InputStreamReader(listStream)); - ArrayList schematics = new ArrayList(); String schematicPath = listReader.readLine(); while (schematicPath != null) { @@ -473,15 +470,19 @@ public class DungeonHelper schematicPath = listReader.readLine(); } listReader.close(); - - //Register the pack - registerDungeonPack(packPath, schematics, true, false, reader); } - catch (Exception e) + catch (IOException e) { - System.err.println("An exception occurred while reading the list of bundled dungeon schematics for " + name); - e.printStackTrace(); + throw new RuntimeException("An unexpected error occured while trying to read the list of schematics for the " + name + " bundled dungeon pack. This would inevitably cause Dimensional Doors to crash during runtime.", e); } + + // Register the pack + DungeonPack pack = registerDungeonPack(packPath, schematics, true, false, reader); + if (pack == null) + { + throw new RuntimeException("Failed to load the " + name + " bundled dungeon pack. This would inevitably cause Dimensional Doors to crash during runtime."); + } + return pack; } public boolean exportDungeon(World world, int centerX, int centerY, int centerZ, String exportPath) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index 860bf4c..f26939b 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -104,8 +104,13 @@ public class PocketBuilder return false; } + DungeonSchematic schematic = loadAndValidateDungeon(dimension.dungeon(), properties); + if (schematic == null) + { + return false; + } Point3D destination = new Point3D(incomingLink.destination()); - loadAndValidateDungeon(dimension.dungeon(), properties).copyToWorld(world, destination, originLink.orientation(), incomingLink, random, properties, false); + schematic.copyToWorld(world, destination, originLink.orientation(), incomingLink, random, properties, false); dimension.setFilled(true); return true; } @@ -167,6 +172,10 @@ public class PocketBuilder // Try to load up the schematic DungeonSchematic schematic = null; schematic = loadAndValidateDungeon(dungeon, properties); + if (schematic == null) + { + return false; + } // Register a new dimension NewDimData parent = PocketManager.getDimensionData(link.source().getDimension()); diff --git a/src/main/resources/schematics/balgor/rules.txt b/src/main/resources/schematics/balgor/rules.txt index 57c87e7..2e02f45 100644 --- a/src/main/resources/schematics/balgor/rules.txt +++ b/src/main/resources/schematics/balgor/rules.txt @@ -12,7 +12,7 @@ AllowPackChangeIn = true Rules: -? ? ? -> +? ? ? -> ? ? ? -> Maze#20 ComplexHall#40 Trap#40 -- 2.39.5 From c980c797e8028a3398eed830d8ef08f4b9e6240a Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 18 Mar 2014 04:56:07 -0400 Subject: [PATCH 13/27] Fixed Limbo Gateways and Minor Change * Fixed Limbo gateways. I accidentally broke them while overhauling gateways in general. * Changed references to BaseItemDoor.placeDoorBlock() to use ItemDoor.placeDoorBlock() instead. We should refer to the original class that implements the function. --- .../mod_pocketDim/core/DDTeleporter.java | 7 ++----- .../world/fortresses/ComponentNetherGateway.java | 4 ++-- .../mod_pocketDim/world/gateways/GatewayLimbo.java | 12 ++++++------ 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index bdb7fd7..7c7bb6c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -9,8 +9,8 @@ import net.minecraft.entity.EntityList; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemDoor; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.network.packet.Packet41EntityEffect; import net.minecraft.network.packet.Packet43Experience; import net.minecraft.network.packet.Packet9Respawn; @@ -20,14 +20,11 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; 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.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; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; @@ -605,7 +602,7 @@ public class DDTeleporter } } - BaseItemDoor.placeDoorBlock(destWorld, link.destination().getX(), link.destination().getY()-1, link.destination().getZ(),link.getDestinationOrientation(), door); + ItemDoor.placeDoorBlock(destWorld, link.destination().getX(), link.destination().getY()-1, link.destination().getZ(),link.getDestinationOrientation(), door); TileEntity doorDestTE = ((BaseDimDoor)door).initDoorTE(destWorld, link.destination().getX(), link.destination().getY(), link.destination().getZ()); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/ComponentNetherGateway.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/ComponentNetherGateway.java index d8c149e..8b05b39 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/ComponentNetherGateway.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/ComponentNetherGateway.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Random; import net.minecraft.block.Block; +import net.minecraft.item.ItemDoor; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraft.world.gen.structure.StructureBoundingBox; @@ -13,7 +14,6 @@ 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.items.BaseItemDoor; public class ComponentNetherGateway extends StructureComponent { @@ -159,7 +159,7 @@ public class ComponentNetherGateway extends StructureComponent { link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation); } - BaseItemDoor.placeDoorBlock(world, x, y, z, orientation, mod_pocketDim.transientDoor); + ItemDoor.placeDoorBlock(world, x, y, z, orientation, mod_pocketDim.transientDoor); } for (x = 0; x <= 6; ++x) 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 c202fcd..27448b3 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java @@ -1,9 +1,9 @@ package StevenDimDoors.mod_pocketDim.world.gateways; +import net.minecraft.item.ItemDoor; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.config.DDProperties; -import StevenDimDoors.mod_pocketDim.items.BaseItemDoor; import StevenDimDoors.mod_pocketDim.world.LimboProvider; public class GatewayLimbo extends BaseGateway @@ -19,16 +19,16 @@ public class GatewayLimbo extends BaseGateway int blockID = mod_pocketDim.blockLimbo.blockID; // Build the gateway out of Unraveled Fabric. Since nearly all the blocks in Limbo are of // that type, there is no point replacing the ground. - world.setBlock(x, y + 2, z + 1, blockID, 0, 3); - world.setBlock(x, y + 2, z - 1, blockID, 0, 3); + world.setBlock(x, y + 3, z + 1, blockID, 0, 3); + world.setBlock(x, y + 3, z - 1, blockID, 0, 3); // Build the columns around the door + world.setBlock(x, y + 2, z - 1, blockID, 0, 3); + world.setBlock(x, y + 2, z + 1, blockID, 0, 3); world.setBlock(x, y + 1, z - 1, blockID, 0, 3); world.setBlock(x, y + 1, z + 1, blockID, 0, 3); - world.setBlock(x, y, z - 1, blockID, 0, 3); - world.setBlock(x, y, z + 1, blockID, 0, 3); - BaseItemDoor.placeDoorBlock(world, x, y, z, 0, mod_pocketDim.transientDoor); + ItemDoor.placeDoorBlock(world, x, y + 1, z, 0, mod_pocketDim.transientDoor); return true; } -- 2.39.5 From 300228ea2466e25aad1ee6fb1722ba75d70a56c4 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 18 Mar 2014 05:01:09 -0400 Subject: [PATCH 14/27] Fixed Limbo Gateways (again) Forgot to add the line for creating the dungeon link. Done and tested. --- .../mod_pocketDim/world/gateways/GatewayLimbo.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 27448b3..cb50437 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java @@ -4,6 +4,8 @@ import net.minecraft.item.ItemDoor; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.config.DDProperties; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.world.LimboProvider; public class GatewayLimbo extends BaseGateway @@ -27,7 +29,8 @@ public class GatewayLimbo extends BaseGateway world.setBlock(x, y + 2, z + 1, blockID, 0, 3); world.setBlock(x, y + 1, z - 1, blockID, 0, 3); world.setBlock(x, y + 1, z + 1, blockID, 0, 3); - + + PocketManager.getDimensionData(world).createLink(x, y + 2, z, LinkTypes.DUNGEON, 0); ItemDoor.placeDoorBlock(world, x, y + 1, z, 0, mod_pocketDim.transientDoor); return true; } -- 2.39.5 From 3d8a9aaf274412d148672e21b4130d79db46f34a Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 18 Mar 2014 20:30:09 -0400 Subject: [PATCH 15/27] Removed Balgor Pack After finally getting the dungeons to load, I've determined that only half of the rooms should be included. The three remaining rooms should definitely stay. That's not much for a pack so I'm going to make some modifications to the schematics and include them as part of Ruins. --- .../mod_pocketDim/helpers/DungeonHelper.java | 1 - src/main/resources/schematics/balgor.txt | 6 ----- ...omplexHall_GardenBalgor1_open_39.schematic | Bin 2502 -> 0 bytes ...exHall_OpenHallBalgor1_Closed_68.schematic | Bin 2144 -> 0 bytes ...l_SilverEggHallBalgor1_closed_25.schematic | Bin 1933 -> 0 bytes .../Maze_OmniMazeBalgor1_open_30.schematic | Bin 8652 -> 0 bytes .../Trap_ArrowTrapBalgor1_closed_20.schematic | Bin 3264 -> 0 bytes ...Trap_ZombieHallBalgor1_closed_25.schematic | Bin 1956 -> 0 bytes .../resources/schematics/balgor/rules.txt | 21 ------------------ 9 files changed, 28 deletions(-) delete mode 100644 src/main/resources/schematics/balgor.txt delete mode 100644 src/main/resources/schematics/balgor/ComplexHall_GardenBalgor1_open_39.schematic delete mode 100644 src/main/resources/schematics/balgor/ComplexHall_OpenHallBalgor1_Closed_68.schematic delete mode 100644 src/main/resources/schematics/balgor/ComplexHall_SilverEggHallBalgor1_closed_25.schematic delete mode 100644 src/main/resources/schematics/balgor/Maze_OmniMazeBalgor1_open_30.schematic delete mode 100644 src/main/resources/schematics/balgor/Trap_ArrowTrapBalgor1_closed_20.schematic delete mode 100644 src/main/resources/schematics/balgor/Trap_ZombieHallBalgor1_closed_25.schematic delete mode 100644 src/main/resources/schematics/balgor/rules.txt diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index 487e4f4..a4cc980 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -436,7 +436,6 @@ public class DungeonHelper //Open the list of dungeons packaged with our mod and register their schematics RuinsPack = registerBundledPack("Ruins", reader); NetherPack = registerBundledPack("Nether", reader); - registerBundledPack("Balgor", reader); System.out.println("Finished registering bundled dungeon packs"); } diff --git a/src/main/resources/schematics/balgor.txt b/src/main/resources/schematics/balgor.txt deleted file mode 100644 index b9d8157..0000000 --- a/src/main/resources/schematics/balgor.txt +++ /dev/null @@ -1,6 +0,0 @@ -/schematics/balgor/ComplexHall_GardenBalgor1_open_39.schematic -/schematics/balgor/ComplexHall_OpenHallBalgor1_Closed_68.schematic -/schematics/balgor/ComplexHall_SilverEggHallBalgor1_closed_25.schematic -/schematics/balgor/Maze_OmniMazeBalgor1_open_30.schematic -/schematics/balgor/Trap_ArrowTrapBalgor1_closed_20.schematic -/schematics/balgor/Trap_ZombieHallBalgor1_closed_25.schematic diff --git a/src/main/resources/schematics/balgor/ComplexHall_GardenBalgor1_open_39.schematic b/src/main/resources/schematics/balgor/ComplexHall_GardenBalgor1_open_39.schematic deleted file mode 100644 index fd5f92694462905c708a15a3aa9d72b8577650fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2502 zcmds2Z#WZr8=fJgQPR>M?GRCn%9j5|VyPy=)P(+M%^01OPRuqrM{kKzZMCh$O6!GfrC}y5sGz2dLgB`VO-}I$P5$L->e_C%yJThuSME;E?ZlZW|EX=@9F00hW@kJ&%~AcvK+CMpS58`&AU ztOEZCOup1S(eg4+Q*f9S7S?kL_zu=^=?J{}KH7fo9WzqOd-o*+*Y_C`Hw3G9S@JbZ&ca50Tg)!5iuiX+r zN*9UjW{pS)p~{wl7ho`_`_;vRM)LqT#iD1u3a(Z?v(z188*g#Me5T&c+*h@cb8Hx0 z9)>Naf^*5ut10I{0Gnpd@0ogYbawV)L>sQiL5ic-Z-htUEkyZjgP;Dz%S}XbNR}w| zEh78&2bc*C$uSV*v1ZFI^zRsj(-)rt=2`*(2TX|oz#rTD4FQ2*{S^OuWZ7RIT{+qP zc4lhoh4cJ$^mFoUo_jiNL<$-FG$Q5Hjg%2Tw@rQB+7)h}0;3+%V%Fs}{FdcOZBZPY z=g(K~X~Hy~o$k^yJ>@RsVuWt)yyci$AxxN8O?;fn!Oz3jIcob9gM%-H)hkD&v6JZm zwr@WmB1aJ+cgRHnds#w#vf!NSryUu3#+ixpX71Ez$E5C6il(n>lVZq%bfn#YlGr*D z^r<5?pzh#f+$+Z|O&-rXOB2&T8(gMk6#kkh^Ry+ozN61ub9A%nnaL$#rmUs|X3KWv4XV^D>H*c4jJ^Bqf2ts8{O z#EJtIJ-|e7Prg4KNWL1^8~PT}U59B-s@ck?Cc)^bjS`W43ia1oZTsf~dqSU4D{EJE zR%RmVvk7o|QVsQ(nOGev&FC8F+MBtToiw|GK3;N&P}8NvQ+b(8c|=otblHrx=H>aA zd#H=+11Pi{|N1WMrvmYHF8F2_Hnc`J)>TL&CqEUtW>hEB@U$Rm#Q^Ds9r5&^i zaeDp+9~lXdDINqvrSYRj?VhCTm|U#)FZGd7@+6kGp$?~w^IL(cVlZ3!&?WKnkx%G3gAaKDn1_>@&0MLXn-xeD5^@PceuDYv5no zI;I#kJ|7bYCG41cWWf z4;9@GeZt<1?fC-sbmR1mhTGA#_oI8h{MA?9f&IEd7N2!%_<=4(Qfu84%h_Y4#K#{vowqVl~T{!(I|>u zuH^+s<>TF0F8sl?_J6htZTRPZlxp|(kCnV5bABD}2A6wqR%(1u5KWGQcP_%U%`8`u zi$1xh+rytoxGa$Nz93WLd@Phl*g0#XSdQsIPihXgMl{0&yn B$aDYz diff --git a/src/main/resources/schematics/balgor/ComplexHall_OpenHallBalgor1_Closed_68.schematic b/src/main/resources/schematics/balgor/ComplexHall_OpenHallBalgor1_Closed_68.schematic deleted file mode 100644 index 19be9c4f09f7384b7892572a22f82eb86f70721a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2144 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 ID#T*dUr6=E8vp!D(E=<^Ar| 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 diff --git a/src/main/resources/schematics/balgor/Trap_ArrowTrapBalgor1_closed_20.schematic b/src/main/resources/schematics/balgor/Trap_ArrowTrapBalgor1_closed_20.schematic deleted file mode 100644 index 8ef105cd58a62dbabb521651ca927dd869d54d98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3264 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 diff --git a/src/main/resources/schematics/balgor/Trap_ZombieHallBalgor1_closed_25.schematic b/src/main/resources/schematics/balgor/Trap_ZombieHallBalgor1_closed_25.schematic deleted file mode 100644 index b968f0d972057bb273fbf4ba01ff6e2ab058cc9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1956 zcmd5)YfzJC7XF}CE^cHOB)AdfQn?5QM-o6m0tA91m;@1U`7nq|;0uzZRW5Q7tdv+v z6<2hXL>iLRfP{!G0YorXs9O+_L@ucbBt;Ss1ffBJa0weNo$2(~&g`E(Ki>1sd!Bip z=RD`w6`KOT#Z>ta&1(N%WHBVcYT(>CGJp@1x+Ze75Tl~I3N6lk5p z>iTMQaOdJANR_AF#Is0a%jv8=J^U^B`JMe?XesGJ{6~Q64}{gmrSNI_4dEx31|Y9g zxf;7=07q2cO`*?++%D=%2YLM|u}%PRWht7zru=_R_In5#^~FZsFtq3XUAz+W&tBCc z@A1;{RV{d#9Uo76OVkwKXzP4@w3!835Ht%nq`!2(y#$gb+GgdC(wk;$R{5*h_NoE( z!cu0wcuK*ORY4 zG2D_Fn6%xZ=znXHFZwnun~+1?{Q5e|k}mpojJJ8xqB5#Vx4f(R8s+akqOA)qKdP6J z)o8!B2cH}Dn9z@vc&I-+OkjV*&d=1n>9>`&w7hfBClS_1qm}&_#!pli|nPQ zJd7s?i=iP6r7?e`An2Duc5G%f`AA4{n81eZT|zuF)>6j2>gaH+aw?Ao<$Sx>REMB$ zyJMS$LQ8{&dDQ1m&2*!!J*7T}55LTiPSD{@QuqL*$BIMUulNL8ZQYco1}$flwEE>N zl$R6D2DWsTC%bxnz5%~h*NamQ{E(xF?qvV=MdULirBT5c@UC>Co&+O(>UF9#Pb9?! zGZ)iC2%jk0jqHHNnMH}{JC&7X<<4~<#m9=MDN}>Yo5fGH+>f>#A{L-S6jEUI7J)H?S$FLeC0uWkpkC- zi5CUd8?SX4U90I~-P!S3GxYOM#qg>adpg6}*ELr(@rSOY#{K5%Zb^tqVM)xxe+AI_ z{2!;d$L)5372xMBe`mg`n2}b?v}4_U*Y1hd^m)qf zJqY4|_vBuQ4Km`t7cZ5#4P0xo&{;|(88U;+;6B4q&<7-hlHM%u+bkAu?ihJsyNcPz zUI8S2vuwRiH{t>S=gIos^9)186owA-I2?|qH~UPk2N=SekxC>I&o8^SA@Rzxku!9h zs9@LfuV+)G*}hZm<@}?YU@+=_VN!oe=`j>Fu2kmyZAvwjs=ae0T=?BT=3_cr3R>qY zhL+vmoxRSQhfDJiCG3Ows_G#9=++jyO{b<)!0Cc-F4D7V?)#hZZ1c z>2?-X%aywkyD|?gY!f|!oj$tY+kH|gk<5iE1kOiNVm@HkzsELtk#Rr$tPbloFPsjF z8?-mKgBjem9_pv;_HK%-!w%<2;67DXTV;8qo9>t4q^`6xX58MEX{yHS-oxlTnu3{2 z$&Yi(zUYpt3pRkUgmx@%W=HOdvH`90RES^1%h{|y)Jj<{(=P&ya{Rlwr%|2Up^bHv z2QRgc8pms(XToHaB4moX@=dOHP2)Lv;y_xEg4-KZ2l+}z*Hv9gzi}`2gP_DMkD+8A zqSCL9_!@%y$CcL~cs=3afI2m+e1PcIDEW11W25KjPPgKG&XKk!D3rd%9M&`H;(b!- zlM@JGZx&6;w|kSG(?A(YQ`U|bP{GXazsHAH;yq;i+qtNEAy})J%IIoNC^SrfOdl|Z zAV^$)nIK4{~%0;rO ? - -? ? -> Maze#20 ComplexHall#40 Trap#40 - -? -> ComplexHall#40 Trap#60 - --> ComplexHall#100 \ No newline at end of file -- 2.39.5 From ddcb0ff42e0eb472b9b36ff3f50d1479c271014b Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 19 Mar 2014 00:27:26 -0400 Subject: [PATCH 16/27] Added Dungeons to Ruins * Added three of Balgor0's dungeons to the Ruins pack * Made aesthetic and functional improvements to the dungeons --- src/main/resources/schematics/ruins.txt | 3 +++ ...Hall_Balgor0-CrumbledHall_Closed_75.schematic | Bin 0 -> 2513 bytes ...DeadEnd_Balgor0-ArrowHall_Closed_75.schematic | Bin 0 -> 2421 bytes .../ruins/Hub_Balgor0-OmniMaze_Open_50.schematic | Bin 0 -> 7039 bytes 4 files changed, 3 insertions(+) create mode 100644 src/main/resources/schematics/ruins/ComplexHall_Balgor0-CrumbledHall_Closed_75.schematic create mode 100644 src/main/resources/schematics/ruins/DeadEnd_Balgor0-ArrowHall_Closed_75.schematic create mode 100644 src/main/resources/schematics/ruins/Hub_Balgor0-OmniMaze_Open_50.schematic diff --git a/src/main/resources/schematics/ruins.txt b/src/main/resources/schematics/ruins.txt index fb199f5..5920286 100644 --- a/src/main/resources/schematics/ruins.txt +++ b/src/main/resources/schematics/ruins.txt @@ -1,3 +1,4 @@ +/schematics/ruins/ComplexHall_Balgor0-CrumbledHall_Closed_75.schematic /schematics/ruins/complexHall_buggyTopEntry1_open_100.schematic /schematics/ruins/ComplexHall_Cere-PuzzleWall_Open_75.schematic /schematics/ruins/ComplexHall_Cere-TransferTunnel_Closed_100.schematic @@ -16,6 +17,7 @@ /schematics/ruins/complexHall_smallRotundaWithExit_closed_100.schematic /schematics/ruins/complexHall_tntPuzzleTrap_closed_50.schematic /schematics/ruins/deadEnd_azersDungeonO_closed_100.schematic +/schematics/ruins/DeadEnd_Balgor0-ArrowHall_Closed_75.schematic /schematics/ruins/deadEnd_brokenPillarsO_open_100.schematic /schematics/ruins/DeadEnd_Cere-FloatingAltar_Open_75.schematic /schematics/ruins/deadEnd_diamondTowerTemple1_open_100.schematic @@ -37,6 +39,7 @@ /schematics/ruins/exit_smallExitPrison_open_100.schematic /schematics/ruins/hub_4WayBasicHall_closed_200.schematic /schematics/ruins/hub_4WayHallExit_closed_200.schematic +/schematics/ruins/Hub_Balgor0-OmniMaze_Open_50.schematic /schematics/ruins/Hub_Cere-GreatHall_Open_40.schematic /schematics/ruins/hub_doorTotemRuins_open_100.schematic /schematics/ruins/hub_fortRuins_open_100.schematic diff --git a/src/main/resources/schematics/ruins/ComplexHall_Balgor0-CrumbledHall_Closed_75.schematic b/src/main/resources/schematics/ruins/ComplexHall_Balgor0-CrumbledHall_Closed_75.schematic new file mode 100644 index 0000000000000000000000000000000000000000..7f924f633f517004c1bb97e4698989d2b7cd0dcf GIT binary patch literal 2513 zcmd^8X;c!37BV=lR1;zFwm3Z~_jq|X@#Gt|n;5=w_s zGYv5X(UhgsY+_t66?chBBP7ugMMNCm^5dQJ&inWNyz{;v_q*qwd%t_mJ@>ODY*zaR zB#$PGMrjtEbZpBvV3UJX<5HVzg4*3|?QXN^Gk9?mNfdp$zI6NtO^cdCC9JJWt#1;Q z-bLWfB1{MTVb7+Kw0r)0!WGMLof*7P;nXxFRXiEm(nUJ$lEoaM*(}Npt zPZ4&<3`|xH*QuUc46R(YzlwIkqs*CSG(uX3&`Lf!v<|dGKfrYl9JW6L=U+TTk z7ikXOdaK9jx0oSD)tpmKD0Vhw8!z!*USWJ{?0InP!M4_9{=J_-t|079c&Rx{>!gD) z;`gQmtK6f&x6 zFjePQQda9$7qRqVRnxGln4YP;Rm)h*P%f%IpstaU6J@E3ucn8^$YC*IM%FVUJ7kBm zZts00r@b)jfeq!^P7UStxE}DHB{re^+mkojCz?ZjBXR=_(T=+lS3h1|NlCS4<#%-P z8H~v>x7KCJiR(|Z{D3I67%xS)`vYG)laZ3xLiq$_7!~mlUIOGAKF1xp)HR#4@CZ^N zbIg(VZs*f*JN3ng{qz2Bh`?zpv#1In0cvw32N$YnhF{s;VwAMsQSo6d>Ha6b8>wIG z-kqOwVHPIOX83+SRWWt0V*@aqFqH~bbdxG&4mrVo&Ha72cR`UpgsVRGU@-S!2m*2M z;y!vXJOP1vRy{%M52U<(5A~7l_9uvph$(5a@#=1a^wyyCK@=fG#S?>T`|D`JU;D?* zXl-$|=8b*z3^Z|@+ceX>QCKa~D@gz4F0*1e7Cj++91&-I=2~y-lcv~O)Yq*6*=59R z%Wd0~4o3jUPlf^7%IEzB9NX?9grM_tzBrp2t&C82J5brsczQ!HHI(8=O1}-U4!mpZ zII!oWubGI#XO&Dtt5t#7wxhuU?h&x`B54b5xKfi9AGBVgaqeUGt(SoEBqZ%>&|Vxc z8yV&1Bl&VJZ-We&Klp$KyKQP%q8b0>@kbySGrKOwv_Z3h@_Ab$dA-knR6`%VAmAQ| zOVv#hy8tFzof!M!Y6D_>Dalv#y<{GM?9PQJfMeX(>aUa|Z!=KPhzkPe38e%2zOj4& z_i)Z!HLt!F%cN({nbqb2DTtH4+^6hHu$45!*s(`y8)+rA@oh>his32Fh7c+WuH)f+ zJfHN;QJC6W_tY31fbn4NAYS^J<4r=EMkQ2EU7tMGRvJZfr|Zk2V_)k4EHRmwG-e6W zDsz)g##J6*z^k7`)`D!t(U$2SWYOqCx%uH4k*9XB>8S+#cVj!Hys7`a1>1En(OoaT z!H#Mirm0M_Z>Hq^E!;Ly+wLJ$nlHvq>&fk@m5)3Hp_83xJ$Wgu_Nm55-yUJj4Exf&4uuRl@yDB}o|V$< zS%oKu4q3&sn(yq=WPLQxl<2+;v67CeyCrVLHRN%Y${jalvd+EwWQu_K6iq$47A}ZG zYIt-SXAfTg#t*NFj>>Nz;v{4o7&DOT-c&3tV?nP)x^DU}V`5)z%1o~6dv8D9XQfCJ z@bBQR2pH~yjJ^o4%BpLy-0N_tsj=^Bz`O&{{%G|Y^p}oDmz$gDNBbGYrklbB2E*_6h+4XO{?pD0q NEw((Lpz;Q&{RuUh!;k;~ literal 0 HcmV?d00001 diff --git a/src/main/resources/schematics/ruins/DeadEnd_Balgor0-ArrowHall_Closed_75.schematic b/src/main/resources/schematics/ruins/DeadEnd_Balgor0-ArrowHall_Closed_75.schematic new file mode 100644 index 0000000000000000000000000000000000000000..12855b2ec04aea0fa529522bb3c43363e3acecb2 GIT binary patch literal 2421 zcmdT^`8OMg8clU{OPBYkoDoz})rc_m>d>kdrFI&U5}hF_iD;+Mu|%2HB&BJ(kxUcY zgo-t2LliaXC=VfuG&GjjDwd#@pwf~z@67x#f53Y`y!*@doqNtb_k8EO=jv1T0RF@R zb0l`i4NN{Gc>*!IH1KBXZYKKOhbeonr+ix05<5N-=}W_Xs*aaSi0;biO!4`owEF+J zg|zt(?JPO(``{w3t+7y?v=aa*aW?QrQ`O9BhG$(SZBg04LPKwmP8JxCJS)i52bujhft{o@M|fb)g0hY@ea2&!s*+xT~$ zR2WMgZ-svFj+t(HKdC|LN#$H;U){HG3~P8q&ac!3ou)1W)B)A`OHv(seBbCubn7eo8N)) z-QP&E-Yj*Ll<__rTCCww^nd9)>M!T01A6v)6?zvzzL?Ciovr6N(9t^whc>4T006%O zuF1M<_XA|_z2s0Eb&Sdo<FtIE9CzC2=fYffMJPPIu<5yn(s zB&y8;j>2PDWHHSxU!7WMF!41vu}{r62Z<;jO}ID*dRwPl68D^0f$4PZN%hqY-;_;D z1gbTWM7ZfoIV75z5Kl$&609#LD<0;-nr0^&<-w~{LWK)2?UR{x`t2F=mZSarjNb1R zMEBpnP2%fybZmaWu6zgHk6*%WioRc~%TuI2wFutAS8eH6nV>K*A6{-s>?=@{a$w?E z9Vq@Of+u<_pHb9%6q{&mTnV{aoNwDZyBb=YvilmFa;W^Gw!;mjxV3d)b?Wm&dqciT z^7_CIKvo6eBx?Kp*=Q7sfbDBu%Nl$76-U+AVHRJKh=575KlnBzmJTQaL!dQl2GKCF ze_o~81#6}z>P<9fSuhx-6nI8=NWGvJ1-@tNkIHlCukAQRrvxIJdOcsT;%HJ%b1Dsf zX53E*Mo1SQ{cK^J*wvY96NYHCjI>p8B+rX%TD?juh=ovKpC5W*ai~#_&;3oRyL{#s zhbMh@y9;nVp}_5-=6mKv~Zh3rAVGuQGMAhY!EM>OKjtzOeW!uD_2 zQ6R1(z$c5hh+63GgjD8qI1wULWtu$D#Nplu1m+>@5qW&hZ}cPN@V(p1S+bLP$W8^1 z{>39V2Ce=PQexKX1q6NY>1+(woRltJZ1op4AcQHb zDPO5(#<_`MQ*rSxr8k&yq`AO^85#+m?S}S8Ly4e6me1VY9gJTWP#LD>4+7$F&N+;^=@Gt{A-s$A91k>$G{_=54;?<4zTj+-byfk42o93BvAz?A> zYGUFEMs0lep|D13wintOlTzLVlqe3!k)M%ilD@-m7_ZW&-o=H}-u2 z#`K=;NnCi0;fZ(KmxnJ0Sj+LM_pxmeg^UNIa|5tFoPmb0uc?`G%*)~o?U|}aYNska zG)=_K1UUB*BC2-_7Q2E>kH*wnWKvzA;LO|fnpH?-9LlPiqSYHYP&n0>5t}IkHIi54Xu>rachY8 z;NFdLjBU|lL?j3qn2j#O?|NK6?mj7yHMi>-XZw9_7Oo#Jj0^l#dmVm~M?~3+3H?st z28Z1Lra~GZVTY{-*&CtBpM3Q{qGkfwSu!cM&CV`68VL>MCe?aoljyxQj}Sr^4D044 zXv+~!XD0>j{ntrkGT99yQDcz)f0t%fBnS)!5AN)5H?smBIB-A+qIMZ_d;UO7@82jj Xz)x=q7G9U8sdj?AH8|wQYJh(OVP~YJ literal 0 HcmV?d00001 diff --git a/src/main/resources/schematics/ruins/Hub_Balgor0-OmniMaze_Open_50.schematic b/src/main/resources/schematics/ruins/Hub_Balgor0-OmniMaze_Open_50.schematic new file mode 100644 index 0000000000000000000000000000000000000000..077e4e70db5c441e349e4ec4145a524d1ae73b9e GIT binary patch literal 7039 zcmdUzRZtvCw}odI++7D4EVvUKf(Hxk?hxE1NN@&scLKpBSa2UCI0OssPJ%n!ob$i_ zb?d&~wO+cqc31EER#jK^ri?}g{70vTt8wH*E@w>A)E{SMaP7}>;DJ}@U0$>_CAn)O=Sfa~P* zo%Jq1m+SF{>|=Jy*msXlOXCfkFMkgC<%Dfkp4iTDqc;&Q!g*hQV^nJ0cs#Xhp31({D{CyC z*U6hAp~^`hE!dWd31hLmIZFQ6s^pA>LTdRJOcF9HP|;mggAg;n$o@ax%k3q6|Ujv~`&8a0%2)?Zng=vtHeIcK-S# z9^T-1ON}Y!TSSZJMNXDRJ-|8aY&ggVqi_&CBL0d1`Ig^}dgBiFcf3FF2|H0GI z`=XybJ6!LGwDnfeH2B;~ZDz!e%fWA-rX40CWr`c3qM*ui+Z2i!QY^irulfbQJbLaz zYvCRIcia=hJG(6GDdY?@JB^y7o|%jka4l+feY^gHzsK#ZhE({TE*jZQDJ_Qg-dq8ep3Yuic2Bi;d4!*l2@xj z(8J?TbSHAtavPv~LLSx6lNYpO-R)InQdArIsE3W^O5MKugSe?^>~cFGaUWF+rlA|F?U z8DDa>acc?k1zk~2Dh4E%@7j@XV!b~Zx^D@=jPz$NX0iJMu>Ji}u7*J%bOuiu$Y9q0 zMjY$;;6@0*>ELAWC#Q5T{Uw3UaDUcY$4&lv*n!_Y3Jl zoYvEB8vG@d3eVPmbNWXyDs69O4bVJdd3b^4K4~%IFDH0w)NA($s3s_?8X)*_5%J%s zIWt=D32asmXj1ncQDjC|$Z#yifWMns6j9N&|lf-8!~OLg&=Zbl=()F%Li-Cvy&;Yxhf*n zk#V7YZU1$vCH3o%Q^b3rqLu7+&(4jQ%S7mVWIm45Up+X3Z|}qjZ}8+3ai!{R%sejM zcxpyVA$6k`1<~IQokhY}lfGwi2nApd zx4nPuhzryue`;L|<%^^wUa6TIcUv&IyRNn!kHXLu zsPKl)AGbWtRL88Sz#;Q+Fy80)I)l43787#_H!;6ZS7Cbq3e+l-j9|UH9|@u^nmd3VMEL!XTI_>E(Idxjp6cq27>HHCL} z5VqC88rAaOLaA;qH+|sR#D1@&k*4brqIZdu0c1=gp~>f^&fA^ZO?Cks6>L5f#hK3n zRjxTF+N#PoQShT~b=49UoRjmKg*;5d8LbVi6tuXyE5x5$gdAeY@{o#c?BzFEq@nPz zWpD@0x5Q`h{O#-_+f7z9gr|c-rJ&*6E2{lb?{2(jMG{Scw7sZsorLM@k`|nDKi0^^ zhNRLyA$|2T?v*ffn?|A8ZCqUl&SI;M{_mgoAvni8t`Q{Vppp3u3AI%*|4`hCZd=OQ zlwoH7`>CgjM+O$HnE>6QiO7K^@4eLesR+q$zzCVVG}Y!(PZn8$60x_;;mltn8#e_j zwT`Hz(Y~RLeX?%H+Q&`CT9*I5q(gX%T4R^YuU^V5BZ?kif3sYRg|}o1mDP&?v%I^s zb|V?-=RuVX6O8PC3OM*v6hcoVUDygs5(e+3b3i7jNcycJ&CT~6KlqJ<-IR3a3;`gJ zvBB>bQBM){-6?LAoUC@c6E)a&Dg`64E-xJVVoUOUB*h0^HCbcMm2iZ}>mT(-5t$oO zzYyQ#pj9rrp1mA0Hn{SuN?~2bhwJrB#?x`x-15gZwqS^#ex(2+V+aX+J6}@EJw&I^ zlNO?>!tD6Ml}z542VvgZE5N&Kxx)kuPDDn`EJyfQTbb^tk>`HcB_VRNrDWc6iNrX( z-CivjcqwHqTR6Hkb|!%ZIx5j_^v<2=dPVVzQuBsuJRZvC!vHoko23UK$Hf(-+zB{h z1S!?lf^lH48&htAcz67E#Tv`E(oSHCcfLBCw#8UhT+8ElPsdY=CU2F4an^cj>E|h; zthVcVXRvLs=B(vr@a_p+_nj@?=c2-JrE#y*XZXA}-e=G<76~Pr?Jxx9xgq!~9Vy*}O;tj}QvLgM`=sMkOSq2oCmBhi z9q#5K}zZO*&+`w6R}BJuh+bTUjVd6_q3Cxj*e5Fea4GFzAE zSn5VrSI7~9rAgKl5I>2wke)4^!VdN(9Y#~S%X^ZewoB35 zREoT}uN#|I5aXW|O^nT6-&eq6x^gM7jM(!w@u&aNpD$fBZ?eOtM4YAs#*7@Asg`{> znaiOd{!A4%mdkvNNE;ojGBVa9eEaqxIcI%7rQ)i&&_>`2sr*8h=`-aa zRpO6YwBuY_4_$+-Il=tMp(NTahIzi0-9K(vM%5Ks2eILK$f6j56&dePdriBZsk*7F z3>ZT%ycaOT5-dRtkPZV}{_j(GURYhHTU!Iu!ZYy&MnIk?LkcS_3`3bTU3n`HfIf%0c?_>1C)xDB*p^@-!P51`zBbU*uDJdB3v+sK43=pdzqI=vCJCz*S0bCoxI^Hy2j~;H{{xrU^Xqw_ub=Em+4b+!9DpGb2=Wt&_9P!8c2%mC$dJz9=8|Ra8|5 z(GLy}fexr|Y8e@xkp`tSON);kr zIvpzpy^@xf@I*f^OYCoftWGi`F-XTE;TDUY1Y=_^`CgdFiaOYtL6bUUEhap_o>GHc zfR}4so-RcGD9gnKMB5hc)L1|LEGip`E5Zxpwx38{+UFP+EHqKiPD<}9E#4bs2#C#B z_tpLU_>sIXrrqy5xqR7Xi#)0n>#tKLp@Nso-o+KQ7ef&U#M-9Ec-lVBR)C+jURhh-?DGKXkq>rht9O&n3?^C>U zi}BGm>kvVHvqf*`l~RF3?^F!nsg&IuNWG^r{%8YbQ0ubbiJlp-yWX{mZpOYuXg?doqCj=F>7r}R>@+Cw;2U}RuL*ftuqpI^tfbv(xUU8 zkRC%XH8t!ZLu|Pwf2}LX-DgX|%QV&QQQn_b;q6c(rnqqpf^>JYhswXbBy8XQ#Zez6 zLx0~qIiECzvWOb>ZJz|4-JX#8lgsyRUzT0#9(uj6CpC9TLJqF|~Lgvn-?u>U=++R(0(ff0Lx zL4^s)F7s1(G2M?&1l&RRD?`wStQH@-}i#xtnX|k8+hfp2B zEz6H4o(N8h>yVnNZXL4ua!#1VGGv{GJig9Y*kx~pp-`R$6h(4zCT;L(N-7j)_Sjz7 z!^bu;t|#n}hpK@LpIPZOKq?Fa?KGGOsx|e}FFP&f$2mJGx8fw{?;z^mhpMrR_PZS4 zFH)^w>lv=~00Bz@N8I`k&6CDxN@5zM#+_liSGc-Y-*XKjGyvQj~ z+CjFifTzEDv4@wf{264?23B2s9S<4Bi?;jF>e}bB?|zpd8KrA8xPw&|i?<+3-){bX zzhN}@JDqoRRM(Vmx2xYxr>#0~%dE4BDZhKr<0cK=wI8g_R=_xr#fHcM!Cp~7J8+VT z3{Q!l?xHJdbI;gD|F)3UQy6!3cBjxwUYVPUB;#yNk4fr zI}+#mrEG$^L$Mk2(xwVXlU`I}6V^~;FBlZwh?|t`M3@1`o2DOY=B2BtzrcDI%0Wy9 z6J2>5-lejz6y66B5U+kR4LS;B9m^xDsu{=T1}?<*1L;D)FKBCy{iJ#0hpA4V@PnR8 zPHqc?L+`dwK$29wznX0GQu|xyg`gy@FcaiPR#X3JRl!U}S}R2K0DK9cA*9+-C0?jM z46H(Um^3P~BP)hkuB-_{z4hQ}>)N65{{1Rjb_=L4AKo z+2YTnUoPxLTSJSK8wL$SXP`B~gp-}igB65+_ts8l9c>Qk(~bi*$5yPkAAC~=au-lB z=^^rgi0I$ps^Gu2L>VfQ@v`KHXGss*uEey^{rydY*!sF7=0{dzLV)VJ#`YwYp`q#F znUouX@9xmN#%2QhOS$!t!``<-J6=Dv+(;r2aG!nkxOaw-*Q;oUml#f>hW7yrFPJsUjMjSif zE{IwR8Z`3ZHVIPCzcQ!RVtnmb$TZmkbMBV=hD#|)kiOXeXsw-T&QRPqm5`>=C4#>` zIV%KR^t#==)}s9Q*<6&DZy^xHM3L%ePVHM>-?DfmY)FxU`W4^Av)ijgs-!W@)V^B zmFKuw*{-4_jC*8|5ER0Y*K968_C#3EW5D8;<9U=7$94>l%(cRyt%y@htt)gjGeuJ$ z?2dt>EO8aE%Gst+L``Q%x%HKk(BAzcg#l}z=u^4in?k5wLF_n7)uWePYFhr|kjj;J z+E)0$;--@di0{3d$+Nw(BKRYLsJpx`dYvVa_66#aJq~-h>}f9lj}BL-lF#oJ*qv&e zYHE#~PDi)Tck=UB4g9^HPmUM1w~hUuPou4s2WLNbzdXo?Kks<{oXn4je?8ngBFpSw zm>e3)?`-+xe>q*SzV7(R{qeqic`|=3;N|A#l4!e&`^5_L0nPByE8qC@<$b00`t;pW zv~}(4=F#qG<^Jo#$wT}3^xa|Q@4t7i3AeWfTwi#ez2~7=#k{|Es&#VAuJ7&$c)tJK z^>lPJH#%t~+#YZbyB=L%arA#UTCPlgy;!w2?*8O|?Waf;kTwwDMs@cg?Cuf*-x-E| z^;P0Y6MJj_w*=G}o=P-;=nN`h&=H2c{kP&6GO+%Vu_R6q#%J@ zd0pC51$nIWH?@$K#8cV7HMX9A?slRp(~Va(JV;_CT+^pRtR?y&8Xlr(1(LN-3a|o%Mg$MDgpz)xmOI zA(Gz|XwBp9?Q-?lmhOAZt~cq>|g@hgwWv zdeQJ1qvIQTkF6*6)43A&iO14kWKbxf5txwjx&jcw(|cJ^v}BA6py`nOavu_JDW|v| z^9=OfpAdT}Qtek;-*P<`i8VJdsP8Liq@f+J9y<4r@A z;6{d0za&T&gj{R`g8l#?#w9KTX8yXUjVG|B4v(a#htrizjP$QH(h;$VJgGs%{4$Pz z56FU`M>Bw}J|znPXlU30@bRxz4N1ie79-LBj-6XEApf{R0R%-8N(7>VX}$xC|60o9 zBf!O!o+~iOe1|uX=da7yFd%FvQivSRF)N4(e~mp?0vrg-9sW-<7j*zv)tQwJjIuXI zD-QEO-rhaqv*o=&|2|&iy>?*SkmdL$-2V>Jpx~g-{3Q;|me?QWtg;;`{54`$0wE(j z7AzKo#vY=JTNTqKhQlr{s(#7!2fEgQEX<}DZeokgI}oC+-qfkVN=WrvprCXoV%XWm zRN}xYzq1Sg10o@3J!j9q#R3EZ?t$)*bz@OQq>Jt~|LwnfT@i3b8Kj{Y=Noex z4(qj;JHE&#LY5A&Wb)zL&n)D!S3$|w&q&zpe*-~nLQKH^7a}D%Q1*g4f)9xOw`uQ5 zApB)5$6I8wt=`J=UtPw4;Gom67w3r}DN26be}Wp2|A#va7Xvb(I}Dns{Fi#MK@o63 z0L@42)7yWUrzr3Q@>^43$=3c$Ji#>*5qqCy2Y5L5Z}@6#(}1mp42;C}#Q=0FJm literal 0 HcmV?d00001 -- 2.39.5 From 484a44a0639b101e3962c3877dd7627f05cf6e57 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 19 Mar 2014 07:04:46 -0400 Subject: [PATCH 17/27] Minor Change to LimboProvider Changed the condition on LimboProvider.canRespawnHere() so that players can respawn in Limbo even if LimboEnabled is false. LimboEnabled only controls whether players are sent to Limbo when they die in a pocket. It does not prevent players from ending up in Limbo because of Monoliths. If Hardcore Limbo is enabled, it stands to reason that people should be respawning in Limbo anyway. --- .../java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java index 76ae6cb..9e22053 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java @@ -62,7 +62,7 @@ public class LimboProvider extends WorldProvider @Override public boolean canRespawnHere() { - return properties.HardcoreLimboEnabled && properties.LimboEnabled; + return properties.HardcoreLimboEnabled; } @Override -- 2.39.5 From ac8874f96a446a0af9f553ccde289422f35c248b Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 19 Mar 2014 07:43:05 -0400 Subject: [PATCH 18/27] Fixed Crash with ChickenChunks Fixed a nasty crash to desktop. It happens when ChickenChunks is installed and a new world is generated with HardcoreLimboEnabled = true. It appears that ChickenChunks forces a chunk to generate in Limbo if LimboProvider.canRespawnHere() = true, which is the case if hardcore Limbo is enabled. Our Monolith and gateway generation code runs as a tick handler instead of through standard world gen calls. I believe Limbo is unloaded immediately after the chunks are generated because no players are around. That would cause DimensionManager to return null for Limbo because it's not loaded, which would crash our code. We probably dealt with this for Monoliths by adding a check. Now it happened again because we didn't take precautions while calling the gateway generation method. I've added code to forcefully load Limbo if it's not loaded. --- .../ticking/CustomLimboPopulator.java | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/CustomLimboPopulator.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/CustomLimboPopulator.java index 465e57b..2f4522a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/CustomLimboPopulator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/CustomLimboPopulator.java @@ -37,24 +37,36 @@ public class CustomLimboPopulator implements IRegularTickReceiver { @Override public void notifyTick() { - //Check if any new spawning requests have come in + World limboWorld = null; + + // Check if any new spawning requests have come in if (!locations.isEmpty()) { - //Check if mob spawning is allowed + // Check if mob spawning is allowed if (isMobSpawningAllowed()) { - //Loop over the locations and call the appropriate function depending - //on whether the request is for Limbo or for a pocket dimension. + // Loop over the locations and call the appropriate function depending + // on whether the request is for Limbo or for a pocket dimension. for (ChunkLocation location : locations) { if (location.DimensionID == properties.LimboDimensionID) { - //Limbo chunk - placeMonolithsInLimbo(location.DimensionID, location.ChunkX, location.ChunkZ); + // Limbo chunk - World world = DimensionManager.getWorld(location.DimensionID); + // SenseiKiwi: Check if we haven't loaded Limbo for another request in this request + // cycle. If so, try to load Limbo up. This solves a strange issue with ChickenChunks + // where CC somehow forces chunks to generate in Limbo if LimboProvider.canRespawnHere() + // is true, yet when execution reaches this point, Limbo isn't loaded anymore! My theory + // is that CC force-loads a chunk for some reason, but since there are no players around, + // Limbo immediately unloads after standard world gen runs, and before this code can run. - mod_pocketDim.instance.gatewayGenerator.generate(world.rand, location.ChunkX, location.ChunkZ,world, world.getChunkProvider(), world.getChunkProvider()); + if (limboWorld == null) + { + limboWorld = PocketManager.loadDimension(properties.LimboDimensionID); + } + placeMonolithsInLimbo(limboWorld, location.ChunkX, location.ChunkZ); + mod_pocketDim.instance.gatewayGenerator.generate(limboWorld.rand, location.ChunkX, location.ChunkZ, + limboWorld, limboWorld.getChunkProvider(), limboWorld.getChunkProvider()); } else { @@ -145,15 +157,8 @@ public class CustomLimboPopulator implements IRegularTickReceiver { while (sanity < 5 && !didSpawn); } - private void placeMonolithsInLimbo(int dimensionID, int chunkX, int chunkZ) + private void placeMonolithsInLimbo(World limbo, int chunkX, int chunkZ) { - World limbo = DimensionManager.getWorld(dimensionID); - - if (limbo == null) - { - return; - } - //The following initialization code is based on code from ChunkProviderGenerate. //It makes our generation depend on the world seed. Random random = new Random(limbo.getSeed() ^ 0xB5130C4ACC71A822L); -- 2.39.5 From 4fecf092a3bf30c077bb06727f5db98da313855b Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 19 Mar 2014 07:46:21 -0400 Subject: [PATCH 19/27] Changed Default Provider and Biome IDs XombyCraft has been kind enough to research which provider and biome IDs are used by major mods. He found some ranges of free IDs and suggested changing our defaults to sidestep conflicts with Biomes o' Plenty. --- .../StevenDimDoors/mod_pocketDim/config/DDProperties.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java index 3aaa69a..e41a467 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java @@ -211,8 +211,8 @@ public class DDProperties "Perma Fabric Block ID", 220, "Blocks used for enclosing pocket dimensions").getInt(); 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(); + PocketProviderID = config.get(CATEGORY_PROVIDER, "Pocket Provider ID", 124).getInt(); + LimboProviderID = config.get(CATEGORY_PROVIDER, "Limbo Provider ID", 113).getInt(); MonolithTeleportationEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Monolith Teleportation", true, "Sets whether Monoliths can teleport players").getBoolean(true); @@ -237,8 +237,8 @@ public class DDProperties "Sets the chance (out of " + BlockRift.MAX_WORLD_THREAD_DROP_CHANCE + ") that a rift will " + "drop World Thread when it destroys a block. The default chance is 50.").getInt(); - LimboBiomeID = config.get(CATEGORY_BIOME, "Limbo Biome ID", 251).getInt(); - PocketBiomeID = config.get(CATEGORY_BIOME, "Pocket Biome ID", 250).getInt(); + LimboBiomeID = config.get(CATEGORY_BIOME, "Limbo Biome ID", 148).getInt(); + PocketBiomeID = config.get(CATEGORY_BIOME, "Pocket Biome ID", 149).getInt(); config.save(); -- 2.39.5 From 5c44ddefe9298ca8998bb753b34a4cec9f28eea2 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 19 Mar 2014 11:53:33 -0400 Subject: [PATCH 20/27] Added Hidden Chests to Snow and Swamp Hubs Added hidden chests as is the tradition for biome-themed pockets. --- .../ruins/Hub_SK-RandomSnow_Open_75.schematic | Bin 2784 -> 2824 bytes .../Hub_SK-RandomSwamp_Open_75.schematic | Bin 2846 -> 2951 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/schematics/ruins/Hub_SK-RandomSnow_Open_75.schematic b/src/main/resources/schematics/ruins/Hub_SK-RandomSnow_Open_75.schematic index 18503e1650f8b766b229aa6f24f873d3e253a1d9..5a4a0cef22fb00fe9d9abdab788e446cbeab0356 100644 GIT binary patch literal 2824 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 literal 2784 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 diff --git a/src/main/resources/schematics/ruins/Hub_SK-RandomSwamp_Open_75.schematic b/src/main/resources/schematics/ruins/Hub_SK-RandomSwamp_Open_75.schematic index 5f3b18da3de552ed61cb57d9764080035eebb7fc..b3a086e0c80def1f1a197be52120464e8fbd6137 100644 GIT binary patch literal 2951 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 L0#_*7Un%_;@j5W! literal 2846 zcmZved05iv7RRZ^$9B8Tn5ik#qG>ADRYS_$Nl{Cp7Wmbe9w88=Xqaf#(KyX z6a^Bju){Dt;?2z-+Zg(ecNrl@$KE`etq|MxW!P=x>Lo^79J7rc+<3u=zgW4}HnAUg z$8$SneTx#F<{&$6a+BKFi?MRkIqupTKH+`h^rr)zy2Zs2T{};v7DnLI6G}DgM2edJ zce&5QW$ur)Mz_MzRwhl`;AIgBXOklYG22@QUT%ayD(p~BCZrsK{U0N@GvDezMZ50J zN+O(kO?2dcj04v}gv}u{UWUJX`Xzdk5vrIjAwlorJi0Vz3J$*C0?~}l5XSCMcZ4RT zXHX9AOkAnveCC^&aI2IUFHmCvfrR~s8$ z;8PxTs1J!os34?WAHjN5ZE+LlCO5B%Zc7u9=g-e0nmqDBQ^xj?-W(7z_Q6B<$a1je zB^Fil<}%u1fw`|k-9h&dXq;bbLlGAKlr_gb-pfw$^5Po%V=}wL>aRk+l{D|sYjEQ| z)^(X9X0HJFque+_JHHlFBP>ilD0`F=NtmR&chMXn*WA*3)kx>@X_Deh){z5Qbsz+? zEt6Z6cp2>#-#zd~tM?TIat+*fS`gFsuYVrnwaSmU)IJRP@ZxAQYVw+d=$9TE4M6DeI#bC0U8~Jh112>T?Sw+&Jm*y6hrugnqiNqe-MCQ`m zQ`{*_#m^_YvsKv??Ytsg+OOs9L&9_zmszj5zkKJe2D+rc%qg^)+57g3S9_wy?&l@B zOmw@NgVXZ+sDVQiPI{Pb*m(j-a_OCc$Q~%>T&BZxWk)7ZD`_lR*lB8>MB?5^Nja`_ zMpnfPH)#6Pr9x;S^`|*W0X7E``y_cO?}oKs*}3e}uKbdd3-x81Akde{c5Zx}8WCr8 z-pRTVtvFra>U*w)sbf++a^;6mj~OKIZfNU3_Qt#eeq}GzVT>VZ<@|5*j&iXD`EHaB zUH*bpX6hdZo+AbzkM-%7T|W?2cwhi5Biu7zH5{H-O_ZK>WknKCRIeJ^NZ$N2-$56@ zvXW507f6k|rDA2;EF#y*Cs$7LThS>kMEyUf+pm4K=PPBm*b(lOovR9a8DF&juK2}~ ze-54V4!p?seVQ2J$IsWl=6jJ^zXWQRv@Q5QX(#?1g@VLhgHGtP&hAgkVtHQg^6KRX zn5*82{){L9hRDuXC8 zBk&v`DP#L}+LpX}(AN`VRHbW3tIXXgsbP+#Pr%-Gld^;F9YMszSM+P;#l{Z7(P>Ya zhXKCg*=b?`wyZ#X^j$>@-w}J9z~d=ejxmE176I-z%D4)g8c+6ZUbp=q&O14H7-ImjQfT8ce8#d#B+WQvec8Bg#`?aAO+B zDsS)nUZnhK^e#sE{lw`YN2Z-h{D(D%I{K!bJSmIYEz6}b(W-`H!ThAsDQJ4VJ#V;t zva?MoOW02)j^Z_2eCn~`wwC-4?~Q|NGtqT6m7??)>b`icKN$ElQS|8oYTXE~dJW)8 zDZhR&{Em<@ar@ASXqxY8&mmSH$2tV%JPZ!C534d@s&6_Ccym>XS8M_miKc-)r1$Rn z752p4c=FI7`8E$2W?tz}f7+pd3I}pRc$?<_8obNPYGaQ-P1@B3x$k&#FHhvfR&V&! z$9;B%+nu!wmsGMJe>5zvy3pboFTO(@1-1gpM-)Rc*~-UvWCwv^zfPI?(BLV>j>x~H zFHW7?iRC;oCKN?6?^q>uHrG`=$<%xhes>CcB{<}*wwZ;~#IRB?*%ztZz&a%|cY@?J(m9TBs*Flqhoh8OQy%FG%~>kW131u4%Y-oQz;A*?1pCj5Ueh2=Fv2|(E`U|>mxeQ7{kJ`jcxeq zVmEzFpYe%On=aCITD&N#n74kOV`%gWKYjQezc#k53*Q*LNm~CllL}_(c?pU#qWX0_ zYnsdw(NqHHCNlERqrf5eGu#ZEJ~;ncext|k=*ZO1hb|$5Qt@uhozi4kBsR&XZ#vyE z+eQ^M5;_IH<#70H@7VX}WDQ)XS;!;AH%VDZv z*Xw)W2?+aMcwtg!K7POH@szz%{v3#(ZWJ%n9GF^=QTd_b#~E$ z6KEul)uMp)xU2ELf03^JTPA(a;Hy(wm(72D?bPgg34R(&1-a>Q21Q`d%0bvGV`!$Y z=zuKlEBJ;*U_d=52t|u_V(FrNvN)eEw#0nlWjU7;K#>E2YnbFrGj!@*4V1Gg5c5xqGjCJxaHpuK`?o5 z*H{2HQwyJ}Sy{2U(F&@&VkqjkSl-mabqXcq)5cw3D=4jb)qmO?<8@{U8M|d{VC`zE z5pn5DhjFX4e^}kM&l*O=%_{+yMtXbeXL9SlsKAs{b*rBgz0Tz|RJiw4v&mY>{{Y_& B2J`>` -- 2.39.5 From 8ebaa0f4934d094b867258fe04e6820edba9ebb5 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 19 Mar 2014 13:15:30 -0400 Subject: [PATCH 21/27] Completed Subtree Searches for Dungeon Packs Completed the implementation of searching through dungeon subtrees to avoid duplicates in "nearby" rooms --- .../dungeon/pack/DungeonPack.java | 19 +++--- .../mod_pocketDim/helpers/DungeonHelper.java | 59 +++++++++++++------ 2 files changed, 52 insertions(+), 26 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java index 6c426d2..4a37e85 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java @@ -138,17 +138,22 @@ public class DungeonPack int maxSearchLength = config.allowDuplicatesInChain() ? maxRuleLength : MAX_HISTORY_LENGTH; ArrayList history = DungeonHelper.getDungeonChainHistory(parent, this, maxSearchLength); - ArrayList subtreeHistory; - /*if (config.getDuplicateSearchLevels() > 0) + ArrayList subtreeHistory = null; + if (config.getDuplicateSearchLevels() > 0) { - subtreeHistory = DungeonHelper.getFlatDungeonTree( - DungeonHelper.getAncestor(parent, config.getDuplicateSearchLevels()), - MAX_SUBTREE_LIST_SIZE); + // Search over (DuplicateSearchLevels - 1); zero means don't search at all, + // one means search only up to the level of the immediate parent, and so on. + // Since we start with the parent, we need to drop the max levels by one. + NewDimData ancestor = DungeonHelper.getAncestor(parent, this, config.getDuplicateSearchLevels() - 1); + if (ancestor != null) + { + subtreeHistory = DungeonHelper.listDungeonsInTree(ancestor, this, MAX_SUBTREE_LIST_SIZE); + } } - else + if (subtreeHistory == null) { subtreeHistory = new ArrayList(); - }*/ + } subtreeHistory = new ArrayList(); return getNextDungeon(history, subtreeHistory, random); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index a4cc980..2c9775e 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -641,45 +641,66 @@ public class DungeonHelper } /** - * Performs a breadth-first listing of all dungeons rooted at a specified dimension. Only dungeons from the same pack as the root will be included. + * Performs a breadth-first listing of all dungeons rooted at a specified dimension. Only dungeons from the specified pack will be included. * @param root - the pocket dimension that serves as the root for the dungeon tree + * @param pack - the pack to which any dungeons must belong in order to be listed * @param maxSize - the maximum number of dungeons that can be listed * @return a list of the dungeons used in a given dungeon tree */ - public static ArrayList listDungeonsInTree(NewDimData root, int maxSize) + public static ArrayList listDungeonsInTree(NewDimData root, DungeonPack pack, int maxSize) { + int count = 0; + NewDimData current; + DungeonData dungeon; ArrayList dungeons = new ArrayList(); - Queue pendingDimensions = new LinkedList(); - - if (root.dungeon() == null) - { - return dungeons; - } + Queue pendingDimensions = new LinkedList(); pendingDimensions.add(root); + // Perform a breadth-first search through the dungeon graph while (dungeons.size() < maxSize && !pendingDimensions.isEmpty()) { - NewDimData current = pendingDimensions.remove(); - for (NewDimData child : current.children()) + current = pendingDimensions.remove(); + dungeon = current.dungeon(); + // Check that this is a dungeon, and if so, that it belongs to the pack that we want + if (dungeon != null && dungeon.dungeonType().Owner == pack) { - if (child.dungeon() != null) + dungeons.add(dungeon); + // Add all child dungeons for checking later + for (NewDimData child : current.children()) { - dungeons.add(child.dungeon()); pendingDimensions.add(child); } - if (dungeons.size() == maxSize) - { - break; - } } } return dungeons; } - public static NewDimData getAncestor(NewDimData dimension, int levels) + /** + * Gets the highest ancestor of a dimension with a dungeon that belongs to the specified pack. + * @param dimension - the first dimension to include in the search + * @param pack - the pack to which the ancestors must belong + * @param maxLevels - the maximum number of ancestors to check + * @return the highest ancestor that belongs to the specified pack within the specified levels, or null if none exists + */ + public static NewDimData getAncestor(NewDimData dimension, DungeonPack pack, int maxLevels) { // Find the ancestor of a dimension located a specified number of levels up. - // If such an ancestor does not exist, return the root dimension. - return null; + NewDimData parent = dimension; + NewDimData current = null; + + // We solve this inductively. We begin with null as the first valid ancestor, + // like a kind of virtual child dimension. Then "current" references the + // highest valid ancestor found so far and "parent" references its parent + for (int levels = 0; levels <= maxLevels; levels++) + { + if (parent == null || parent.dungeon() == null || + parent.dungeon().dungeonType().Owner != pack) + { + break; + } + current = parent; + parent = parent.parent(); + } + return current; } } \ No newline at end of file -- 2.39.5 From 7258ffa7dc1328ff2b093e47f65d99699c36cc6a Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 19 Mar 2014 23:08:25 -0400 Subject: [PATCH 22/27] Updated pistonFallRuins Updated the dungeon pistonFallRuins so that it causes less extreme lag by slowing down and spacing out the timing for the piston traps. Also reinforced the dungeon against tampering and added lava inside each piston drop. --- src/main/resources/schematics/ruins.txt | 2 +- .../trap_pistonFallRuins_open_100.schematic | Bin 3963 -> 0 bytes .../ruins/trap_pistonFallRuins_open_75.schematic | Bin 0 -> 4178 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 src/main/resources/schematics/ruins/trap_pistonFallRuins_open_100.schematic create mode 100644 src/main/resources/schematics/ruins/trap_pistonFallRuins_open_75.schematic diff --git a/src/main/resources/schematics/ruins.txt b/src/main/resources/schematics/ruins.txt index 5920286..7bd11e7 100644 --- a/src/main/resources/schematics/ruins.txt +++ b/src/main/resources/schematics/ruins.txt @@ -73,7 +73,7 @@ /schematics/ruins/trap_fakeTNTTrap_closed_100.schematic /schematics/ruins/trap_hallwayPitFallTrap_closed_200.schematic /schematics/ruins/trap_lavaPyramid_open_100.schematic -/schematics/ruins/trap_pistonFallRuins_open_100.schematic +/schematics/ruins/trap_pistonFallRuins_open_75.schematic /schematics/ruins/trap_pistonFloorHall_closed_150.schematic /schematics/ruins/trap_pistonFloorPlatform2_closed_100.schematic /schematics/ruins/trap_pistonFloorPlatform_closed_100.schematic diff --git a/src/main/resources/schematics/ruins/trap_pistonFallRuins_open_100.schematic b/src/main/resources/schematics/ruins/trap_pistonFallRuins_open_100.schematic deleted file mode 100644 index ca2d664aa35f68cc300de3c90f7cbbd0b9ce0a22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3963 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 diff --git a/src/main/resources/schematics/ruins/trap_pistonFallRuins_open_75.schematic b/src/main/resources/schematics/ruins/trap_pistonFallRuins_open_75.schematic new file mode 100644 index 0000000000000000000000000000000000000000..0ed8a39edfe1ba3b38e109c5a8562eed2d7e5874 GIT binary patch literal 4178 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 Date: Thu, 20 Mar 2014 05:31:02 -0400 Subject: [PATCH 23/27] Updated SK-FractalCage * Added a small treasure room that opens when the puzzle is solved and made the exits in the corners slightly more apparent by placing redstone lamps. * Tweaked the redstone a little to correct for a brief signal cutoff. * Tried to add fireworks that would shoot out when the puzzle was solved, but it was too hard to secure them against theft while also getting consistent explosions. --- .../Hub_SK-FractalCage_Open_40.schematic | Bin 9345 -> 10698 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/schematics/ruins/Hub_SK-FractalCage_Open_40.schematic b/src/main/resources/schematics/ruins/Hub_SK-FractalCage_Open_40.schematic index 5a0c61c472be8c29f84cdfa64290125ed17a07e8..db1ceaf0a1b71058248e55bb41fe66f71741a77c 100644 GIT binary patch literal 10698 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 SH^#T$XWrb1jDb>Gs{aK_?&-q- -- 2.39.5 From bf2f5da67237e4accc5395ef07f57f54a0569079 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 22 Mar 2014 08:00:21 -0400 Subject: [PATCH 24/27] More Dungeons * Added two exit dungeons: SK-HotSuspense and XombyCraft-RopeBridge * Removed a duplicate copy of Cere-FloatingAltar that slipped by --- src/main/resources/schematics/ruins.txt | 2 ++ .../DeadEnd_Floating-Altar_Open_100.schematic | Bin 1647 -> 0 bytes .../ruins/Exit_SK-HotSuspense_Open_75.schematic | Bin 0 -> 1777 bytes ...Exit_XombyCraft-RopeBridge_Open_100.schematic | Bin 0 -> 2137 bytes 4 files changed, 2 insertions(+) delete mode 100644 src/main/resources/schematics/ruins/DeadEnd_Floating-Altar_Open_100.schematic create mode 100644 src/main/resources/schematics/ruins/Exit_SK-HotSuspense_Open_75.schematic create mode 100644 src/main/resources/schematics/ruins/Exit_XombyCraft-RopeBridge_Open_100.schematic diff --git a/src/main/resources/schematics/ruins.txt b/src/main/resources/schematics/ruins.txt index 7bd11e7..5e43921 100644 --- a/src/main/resources/schematics/ruins.txt +++ b/src/main/resources/schematics/ruins.txt @@ -35,8 +35,10 @@ /schematics/ruins/deadEnd_tntTrapO_open_100.schematic /schematics/ruins/exit_exitCube_open_100.schematic /schematics/ruins/exit_lockingExitHall_closed_100.schematic +/schematics/ruins/Exit_SK-HotSuspense_Open_75.schematic /schematics/ruins/Exit_SK-LockingExitTrap_Closed_50.schematic /schematics/ruins/exit_smallExitPrison_open_100.schematic +/schematics/ruins/Exit_XombyCraft-RopeBridge_Open_100.schematic /schematics/ruins/hub_4WayBasicHall_closed_200.schematic /schematics/ruins/hub_4WayHallExit_closed_200.schematic /schematics/ruins/Hub_Balgor0-OmniMaze_Open_50.schematic diff --git a/src/main/resources/schematics/ruins/DeadEnd_Floating-Altar_Open_100.schematic b/src/main/resources/schematics/ruins/DeadEnd_Floating-Altar_Open_100.schematic deleted file mode 100644 index fa5b3c02be7b1bef59ab37db1643d211990b08cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1647 zcmV-#29Wt5iwFP!000000PUPjkJ?5U#|M_hkbP6DUVF%1*Q!+IfO<@`Nh@`$R%)f3 zb|qM>U}XVoq1vR^=H9Q8i%y!{v~%`_Bvj0001FE-o%oFUpZ^c5-@lezD?sJ9Ys8V87_r?EnA(tjTe? zWF_Ur##ZbC02)M(+m>;pZ23s8&Y7h3C1sr;bG1cjpEumg&3`hx`Os>o0=0ejgafM% zP(ti=!X;OSG7l-3%^V&rSz)kVCp35~BQ6<*qFq`x+*8)cO^t|S9g?;VJ|yg}*LSn} z9=h03kt&HojHHre?Q*ZlYBCiAb_^@Tf6s=XS%V~4lBI0f^q!X{*K{$OUlh6GAILQ~Qv_X}`?b}tT;1RdofZa!_ zR+E{0bQr!h`fz|Ly6K$O?Z9Dzk28KVI9@>-qe##m*+f#ZT63W{rOz+K=proy;F?YqlIN?fJ|oUm^V)_*x3|M)P!f4^Yt`~Pa{QXO%gLb9b%;gcaPO(@XH z?E;X-k;aa}efpFw&B)|hxm^I#4eY)p{Qgg`PJiIh1AIIvx$(dWpcPg;s32)2tn%ON9z?UIwu#zLtP8J1`b%=$WQL?O-q000000001N5l8k6u_L|M zl|OVREp?<%CsRr(XUp+dUN=w+@;Eb?d{ITR(3iZGml~<}^-3vcllz-fw|$PuHtYUu z+3zMx_D!1|zqQB92{R4WjlcPE|G91tftI*g2+~5ape;C7fSB?&dt1p43|3EjXzFa{CQT%Pq52-Q8Y`&=eu*|MEfbe(uM$R)){V4+cvbU6dJ~HyZIX%vttSn| zv38aGD0V6SlG&ea?%$BsG2Oi@)&N=b?C|4U!+hZe?{7p|mfh-vU2W=6g!t+j5hTA{MUa5Ba zDcLJG{Ha`$){ZjgFR<_1%}D+J$XTnC*>wlmow$IMbat1QxpHD{}ayTa;2k`*zb>mshnWfEif#w`Rxx<`Z z-nps9$&3ySqk|6$>}`s!0_t__&M3I=`U5Xz1<8+Kw+ggvUllM?4vjrY(al24NVz#G zzIU6J=8J^_LY~~h#BZ;`NCAz3@~E4e*=($Jxt#*7JK&zlD{`2Bz%OULPkwB}a~}YE z4I!VogS+566Dm`qH~}eYQ=4KpW9?nO*1N`yA=q`JV=?Um0Pxf}@1tn>?_yAL6!IAW z0000000000000000000$Pt<>oj&f(0^0xL6rQZN(4wMmOnx^8= t41Ng7Q>#d$9R)E#>#m;iFBMm%t*UOM_9gWjL!PXM{{biFAL-8e001=BEK&df diff --git a/src/main/resources/schematics/ruins/Exit_SK-HotSuspense_Open_75.schematic b/src/main/resources/schematics/ruins/Exit_SK-HotSuspense_Open_75.schematic new file mode 100644 index 0000000000000000000000000000000000000000..b658c79f1e1d744615f817049f76aabfe952ef21 GIT binary patch literal 1777 zcmb2|=3sz;w|5WvNr#IxJWS@{Nx9@Y+xNbL^nMqvz}+5Ky;fe?%DLEpYol(#)FtaL zJa^pV^R2Sis^MeBy0_Ikigy-E{I8D=Jdu9?V?oW7ORn=yKD=F?e)RamEj80mzWZ2U zCGxXO*98e|yOsHysiPw!*ShwaiQvVuk^}qHm2S1&_y$oEt8u<~?xh_wFB*Pb$>r+e zvTDof^7ySM%TxWgelQlZ6TB$A{`xmo0l|y2l>YPmZ@B+ZSWt59{r9h@9Q*p)R#x~e zM3a(!%~iEF#UX5)^~@pQ^7w!{(BwYce?-h$LRy|4Z)GKel-B=0wY?;6A%E`+n8fXu8$M z$jt56@4kF9_{+b)bJudFc8jOMIjJL#3*P<&Tcub$yZ>LkMHYX*Y+O0>@7|I;-&|%Goz`b$ zt2TIj=}`Qi+qS3Qt*`ypy?wn!bkfx8700K=Z4Z%)NS(POr!w@)j5P_9ErqA2T7~_N z`g`HzoK(H&nzf(2(zic<_Wr2%ioI*1&3>v(ewsbozU<}AXWuthRZoBQ>(Kd_Z57UU zH|G>ybLKyLB(*y`Ug}fm`_@qBxS!Y7SLo~9mpfXW_-Io*-%qV=Stq8;N6o)i{cYtc zvwh;P+RyEqU+x@NseeZ9^*-@;a{K?Bjk@x+RX;NIME3K08-8^f+%V#n{S+o%XSOo$ zQ`kG{H<_CsD8?Uj3GZpu*QvQ7ruRo@^#)||H~)WasHwi4B7FGzH9PM4=F>I1t5>|e z&24;2>dfrJF5=wwyvYyqlOBG4W|UgUzqJ;qbY@><9cTY>sJuLOZFCd9t#+CxKKk{V zgL^D}N;ZB-e7pHWW%0~SJKAsU+iS3xM#6^@bd8_hiLT=`xN%sLTYg(_Pb>dzFE^L% zZ%_Qocm4SEb%Oj#S!f7Wa_`{rK#t-sDj)o1eU z-Wo1F*V#6=Mqes8es>jsbKY8e zZbpOnb|Fl8dG}^BI*+lkKO}GDwQt#Iqi7(p#`ughx4oG4&Y#(;n-KzxAa?bde=C<}H_uE1 zYUZ5rl(W$^eK*jn*Uz&xFFxpSu&>VUlEK~0n(KXkdL`TrwU zUv7QadeFx>U*`|YnNKYTW&w+~GaR3f9r8b*m#18`ro^7f?j{>>ThoD@YG}k-Jm6aBKIr+c0 LV)=|$u1pL77vx*Y literal 0 HcmV?d00001 diff --git a/src/main/resources/schematics/ruins/Exit_XombyCraft-RopeBridge_Open_100.schematic b/src/main/resources/schematics/ruins/Exit_XombyCraft-RopeBridge_Open_100.schematic new file mode 100644 index 0000000000000000000000000000000000000000..d42788997736c26751cd01860494ede305edbab0 GIT binary patch literal 2137 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 literal 0 HcmV?d00001 -- 2.39.5 From da579bc23d37afa36c301de014511229e7f94dc8 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 23 Mar 2014 11:38:28 -0400 Subject: [PATCH 25/27] Stopped Filling Empty Dispensers Changed FillContainersOperation so that empty dispensers are not filled with a stack of arrows on import. Just in case someone needs to use empty dispensers in their design. As far as I can remember, this won't affect any of our dungeons - arrow traps are rare. The only dungeon that I can remember is one by Balgor and it was exported with all of its dispensers loaded. --- .../mod_pocketDim/dungeon/FillContainersOperation.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java index f124225..e44a58b 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java @@ -57,16 +57,6 @@ public class FillContainersOperation extends WorldOperation } } } - - // Fill dispensers - if (tileEntity instanceof TileEntityDispenser) - { - TileEntityDispenser dispenser = (TileEntityDispenser) tileEntity; - if (isInventoryEmpty(dispenser)) - { - dispenser.addItem(new ItemStack(Item.arrow, 64)); - } - } } return true; } -- 2.39.5 From e5adb43f77de6b13bbab40f5a1a7f0f6438bfc96 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 23 Mar 2014 11:39:03 -0400 Subject: [PATCH 26/27] Updated How to Add Dungeons Updated our dungeon creation guide. It was badly outdated by now. --- .../dimdoors/text/How_to_add_dungeons.txt | 67 ++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/src/main/resources/assets/dimdoors/text/How_to_add_dungeons.txt b/src/main/resources/assets/dimdoors/text/How_to_add_dungeons.txt index c361d91..254245c 100644 --- a/src/main/resources/assets/dimdoors/text/How_to_add_dungeons.txt +++ b/src/main/resources/assets/dimdoors/text/How_to_add_dungeons.txt @@ -1,51 +1,70 @@ -Adding dungeons is pretty simple, but you have to know the various flags and stuff I use to read them in and build them. Ill walk you through the process here, and provide all the flags and a breif description of what they mean here. +This guide explains the simple details involved in creating your own dungeons. -To get started, run Minecraft with DimDoors installed and use the "/dd-create" command. +[CREATING YOUR BUILDING AREA] -This will generate an empty pocket dim for you to build with that is in the proper orientation (north). If you do not use this command, you WILL run into issues later. +To get started, run Minecraft with Dimensional Doors installed and use the command "/dd-create". This will create an empty pocket dimension for you to build in. It used to be necessary to use this command to ensure that the resulting room was oriented properly for exporting. That's no longer the case; you can now create pockets in any way and they'll also work fine. -So on to the building- You can ONLY use vanilla blocks in the dungeons. Everything that is not vanilla MC will be turned into fabric of reality when I gen them, or it will crash horribly. The only exceptions to this are DimDoors doors, which will be treated like mundane, vanilla doors of the same material. +[CHOOSING YOUR BUILDING MATERIALS] -The first step is to make your entrance door. This is where the player will appear when they teleport in for the first time. It is marked by a vanilla wooden door. It will be replaced by a wooden warp door on generation, and by default is set as the door you entered from. +You can ONLY build a dungeon using regular Minecraft blocks and some Dimensional Doors blocks. Everything that is not a regular Minecrat block or part of the acceptable Dimensional Doors blocks will be turned into Fabric of Reality during both exporting and importing of the dungeon. This is a safety precaution against potentially serious crashes. The permitted blocks from Dimensional Doors are: -As you build your dungeon, there are a few restrictions. Any chests you place will get filled with random loot, and not what you place in them. Any dispensers will get a few stacks of arrows. Other than that, any vanilla mechanics should work fine, except rails. I'm working on that now, as well as saving inventories. +Fabric of Reality, Ancient Fabric, Eternal Fabric, Warp Doors, Dimensional Doors, and Transient Doors -Any iron doors you place will become iron dim doors, and link to more dungeon pockets, so use these to make your dungeon lead farther into a dungeon chain. +Transient doors are only intended for use with Rift Gateway designs and may not be assigned a destination if loaded in a dungeon. Also note that rifts are not in the permitted list and will be filtered out. Entities (e.g. mobs, minecarts, items frames, and dropped items) will not be imported or exported either. -If you want your dungeon to link back the Overworld, place a wooden door on top of a Sandstone block. This will mark it as an exit door, and it will generate as a wooden Dim door leading to the Overworld (or whatever dim this chain started in). The sandstone block will become whatever is under it. +Previously, builders would have to use regular Minecraft doors and those would be converted into Warp Doors and Dimensional Doors when a design was imported. That behavior was changed to that players could use regular doors within their designs. All dimensional doors will be reset upon importing so creating paths within a single room is currently not possible. -Once you have finished creating your dungeon, you need to use the command "/dd-export " +[BUILDING YOUR DUNGEON] -To name it, use the following format: +The first step is to place the entrance door. That is where the player will appear when they teleport in for the first time. It is designated using a Warp Door. Any dungeon without an entrance door will fail to load. -___ +You can place Dimensinoal Doors to connect your room to other rooms. You only have to place the doors where you want them. The doors will be linked to other rooms automatically whenever a player steps through. -DungeonType: The dungeon types are "Hub", "SimpleHall", "ComplexHall", "Trap', "Maze", "Exit", and "DeadEnd'. +You can also place Warp Doors to act as exits to the Overworld and other dimensions. Their destinations will be assigned automatically whenever a player steps through. Note that there is an extra step involved for this. Any exit doors must have a block of regular sandstone underneath to make the proper entrance clear. If you forget to place the sandstone block, then the mod may select one of your exit doors as the entrance. The mod will also automatically replace the sandstone block with the block underneath it. - Hub: Dungeons that have 4 or more iron doors in them should be labeled as hubs, so they don't generate one after another. +Any empty chests or trapped chests will be loaded with loot automatically when the dungeon is imported. Chests or trapped chests with contents already will not be affected. Be sure not to leave loot inside your chests if you import and re-export any of your designs; this is a common mistake. - SimpleHall: Dungeons that contain a single iron door or two, but no more than that, and don't contain traps. These are the halls that separate rooms and should generally be tagged as 'closed'. +It used to be that empty dispensers would be filled automatically with a stack of arrows. That was needed before when loaded inventories could not be exported. Now that feature has been removed for added flexibility - in case someone needs to have empty dispensers in their designs. - ComplexHall: These dungeons are more like rooms and can be open. They can have piston puzzles or locks, and up to three iron doors. In addition, they can contain wooden doors to link to the surface. +Finally, End Portal Frame blocks act as special markers. When the dungeon is imported, the blocks are removed and Monoliths are spawned in their place. This is used to manually set up Monolith positions to ensure that certain areas of a dungeon are protected. It's not usually necessary to use those markers because have ways of assigning them random positions in a dungeon (explained below). - Trap: These dungeons are primarily traps and often contain only a single iron door. The traps should never instantly kill the player, and it should be possible to beat them. They can contain either a reward/chest, or simply allow progress. Piston traps are very fun for these. +[EXPORTING YOUR DUNGEON] - Maze: These dungeons can contain up to 3 iron doors. They can be simple labyrinths or full of changing walls, etc. They should not, however, be primarily trying to kill the player, though they can have possibly lethal elements. In the worst case, think of it as half trap and half hub. +Once you have finished creating your dungeon, you need to export it as a schematic file with the command "/dd-export [SpawnWeight]" - Exit: The main purpose of these dungeons is to link back to Overworld with a wooden door. They should never contain iron doors. +The mod searches a 101 x 101 x 101 block cube (centered on the player's position) for blocks and chooses the smallest area that contains all of the blocks it finds. That area is then exported. Be careful about leaving garbage outside of the pocket in which you were building since it will be detected and exported along with everything else. - DeadEnd: Dungeons that have no other doors except the entrance. Usually contain some sort of treasure. +The following section explains each parameter for the command. + +DungeonType: The dungeon types for the default Ruins are "Hub", "SimpleHall", "ComplexHall", "Trap", "Exit", and "DeadEnd". + + Hub: Dungeons that have 4 or more iron doors in them should be labeled as hubs, so they don't generate one after another. + + SimpleHall: Dungeons that contain one or two Dimensional Doors, but no more than that, and don't contain traps. These are the halls that separate rooms and are generally "closed" rooms. + + ComplexHall: These dungeons are more like rooms than hallways and can be open. They can have piston puzzles or locks, and up to three Dimensional Doors. In addition, they can contain wooden doors to link to the surface. + + Trap: These dungeons are primarily traps and often contain only a single iron door. The traps should never instantly kill the player, and it should be possible to beat them. They can contain either a reward/chest, or simply allow progress. Piston traps are very fun for these. + + Exit: The main purpose of these dungeons is to link back to Overworld with a wooden door. They should never contain iron doors. + + DeadEnd: Dungeons that have no other doors except the entrance. Usually contain some sort of treasure. + +Note that there used to be a Maze type as well. That type was changed for internal use. Dungeon types are specific to each dungeon pack and other type names may apply for other packs. IsOpen: Indicates whether the dungeon is an open-air structure or a closed structure that should be surrounded by Monoliths. Monoliths prevent players from breaking out of closed structures to avoid puzzles or traps. The only valid values are "open" or "closed". SpawnWeight: An optional integer that determines how frequently you want the dungeon to appear relative to others of the same type. The default weight is 100. Higher values cause a dungeon to generate more often, while lower values cause it to be less common. The minimum weight is 0 and the maximum weight is 10,000. +-------------------------- -Examples: - Hub_RuinsWithDoors_Open_100 - SimpleHall_WindingHallway_Closed_50 - Trap_CleverTrap_Closed +You can also use the command "/dd-export override" to force the mod to export your surroundings as a schematic without following the naming restrictions above. This is useful for exporting a dungeon with a dungeon type that isn't part of Ruins. + +Examples names: + Hub_RuinsWithDoors_Open_100 + SimpleHall_WindingHallway_Closed_50 + Trap_CleverTrap_Closed Although you can deviate from the format above, the current dungeon generation system requires that format to work properly. It will not select schematics that do not follow those naming rules. -Congratulations! You have added your own dungeon. You can use the command "/dd-rift " to generate it, or use "/dd-rift list" to list all available dungeons. Finally, "/dd-rift random" will select a dungeon at random. \ No newline at end of file +Congratulations! You have added your own dungeon. You can use the command "/dd-rift " to generate it, or use "/dd-list" to list all available dungeons. -- 2.39.5 From d6b07db3d6213bf9b6f7139c4cc42389230854cf Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 23 Mar 2014 17:18:47 -0400 Subject: [PATCH 27/27] Fixed Conflict with Witchery Mod * Changed DDTeleporter to stop us from generating exits to Witchery's Spirit World - this would cause people to lose their items upon leaving the dimension. * Changed GatewayGenerator to stop us from generating gateways or rift clusters in the Spirit World --- .../mod_pocketDim/core/DDTeleporter.java | 18 +++++++++++++++--- .../world/gateways/GatewayGenerator.java | 7 +++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index 7c7bb6c..0c95b06 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -46,6 +46,7 @@ public class DDTeleporter 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; + private static final String SPIRIT_WORLD_NAME = "Spirit World"; public static int cooldown = 0; @@ -644,9 +645,7 @@ public class DDTeleporter for (int attempts = 0; attempts < 10; attempts++) { NewDimData selection = roots.get( random.nextInt(roots.size()) ); - if (selection.id() != END_DIMENSION_ID && - selection.id() != properties.LimboDimensionID && - selection != current.root()) + if (selection != current.root() && isValidForDungeonExit(selection, properties)) { return generateSafeExit(selection, link, properties); } @@ -657,6 +656,19 @@ public class DDTeleporter return generateSafeExit(current.root(), link, properties); } + private static boolean isValidForDungeonExit(NewDimData destination, DDProperties properties) + { + // Prevent exits to The End and Limbo + if (destination.id() == END_DIMENSION_ID || destination.id() == properties.LimboDimensionID) + { + return false; + } + // Prevent exits to Witchery's Spirit World; we need to load the dimension to retrieve its name. + // This is okay because the dimension would have to be loaded subsequently by generateSafeExit(). + World world = PocketManager.loadDimension(destination.id()); + return (world != null && !SPIRIT_WORLD_NAME.equals(world.provider.getDimensionName())); + } + private static boolean generateSafeExit(NewDimData destinationDim, DimLink link, DDProperties properties) { // A safe exit attempts to place a Warp Door in a dimension with 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 d2d9c0f..dfd855a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayGenerator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayGenerator.java @@ -32,6 +32,7 @@ public class GatewayGenerator implements IWorldGenerator private static final int OVERWORLD_DIMENSION_ID = 0; private static final int NETHER_DIMENSION_ID = -1; private static final int END_DIMENSION_ID = 1; + private static final String SPIRIT_WORLD_NAME = "Spirit World"; private ArrayList gateways; private BaseGateway defaultGateway; @@ -58,12 +59,14 @@ public class GatewayGenerator implements IWorldGenerator public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { // 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. + // Also don't generate anything in the Nether, The End, or in Witchery's Spirit World. + // We only match against Spirit World using hashing to speed up the process a little (hopefully). int dimensionID = world.provider.dimensionId; if (world.isRemote || (world.provider instanceof PocketProvider) || (dimensionID == END_DIMENSION_ID) - || (dimensionID == NETHER_DIMENSION_ID)) + || (dimensionID == NETHER_DIMENSION_ID) + || (world.provider.getDimensionName().hashCode() == SPIRIT_WORLD_NAME.hashCode())) { return; } -- 2.39.5