Add functions to the GUI.

This commit is contained in:
Len 2024-02-11 14:34:56 +01:00
parent 52d8178e28
commit 4701b019d7
7 changed files with 209 additions and 26 deletions

View File

@ -20,7 +20,21 @@ public class MessageConfiguration implements Configuration {
SetHome setHome = new SetHome(); SetHome setHome = new SetHome();
@ConfigSerializable @Getter @ConfigSerializable @Getter
public static class SetHome { public static class SetHome {
String homeSet = "You have set your island home to your current location.";
}
CobbeGen cobbeGen = new CobbeGen();
@ConfigSerializable @Getter
public static class CobbeGen {
String requiredLevel = "You must reach <islandlevel> before upgrading to the next cobblestone generation level.";
String upgraded = "Your cobblestone generation is now level <level>.";
}
Level level = new Level();
@ConfigSerializable @Getter
public static class Level {
String requiredXp = "You need <requiredxp> to level up your island.";
String upgraded = "Your island has leveled up!";
} }
} }

View File

@ -3,6 +3,8 @@ package com.alttd.cometskyblock.gui;
import com.alttd.cometskyblock.island.Island; import com.alttd.cometskyblock.island.Island;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
@ -106,7 +108,7 @@ public abstract class GUIInventory implements GUI, InventoryHolder {
for (int i = 0; i < 9; ++i) { for (int i = 0; i < 9; ++i) {
addButton(i, createMenuButton(Material.BLACK_STAINED_GLASS_PANE, "", new ArrayList<>(), event -> {})); addButton(i, createMenuButton(Material.BLACK_STAINED_GLASS_PANE, "", new ArrayList<>(), event -> {}));
} }
addButton(5, createIslandMenuButton(island.owner(), event -> {})); addButton(4, createIslandMenuButton(island.owner(), event -> {}));
} }
public void open(Player player) { public void open(Player player) {
@ -173,10 +175,13 @@ public abstract class GUIInventory implements GUI, InventoryHolder {
SkullMeta meta = (SkullMeta) skull.getItemMeta(); SkullMeta meta = (SkullMeta) skull.getItemMeta();
meta.setPlayerProfile(offlinePlayer.getPlayerProfile()); meta.setPlayerProfile(offlinePlayer.getPlayerProfile());
var placeholders = TagResolver.resolver(
Placeholder.unparsed("islandlevel", island.level() + ""),
Placeholder.unparsed("islandmembers", island.members().size() + "")
);
List<Component> metaLore = new ArrayList<>(); List<Component> metaLore = new ArrayList<>();
for (String loreString : List.of("Island Level : <islandlevel>", "Members: <islandmembers>", "")) { for (String loreString : List.of("Island Level : <gold><islandlevel>", "Members: <gold><islandmembers>", "")) {
metaLore.add(MiniMessage.miniMessage().deserialize(loreString)); metaLore.add(MiniMessage.miniMessage().deserialize(loreString, placeholders));
} }
meta.lore(metaLore); meta.lore(metaLore);

View File

@ -37,7 +37,10 @@ public class MembersGUI extends GUIInventory {
int startIndex = pageIndex * 45; int startIndex = pageIndex * 45;
for (int i = startIndex; i < island.members().size(); i++) { for (int i = startIndex; i < island.members().size(); i++) {
GUIButton guiButton = createPlayerHeadMenuButton(island.members().get(i), event -> {}); GUIButton guiButton = createPlayerHeadMenuButton(island.members().get(i), event -> {
// TODO - show last online, some player info
// Island owner can kick from gui
});
if (!addItem(guiButton)) { if (!addItem(guiButton)) {
createNextPageButton(player); createNextPageButton(player);
break; break;

View File

@ -47,6 +47,7 @@ public class SettingsGUI extends GUIInventory {
return; return;
} }
player.getWorld().setSpawnLocation(player.getLocation()); player.getWorld().setSpawnLocation(player.getLocation());
player.sendRichMessage(islandMessages.setHome().homeSet());
})); }));
super.decorate(player); super.decorate(player);
} }

View File

