Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package io.github.thebusybiscuit.slimefun4.core.services;
- import io.github.thebusybiscuit.slimefun4.core.services.OreRegen.GeneratorSettings;
- import me.mrCookieSlime.Slimefun.SlimefunPlugin;
- import org.bukkit.Bukkit;
- import org.bukkit.Material;
- import org.bukkit.World;
- import org.bukkit.block.Block;
- import org.bukkit.block.BlockFace;
- import org.bukkit.event.EventHandler;
- import org.bukkit.event.Listener;
- import org.bukkit.event.player.PlayerInteractEvent;
- import org.bukkit.plugin.Plugin;
- import java.util.*;
- public class OreRegenService implements Listener {
- LinkedHashMap<Long, String> chunkmap;
- World world;
- @EventHandler
- public void onClick(PlayerInteractEvent e){
- for(World world : Bukkit.getWorlds()){
- if(!world.getName().contains("lobby")){
- this.world = world;
- }
- }
- try{
- if(e.getPlayer().getInventory().getItemInMainHand().getType() == Material.BLAZE_ROD){
- Generate(e.getClickedBlock(), 7);
- }
- else if(e.getPlayer().getInventory().getItemInMainHand().getType() == Material.STICK){
- Lookup(e.getClickedBlock(), 7);
- }
- } catch (Exception ex){
- ex.printStackTrace();
- }
- }
- public void Generate(Block center, int range){
- Bukkit.getConsoleSender().sendMessage("owo");
- for (int x = center.getX() - range; x <= center.getX() + range; x++) {
- for (int z = center.getZ() - range; z <= center.getZ() + range; z++) {
- for (int y = center.getY(); y > 0; y--) {
- Block block = world.getBlockAt(x, y, z);
- if (y < 3 || isOre(block)) continue; //少於最低深度或坐標為礦物時
- final int height = y;
- Optional<Material> mOp = GeneratorSettings.getMaterials(block).stream().reduce((m1, m2) -> { //過濾為一個礦物生成
- double m1Percent = GeneratorSettings.getProbability(m1, height).percent;
- double m2Percent = GeneratorSettings.getProbability(m2, height).percent;
- m1Percent = Math.min(m1Percent, m2Percent); //確保 m1 最少
- m2Percent = Math.max(m2Percent, m1Percent); //確保 m2 最大
- Material m;
- double r = random.nextDouble();
- if (r < m1Percent && m1Percent != m2Percent){
- m = m1;
- }else if (r < m2Percent && m1Percent != m2Percent){
- m = m2;
- }else{ //當不滿足以上條件,改成公平隨機
- m = r > 0.5f ? m1 : m2;
- }
- return m;
- });
- if (!mOp.isPresent()) continue; //沒有符合條件的礦物時
- Material m = mOp.get();
- block.setType(m); //設置為礦物
- int groups = GeneratorSettings.randomOf(GeneratorSettings.ORE_GROUP); //獲取礦物群數量
- for (int i = 0; i < groups; i++) {
- BlockFace face = randomFace(); //隨機方向伸展
- Block relative = block.getRelative(face); //獲取伸展方塊
- if (isOre(relative)) continue; //伸展方塊為礦物時
- relative.setType(m); //設置為礦物
- block = relative; //把伸展方塊設為中心並再度伸展
- }
- }
- }
- }
- }
- public void Lookup(Block center, int range){
- HashMap<Material, Integer> ores = new HashMap<>();
- for (int x = center.getX() - range; x <= center.getX() + range; x++) {
- for (int z = center.getZ() - range; z <= center.getZ() + range; z++) {
- for (int y = center.getY(); y > 0; y--) {
- Block block = world.getBlockAt(x, y, z);
- if (y < 3) continue; //少於最低深度或坐標為礦物時
- if(isOre(block)){
- if(ores.containsKey(block.getType())){
- ores.put(block.getType(), ores.get(block.getType())+1);
- }else {
- ores.put(block.getType(), 1);
- }
- }
- }
- }
- }
- for(Material material : ores.keySet()){
- Bukkit.getConsoleSender().sendMessage(material.toString()+": "+ores.get(material));
- }
- Bukkit.getConsoleSender().sendMessage("======================");
- }
- private Random random = new Random();
- private boolean isOre(Block block) {
- return block.getType().toString().endsWith("_ORE");
- }
- private BlockFace randomFace() {
- return BlockFace.values()[random.nextInt(BlockFace.values().length)];
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement