From 5103d91db01e8615300381fd6665fcda3ea95b51 Mon Sep 17 00:00:00 2001 From: StrangeOne101 Date: Mon, 5 Jul 2021 04:24:13 +1200 Subject: [PATCH] Fixed Loot tables acting like a cucumber in the sun - Fixed loot chests containing the exact same loot - Fixed chests having nothing if a roll fails - Fixed rolls always being done in the same order - Added method to BlockPosition to get a unique long from 3 integers (x, y z) --- .../com/volmit/iris/object/IrisLootTable.java | 35 ++++++------------- .../iris/object/IrisObjectPlacement.java | 6 ++++ .../volmit/iris/scaffold/engine/Engine.java | 7 ++-- .../iris/scaffold/jigsaw/PlannedPiece.java | 7 ++-- .../com/volmit/iris/util/BlockPosition.java | 21 +++++++++++ src/main/java/com/volmit/iris/util/RNG.java | 6 +++- 6 files changed, 52 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/volmit/iris/object/IrisLootTable.java b/src/main/java/com/volmit/iris/object/IrisLootTable.java index bbe485b2b..c44ce4f9b 100644 --- a/src/main/java/com/volmit/iris/object/IrisLootTable.java +++ b/src/main/java/com/volmit/iris/object/IrisLootTable.java @@ -1,5 +1,6 @@ package com.volmit.iris.object; +import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import com.volmit.iris.util.ArrayType; @@ -56,35 +57,21 @@ public class IrisLootTable extends IrisRegistrant KList lootf = new KList<>(); int m = 0; + int mx = rng.i(getMinPicked(), getMaxPicked()); - for(IrisLoot i : loot) - { - if(i.getSlotTypes().equals(slot)) + while (m < mx) { + int num = rng.i(loot.size()); + + IrisLoot l = loot.get(num); + + if(l.getSlotTypes() == slot) { - ItemStack item = i.get(debug, false, this, rng, x, y, z); + ItemStack item = l.get(debug, false, this, rng, x, y, z); - if(item != null) - { - lootf.add(item); - } - } - - m++; - - if(m > maxPicked) - { - break; - } - } - - if(lootf.size() < getMinPicked()) - { - for(int i = 0; i < getMinPicked() - lootf.size(); i++) - { - ItemStack item = loot.get(rng.nextParallelRNG(3945).nextInt(loot.size())).get(debug, doSomething, this, rng, x, y, z); - if(item != null) + if(item != null && item.getType() != Material.AIR) { lootf.add(item); + m++; } } } diff --git a/src/main/java/com/volmit/iris/object/IrisObjectPlacement.java b/src/main/java/com/volmit/iris/object/IrisObjectPlacement.java index de7377cfc..9e8ad2f2b 100644 --- a/src/main/java/com/volmit/iris/object/IrisObjectPlacement.java +++ b/src/main/java/com/volmit/iris/object/IrisObjectPlacement.java @@ -256,6 +256,12 @@ public class IrisObjectPlacement }); } + /** + * Gets the loot table that should be used for the block + * @param data The block data of the block + * @param dataManager Iris Data Manager + * @return The loot table it should use. + */ public IrisLootTable getTable(BlockData data, IrisDataManager dataManager) { TableCache cache = getCache(dataManager); diff --git a/src/main/java/com/volmit/iris/scaffold/engine/Engine.java b/src/main/java/com/volmit/iris/scaffold/engine/Engine.java index 16f66341d..fa975f4f0 100644 --- a/src/main/java/com/volmit/iris/scaffold/engine/Engine.java +++ b/src/main/java/com/volmit/iris/scaffold/engine/Engine.java @@ -1,5 +1,6 @@ package com.volmit.iris.scaffold.engine; +import com.volmit.iris.Iris; import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.manager.gui.Renderer; import com.volmit.iris.object.*; @@ -210,7 +211,7 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro if(B.isStorage(data)) { - RNG rx = rf.nextParallelRNG(x).nextParallelRNG(z).nextParallelRNG(y); + RNG rx = rf.nextParallelRNG(BlockPosition.toLong(x, y, z)); InventorySlotType slot = null; if(B.isStorageChest(data)) @@ -220,7 +221,7 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro if(slot != null) { - KList tables = getLootTables(rx.nextParallelRNG(4568111), block); + KList tables = getLootTables(rx, block); InventorySlotType slott = slot; try @@ -350,7 +351,7 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro for(IrisLootTable i : tables) { b++; - items.addAll(i.getLoot(debug, items.isEmpty(), rng.nextParallelRNG(345911), slot, x, y, z, b + b, mgf + b)); + items.addAll(i.getLoot(debug, items.isEmpty(), rng, slot, x, y, z, b + b, mgf + b)); } for(ItemStack i : items) diff --git a/src/main/java/com/volmit/iris/scaffold/jigsaw/PlannedPiece.java b/src/main/java/com/volmit/iris/scaffold/jigsaw/PlannedPiece.java index f6ac95609..62759e9dd 100644 --- a/src/main/java/com/volmit/iris/scaffold/jigsaw/PlannedPiece.java +++ b/src/main/java/com/volmit/iris/scaffold/jigsaw/PlannedPiece.java @@ -9,6 +9,7 @@ import com.volmit.iris.scaffold.IrisWorlds; import com.volmit.iris.scaffold.engine.Engine; import com.volmit.iris.scaffold.engine.IrisAccess; import com.volmit.iris.util.AxisAlignedBB; +import com.volmit.iris.util.BlockPosition; import com.volmit.iris.util.IObjectPlacer; import com.volmit.iris.util.KList; import com.volmit.iris.util.RNG; @@ -148,6 +149,7 @@ public class PlannedPiece { getPiece().getPlacementOptions().getRotation().setEnabled(false); int finalMinY = minY; + RNG rng = getStructure().getRng().nextParallelRNG(37555); getObject().place(position.getX()+getObject().getCenter().getBlockX(), position.getY()+getObject().getCenter().getBlockY(), position.getZ()+getObject().getCenter().getBlockZ(), new IObjectPlacer() { @Override public int getHighest(int x, int z) { @@ -174,7 +176,8 @@ public class PlannedPiece { IrisLootTable table = getPiece().getPlacementOptions().getTable(block.getBlockData(), getData()); if (table == null) return; Engine engine = a.getCompound().getEngineForHeight(y); - engine.addItems(false, ((InventoryHolder) block.getState()).getInventory(), getStructure().getRng(), + engine.addItems(false, ((InventoryHolder) block.getState()).getInventory(), + rng.nextParallelRNG(BlockPosition.toLong(x, y, z)), new KList<>(table), InventorySlotType.STORAGE, x, y, z, 15); } } @@ -215,6 +218,6 @@ public class PlannedPiece { tile.toBukkitTry(state); state.update(); } - }, piece.getPlacementOptions(), getStructure().getRng(), getData()); + }, piece.getPlacementOptions(), rng, getData()); } } diff --git a/src/main/java/com/volmit/iris/util/BlockPosition.java b/src/main/java/com/volmit/iris/util/BlockPosition.java index 47f319961..fcfecd8e0 100644 --- a/src/main/java/com/volmit/iris/util/BlockPosition.java +++ b/src/main/java/com/volmit/iris/util/BlockPosition.java @@ -11,6 +11,15 @@ public class BlockPosition private int y; private int z; + //Magic numbers + private static final int m1 = 1 + MathHelper.f(MathHelper.c(30000000)); + private static final int m2 = 64 - (m1 * 2); + private static final long m3 = m1 + m2; + private static final long m4 = (1L << m1) - 1L; + private static final long m5 = (1L << m2) - 1L; + private static final long m6 = (1L << m1) - 1L; + + public BlockPosition(int x, int y, int z) { this.x = x; @@ -59,4 +68,16 @@ public class BlockPosition { return this.x == x && this.y == y && this.z == z; } + + public long asLong() { + return toLong(getX(), getY(), getZ()); + } + + public static long toLong(int x, int y, int z) { + long var3 = 0L; + var3 |= (x & m4) << m3; + var3 |= (y & m5) << 0L; + var3 |= (z & m6) << m2; + return var3; + } } diff --git a/src/main/java/com/volmit/iris/util/RNG.java b/src/main/java/com/volmit/iris/util/RNG.java index 2724deb1b..d5986e08f 100644 --- a/src/main/java/com/volmit/iris/util/RNG.java +++ b/src/main/java/com/volmit/iris/util/RNG.java @@ -132,7 +132,7 @@ public class RNG extends Random public int i(int lowerBound, int upperBound) { - return (int) Math.round(d(lowerBound, upperBound)); + return (int) Math.floor(d(lowerBound, upperBound)); } public int i(int upperBound) @@ -192,4 +192,8 @@ public class RNG extends Random return pieces.get(nextInt(pieces.size())); } + + public long getSeed() { + return sx; + } }