Skip to content

Commit

Permalink
add: ChestUI
Browse files Browse the repository at this point in the history
misc: Exclude slf4j from Java-WebSocket
  • Loading branch information
MATRIX-feather committed Sep 15, 2024
1 parent 9af1e9c commit eb96129
Show file tree
Hide file tree
Showing 8 changed files with 467 additions and 6 deletions.
10 changes: 7 additions & 3 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,13 @@ repositories {
includeGroup("com.ticxo.modelengine")
}
}
/*

maven {
url = uri("https://repo.minebench.de")
content {
includeGroup("de.themoep")
}
}*/
}
}

paperweight.reobfArtifactConfiguration = ReobfArtifactConfiguration.MOJANG_PRODUCTION
Expand All @@ -76,8 +76,11 @@ dependencies {
compileOnly("me.clip:placeholderapi:${project.property("papi_version")}")

implementation("org.java-websocket:Java-WebSocket:1.5.7")
{
exclude("org.slf4j")
}

//implementation("de.themoep:inventorygui:1.6.3-SNAPSHOT")
implementation("de.themoep:inventorygui:1.6.3-SNAPSHOT")

//compileOnly("dev.majek:hexnicks:3.1.1")

Expand Down Expand Up @@ -198,6 +201,7 @@ tasks.shadowJar {
relocate("xiamomc.pluginbase", "xiamomc.morph.shaded.pluginbase")
relocate("org.bstats", "xiamomc.morph.shaded.bstats")
relocate("de.tr7zw.changeme.nbtapi", "xiamomc.morph.shaded.nbtapi")
relocate("de.themoep.inventorygui", "xiamomc.morph.shaded.inventorygui")
}

tasks.withType<JavaCompile>() {
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/xiamomc/morph/MorphPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import xiamomc.morph.misc.NetworkingHelper;
import xiamomc.morph.misc.PlayerOperationSimulator;
import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
import xiamomc.morph.misc.gui.IconLookup;
import xiamomc.morph.misc.integrations.modelengine.ModelEngineHelper;
import xiamomc.morph.misc.integrations.placeholderapi.PlaceholderIntegration;
import xiamomc.morph.misc.integrations.residence.ResidenceEventProcessor;
Expand Down Expand Up @@ -212,6 +213,9 @@ public void onEnable()

clientHandler.sendReAuth(Bukkit.getOnlinePlayers());
});

//Init GUI IconLookup
IconLookup.instance();
}

@ApiStatus.Internal
Expand Down
9 changes: 8 additions & 1 deletion src/main/java/xiamomc/morph/commands/MorphCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import xiamomc.morph.messages.HelpStrings;
import xiamomc.morph.messages.MessageUtils;
import xiamomc.morph.messages.MorphStrings;
import xiamomc.morph.misc.gui.DisguiseSelectScreenWrapper;
import xiamomc.pluginbase.Annotations.Resolved;
import xiamomc.pluginbase.Command.IPluginCommand;
import xiamomc.pluginbase.Messages.FormattableMessage;
Expand All @@ -35,9 +36,15 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command
}

if (args.length >= 1)
{
morphManager.morph(sender, player, args[0], player.getTargetEntity(5));
}
else
sender.sendMessage(MessageUtils.prefixes(sender, MorphStrings.disguiseNotDefinedString()));
{
var gui = new DisguiseSelectScreenWrapper(player, 0);
gui.show();
//sender.sendMessage(MessageUtils.prefixes(sender, MorphStrings.disguiseNotDefinedString()));
}
}

return true;
Expand Down
31 changes: 31 additions & 0 deletions src/main/java/xiamomc/morph/messages/GuiStrings.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package xiamomc.morph.messages;

import xiamomc.pluginbase.Messages.FormattableMessage;

public class GuiStrings extends AbstractMorphStrings
{
public static FormattableMessage nextPage()
{
return getFormattable(getKey("next_page"), "[Fallback] 下一页");
}

public static FormattableMessage prevPage()
{
return getFormattable(getKey("prev_page"), "[Fallback] 上一页");
}

public static FormattableMessage unDisguise()
{
return getFormattable(getKey("undisguise"), "[Fallback] 取消伪装");
}

public static FormattableMessage selectDisguise()
{
return getFormattable(getKey("title_select_disguise"), "[Fallback] 选择伪装");
}

private static String getKey(String key)
{
return "chestui." + key;
}
}
233 changes: 233 additions & 0 deletions src/main/java/xiamomc/morph/misc/gui/DisguiseSelectScreenWrapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,233 @@
package xiamomc.morph.misc.gui;

import de.themoep.inventorygui.InventoryGui;
import de.themoep.inventorygui.StaticGuiElement;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import xiamomc.morph.MorphManager;
import xiamomc.morph.MorphPluginObject;
import xiamomc.morph.messages.GuiStrings;
import xiamomc.morph.messages.MessageUtils;
import xiamomc.morph.misc.DisguiseMeta;
import xiamomc.pluginbase.Annotations.Resolved;

