From 58bd7499cee2bfca50f081fdf6903f9637ab939b Mon Sep 17 00:00:00 2001 From: xoiox Date: Wed, 23 Sep 2026 20:33:22 +0200 Subject: [PATCH] block and sacrifice removal upon successful summoning --- .../java/dev/hytalemodding/RitualSpawner.java | 65 ++++++++++++++++--- .../definitions/RitualDefinitions.java | 10 ++- .../definitions/RitualSetup.java | 10 ++- .../events/RitualDropItemEvent.java | 2 +- 4 files changed, 75 insertions(+), 12 deletions(-) diff --git a/src/main/java/dev/hytalemodding/RitualSpawner.java b/src/main/java/dev/hytalemodding/RitualSpawner.java index 12bb725..13970ec 100644 --- a/src/main/java/dev/hytalemodding/RitualSpawner.java +++ b/src/main/java/dev/hytalemodding/RitualSpawner.java @@ -1,21 +1,23 @@ package dev.hytalemodding; +import com.hypixel.hytale.component.Ref; +import com.hypixel.hytale.component.RemoveReason; +import com.hypixel.hytale.component.Store; import com.hypixel.hytale.math.vector.Rotation3f; import com.hypixel.hytale.protocol.SoundCategory; import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType; import com.hypixel.hytale.server.core.asset.type.soundevent.config.SoundEvent; import com.hypixel.hytale.server.core.universe.world.SoundUtil; import com.hypixel.hytale.server.core.universe.world.World; +import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; import com.hypixel.hytale.server.npc.NPCPlugin; -import dev.hytalemodding.definitions.RitualDefinitions; -import dev.hytalemodding.definitions.RitualPattern; -import dev.hytalemodding.definitions.RitualSacrifice; -import dev.hytalemodding.definitions.RitualTypes; +import dev.hytalemodding.definitions.*; import org.joml.Vector3d; import org.joml.Vector3i; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; public class RitualSpawner { RitualDefinitions ritualDefinitions = new RitualDefinitions(); @@ -50,7 +52,7 @@ public class RitualSpawner { } } - public void sacrificeDropEvent(String itemId, Vector3d targetPosition, World world) { + public void sacrificeDropEvent(String itemId, Vector3d targetPosition, World world, Store store, Ref ref) { Vector3i blockPosition = entityToBlockPos(targetPosition); /*RitualPlugin.LOGGER.atInfo().log( "an item got thrown at the position: %f, %f, %f with the item id: %s", @@ -58,18 +60,29 @@ public class RitualSpawner { RitualPlugin.LOGGER.atInfo().log( "an item got thrown at the position: %d, %d, %d with the item id: %s", blockPosition.x, blockPosition.y, blockPosition.z, itemId); - RitualTypes ritualType = getRitualTypeFromSacrifice(itemId, blockPosition, world); + AtomicInteger setupIndex = new AtomicInteger(-1); + RitualTypes ritualType = getRitualTypeFromSacrifice(itemId, blockPosition, world, setupIndex); if (!ritualType.equals(RitualTypes.NONE)) { + RitualPlugin.LOGGER.atInfo().log("Ritual complete"); if (ritualType.equals(RitualTypes.SKELETON)) { - RitualPlugin.LOGGER.atInfo().log("Ritual complete"); world.execute(() -> { NPCPlugin.get().spawnNPC(world.getEntityStore().getStore(), "Skeleton", null, blockToEntityPos(blockPosition), new Rotation3f(0, 0, 0)); }); + } else if (ritualType.equals(RitualTypes.YEDI)) { + world.execute(() -> { + NPCPlugin.get().spawnNPC(world.getEntityStore().getStore(), "Yeti", null, blockToEntityPos(blockPosition), new Rotation3f(0, 0, 0)); + }); + } + if (setupIndex.get() >= 0) { + removeUsedBlocks(setupIndex.get(), blockPosition, world); + } + if (ritualDefinitions.getSacrifices(setupIndex.get()).getFirst().shouldConsume() && ref.isValid()) { + store.removeEntity(ref, RemoveReason.REMOVE); // Only supports one sacrifice for now } } } - RitualTypes getRitualTypeFromSacrifice(String itemId, Vector3i centerPosition, World world) { + RitualTypes getRitualTypeFromSacrifice(String itemId, Vector3i centerPosition, World world, AtomicInteger setupIndex) { List possibleSetups = getFullRitualSetupRange(); checkSacrificePalette(possibleSetups, itemId); int radius = getMaxSacrificeRadius(possibleSetups); @@ -84,6 +97,7 @@ public class RitualSpawner { checkPatterns(setupsAtPosition, samplePosition, world, samplePosition, "Empty"); if (!setupsAtPosition.isEmpty()) { centerPosition.set(samplePosition); + setupIndex.set(setupsAtPosition.getFirst()); return ritualDefinitions.getRitualType(setupsAtPosition.getFirst()); } } @@ -222,6 +236,41 @@ public class RitualSpawner { } } + void removeUsedBlocks(int index, Vector3i centerPosition, World world) { + if (ritualDefinitions.getShouldConsumeCenterBlock(index)) { + world.setBlock(centerPosition.x, centerPosition.y, centerPosition.z, "Empty"); + } + + List ritualPatterns = ritualDefinitions.getPatterns(index); + for (RitualPattern ritualPattern : ritualPatterns) { + int radius = ritualPattern.radius(); + int amountRemaining = ritualPattern.amount(); + int side = 2 * radius + 1; + int total = side * side * side; + + if (ritualPattern.shouldConsume()) { + for (int i = 0; i < total; i++) { + int ix = centerPosition.x - radius + (i % side); + int iy = centerPosition.y - radius + ((i / side) % side); + int iz = centerPosition.z - radius + (i / (side * side)); + + Vector3i samplePosition = new Vector3i(ix, iy, iz); + if (getBlockId(samplePosition, world).equals(ritualPattern.blockId())) { + world.setBlock(samplePosition.x, samplePosition.y, samplePosition.z, "Empty"); + amountRemaining--; + if (amountRemaining <= 0) { + break; + } + } + } + } + } + } + + void setInteractionState() { + //world.setBlockInteractionState(, new BlockType("Empty"), "Empty"); + } + int getMaxPatternRadius(List ritualSetups) { int maxRadius = 0; for (Integer ritualSetup : ritualSetups) { diff --git a/src/main/java/dev/hytalemodding/definitions/RitualDefinitions.java b/src/main/java/dev/hytalemodding/definitions/RitualDefinitions.java index 1af5d34..3972d81 100644 --- a/src/main/java/dev/hytalemodding/definitions/RitualDefinitions.java +++ b/src/main/java/dev/hytalemodding/definitions/RitualDefinitions.java @@ -8,9 +8,13 @@ public class RitualDefinitions { public RitualDefinitions() { // Crude skeleton ritual - ritualSetups.add(new RitualSetup("Deco_Bone_Skulls", RitualTypes.SKELETON) + ritualSetups.add(new RitualSetup("Deco_Bone_Skulls", true, RitualTypes.SKELETON) .addPattern("Furniture_Crude_Torch", 2, 4, false, true) .addSacrifice("Ingredient_Life_Essence", 1, 1, true)); + ritualSetups.add(new RitualSetup("Furniture_Temple_Light_Brazier", false, RitualTypes.YEDI) + .addPattern("Rock_Crystal_Cyan_Small", 3, 6, false, false) + .addPattern("Rubble_Ice", 3, 6, true, false) + .addSacrifice("Ingredient_Ice_Essence", 2, 1, true)); } public int getRitualSetupsCount() { @@ -25,6 +29,10 @@ public class RitualDefinitions { return ritualSetups.get(index).getCenterBlockId(); } + public boolean getShouldConsumeCenterBlock(int index) { + return ritualSetups.get(index).getShouldConsumeCenterBlock(); + } + public List getPatterns(int setupIndex) { return ritualSetups.get(setupIndex).getPatterns(); } diff --git a/src/main/java/dev/hytalemodding/definitions/RitualSetup.java b/src/main/java/dev/hytalemodding/definitions/RitualSetup.java index f73707a..5f394b1 100644 --- a/src/main/java/dev/hytalemodding/definitions/RitualSetup.java +++ b/src/main/java/dev/hytalemodding/definitions/RitualSetup.java @@ -6,12 +6,14 @@ import java.util.List; public class RitualSetup { RitualTypes ritualType; String centerBlockId; + boolean shouldConsumeCenterBlock; List patterns = new ArrayList<>(); List sacrifices = new ArrayList<>(); - public RitualSetup(String centerBlockId, RitualTypes ritualType) { - this.ritualType = ritualType; + public RitualSetup(String centerBlockId, boolean shouldConsumeCenterBlock, RitualTypes ritualType) { this.centerBlockId = centerBlockId; + this.shouldConsumeCenterBlock = shouldConsumeCenterBlock; + this.ritualType = ritualType; } public RitualSetup addPattern(String blockId, int radius, int amount, boolean shouldConsume, boolean shouldInteract) { @@ -32,6 +34,10 @@ public class RitualSetup { return centerBlockId; } + public boolean getShouldConsumeCenterBlock() { + return shouldConsumeCenterBlock; + } + public RitualPattern getPattern(int index) { return patterns.get(index); } diff --git a/src/main/java/dev/hytalemodding/events/RitualDropItemEvent.java b/src/main/java/dev/hytalemodding/events/RitualDropItemEvent.java index fd854b8..cbecf94 100644 --- a/src/main/java/dev/hytalemodding/events/RitualDropItemEvent.java +++ b/src/main/java/dev/hytalemodding/events/RitualDropItemEvent.java @@ -31,7 +31,7 @@ public class RitualDropItemEvent extends EntityEventSystem