From d7a96c061d3f9d0a3d439721a9929e3c8f7ac2d7 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Thu, 31 Dec 2015 08:01:39 -0500 Subject: [PATCH] Added getNewCopy() to Ritual to allow tiles to hold their own copy of a Ritual. Created caching in AreaDescriptor for faster BlockPos access. --- .../api/registry/RitualRegistry.java | 3 ++- .../bloodmagic/api/ritual/AreaDescriptor.java | 27 +++++++++++++------ .../bloodmagic/api/ritual/Ritual.java | 4 ++- .../bloodmagic/ritual/RitualGreenGrove.java | 6 +++++ .../bloodmagic/ritual/RitualLava.java | 18 ++++++++++++- .../bloodmagic/ritual/RitualTest.java | 6 +++++ .../bloodmagic/ritual/RitualWater.java | 22 ++++++++++++--- 7 files changed, 72 insertions(+), 14 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java index 9c3eb218..ddecaa4e 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/RitualRegistry.java @@ -43,7 +43,8 @@ public class RitualRegistry public static Ritual getRitualForId(String id) { - return registry.get(id); + Ritual ritual = registry.get(id); + return ritual != null ? ritual.getNewCopy() : null; } public static String getIdForRitual(Ritual ritual) diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/AreaDescriptor.java b/src/main/java/WayofTime/bloodmagic/api/ritual/AreaDescriptor.java index bd1a6f58..4758e954 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/AreaDescriptor.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/AreaDescriptor.java @@ -23,6 +23,9 @@ public class AreaDescriptor private BlockPos minimumOffset; private BlockPos maximumOffset; + private ArrayList blockPosCache = new ArrayList(); + private BlockPos cachedPosition = new BlockPos(0, 0, 0); + public Rectangle(BlockPos minimumOffset, BlockPos maximumOffset) { setOffsets(minimumOffset, maximumOffset); @@ -31,22 +34,29 @@ public class AreaDescriptor @Override public List getContainedPositions(BlockPos pos) { - ArrayList posList = new ArrayList(); - - for (int i = minimumOffset.getX(); i <= maximumOffset.getX(); i++) + if (!pos.equals(cachedPosition) || blockPosCache.isEmpty()) { - for (int j = minimumOffset.getY(); j <= maximumOffset.getY(); j++) + ArrayList posList = new ArrayList(); + + for (int i = minimumOffset.getX(); i <= maximumOffset.getX(); i++) { - for (int k = minimumOffset.getZ(); k <= maximumOffset.getZ(); k++) + for (int j = minimumOffset.getY(); j <= maximumOffset.getY(); j++) { - posList.add(pos.add(i, j, k)); + for (int k = minimumOffset.getZ(); k <= maximumOffset.getZ(); k++) + { + posList.add(pos.add(i, j, k)); + } } } + + blockPosCache = posList; + cachedPosition = pos; } - return posList; + + return blockPosCache; } - + @Override public AxisAlignedBB getAABB(BlockPos pos) { @@ -65,6 +75,7 @@ public class AreaDescriptor { this.minimumOffset = new BlockPos(Math.min(offset1.getX(), offset2.getX()), Math.min(offset1.getY(), offset2.getY()), Math.min(offset1.getZ(), offset2.getZ())); this.maximumOffset = new BlockPos(Math.max(offset1.getX(), offset2.getX()), Math.max(offset1.getY(), offset2.getY()), Math.max(offset1.getZ(), offset2.getZ())); + blockPosCache = new ArrayList(); } } } diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java b/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java index 76e5df61..eac800be 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java @@ -31,7 +31,7 @@ public abstract class Ritual private final RitualRenderer renderer; private final String unlocalizedName; - private final Map modableRangeMap = new HashMap(); + protected final Map modableRangeMap = new HashMap(); /** * @param name @@ -165,4 +165,6 @@ public abstract class Ritual { REDSTONE, BREAK_MRS, BREAK_STONE, ACTIVATE, DEACTIVATE, EXPLOSION, } + + public abstract Ritual getNewCopy(); } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java index 4230b463..72130e13 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualGreenGrove.java @@ -84,4 +84,10 @@ public class RitualGreenGrove extends Ritual return components; } + + @Override + public Ritual getNewCopy() + { + return new RitualGreenGrove(); + } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java index 14816d4c..e8e13448 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualLava.java @@ -30,6 +30,9 @@ public class RitualLava extends Ritual if (currentEssence < getRefreshCost()) return; + int maxEffects = currentEssence / getRefreshCost(); + int totalEffects = 0; + AreaDescriptor lavaRange = getBlockRange(LAVA_RANGE); for (BlockPos newPos : lavaRange.getContainedPositions(masterRitualStone.getPos())) @@ -37,9 +40,16 @@ public class RitualLava extends Ritual if (world.isAirBlock(newPos)) { world.setBlockState(newPos, Blocks.lava.getDefaultState()); - network.syphon(getRefreshCost()); + totalEffects++; + } + + if (totalEffects >= maxEffects) + { + break; } } + + network.syphon(getRefreshCost() * totalEffects); } @Override @@ -63,4 +73,10 @@ public class RitualLava extends Ritual return components; } + + @Override + public Ritual getNewCopy() + { + return new RitualLava(); + } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualTest.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualTest.java index 014b831c..d50ecac1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualTest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualTest.java @@ -60,4 +60,10 @@ public class RitualTest extends Ritual return components; } + + @Override + public Ritual getNewCopy() + { + return new RitualTest(); + } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java index ca31b86c..a92d0fb6 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWater.java @@ -30,16 +30,26 @@ public class RitualWater extends Ritual if (currentEssence < getRefreshCost()) return; - AreaDescriptor lavaRange = getBlockRange(WATER_RANGE); + int maxEffects = currentEssence / getRefreshCost(); + int totalEffects = 0; + + AreaDescriptor waterRange = getBlockRange(WATER_RANGE); - for (BlockPos newPos : lavaRange.getContainedPositions(masterRitualStone.getPos())) + for (BlockPos newPos : waterRange.getContainedPositions(masterRitualStone.getPos())) { if (world.isAirBlock(newPos)) { world.setBlockState(newPos, Blocks.water.getDefaultState()); - network.syphon(getRefreshCost()); + totalEffects++; + } + + if (totalEffects >= maxEffects) + { + break; } } + + network.syphon(getRefreshCost() * totalEffects); } @Override @@ -63,4 +73,10 @@ public class RitualWater extends Ritual return components; } + + @Override + public Ritual getNewCopy() + { + return new RitualWater(); + } }