import java.util.List;

public class DisguiseSelectScreenWrapper extends MorphPluginObject
{
@NotNull
private final InventoryGui gui;

private final Player bindingPlayer;

private final int pageOffset;

private final List<DisguiseMeta> disguises;

private final String playerLocale;

@Resolved(shouldSolveImmediately = true)
private MorphManager manager;

/**
* 获取此GUI的行数
* @return
*/
protected int getRowCount()
{
return 4;
}

/**
* 获取此GUI的最大伪装显示物品承载量
* @return
*/
private int getElementCapacity()
{
// 行数 - 1(Footer)
return ( getRowCount() - 1 ) * 9;
}

/**
* 获取此页面在伪装列表中的起始Index
* @return
*/
private int getStartingIndex()
{
return this.pageOffset * (this.getRowCount() - 1) * 9;
}

public DisguiseSelectScreenWrapper(Player bindingPlayer, int pageOffset)
{
this.disguises = manager.getAvaliableDisguisesFor(bindingPlayer);
this.bindingPlayer = bindingPlayer;
this.pageOffset = pageOffset;
this.playerLocale = MessageUtils.getLocale(bindingPlayer);

this.gui = this.preparePage();
initElements();
}

public void show()
{
this.gui.show(bindingPlayer);
}

private InventoryGui preparePage()
{
var columns = 9;

List<String> rows = new ObjectArrayList<>();
var index = this.getStartingIndex();

StringBuilder builder = new StringBuilder();

// Build element slots
for (int x = 1; x <= this.getRowCount() - 1; x++)
{
for (int y = 1; y <= columns; y++)
{
index++;
builder.append(this.getElementCharAt(index));
}

rows.add(builder.toString());
builder = new StringBuilder();
}

// Build footer slots
var isLast = isLastPage();
var isFirst = this.pageOffset == 0;

builder.append(isFirst ? "x" : "P").append("xxxUxxx").append(isLast ? "x" : "N");
rows.add(builder.toString());

// Build page
var array = rows.toArray(new String[]{});

var page = new InventoryGui(plugin, GuiStrings.selectDisguise().toString(playerLocale), array);

page.setCloseAction(close -> false);

return page;
}

private char getElementCharAt(int index)
{
return (char)(1000 + index);
}

private void initElements()
{
// Fill disguise entries
var endIndex = Math.min(disguises.size(), getStartingIndex() + getElementCapacity() + 1);
for (int index = getStartingIndex(); index < endIndex; index++)
{
var meta = disguises.get(index);
var element = new StaticGuiElement(this.getElementCharAt(index),
IconLookup.instance().lookup(meta.rawIdentifier),
1,
click ->
{
manager.morph(bindingPlayer, bindingPlayer, meta.rawIdentifier, bindingPlayer.getTargetEntity(5));
gui.close();

return true;
},
// They don't seem to support Components... Sad :(
"§r" + PlainTextComponentSerializer.plainText().serialize(meta.asComponent(playerLocale)));

gui.addElement(element);
}

// Fill controls
var borderElement = new StaticGuiElement('x',
new ItemStack(Material.PINK_STAINED_GLASS_PANE),
1,
click -> true,
"§§");

gui.addElement(borderElement);

var prevButton = new StaticGuiElement('P',
new ItemStack(Material.LIME_STAINED_GLASS_PANE),
1,
click ->
{
schedulePrevPage();
return true;
},
"§r" + GuiStrings.prevPage().toString(playerLocale));

gui.addElement(prevButton);

var nextButton = new StaticGuiElement('N',
new ItemStack(Material.LIGHT_BLUE_STAINED_GLASS_PANE),
1,
click ->
{
scheduleNextPage();
return true;
},
"§r" + GuiStrings.nextPage().toString(playerLocale));

gui.addElement(nextButton);

var unDisguiseButton = new StaticGuiElement('U',
new ItemStack(Material.RED_STAINED_GLASS_PANE),
1,
click ->
{
manager.unMorph(bindingPlayer);
this.gui.close();
return true;
},
"§r" + GuiStrings.unDisguise().toString(playerLocale));

gui.addElement(unDisguiseButton);
}

private boolean isLastPage()
{
return (this.getStartingIndex() + this.getElementCapacity()) > disguises.size();
}

@Nullable
private Runnable scheduledAction;

private void scheduleNextPage()
{
if (isLastPage()) return;

if (scheduledAction != null) return;

scheduledAction = () ->
{
var next = new DisguiseSelectScreenWrapper(bindingPlayer, this.pageOffset + 1);
next.show();
};

this.addSchedule(scheduledAction);
}

private void schedulePrevPage()
{
if (this.pageOffset == 0) return;

if (scheduledAction != null) return;

scheduledAction = () ->
{
var next = new DisguiseSelectScreenWrapper(bindingPlayer, this.pageOffset - 1);
next.show();
};

this.addSchedule(scheduledAction);
}
}
Loading

0 comments on commit eb96129

Please sign in to comment.