Ore generators V2 (#15)

* Fix typo in island gui

* Add glow for challenges that are completed.

* Enhance ore generators to generate the ore when the block is broken.
This commit is contained in:
destro174 2024-04-20 15:00:35 +02:00 committed by GitHub
parent 09525f0be1
commit 94b3abb0f5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 72 additions and 45 deletions

View File

@ -177,10 +177,9 @@ public class ChallengesGUI extends GUIInventory {
lore.add(miniMessage.deserialize("<yellow>Reward: " + StringUtil.splitMiniMessageString(
(challenge.challengeType().equals(ChallengeType.ON_PLAYER) && challengeCount != 0) ?
challenge.repeatRewardText() : challenge.rewardText())));
// TODO -- Add glow for challenges that are completed
// if (challengeCount > 0 || challenge.repeatRewards() != null && !challenge.repeatRewards().isEmpty()) {
// meta.addEnchant(Enchantment.MENDING, 1, true);
// }
if (challengeCount > 0) {
meta.addEnchant(Enchantment.MENDING, 1, true);
}
meta.addItemFlags(ItemFlag.values());
meta.lore(lore);

View File

@ -43,7 +43,7 @@ public class IslandGUI extends GUIInventory {
player.closeInventory();
new SettingsGUI(island).open(player);
}));
addButton(13, createMenuButton(Material.ENCHANTED_BOOK, "Challenes", new ArrayList<>(), event -> {
addButton(13, createMenuButton(Material.BOOKSHELF, "Challenges", new ArrayList<>(), event -> {
player.closeInventory();
new ChallengesGUI(island).open(player);
}));

View File

@ -32,6 +32,12 @@ public class GeneratorHandler {
return deepslate ? deepslateVariant(ore) : ore;
}
public Material generateOre(Island island, Material material) {
boolean deepslate = material == Material.DEEPSLATE;
Material ore = rollGenerator(island, material == Material.STONE || material == Material.COBBLESTONE || deepslate);
return deepslate ? deepslateVariant(ore) : ore;
}
private Material rollGenerator(Island island, boolean cobblestone) {
double random = Math.random() * 100;
double checkedChance = 0;

View File

@ -2,70 +2,92 @@ package com.alttd.cometskyblock.listeners;
import com.alttd.cometskyblock.CometSkyBlockPlugin;
import com.alttd.cometskyblock.island.Island;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Item;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockFormEvent;
import org.bukkit.event.block.*;
import org.bukkit.metadata.FixedMetadataValue;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.TimeUnit;
import java.util.List;
public class CobbestoneGeneratorListener implements Listener {
public static final @NotNull String GENERATOR_METADATA_KEY = "comet:oregenerator";
private final CometSkyBlockPlugin plugin;
// public static Cache<Location, Long> generatorCache = CacheBuilder.newBuilder()
// .maximumSize(1000)
// .expireAfterAccess(10, TimeUnit.MINUTES)
// .build();
public CobbestoneGeneratorListener(CometSkyBlockPlugin plugin) {
this.plugin = plugin;
}
@EventHandler
@EventHandler(ignoreCancelled = true)
public void onBockForm(BlockFormEvent blockFormEvent) {
Block block = blockFormEvent.getNewState().getBlock();
if (block.getType() == Material.OBSIDIAN)
return;
Island island = Island.getIsland(block.getWorld().getUID());
if (island.worldName() == null || island.worldName().isEmpty()) // Worlds not generated by us will have this as null or empty
return;
Material formedMaterial = blockFormEvent.getNewState().getType();
boolean cobblestone;
switch (formedMaterial) {
case COBBLESTONE -> cobblestone = true;
case BASALT -> cobblestone = false;
default -> {
return;
BlockState blockState = blockFormEvent.getNewState();
blockState.setMetadata(GENERATOR_METADATA_KEY, new CometMeta());
if (blockFormEvent.getNewState().getType() == Material.COBBLESTONE && block.getLocation().getBlockY() <= 16)
blockFormEvent.getNewState().setType(Material.DEEPSLATE);
}
@EventHandler(ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent event) {
Block block = event.getBlock();
if(!block.hasMetadata(GENERATOR_METADATA_KEY)) {
return;
}
Island island = Island.getIsland(block.getWorld().getUID());
Material generatedMaterial = plugin.generatorHandler().generateOre(island, block.getType());
block.setType(generatedMaterial);
}
@EventHandler(ignoreCancelled = true)
public void onBlockDropItem(BlockDropItemEvent event) {
Block block = event.getBlock();
if(!block.hasMetadata(GENERATOR_METADATA_KEY)) {
return;
}
// At This point we can inject bonus items
block.removeMetadata(GENERATOR_METADATA_KEY, plugin);
for (Item item : event.getItems()) {
item.setFireInvulnerableTicks(100);
}
}
@EventHandler(ignoreCancelled = true)
public void onBlockPistonExtend(BlockPistonExtendEvent event) {
cleanPistonBlocks(event.getBlocks());
}
@EventHandler(ignoreCancelled = true)
public void onBlockPistonRetract(BlockPistonRetractEvent event) {
cleanPistonBlocks(event.getBlocks());
}
private void cleanPistonBlocks(List<Block> blocks) {
for (Block block : blocks) {
if(block.hasMetadata(GENERATOR_METADATA_KEY)) {
block.removeMetadata(GENERATOR_METADATA_KEY, plugin);
}
}
Material generatedMaterial = plugin.generatorHandler().generateOre(island, cobblestone, blockFormEvent.getBlock().getLocation().getBlockY());
blockFormEvent.getNewState().setType(generatedMaterial);
// TODO - set to infested variants - turn them into ore when breaking them?
// if infested block -> rollgenerator -> block::breaknaturally?
}
// @EventHandler
// public void cobblestoneGeneratorDrops(BlockBreakEvent event) {
// // TODO - multiply drops from cobble gen?
// Block block = event.getBlock();
// if (block.getType().equals(Material.COBBLESTONE)) {
// if (relativeEqualsMaterial(block, Material.LAVA)) { // any other way to detect if they are from cobble gen
// // set some data during blockform event?
// if (relativeEqualsMaterial(block, Material.WATER)) {
//
// }
// }
// }
// }
public class CometMeta extends FixedMetadataValue {
boolean relativeEqualsMaterial(Block block, Material material) {
return block.getRelative(BlockFace.NORTH).getType().equals(material)
|| block.getRelative(BlockFace.EAST).getType().equals(material)
|| block.getRelative(BlockFace.SOUTH).getType().equals(material)
|| block.getRelative(BlockFace.WEST).getType().equals(material);
public CometMeta() {
super(plugin, true);
}
}
}