block and sacrifice removal upon successful summoning
Verifying Everything Compiles / build (push) Has been cancelled
Verifying Everything Compiles / build (push) Has been cancelled
This commit is contained in:
1 parent
15d66f5ac8
commit
58bd7499ce
4 files changed
+75
-12
No files matched your search
@@ -1,21 +1,23 @@
|
|||||||
package dev.hytalemodding;
|
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.math.vector.Rotation3f;
|
||||||
import com.hypixel.hytale.protocol.SoundCategory;
|
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.blocktype.config.BlockType;
|
||||||
import com.hypixel.hytale.server.core.asset.type.soundevent.config.SoundEvent;
|
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.SoundUtil;
|
||||||
import com.hypixel.hytale.server.core.universe.world.World;
|
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 com.hypixel.hytale.server.npc.NPCPlugin;
|
||||||
import dev.hytalemodding.definitions.RitualDefinitions;
|
import dev.hytalemodding.definitions.*;
|
||||||
import dev.hytalemodding.definitions.RitualPattern;
|
|
||||||
import dev.hytalemodding.definitions.RitualSacrifice;
|
|
||||||
import dev.hytalemodding.definitions.RitualTypes;
|
|
||||||
import org.joml.Vector3d;
|
import org.joml.Vector3d;
|
||||||
import org.joml.Vector3i;
|
import org.joml.Vector3i;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
public class RitualSpawner {
|
public class RitualSpawner {
|
||||||
RitualDefinitions ritualDefinitions = new RitualDefinitions();
|
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<EntityStore> store, Ref<EntityStore> ref) {
|
||||||
Vector3i blockPosition = entityToBlockPos(targetPosition);
|
Vector3i blockPosition = entityToBlockPos(targetPosition);
|
||||||
/*RitualPlugin.LOGGER.atInfo().log(
|
/*RitualPlugin.LOGGER.atInfo().log(
|
||||||
"an item got thrown at the position: %f, %f, %f with the item id: %s",
|
"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(
|
RitualPlugin.LOGGER.atInfo().log(
|
||||||
"an item got thrown at the position: %d, %d, %d with the item id: %s",
|
"an item got thrown at the position: %d, %d, %d with the item id: %s",
|
||||||
blockPosition.x, blockPosition.y, blockPosition.z, itemId);
|
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)) {
|
if (!ritualType.equals(RitualTypes.NONE)) {
|
||||||
|
RitualPlugin.LOGGER.atInfo().log("Ritual complete");
|
||||||
if (ritualType.equals(RitualTypes.SKELETON)) {
|
if (ritualType.equals(RitualTypes.SKELETON)) {
|
||||||
RitualPlugin.LOGGER.atInfo().log("Ritual complete");
|
|
||||||
world.execute(() -> {
|
world.execute(() -> {
|
||||||
NPCPlugin.get().spawnNPC(world.getEntityStore().getStore(), "Skeleton", null, blockToEntityPos(blockPosition), new Rotation3f(0, 0, 0));
|
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<Integer> possibleSetups = getFullRitualSetupRange();
|
List<Integer> possibleSetups = getFullRitualSetupRange();
|
||||||
checkSacrificePalette(possibleSetups, itemId);
|
checkSacrificePalette(possibleSetups, itemId);
|
||||||
int radius = getMaxSacrificeRadius(possibleSetups);
|
int radius = getMaxSacrificeRadius(possibleSetups);
|
||||||
@@ -84,6 +97,7 @@ public class RitualSpawner {
|
|||||||
checkPatterns(setupsAtPosition, samplePosition, world, samplePosition, "Empty");
|
checkPatterns(setupsAtPosition, samplePosition, world, samplePosition, "Empty");
|
||||||
if (!setupsAtPosition.isEmpty()) {
|
if (!setupsAtPosition.isEmpty()) {
|
||||||
centerPosition.set(samplePosition);
|
centerPosition.set(samplePosition);
|
||||||
|
setupIndex.set(setupsAtPosition.getFirst());
|
||||||
return ritualDefinitions.getRitualType(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<RitualPattern> 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<Integer> ritualSetups) {
|
int getMaxPatternRadius(List<Integer> ritualSetups) {
|
||||||
int maxRadius = 0;
|
int maxRadius = 0;
|
||||||
for (Integer ritualSetup : ritualSetups) {
|
for (Integer ritualSetup : ritualSetups) {
|
||||||
|
|||||||
@@ -8,9 +8,13 @@ public class RitualDefinitions {
|
|||||||
|
|
||||||
public RitualDefinitions() {
|
public RitualDefinitions() {
|
||||||
// Crude skeleton ritual
|
// 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)
|
.addPattern("Furniture_Crude_Torch", 2, 4, false, true)
|
||||||
.addSacrifice("Ingredient_Life_Essence", 1, 1, 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() {
|
public int getRitualSetupsCount() {
|
||||||
@@ -25,6 +29,10 @@ public class RitualDefinitions {
|
|||||||
return ritualSetups.get(index).getCenterBlockId();
|
return ritualSetups.get(index).getCenterBlockId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean getShouldConsumeCenterBlock(int index) {
|
||||||
|
return ritualSetups.get(index).getShouldConsumeCenterBlock();
|
||||||
|
}
|
||||||
|
|
||||||
public List<RitualPattern> getPatterns(int setupIndex) {
|
public List<RitualPattern> getPatterns(int setupIndex) {
|
||||||
return ritualSetups.get(setupIndex).getPatterns();
|
return ritualSetups.get(setupIndex).getPatterns();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,12 +6,14 @@ import java.util.List;
|
|||||||
public class RitualSetup {
|
public class RitualSetup {
|
||||||
RitualTypes ritualType;
|
RitualTypes ritualType;
|
||||||
String centerBlockId;
|
String centerBlockId;
|
||||||
|
boolean shouldConsumeCenterBlock;
|
||||||
List<RitualPattern> patterns = new ArrayList<>();
|
List<RitualPattern> patterns = new ArrayList<>();
|
||||||
List<RitualSacrifice> sacrifices = new ArrayList<>();
|
List<RitualSacrifice> sacrifices = new ArrayList<>();
|
||||||
|
|
||||||
public RitualSetup(String centerBlockId, RitualTypes ritualType) {
|
public RitualSetup(String centerBlockId, boolean shouldConsumeCenterBlock, RitualTypes ritualType) {
|
||||||
this.ritualType = ritualType;
|
|
||||||
this.centerBlockId = centerBlockId;
|
this.centerBlockId = centerBlockId;
|
||||||
|
this.shouldConsumeCenterBlock = shouldConsumeCenterBlock;
|
||||||
|
this.ritualType = ritualType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public RitualSetup addPattern(String blockId, int radius, int amount, boolean shouldConsume, boolean shouldInteract) {
|
public RitualSetup addPattern(String blockId, int radius, int amount, boolean shouldConsume, boolean shouldInteract) {
|
||||||
@@ -32,6 +34,10 @@ public class RitualSetup {
|
|||||||
return centerBlockId;
|
return centerBlockId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean getShouldConsumeCenterBlock() {
|
||||||
|
return shouldConsumeCenterBlock;
|
||||||
|
}
|
||||||
|
|
||||||
public RitualPattern getPattern(int index) {
|
public RitualPattern getPattern(int index) {
|
||||||
return patterns.get(index);
|
return patterns.get(index);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ public class RitualDropItemEvent extends EntityEventSystem<EntityStore, DropItem
|
|||||||
assert transform != null;
|
assert transform != null;
|
||||||
Vector3d targetPosition = transform.getPosition();
|
Vector3d targetPosition = transform.getPosition();
|
||||||
World world = store.getExternalData().getWorld();
|
World world = store.getExternalData().getWorld();
|
||||||
ritualSpawner.sacrificeDropEvent(itemId, targetPosition, world);
|
ritualSpawner.sacrificeDropEvent(itemId, targetPosition, world, store, archetypeChunk.getReferenceTo(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
@NullableDecl
|
@NullableDecl
|
||||||
|
|||||||
Reference in new issue
Block a user