SHARE
TWEET

Untitled

a guest Feb 16th, 2020 80 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package io.github.thebusybiscuit.slimefun4.core.services;
  2.  
  3. import io.github.thebusybiscuit.slimefun4.core.services.OreRegen.GeneratorSettings;
  4. import me.mrCookieSlime.Slimefun.SlimefunPlugin;
  5. import org.bukkit.Bukkit;
  6. import org.bukkit.Material;
  7. import org.bukkit.World;
  8. import org.bukkit.block.Block;
  9. import org.bukkit.block.BlockFace;
  10. import org.bukkit.event.EventHandler;
  11. import org.bukkit.event.Listener;
  12. import org.bukkit.event.player.PlayerInteractEvent;
  13. import org.bukkit.plugin.Plugin;
  14.  
  15. import java.util.*;
  16.  
  17. public class OreRegenService implements Listener {
  18.  
  19.     LinkedHashMap<Long, String> chunkmap;
  20.     World world;
  21.  
  22.     @EventHandler
  23.     public void onClick(PlayerInteractEvent e){
  24.         for(World world : Bukkit.getWorlds()){
  25.             if(!world.getName().contains("lobby")){
  26.                 this.world = world;
  27.             }
  28.         }
  29.         try{
  30.             if(e.getPlayer().getInventory().getItemInMainHand().getType() == Material.BLAZE_ROD){
  31.                 Generate(e.getClickedBlock(), 7);
  32.             }
  33.             else if(e.getPlayer().getInventory().getItemInMainHand().getType() == Material.STICK){
  34.                 Lookup(e.getClickedBlock(), 7);
  35.             }
  36.         } catch (Exception ex){
  37.             ex.printStackTrace();
  38.         }
  39.     }
  40.  
  41.     public void Generate(Block center, int range){
  42.         Bukkit.getConsoleSender().sendMessage("owo");
  43.         for (int x = center.getX() - range; x <= center.getX() + range; x++) {
  44.             for (int z = center.getZ() - range; z <= center.getZ() + range; z++) {
  45.                 for (int y = center.getY(); y > 0; y--) {
  46.                     Block block = world.getBlockAt(x, y, z);
  47.                     if (y < 3 || isOre(block)) continue; //少於最低深度或坐標為礦物時
  48.                     final int height = y;
  49.                     Optional<Material> mOp = GeneratorSettings.getMaterials(block).stream().reduce((m1, m2) -> { //過濾為一個礦物生成
  50.                         double m1Percent = GeneratorSettings.getProbability(m1, height).percent;
  51.                         double m2Percent = GeneratorSettings.getProbability(m2, height).percent;
  52.                         m1Percent = Math.min(m1Percent, m2Percent); //確保 m1 最少
  53.                         m2Percent = Math.max(m2Percent, m1Percent); //確保 m2 最大
  54.                         Material m;
  55.                         double r = random.nextDouble();
  56.                         if (r < m1Percent && m1Percent != m2Percent){
  57.                             m = m1;
  58.                         }else if (r < m2Percent && m1Percent != m2Percent){
  59.                             m = m2;
  60.                         }else{ //當不滿足以上條件,改成公平隨機
  61.                             m = r > 0.5f ? m1 : m2;
  62.                         }
  63.                         return m;
  64.                     });
  65.                     if (!mOp.isPresent()) continue; //沒有符合條件的礦物時
  66.                     Material m = mOp.get();
  67.                     block.setType(m); //設置為礦物
  68.                     int groups = GeneratorSettings.randomOf(GeneratorSettings.ORE_GROUP); //獲取礦物群數量
  69.                     for (int i = 0; i < groups; i++) {
  70.                         BlockFace face = randomFace(); //隨機方向伸展
  71.                         Block relative = block.getRelative(face); //獲取伸展方塊
  72.                         if (isOre(relative)) continue; //伸展方塊為礦物時
  73.                         relative.setType(m); //設置為礦物
  74.                         block = relative; //把伸展方塊設為中心並再度伸展
  75.                     }
  76.                 }
  77.             }
  78.         }
  79.     }
  80.  
  81.     public void Lookup(Block center, int range){
  82.         HashMap<Material, Integer> ores = new HashMap<>();
  83.         for (int x = center.getX() - range; x <= center.getX() + range; x++) {
  84.             for (int z = center.getZ() - range; z <= center.getZ() + range; z++) {
  85.                 for (int y = center.getY(); y > 0; y--) {
  86.                     Block block = world.getBlockAt(x, y, z);
  87.                     if (y < 3) continue; //少於最低深度或坐標為礦物時
  88.                     if(isOre(block)){
  89.                         if(ores.containsKey(block.getType())){
  90.                             ores.put(block.getType(), ores.get(block.getType())+1);
  91.                         }else {
  92.                             ores.put(block.getType(), 1);
  93.                         }
  94.                     }
  95.                 }
  96.             }
  97.         }
  98.         for(Material material : ores.keySet()){
  99.             Bukkit.getConsoleSender().sendMessage(material.toString()+": "+ores.get(material));
  100.         }
  101.         Bukkit.getConsoleSender().sendMessage("======================");
  102.     }
  103.  
  104.         private Random random = new Random();
  105.  
  106.         private boolean isOre(Block block) {
  107.             return block.getType().toString().endsWith("_ORE");
  108.         }
  109.  
  110.         private BlockFace randomFace() {
  111.             return BlockFace.values()[random.nextInt(BlockFace.values().length)];
  112.         }
  113.  
  114.  
  115. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top