Island levelling improvements

This commit is contained in:
Esophose 2019-03-23 02:34:36 -06:00
parent 868ec061c9
commit abddc11159
9 changed files with 119 additions and 91 deletions

View File

@ -4,7 +4,7 @@ import me.goodandevil.skyblock.command.SubCommand;
import me.goodandevil.skyblock.config.FileManager; import me.goodandevil.skyblock.config.FileManager;
import me.goodandevil.skyblock.config.FileManager.Config; import me.goodandevil.skyblock.config.FileManager.Config;
import me.goodandevil.skyblock.levelling.LevellingManager; import me.goodandevil.skyblock.levelling.LevellingManager;
import me.goodandevil.skyblock.levelling.Material; import me.goodandevil.skyblock.levelling.LevellingMaterial;
import me.goodandevil.skyblock.message.MessageManager; import me.goodandevil.skyblock.message.MessageManager;
import me.goodandevil.skyblock.sound.SoundManager; import me.goodandevil.skyblock.sound.SoundManager;
import me.goodandevil.skyblock.utils.NumberUtil; import me.goodandevil.skyblock.utils.NumberUtil;
@ -46,7 +46,7 @@ public class ValueCommand extends SubCommand {
} }
if (materials != null && levellingManager.containsMaterial(materials)) { if (materials != null && levellingManager.containsMaterial(materials)) {
Material material = levellingManager.getMaterial(materials); LevellingMaterial material = levellingManager.getMaterial(materials);
double level = (double) material.getPoints() double level = (double) material.getPoints()
/ (double) fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")) / (double) fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml"))
.getFileConfiguration().getInt("Island.Levelling.Division"); .getFileConfiguration().getInt("Island.Levelling.Division");

View File

