diff options
Diffstat (limited to 'src/main/java/luckyblock/action')
7 files changed, 318 insertions, 0 deletions
diff --git a/src/main/java/luckyblock/action/LuckyActionHolder.java b/src/main/java/luckyblock/action/LuckyActionHolder.java new file mode 100644 index 0000000..b18ad67 --- /dev/null +++ b/src/main/java/luckyblock/action/LuckyActionHolder.java @@ -0,0 +1,62 @@ +package luckyblock.action; + +import com.google.gson.JsonElement; +import com.google.gson.annotations.SerializedName; +import luckyblock.action.triggers.*; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; + +import java.util.ArrayList; +import java.util.List; + +public class LuckyActionHolder { + private static final List<ILuckyTrigger> cmdList = new ArrayList<>(); + + static { + cmdList.add(new BroadcastTrigger()); + cmdList.add(new SummonItemTrigger()); + cmdList.add(new SummonTrigger()); + cmdList.add(new TrappedRoomTrigger()); + } + + public String type = ""; + public int weight = -1; + public List<String> queue; + + @SerializedName("delay-queue") + public List<Integer> delay_queue; + public JsonElement json; + public List<String> items; + public List<String> mobs; + public int count = 1; + public int height = 0; + @SerializedName("is-powered") + public boolean is_powered = false; + @SerializedName("wall-block") + public String wall_block = "minecraft:stone_bricks"; + public int radius = 3; + + public void execute(Level level, BlockPos pos) { + if (!(level instanceof ServerLevel serverLevel)) { return; } + + for (ILuckyTrigger c : cmdList) { + if (this.type != null && this.type.equals(c.getName())) { + c.execute(serverLevel, pos, this, level.getRandom()); + break; + } + } + + if (this.queue != null && !this.queue.isEmpty()) { + for (int i=0;i<this.queue.size();i++) { + String next = this.queue.get(i); + int delayTicks = 0; + if (this.delay_queue != null && i<this.delay_queue.size()) { + delayTicks = this.delay_queue.get(i) * 20; + } + LuckyActionManager.enqueue(next, pos, serverLevel, delayTicks); + } + } + } + +} diff --git a/src/main/java/luckyblock/action/LuckyActionManager.java b/src/main/java/luckyblock/action/LuckyActionManager.java new file mode 100644 index 0000000..4acc2eb --- /dev/null +++ b/src/main/java/luckyblock/action/LuckyActionManager.java @@ -0,0 +1,67 @@ +package luckyblock.action; + +import luckyblock.Main; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; + +import java.util.LinkedList; +import java.util.Queue; + +public class LuckyActionManager { + private static class Task { + String fieldName; + BlockPos pos; + ServerLevel level; + int remainingTicks; + + Task(String fieldName, BlockPos pos, ServerLevel level, int remainingTicks) { + this.fieldName = fieldName.replace("-", "_"); + this.pos = pos; + this.level = level; + this.remainingTicks = remainingTicks; + } + } + + private static final Queue<Task> actions = new LinkedList<>(); + + public static void enqueue(String actionField, BlockPos pos, ServerLevel level, int delayTicks) { + actions.offer(new Task(actionField, pos, level, delayTicks)); + } + + public static void enqueue(String actionField, BlockPos pos, int delayTicks) { + if (net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer() != null) { + enqueue(actionField, pos, net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer().overworld(), delayTicks); + } + } + + @SubscribeEvent + public static void onServerTick(TickEvent.ServerTickEvent event) { + if (event.phase != TickEvent.Phase.END + || actions.isEmpty() + || Main.settings == null) { + return; + } + + int size = actions.size(); + for (int i=0;i<size;i++) { + Task task = actions.poll(); + if (task == null) continue; + + task.remainingTicks--; + if (task.remainingTicks <= 0) { + ServerLevel level = task.level; + if (level == null) { + level = event.getServer().overworld(); + } + LuckyActionHolder action = Main.settings.events.get(task.fieldName); + if (action != null) { + action.execute(level, task.pos); + } + }else { + actions.offer(task); + } + } + } +} diff --git a/src/main/java/luckyblock/action/triggers/BroadcastTrigger.java b/src/main/java/luckyblock/action/triggers/BroadcastTrigger.java new file mode 100644 index 0000000..fae58f0 --- /dev/null +++ b/src/main/java/luckyblock/action/triggers/BroadcastTrigger.java @@ -0,0 +1,33 @@ +package luckyblock.action.triggers; + + +import luckyblock.action.LuckyActionHolder; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; + +import java.util.ArrayList; +import java.util.List; + +public class BroadcastTrigger implements ILuckyTrigger { + @Override + public String getName() { + return "broadcast"; + } + + @Override + public void execute(ServerLevel level, BlockPos pos, LuckyActionHolder holder, RandomSource random) { + if (holder.json != null) { + List<String> messages = new ArrayList<>(); + if (holder.json.isJsonArray()) { + holder.json.getAsJsonArray().forEach(e -> messages.add(e.getAsString())); + } else if (holder.json.isJsonPrimitive()) { + messages.add(holder.json.getAsString()); + } + for (String msg : messages) { + level.getServer().getPlayerList().broadcastSystemMessage(Component.literal(msg), false); + } + } + } +}
\ No newline at end of file diff --git a/src/main/java/luckyblock/action/triggers/ILuckyTrigger.java b/src/main/java/luckyblock/action/triggers/ILuckyTrigger.java new file mode 100644 index 0000000..6e42d01 --- /dev/null +++ b/src/main/java/luckyblock/action/triggers/ILuckyTrigger.java @@ -0,0 +1,12 @@ +package luckyblock.action.triggers; + +import luckyblock.action.LuckyActionHolder; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; + +public interface ILuckyTrigger { + String getName(); + + void execute(ServerLevel level, BlockPos pos, LuckyActionHolder holder, RandomSource random); +} diff --git a/src/main/java/luckyblock/action/triggers/SummonItemTrigger.java b/src/main/java/luckyblock/action/triggers/SummonItemTrigger.java new file mode 100644 index 0000000..fbf44ff --- /dev/null +++ b/src/main/java/luckyblock/action/triggers/SummonItemTrigger.java @@ -0,0 +1,34 @@ +package luckyblock.action.triggers; + + +import luckyblock.action.LuckyActionHolder; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Blocks; + +public class SummonItemTrigger implements ILuckyTrigger { + @Override + public String getName() { + return "summon_item"; + } + + @Override + public void execute(ServerLevel level, BlockPos pos, LuckyActionHolder holder, RandomSource random) { + if (holder.items != null) { + for (String itemId : holder.items) { + var item = BuiltInRegistries.ITEM.get(new ResourceLocation(itemId)); + if (item != Blocks.AIR.asItem()) { + for (int i = 0; i < holder.count; i++) { + ItemEntity entity = new ItemEntity(level, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(item)); + level.addFreshEntity(entity); + } + } + } + } + } +} diff --git a/src/main/java/luckyblock/action/triggers/SummonTrigger.java b/src/main/java/luckyblock/action/triggers/SummonTrigger.java new file mode 100644 index 0000000..54103f5 --- /dev/null +++ b/src/main/java/luckyblock/action/triggers/SummonTrigger.java @@ -0,0 +1,72 @@ +package luckyblock.action.triggers; + + +import luckyblock.action.LuckyActionHolder; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.item.FallingBlockEntity; +import net.minecraft.world.entity.item.PrimedTnt; +import net.minecraft.world.entity.monster.Creeper; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; + +public class SummonTrigger implements ILuckyTrigger { + @Override + public String getName() { + return "summon"; + } + + @Override + public void execute(ServerLevel level, BlockPos pos, LuckyActionHolder holder, RandomSource random) { + if (holder.items != null) { + for (String itemId : holder.items) { + if (itemId.equals("minecraft:tnt")) { + for (int i = 0; i < holder.count; i++) { + PrimedTnt tnt = new PrimedTnt(EntityType.TNT, level); + double rx = pos.getX() + 0.5 + (random.nextDouble() - 0.5) * 4; + double rz = pos.getZ() + 0.5 + (random.nextDouble() - 0.5) * 4; + double ry = pos.getY() + holder.height; + tnt.moveTo(rx, ry, rz, 0.0F, 0.0F); + tnt.setFuse(holder.height > 0 ? 40 + random.nextInt(20) : 60 + random.nextInt(20)); + level.addFreshEntity(tnt); + } + } else { + Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(itemId)); + if (block != Blocks.AIR) { + BlockState blockState = block.defaultBlockState(); + for (int i = 0; i < holder.count; i++) { + BlockPos spawnPos = pos.above(holder.height + i); + FallingBlockEntity falling = FallingBlockEntity.fall(level, spawnPos, blockState); + level.addFreshEntity(falling); + } + } + } + } + } + if (holder.mobs != null) { + for (String mobId : holder.mobs) { + EntityType<?> entityType = BuiltInRegistries.ENTITY_TYPE.get(new ResourceLocation(mobId)); + if (entityType != null) { + for (int i = 0; i < holder.count; i++) { + BlockPos spawnPos = pos.above(holder.height > 0 ? holder.height : 1); + var entity = entityType.spawn(level, spawnPos, MobSpawnType.COMMAND); + if (entity instanceof Creeper creeper && holder.is_powered) { + CompoundTag nbt = new CompoundTag(); + creeper.saveWithoutId(nbt); + nbt.putBoolean("powered", true); + creeper.load(nbt); + } + } + } + } + } + } +} + diff --git a/src/main/java/luckyblock/action/triggers/TrappedRoomTrigger.java b/src/main/java/luckyblock/action/triggers/TrappedRoomTrigger.java new file mode 100644 index 0000000..818fb07 --- /dev/null +++ b/src/main/java/luckyblock/action/triggers/TrappedRoomTrigger.java @@ -0,0 +1,38 @@ +package luckyblock.action.triggers; + + +import luckyblock.action.LuckyActionHolder; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; + +public class TrappedRoomTrigger implements ILuckyTrigger { + @Override + public String getName() { + return "trapped_room"; + } + + @Override + public void execute(ServerLevel level, BlockPos pos, LuckyActionHolder holder, RandomSource random) { + Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(holder.wall_block)); + BlockState wallState = (block != null) ? block.defaultBlockState() : Blocks.STONE_BRICKS.defaultBlockState(); + int r = holder.radius; + for (int x = -r; x <= r; x++) { + for (int y = 0; y <= r * 2; y++) { + for (int z = -r; z <= r; z++) { + BlockPos targetPos = pos.offset(x, y, z); + if (Math.abs(x) == r || Math.abs(z) == r || y == 0 || y == r * 2) { + level.setBlock(targetPos, wallState, 3); + } else { + level.setBlock(targetPos, Blocks.AIR.defaultBlockState(), 3); + } + } + } + } + } +}
\ No newline at end of file |
