diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 7d5f08b..ff44990 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -12,28 +12,27 @@ jobs: - name: JDk 21 setup uses: actions/setup-java@v1 with: - java-version: 1.21 - # - uses: actions/cache@v4 - # env: - # cache-name: cache-gradle - # with: - # path: | - # ~/.gradle/caches - # ~/.gradle/wrapper - # .gradle/caches - # key: ${{ runner.os }}-gradle-${{ env.cache-name }}-${{ hashFiles('*.gradle.kts', '**/gradle-wrapper.properties') }} - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v3 + java-version: 1.21 + - uses: actions/cache@v3 + env: + cache-name: cache-gradle with: - gradle-version: "8.11.1" - - name: Compile - run: ./gradlew assemble + path: | + ~/.gradle/caches + ~/.gradle/wrapper + .gradle/caches + key: ${{ runner.os }}-gradle-${{ env.cache-name }}-${{ hashFiles('*.gradle.kts', '**/gradle-wrapper.properties') }} + - name: Gradle Build Action + uses: gradle/gradle-build-action@v2.1.3 + with: + gradle-version: "7.4.1" + arguments: assemble - name: Clean build outputs run: rm build/libs/LaBoulangerieCore-*dev*.jar - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v1 with: - name: laboulangeriecore - path: build/libs/ + name: laboulangeriecore + path: build/libs/ deploy: runs-on: ubuntu-latest needs: [build] diff --git a/src/main/java/net/laboulangerie/laboulangeriecore/LaBoulangerieCore.java b/src/main/java/net/laboulangerie/laboulangeriecore/LaBoulangerieCore.java index 33f4e35..e2e6d0a 100644 --- a/src/main/java/net/laboulangerie/laboulangeriecore/LaBoulangerieCore.java +++ b/src/main/java/net/laboulangerie/laboulangeriecore/LaBoulangerieCore.java @@ -64,6 +64,7 @@ import net.laboulangerie.laboulangeriecore.misc.MiscListener; import net.laboulangerie.laboulangeriecore.misc.TradeOverflowListener; import net.laboulangerie.laboulangeriecore.misc.TradesHook; +import net.laboulangerie.laboulangeriecore.misc.VaultsReset; import net.laboulangerie.laboulangeriecore.speedpaths.SpeedPathListener; import net.laboulangerie.laboulangeriecore.speedpaths.SpeedPathManager; import net.laboulangerie.laboulangeriecore.tab.TabListener; @@ -124,6 +125,8 @@ public void onEnable() { EventsManager.innit(); + VaultsReset.reset(); + registerListeners(); getCommand("authenticate").setExecutor(new AuthenticateCommand()); @@ -152,36 +155,41 @@ public void onEnable() { getCommand("librahost").setExecutor(new LinkCommands()); if (getServer().getPluginManager().getPlugin("BetonQuest") != null) { - BetonQuest.getInstance().getQuestRegistries().getConditionTypes().register("towny_is_king", new PlayerConditionFactory() { - @Override - public PlayerCondition parsePlayer(Instruction instruction) throws InstructionParseException { - return new KingCondition(); - } - }, null); - BetonQuest.getInstance().getQuestRegistries().getConditionTypes().register("towny_is_mayor", new PlayerConditionFactory() { - @Override - public PlayerCondition parsePlayer(Instruction instruction) throws InstructionParseException { - return new MayorCondition(); - } - }, null); - BetonQuest.getInstance().getQuestRegistries().getConditionTypes().register("nation_houses_has_stocks", new PlayerConditionFactory() { - @Override - public PlayerCondition parsePlayer(Instruction instruction) throws InstructionParseException { - return new HousesStockCondition(); - } - }, null); - BetonQuest.getInstance().getQuestRegistries().getConditionTypes().register("towny_has_house", new PlayerConditionFactory() { - @Override - public PlayerCondition parsePlayer(Instruction instruction) throws InstructionParseException { - return new HasHouseCondition(); - } - }, null); - BetonQuest.getInstance().getQuestRegistries().getConditionTypes().register("towny_has_rank", new PlayerConditionFactory() { - @Override - public PlayerCondition parsePlayer(Instruction instruction) throws InstructionParseException { - return new RankCondition(instruction.getPart(1), instruction.getPart(2)); - } - }, null); + BetonQuest.getInstance().getQuestRegistries().getConditionTypes().register("towny_is_king", + new PlayerConditionFactory() { + @Override + public PlayerCondition parsePlayer(Instruction instruction) throws InstructionParseException { + return new KingCondition(); + } + }, null); + BetonQuest.getInstance().getQuestRegistries().getConditionTypes().register("towny_is_mayor", + new PlayerConditionFactory() { + @Override + public PlayerCondition parsePlayer(Instruction instruction) throws InstructionParseException { + return new MayorCondition(); + } + }, null); + BetonQuest.getInstance().getQuestRegistries().getConditionTypes().register("nation_houses_has_stocks", + new PlayerConditionFactory() { + @Override + public PlayerCondition parsePlayer(Instruction instruction) throws InstructionParseException { + return new HousesStockCondition(); + } + }, null); + BetonQuest.getInstance().getQuestRegistries().getConditionTypes().register("towny_has_house", + new PlayerConditionFactory() { + @Override + public PlayerCondition parsePlayer(Instruction instruction) throws InstructionParseException { + return new HasHouseCondition(); + } + }, null); + BetonQuest.getInstance().getQuestRegistries().getConditionTypes().register("towny_has_rank", + new PlayerConditionFactory() { + @Override + public PlayerCondition parsePlayer(Instruction instruction) throws InstructionParseException { + return new RankCondition(instruction.getPart(1), instruction.getPart(2)); + } + }, null); getLogger().info("Hooked in BetonQuest!"); } diff --git a/src/main/java/net/laboulangerie/laboulangeriecore/commands/CoreCommand.java b/src/main/java/net/laboulangerie/laboulangeriecore/commands/CoreCommand.java index 5a172ef..6f7169a 100644 --- a/src/main/java/net/laboulangerie/laboulangeriecore/commands/CoreCommand.java +++ b/src/main/java/net/laboulangerie/laboulangeriecore/commands/CoreCommand.java @@ -25,6 +25,7 @@ import net.laboulangerie.laboulangeriecore.core.end.Dragon; import net.laboulangerie.laboulangeriecore.core.event.EventsManager; import net.laboulangerie.laboulangeriecore.eco.ConversionInv; +import net.laboulangerie.laboulangeriecore.misc.VaultsReset; public class CoreCommand implements TabExecutor { @Override @@ -126,6 +127,11 @@ public boolean onCommand(CommandSender sender, Command cmd, String alias, String sender.sendMessage("§aNickname reset successfully!"); return true; } + + if (args[0].equalsIgnoreCase("resetvaults")) { + VaultsReset.reset(); + return true; + } return false; } @@ -134,7 +140,8 @@ public boolean onCommand(CommandSender sender, Command cmd, String alias, String @NotNull String alias, @NotNull String[] args) { List suggestions = Arrays.asList(""); if (args.length == 1) - suggestions = Arrays.asList("reload", "rl", "conversion", "nick", "unnick", "spawnDragon", "nametag"); + suggestions = Arrays.asList("reload", "rl", "conversion", "nick", "unnick", "spawnDragon", "nametag", + "resetvaults"); if (args.length == 2 && (args[0].equalsIgnoreCase("nick") || args[0].equalsIgnoreCase("unnick") || args[0].equalsIgnoreCase("nametag"))) diff --git a/src/main/java/net/laboulangerie/laboulangeriecore/misc/VaultsReset.java b/src/main/java/net/laboulangerie/laboulangeriecore/misc/VaultsReset.java new file mode 100644 index 0000000..2079b07 --- /dev/null +++ b/src/main/java/net/laboulangerie/laboulangeriecore/misc/VaultsReset.java @@ -0,0 +1,77 @@ +package net.laboulangerie.laboulangeriecore.misc; + +import java.util.List; + +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.CraftWorld; + +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldguard.WorldGuard; +import com.sk89q.worldguard.protection.managers.RegionManager; +import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; +import com.sk89q.worldguard.protection.regions.RegionContainer; + +import net.laboulangerie.laboulangeriecore.LaBoulangerieCore; +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.block.entity.BlockEntity; + +public class VaultsReset { + + public static void reset() { + List regionWorldPairs = LaBoulangerieCore.PLUGIN.getConfig().getStringList("vault-reset-regions"); + + RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); + + for (String regionWorldPair : regionWorldPairs) { + String[] splitted = regionWorldPair.split(":"); + String worldName = splitted[0]; + String regionName = splitted[1]; + + World world = LaBoulangerieCore.PLUGIN.getServer().getWorld(worldName); + RegionManager regions = container.get(BukkitAdapter.adapt(world)); + ProtectedRegion region = regions.getRegion(regionName); + // check if region is a cuboid + if (region instanceof ProtectedCuboidRegion) { + resetVault(region, world); + } else { + LaBoulangerieCore.PLUGIN.getLogger().warning("Region " + regionName + " in world " + worldName + + " is not a cuboid region, skipping..."); + } + } + } + + private static void resetVault(ProtectedRegion region, World world) { + BlockVector3 min = region.getMinimumPoint(); + BlockVector3 max = region.getMaximumPoint(); + + HolderLookup.Provider minecraftProvider = MinecraftServer.getServer().registryAccess(); + CraftWorld craftWorld = (CraftWorld) world; + for (int x = min.x(); x <= max.x(); x++) { + for (int y = min.y(); y <= max.y(); y++) { + for (int z = min.z(); z <= max.z(); z++) { + if (world.getBlockAt(x, y, z).getType() == Material.VAULT) { + LaBoulangerieCore.PLUGIN.getLogger() + .info("Resetting rewarded players of vault at " + x + " " + y + " " + z + " in world " + + world.getName()); + BlockPos blockPos = new BlockPos(x, y, z); + BlockEntity blockEntity = craftWorld.getHandle().getBlockEntity(blockPos); + + CompoundTag ct = blockEntity.saveWithFullMetadata(minecraftProvider); + CompoundTag serverData = ct.getCompound("server_data"); + serverData.remove("rewarded_players"); + + blockEntity.loadWithComponents(ct, minecraftProvider); + blockEntity.setChanged(); + } + } + } + } + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index f695f33..a564767 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -179,3 +179,6 @@ speed-paths: # that should be disabled disabled-crafts: - VEX_ARMOR_TRIM_SMITHING_TEMPLATE + +vault-reset-regions: + - world:spawn_trial