@ -738,6 +738,9 @@ public class IslandManager {
setNextAvailableLocation(world, islandLocation); setNextAvailableLocation(world, islandLocation);
saveNextAvailableLocation(world); saveNextAvailableLocation(world);
// Recalculate island level
Bukkit.getServer().getScheduler().runTaskLater(skyblock, () -> skyblock.getLevellingManager().calculatePoints(null, island), 20L);
} }
public Set<UUID> getVisitorsAtIsland(Island island) { public Set<UUID> getVisitorsAtIsland(Island island) {

View File

@ -1,23 +1,5 @@
package me.goodandevil.skyblock.levelling; package me.goodandevil.skyblock.levelling;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import org.bukkit.Bukkit;
import org.bukkit.ChunkSnapshot;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import me.goodandevil.skyblock.SkyBlock; import me.goodandevil.skyblock.SkyBlock;
import me.goodandevil.skyblock.api.event.island.IslandLevelChangeEvent; import me.goodandevil.skyblock.api.event.island.IslandLevelChangeEvent;
import me.goodandevil.skyblock.config.FileManager.Config; import me.goodandevil.skyblock.config.FileManager.Config;
@ -30,12 +12,22 @@ import me.goodandevil.skyblock.utils.version.Materials;
import me.goodandevil.skyblock.utils.version.NMSUtil; import me.goodandevil.skyblock.utils.version.NMSUtil;
import me.goodandevil.skyblock.utils.version.Sounds; import me.goodandevil.skyblock.utils.version.Sounds;
import me.goodandevil.skyblock.world.WorldManager; import me.goodandevil.skyblock.world.WorldManager;
import org.bukkit.*;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
import java.util.logging.Level;
public class LevellingManager { public class LevellingManager {
private final SkyBlock skyblock; private final SkyBlock skyblock;
private List<Material> materialStorage = new ArrayList<>(); private List<LevellingMaterial> materialStorage = new ArrayList<>();
public LevellingManager(SkyBlock skyblock) { public LevellingManager(SkyBlock skyblock) {
this.skyblock = skyblock; this.skyblock = skyblock;
@ -59,8 +51,6 @@ public class LevellingManager {
if (!chunk.isComplete()) return; if (!chunk.isComplete()) return;
cancel(); cancel();
Map<String, Integer> materials = new HashMap<>();
Method getBlockTypeMethod = null; Method getBlockTypeMethod = null;
Method getBlockTypeIdMethod = null; Method getBlockTypeIdMethod = null;
Method getBlockTypeDataMethod = null; Method getBlockTypeDataMethod = null;
@ -76,6 +66,8 @@ public class LevellingManager {
} }
} }
Map<LevellingData, Integer> levellingData = new HashMap<>();
for (ChunkSnapshot chunkSnapshotList : chunk.getChunkSnapshots()) { for (ChunkSnapshot chunkSnapshotList : chunk.getChunkSnapshots()) {
for (int x = 0; x < 16; x++) { for (int x = 0; x < 16; x++) {
for (int z = 0; z < 16; z++) { for (int z = 0; z < 16; z++) {
@ -114,23 +106,8 @@ public class LevellingManager {
blockData = (int) getBlockTypeDataMethod.invoke(chunkSnapshotList, x, y, z); blockData = (int) getBlockTypeDataMethod.invoke(chunkSnapshotList, x, y, z);
} }
if (blockMaterial == org.bukkit.Material.AIR) continue; if (blockMaterial == org.bukkit.Material.AIR)
for (Material materialList : materialStorage) {
if (materialList == null) continue;
ItemStack is;
try {
is = materialList.getItemStack();
} catch (Exception ignored) {
continue; continue;
}
if (blockMaterial != materialList.getItemStack().getType()) continue;
if (NMSVersion < 13) {
if (blockData != is.getData().getData()) {
continue;
}
}
int amount = 1; int amount = 1;
if (blockMaterial == Materials.SPAWNER.parseMaterial() if (blockMaterial == Materials.SPAWNER.parseMaterial()
@ -152,13 +129,10 @@ public class LevellingManager {
} }
} }
if (materials.containsKey(materialList.getMaterials().name())) { LevellingData data = new LevellingData(blockMaterial, (byte)blockData);
materials.put(materialList.getMaterials().name(), Integer totalAmountInteger = levellingData.get(data);
materials.get(materialList.getMaterials().name()) + amount); int totalAmount = totalAmountInteger == null ? amount : totalAmountInteger + amount;
} else { levellingData.put(data, totalAmount);
materials.put(materialList.getMaterials().name(), amount);
}
}
} catch (IllegalAccessException | IllegalArgumentException } catch (IllegalAccessException | IllegalArgumentException
| InvocationTargetException | NoSuchMethodException | SecurityException e) { | InvocationTargetException | NoSuchMethodException | SecurityException e) {
e.printStackTrace(); e.printStackTrace();
@ -168,6 +142,12 @@ public class LevellingManager {
} }
} }
Map<String, Integer> materials = new HashMap<>();
for (LevellingData data : levellingData.keySet()) {
int amount = levellingData.get(data);
materials.put(data.getMaterials().name(), amount);
}
if (materials.size() == 0) { if (materials.size() == 0) {
if (player != null) { if (player != null) {
skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager() skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager()
@ -218,15 +198,15 @@ public class LevellingManager {
} }
public void addMaterial(Materials materials, int points) { public void addMaterial(Materials materials, int points) {
materialStorage.add(new Material(materials, points)); materialStorage.add(new LevellingMaterial(materials, points));
} }
public void removeMaterial(Material material) { public void removeMaterial(LevellingMaterial material) {
materialStorage.remove(material); materialStorage.remove(material);
} }
public boolean containsMaterial(Materials materials) { public boolean containsMaterial(Materials materials) {
for (Material materialList : materialStorage) { for (LevellingMaterial materialList : materialStorage) {
if (materialList.getMaterials().name().equals(materials.name())) { if (materialList.getMaterials().name().equals(materials.name())) {
return true; return true;
} }
@ -235,8 +215,8 @@ public class LevellingManager {
return false; return false;
} }
public Material getMaterial(Materials materials) { public LevellingMaterial getMaterial(Materials materials) {
for (Material materialList : materialStorage) { for (LevellingMaterial materialList : materialStorage) {
if (materialList.getMaterials().name().equals(materials.name())) { if (materialList.getMaterials().name().equals(materials.name())) {
return materialList; return materialList;
} }
@ -245,7 +225,40 @@ public class LevellingManager {
return null; return null;
} }
public List<Material> getMaterials() { public List<LevellingMaterial> getMaterials() {
return materialStorage; return materialStorage;
} }
private class LevellingData {
private final Material material;
private final byte data;
private LevellingData(Material material, byte data) {
this.material = material;
this.data = data;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof LevellingData)) return false;
LevellingData data = (LevellingData)obj;
if (this == obj) return true;
return this.material == data.material && this.data == data.data;
}
@Override
public int hashCode() {
return Objects.hash(this.material, this.data);
}
private Materials getMaterials() {
if (NMSUtil.getVersionNumber() > 12) {
try {
return Materials.fromString(material.name());
} catch (Exception ignored) {}
}
return Materials.getMaterials(this.material, this.data);
}
}
} }

View File

@ -4,12 +4,12 @@ import org.bukkit.inventory.ItemStack;
import me.goodandevil.skyblock.utils.version.Materials; import me.goodandevil.skyblock.utils.version.Materials;
public class Material { public class LevellingMaterial {
private Materials materials; private Materials materials;
private int points; private int points;
public Material(Materials materials, int points) { public LevellingMaterial(Materials materials, int points) {
this.materials = materials; this.materials = materials;
this.points = points; this.points = points;
} }

View File

@ -2,6 +2,7 @@ package me.goodandevil.skyblock.menus;
import java.io.File; import java.io.File;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.commons.lang3.text.WordUtils; import org.apache.commons.lang3.text.WordUtils;
@ -193,9 +194,10 @@ public class Levelling {
IslandLevel level = island.getLevel(); IslandLevel level = island.getLevel();
Map<String, Integer> testIslandMaterials = level.getMaterials(); Map<String, Integer> testIslandMaterials = level.getMaterials();
Map<String, Integer> islandMaterials = new HashMap<>(); Map<String, Integer> islandMaterials = level.getMaterials();
Config mainConfig = fileManager.getConfig(new File(skyblock.getDataFolder(), "levelling.yml")); Config mainConfig = fileManager.getConfig(new File(skyblock.getDataFolder(), "levelling.yml"));
Config settingsConfig = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml"));
// Filter out ItemStacks that can't be displayed in the inventory // Filter out ItemStacks that can't be displayed in the inventory
Inventory testInventory = Bukkit.createInventory(null, 9); Inventory testInventory = Bukkit.createInventory(null, 9);
@ -207,7 +209,7 @@ public class Levelling {
Materials materials = Materials.fromString(materialName); Materials materials = Materials.fromString(materialName);
ItemStack is = materials.parseItem(); ItemStack is = materials.parseItem();
is.setAmount(testIslandMaterials.get(materialName)); is.setAmount(Math.min(testIslandMaterials.get(materialName), 64));
is.setType(MaterialUtil.correctMaterial(is.getType())); is.setType(MaterialUtil.correctMaterial(is.getType()));
if (is == null || is.getItemMeta() == null) continue; if (is == null || is.getItemMeta() == null) continue;
@ -270,27 +272,30 @@ public class Levelling {
if (materials != null) { if (materials != null) {
int materialAmount = islandMaterials.get(material); int materialAmount = islandMaterials.get(material);
if (mainConfig.getFileConfiguration() if (mainConfig.getFileConfiguration().getString("Materials." + material + ".Points") != null) {
.getString("Materials." + material + ".Points") != null) { int pointsMultiplier = mainConfig.getFileConfiguration().getInt("Materials." + material + ".Points");
int pointsRequired = mainConfig.getFileConfiguration()
.getInt("Materials." + material + ".Points");
if (pointsRequired != 0) { if (settingsConfig.getFileConfiguration().getBoolean("Island.Levelling.IncludeEmptyPointsInList") || pointsMultiplier != 0) {
inventorySlot++; inventorySlot++;
int pointsEarned = materialAmount * pointsRequired; int pointsEarned = materialAmount * pointsMultiplier;
ItemStack is = materials.parseItem(); ItemStack is = materials.parseItem();
is.setAmount(materialAmount); is.setAmount(materialAmount);
is.setType(MaterialUtil.correctMaterial(is.getType())); is.setType(MaterialUtil.correctMaterial(is.getType()));
System.out.println(MaterialUtil.correctMaterial(is.getType()).name() + " | " + material);
List<String> lore = configLoad.getStringList("Menu.Levelling.Item.Material.Lore");
lore.replaceAll(x -> x.replace("%blocks", NumberUtil.formatNumberByDecimal(materialAmount)));
nInv.addItem(nInv.createItem(is, configLoad nInv.addItem(nInv.createItem(is, configLoad
.getString("Menu.Levelling.Item.Material.Displayname") .getString("Menu.Levelling.Item.Material.Displayname")
.replace("%points", NumberUtil.formatNumberByDecimal(pointsEarned)) .replace("%points", NumberUtil.formatNumberByDecimal(pointsEarned))
.replace("%material", .replace("%material",
WordUtils.capitalize(material.toLowerCase().replace("_", " ") WordUtils.capitalize(material.toLowerCase().replace("_", " ")
.replace("item", "").replace("block", ""))), .replace("item", "").replace("block", ""))),
null, null, null, null), inventorySlot); lore, null, null, null), inventorySlot);
} }
} }
} }

View File

@ -5,6 +5,7 @@ import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import me.goodandevil.skyblock.levelling.LevellingMaterial;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
@ -56,7 +57,7 @@ public class Levelling implements Listener {
PlayerData playerData = skyblock.getPlayerDataManager().getPlayerData(player); PlayerData playerData = skyblock.getPlayerDataManager().getPlayerData(player);
List<me.goodandevil.skyblock.levelling.Material> levellingMaterials = levellingManager.getMaterials(); List<LevellingMaterial> levellingMaterials = levellingManager.getMaterials();
// Filter out materials that won't be displayed in the GUI properly // Filter out materials that won't be displayed in the GUI properly
Inventory testInventory = Bukkit.createInventory(null, 9); Inventory testInventory = Bukkit.createInventory(null, 9);
@ -121,7 +122,7 @@ public class Levelling implements Listener {
if (levellingMaterials.size() > index) { if (levellingMaterials.size() > index) {
inventorySlot++; inventorySlot++;
me.goodandevil.skyblock.levelling.Material material = levellingMaterials.get(index); LevellingMaterial material = levellingMaterials.get(index);
nInv.addItem( nInv.addItem(
nInv.createItem( nInv.createItem(
new ItemStack(MaterialUtil.correctMaterial(material.getItemStack().getType()), 1, new ItemStack(MaterialUtil.correctMaterial(material.getItemStack().getType()), 1,
@ -311,7 +312,7 @@ public class Levelling implements Listener {
} }
if (is.hasItemMeta() && is.getItemMeta().hasDisplayName()) { if (is.hasItemMeta() && is.getItemMeta().hasDisplayName()) {
for (me.goodandevil.skyblock.levelling.Material materialList : levellingManager.getMaterials()) { for (LevellingMaterial materialList : levellingManager.getMaterials()) {
Materials materials = materialList.getMaterials(); Materials materials = materialList.getMaterials();
if (event.getCurrentItem().getType() == MaterialUtil.correctMaterial(materials.parseMaterial()) if (event.getCurrentItem().getType() == MaterialUtil.correctMaterial(materials.parseMaterial())

View File

@ -23,6 +23,8 @@ public class MaterialUtil {
material = Material.TRIPWIRE_HOOK; material = Material.TRIPWIRE_HOOK;
} else if (material == Material.FLOWER_POT) { } else if (material == Material.FLOWER_POT) {
material = Materials.LEGACY_FLOWER_POT_ITEM.getPostMaterial(); material = Materials.LEGACY_FLOWER_POT_ITEM.getPostMaterial();
} else if (material.name().startsWith("POTTED_")) {
material = Material.FLOWER_POT;
} else if (material == Materials.LEGACY_IRON_DOOR_BLOCK.getPostMaterial()) { } else if (material == Materials.LEGACY_IRON_DOOR_BLOCK.getPostMaterial()) {
material = Material.IRON_DOOR; material = Material.IRON_DOOR;
} else if (material == Material.CAULDRON) { } else if (material == Material.CAULDRON) {

View File

@ -162,6 +162,8 @@ Island:
# time cycle or be fixed. # time cycle or be fixed.
Cycle: false Cycle: false
Levelling: Levelling:
# Include Points: 0 in the '/is level' GUI
IncludeEmptyPointsInList: true
# Island Level Points divided by value # Island Level Points divided by value
Division: 100 Division: 100
Cooldown: Cooldown:

View File

@ -1842,6 +1842,8 @@ Menu:
Displayname: "&c&oNothing to see here..." Displayname: "&c&oNothing to see here..."
Material: Material:
Displayname: "&7%material &8(&e+%points Points&8)" Displayname: "&7%material &8(&e+%points Points&8)"
Lore:
- "&8(&e%blocks Blocks&8)"
Settings: Settings:
Categories: Categories:
Title: "&8Settings - Categories" Title: "&8Settings - Categories"