@ -1,9 +1,13 @@
package com.alttd.cometskyblock.island.gui; package com.alttd.cometskyblock.island.gui;
import com.alttd.cometskyblock.CometSkyBlockPlugin; import com.alttd.cometskyblock.CometSkyBlockPlugin;
import com.alttd.cometskyblock.configuration.MessageConfiguration;
import com.alttd.cometskyblock.gui.GUIInventory; import com.alttd.cometskyblock.gui.GUIInventory;
import com.alttd.cometskyblock.island.CobblestoneGeneratorLevel;
import com.alttd.cometskyblock.island.Island; import com.alttd.cometskyblock.island.Island;
import com.alttd.cometskyblock.util.Experience;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
@ -12,6 +16,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
public class UpgradesGUI extends GUIInventory { public class UpgradesGUI extends GUIInventory {
@ -27,6 +32,7 @@ public class UpgradesGUI extends GUIInventory {
@Override @Override
public void decorate(Player player) { public void decorate(Player player) {
makeMenuBar(); makeMenuBar();
MessageConfiguration.Island islandMessages = CometSkyBlockPlugin.instance().messagesConfiguration().get().island();
// Todo - move to handlers, add costs, validation ... // Todo - move to handlers, add costs, validation ...
// WorldBorder // WorldBorder
addButton(10, createMenuButton(Material.GRASS_BLOCK, "Expand The world border", new ArrayList<>(), event -> { addButton(10, createMenuButton(Material.GRASS_BLOCK, "Expand The world border", new ArrayList<>(), event -> {
@ -40,12 +46,50 @@ public class UpgradesGUI extends GUIInventory {
})); }));
// Cobble Gen // Cobble Gen
addButton(11, createMenuButton(Material.COBBLESTONE, "Upgrade your cobble stone generator", new ArrayList<>(), event -> { addButton(11, createMenuButton(Material.COBBLESTONE, "Upgrade your cobble stone generator", new ArrayList<>(), event -> {
int requiredIslandLevel = getRequiredIslandLevel(island.cobblegenLevel() + 1);
if (island.level() < requiredIslandLevel) {
player.sendRichMessage(islandMessages.cobbeGen().requiredLevel(), Placeholder.parsed("islandlevel", "<gold>" + requiredIslandLevel + "</gold>"));
return;
}
island.cobblegenLevel(island.cobblegenLevel() + 1); island.cobblegenLevel(island.cobblegenLevel() + 1);
player.sendRichMessage(islandMessages.cobbeGen().upgraded(), Placeholder.parsed("level", "<gold>" + island.cobblegenLevel() + "</gold>"));
})); }));
// Level // Level
addButton(12, createMenuButton(Material.ENCHANTING_TABLE, "Increase your island level", new ArrayList<>(), event -> {})); addButton(12, createMenuButton(Material.EXPERIENCE_BOTTLE, "Increase your island level", List.of(
"<white>Use your experience to upgrade your island level.",
"",
"<white><gold>" + Experience.getExpToNextIslandLevel(island.level()) + "</gold> experience required to level up!"
),event -> {
int xp = Experience.getExpToNextIslandLevel(island.level());
if (player.getTotalExperience() < xp) {
player.sendRichMessage(islandMessages.level().requiredXp(), Placeholder.parsed("requiredxp", "<gold>" + xp + "</gold>"));
return;
}
Experience.changeExp(player, player.getTotalExperience() - xp);
}));
// Difficulty // Difficulty
super.decorate(player); super.decorate(player);
} }
Integer getRequiredIslandLevel(int generatorLevel) {
CobblestoneGeneratorLevel level = getLevel(generatorLevel);
return level != null ? level.islandLevel() : 0;
}
CobblestoneGeneratorLevel getLevel(int generatorLevel) {
if (generatorLevel == 0) {
return null;
}
CometSkyBlockPlugin plugin = CometSkyBlockPlugin.instance();
if (plugin.cobblestoneGeneratorConfiguration().get().levels().size() < generatorLevel) {
return getLevel(generatorLevel - 1);
}
for (CobblestoneGeneratorLevel level : plugin.cobblestoneGeneratorConfiguration().get().levels()) {
if (level.level() == generatorLevel) {
return level;
}
}
return null;
}
} }

View File

@ -69,26 +69,6 @@ public class CobbestoneGeneratorListener implements Listener {
return Material.COBBLESTONE; return Material.COBBLESTONE;
} }
Integer getRequiredIslandLevel(int generatorLevel) {
CobblestoneGeneratorLevel level = getLevel(generatorLevel);
return level != null ? level.islandLevel() : 0;
}
CobblestoneGeneratorLevel getLevel(int generatorLevel) {
if (generatorLevel == 0) {
return null;
}
if (plugin.cobblestoneGeneratorConfiguration().get().levels().size() < generatorLevel) {
return getLevel(generatorLevel - 1);
}
for (CobblestoneGeneratorLevel level : plugin.cobblestoneGeneratorConfiguration().get().levels()) {
if (level.level() == generatorLevel) {
return level;
}
}
return null;
}
boolean relativeEqualsMaterial(Block block, Material material) { boolean relativeEqualsMaterial(Block block, Material material) {
return block.getRelative(BlockFace.NORTH).getType().equals(material) return block.getRelative(BlockFace.NORTH).getType().equals(material)
|| block.getRelative(BlockFace.EAST).getType().equals(material) || block.getRelative(BlockFace.EAST).getType().equals(material)

View File

@ -0,0 +1,136 @@
package com.alttd.cometskyblock.util;
import org.bukkit.entity.Player;
/**
* Based on gist
* <a href="https://gist.github.com/Jikoo/30ec040443a4701b8980">A utility for managing player experience.</a>
*/
public final class Experience {
/**
* Calculate a player's total experience based on level and progress to next.
*
* @param player the Player
* @return the amount of experience the Player has
*
* @see <a href=http://minecraft.gamepedia.com/Experience#Leveling_up>Experience#Leveling_up</a>
*/
public static int getExp(Player player) {
return getExpFromLevel(player.getLevel())
+ Math.round(getExpToNext(player.getLevel()) * player.getExp());
}
/**
* Calculate total experience based on level.
*
* @param level the level
* @return the total experience calculated
*
* @see <a href=http://minecraft.gamepedia.com/Experience#Leveling_up>Experience#Leveling_up</a>
*/
public static int getExpFromLevel(int level) {
if (level > 30) {
return (int) (4.5 * level * level - 162.5 * level + 2220);
}
if (level > 15) {
return (int) (2.5 * level * level - 40.5 * level + 360);
}
return level * level + 6 * level;
}
/**
* Calculate level (including progress to next level) based on total experience.
*
* @param exp the total experience
* @return the level calculated
*/
public static double getLevelFromExp(long exp) {
int level = getIntLevelFromExp(exp);
// Get remaining exp progressing towards next level. Cast to float for next bit of math.
float remainder = exp - (float) getExpFromLevel(level);
// Get level progress with float precision.
float progress = remainder / getExpToNext(level);
// Slap both numbers together and call it a day. While it shouldn't be possible for progress
// to be an invalid value (value < 0 || 1 <= value)
return ((double) level) + progress;
}
/**
* Calculate level based on total experience.
*
* @param exp the total experience
* @return the level calculated
*/
public static int getIntLevelFromExp(long exp) {
if (exp > 1395) {
return (int) ((Math.sqrt(72 * exp - 54215D) + 325) / 18);
}
if (exp > 315) {
return (int) (Math.sqrt(40 * exp - 7839D) / 10 + 8.1);
}
if (exp > 0) {
return (int) (Math.sqrt(exp + 9D) - 3);
}
return 0;
}
/**
* Get the total amount of experience required to progress to the next level.
*
* @param level the current level
*
* @see <a href=http://minecraft.gamepedia.com/Experience#Leveling_up>Experience#Leveling_up</a>
*/
private static int getExpToNext(int level) {
if (level >= 30) {
// Simplified formula. Internal: 112 + (level - 30) * 9
return level * 9 - 158;
}
if (level >= 15) {
// Simplified formula. Internal: 37 + (level - 15) * 5
return level * 5 - 38;
}
// Internal: 7 + level * 2
return level * 2 + 7;
}
/**
* Change a Player's experience.
*
* <p>This method is preferred over {@link Player#giveExp(int)}.
* <br>In older versions the method does not take differences in exp per level into account.
* This leads to overlevelling when granting players large amounts of experience.
* <br>In modern versions, while differing amounts of experience per level are accounted for, the
* approach used is loop-heavy and requires an excessive number of calculations, which makes it
* quite slow.
*
* @param player the Player affected
* @param exp the amount of experience to add or remove
*/
public static void changeExp(Player player, int exp) {
exp += getExp(player);
if (exp < 0) {
exp = 0;
}
double levelAndExp = getLevelFromExp(exp);
int level = (int) levelAndExp;
player.setLevel(level);
player.setExp((float) (levelAndExp - level));
}
public static int getExpToNextIslandLevel(int level) {
if (level <= 15) {
return 2 * level + 7;
} else if (level <= 30) {
return 5 * level - 38;
} else {
return 9 * level - 158;
}
}
}