Skip to content

Commit

Permalink
Better entity data handling:
Browse files Browse the repository at this point in the history
 - This allows to reset entities to nbt states before the minigame had started (but recording changes is not implemented yet)
 - enables SpawnEntityAction to finally work properly
To make the changes above possible, I changed how MenuItems accept user input. Now it will only close, if the user inputs the right data and ignore everything else.
Update gradle
  • Loading branch information
FireInstall committed Nov 12, 2024
1 parent f47055c commit 4c368ec
Show file tree
Hide file tree
Showing 39 changed files with 537 additions and 624 deletions.
28 changes: 23 additions & 5 deletions Minigames/src/main/java/au/com/mineauz/minigames/Events.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
import au.com.mineauz.minigames.managers.language.MinigamePlaceHolderKey;
import au.com.mineauz.minigames.managers.language.langkeys.MgMiscLangKey;
import au.com.mineauz.minigames.menu.MenuItem;
import au.com.mineauz.minigames.menu.consumer.BlockDataConsumer;
import au.com.mineauz.minigames.menu.consumer.EntityConsumer;
import au.com.mineauz.minigames.menu.consumer.StringConsumer;
import au.com.mineauz.minigames.minigame.Minigame;
import au.com.mineauz.minigames.minigame.MinigameState;
import au.com.mineauz.minigames.minigame.Team;
Expand Down Expand Up @@ -258,19 +261,34 @@ private void onPlayerConnect(final @NotNull PlayerJoinEvent event) {
}

@EventHandler
public void playerInteract(@NotNull PlayerInteractEvent event) {
private void player(@NotNull EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Player player) {
final MinigamePlayer mgPlayer = pdata.getMinigamePlayer(player);

if (mgPlayer.isInMenu() && mgPlayer.getNoClose() && mgPlayer.getManualEntry() instanceof EntityConsumer entityConsumer) {
event.setCancelled(true);
mgPlayer.setNoClose(false);
mgPlayer.setNoClose(false);
entityConsumer.acceptEntity(event.getEntity());
mgPlayer.setManualEntry(null);
}
}
}

@EventHandler
private void playerInteract(@NotNull PlayerInteractEvent event) {
MinigamePlayer mgPlayer = pdata.getMinigamePlayer(event.getPlayer());

if (mgPlayer.isInMinigame() && !mgPlayer.canInteract()) {
event.setCancelled(true);
return;
}
if (mgPlayer.isInMenu() && mgPlayer.getNoClose() && mgPlayer.getManualEntry() != null) {
if (mgPlayer.isInMenu() && mgPlayer.getNoClose() && mgPlayer.getManualEntry() instanceof BlockDataConsumer blockDataConsumer) {
event.setCancelled(true);
mgPlayer.setNoClose(false);
if (event.getClickedBlock() != null) {
mgPlayer.setNoClose(false);
mgPlayer.getManualEntry().checkValidEntry(event.getClickedBlock().getBlockData().getAsString());
blockDataConsumer.acceptBlockData(event.getClickedBlock().getBlockData());
mgPlayer.setManualEntry(null);
}
return;
Expand Down Expand Up @@ -742,10 +760,10 @@ private void closeMenu(@NotNull InventoryCloseEvent event) {
@EventHandler
private void manualItemEntry(@NotNull AsyncPlayerChatEvent event) {
MinigamePlayer mgPlayer = pdata.getMinigamePlayer(event.getPlayer());
if (mgPlayer.isInMenu() && mgPlayer.getNoClose() && mgPlayer.getManualEntry() != null) {
if (mgPlayer.isInMenu() && mgPlayer.getNoClose() && mgPlayer.getManualEntry() instanceof StringConsumer stringAcceptor) {
event.setCancelled(true);
mgPlayer.setNoClose(false);
mgPlayer.getManualEntry().checkValidEntry(event.getMessage());
stringAcceptor.acceptString(event.getMessage());
mgPlayer.setManualEntry(null);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import au.com.mineauz.minigames.Minigames;
import au.com.mineauz.minigames.menu.Callback;
import au.com.mineauz.minigames.menu.MenuItem;
import au.com.mineauz.minigames.menu.MenuItemMaterial;
import net.kyori.adventure.text.Component;
import org.bukkit.Material;
Expand Down Expand Up @@ -52,7 +51,7 @@ public void loadValue(@NotNull Configuration config, @NotNull String path) {

@Deprecated
@Override
public @NotNull MenuItem getMenuItem(@Nullable Material displayMat, @Nullable Component name) {
public @NotNull MenuItemMaterial getMenuItem(@Nullable Material displayMat, @Nullable Component name) {
return getMenuItem(displayMat, name, null);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import org.intellij.lang.annotations.Subst;

public enum MinigamePlaceHolderKey implements PlaceHolderKey {
ENTITY("entity"),
BIOME("biome"),
COMMAND("command"),
COORDINATE_X("x"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,10 +270,6 @@ public ItemStack onDoubleClick() {
return getDisplayItem();
}

public void checkValidEntry(String entry) {
//Do Stuff
}

public @Nullable Menu getContainer() {
return container;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import au.com.mineauz.minigames.managers.language.MinigamePlaceHolderKey;
import au.com.mineauz.minigames.managers.language.langkeys.MgMenuLangKey;
import au.com.mineauz.minigames.managers.language.langkeys.MinigameLangKey;
import au.com.mineauz.minigames.menu.consumer.StringConsumer;
import au.com.mineauz.minigames.minigame.Minigame;
import au.com.mineauz.minigames.objects.MinigamePlayer;
import net.kyori.adventure.text.Component;
Expand All @@ -18,7 +19,7 @@
import java.time.Duration;
import java.util.List;

public class MenuItemAddFlag extends MenuItem {
public class MenuItemAddFlag extends MenuItem implements StringConsumer {
private final @NotNull Minigame mgm;

public MenuItemAddFlag(@Nullable Material displayMat, @NotNull MinigameLangKey langKey, @NotNull Minigame mgm) {
Expand Down Expand Up @@ -54,9 +55,9 @@ public MenuItemAddFlag(@Nullable Material displayMat, @Nullable Component name,
}

@Override
public void checkValidEntry(@NotNull String entry) {
mgm.addSinglePlayerFlag(entry);
getContainer().addItem(new MenuItemFlag(Material.OAK_SIGN, entry, mgm.getSinglePlayerFlags()));
public void acceptString(@NotNull String string) {
mgm.addSinglePlayerFlag(string);
getContainer().addItem(new MenuItemFlag(Material.OAK_SIGN, string, mgm.getSinglePlayerFlags()));

getContainer().cancelReopenTimer();
getContainer().displayMenu(getContainer().getViewer());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import au.com.mineauz.minigames.managers.language.langkeys.MgMenuLangKey;
import au.com.mineauz.minigames.managers.language.langkeys.MgMiscLangKey;
import au.com.mineauz.minigames.managers.language.langkeys.MinigameLangKey;
import au.com.mineauz.minigames.menu.consumer.StringConsumer;
import au.com.mineauz.minigames.minigame.Team;
import au.com.mineauz.minigames.minigame.TeamColor;
import au.com.mineauz.minigames.minigame.modules.TeamsModule;
Expand All @@ -20,7 +21,7 @@
import java.util.ArrayList;
import java.util.List;

public class MenuItemAddTeam extends MenuItem {
public class MenuItemAddTeam extends MenuItem implements StringConsumer {
private final @NotNull TeamsModule tm;

public MenuItemAddTeam(@NotNull Component name, @NotNull TeamsModule tm) {
Expand Down Expand Up @@ -49,7 +50,7 @@ public MenuItemAddTeam(@NotNull MinigameLangKey name, @NotNull TeamsModule tm) {


@Override
public void checkValidEntry(@NotNull String entry) {
public void acceptString(@NotNull String entry) {
TeamColor col = TeamColor.matchColor(entry.toUpperCase().replace(" ", "_"));
if (col != null) {
if (!tm.hasTeam(col)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,22 @@
import au.com.mineauz.minigames.managers.language.langkeys.MgCommandLangKey;
import au.com.mineauz.minigames.managers.language.langkeys.MgMenuLangKey;
import au.com.mineauz.minigames.managers.language.langkeys.MinigameLangKey;
import au.com.mineauz.minigames.menu.consumer.BlockDataConsumer;
import au.com.mineauz.minigames.menu.consumer.MaterialConsumer;
import au.com.mineauz.minigames.menu.consumer.StringConsumer;
import au.com.mineauz.minigames.objects.MinigamePlayer;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.time.Duration;
import java.util.List;

public class MenuItemAddWhitelistBlock extends MenuItem {
public class MenuItemAddWhitelistBlock extends MenuItem implements StringConsumer, BlockDataConsumer, MaterialConsumer {
protected final @NotNull List<@NotNull Material> whitelist;

public MenuItemAddWhitelistBlock(@NotNull MinigameLangKey langKey, @NotNull List<@NotNull Material> whitelist) {
Expand Down Expand Up @@ -58,35 +61,41 @@ public MenuItemAddWhitelistBlock(@NotNull Component name, @NotNull List<@NotNull
}

@Override
public void checkValidEntry(@NotNull String entry) {
// try a direct match in case of a chat input
Material mat = Material.matchMaterial(entry);

if (mat == null) {
// didn't work, now try the input as a block data, as we get when a block was clicked
try {
mat = Bukkit.createBlockData(entry).getMaterial();
} catch (IllegalArgumentException ignored) {
}
}
public void acceptBlockData(@NotNull BlockData data) {
acceptMaterial(data.getMaterial());
}

@Override
public void acceptString(@NotNull String string) {
final @Nullable Material mat = Material.matchMaterial(string);

if (mat != null) {
if (!whitelist.contains(mat)) {
// intern
whitelist.add(mat);

// visual
getContainer().addItem(new MenuItemWhitelistBlock(mat, whitelist));
} else {
MinigameMessageManager.sendMgMessage(getContainer().getViewer(), MinigameMessageType.ERROR, MgMenuLangKey.MENU_WHITELIST_ERROR_CONTAINS);
}
acceptMaterial(mat);
} else {
// still didn't work.
// didn't work.
getContainer().cancelReopenTimer();
getContainer().displayMenu(getContainer().getViewer());

MinigameMessageManager.sendMgMessage(getContainer().getViewer(), MinigameMessageType.ERROR, MgCommandLangKey.COMMAND_ERROR_NOTMATERIAL,
Placeholder.unparsed(MinigamePlaceHolderKey.TEXT.getKey(), entry));
Placeholder.unparsed(MinigamePlaceHolderKey.TEXT.getKey(), string));

/* cancel automatic reopening and reopen {@link MenuItemDisplayWhitelist}*/
getContainer().cancelReopenTimer();
getContainer().displayMenu(getContainer().getViewer());
}

}

@Override
public void acceptMaterial(@NotNull Material mat) {
if (!whitelist.contains(mat)) {
// intern
whitelist.add(mat);

// visual
getContainer().addItem(new MenuItemWhitelistBlock(mat, whitelist));
} else {
MinigameMessageManager.sendMgMessage(getContainer().getViewer(), MinigameMessageType.ERROR, MgMenuLangKey.MENU_WHITELIST_ERROR_CONTAINS);
}

/* cancel automatic reopening and reopen {@link MenuItemDisplayWhitelist}*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import au.com.mineauz.minigames.managers.language.MinigameMessageType;
import au.com.mineauz.minigames.managers.language.MinigamePlaceHolderKey;
import au.com.mineauz.minigames.managers.language.langkeys.MgMenuLangKey;
import au.com.mineauz.minigames.menu.consumer.BlockDataConsumer;
import au.com.mineauz.minigames.menu.consumer.StringConsumer;
import au.com.mineauz.minigames.objects.MinigamePlayer;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
Expand All @@ -21,7 +23,7 @@
import java.util.ArrayList;
import java.util.List;

public class MenuItemBlockData extends MenuItem {
public class MenuItemBlockData extends MenuItem implements BlockDataConsumer, StringConsumer {
private static final @NotNull String DESCRIPTION_TOKEN = "BlockData_description";
private final @NotNull Callback<BlockData> dataCallback;

Expand Down Expand Up @@ -103,20 +105,24 @@ public void update() {
}

@Override
public void checkValidEntry(@NotNull String entry) {
public void acceptString(@NotNull String string) {
try {
BlockData d = Bukkit.createBlockData(entry);
dataCallback.setValue(d);
setDescriptionPart(DESCRIPTION_TOKEN, createDescription(dataCallback.getValue()));

// update the display item
if (d.getMaterial().isItem()) {
ItemStack stackUpdate = getDisplayItem();
setDisplayItem(stackUpdate.withType(d.getMaterial()));
}
acceptBlockData(Bukkit.createBlockData(string));
} catch (IllegalArgumentException e) {
MinigameMessageManager.sendMessage(getContainer().getViewer(), MinigameMessageType.ERROR, Component.text(e.getLocalizedMessage()));
}
}

@Override
public void acceptBlockData(@NotNull BlockData blockData) {
dataCallback.setValue(blockData);
setDescriptionPart(DESCRIPTION_TOKEN, createDescription(dataCallback.getValue()));

// update the display item
if (blockData.getMaterial().isItem()) {
ItemStack stackUpdate = getDisplayItem();
setDisplayItem(stackUpdate.withType(blockData.getMaterial()));
}

getContainer().cancelReopenTimer();
getContainer().displayMenu(getContainer().getViewer());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import au.com.mineauz.minigames.managers.language.MinigamePlaceHolderKey;
import au.com.mineauz.minigames.managers.language.langkeys.MgMenuLangKey;
import au.com.mineauz.minigames.managers.language.langkeys.MinigameLangKey;
import au.com.mineauz.minigames.menu.consumer.StringConsumer;
import au.com.mineauz.minigames.objects.MinigamePlayer;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
Expand All @@ -18,7 +19,7 @@
import java.time.Duration;
import java.util.List;

public class MenuItemComponent extends MenuItem {
public class MenuItemComponent extends MenuItem implements StringConsumer {
private final static String DESCRIPTION_VALUE_TOKEN = "COMPONENT_VALUE_DESCRIPTION";
private final MiniMessage miniMessage = MiniMessage.miniMessage();
private final @NotNull Callback<Component> component;
Expand Down Expand Up @@ -80,11 +81,11 @@ public void updateDescription() {
}

@Override
public void checkValidEntry(@NotNull String entry) {
if (entry.equals("null") && allowNull) {
public void acceptString(@NotNull String string) {
if (string.equals("null") && allowNull) {
component.setValue(null);
} else {
component.setValue(miniMessage.deserialize(entry));
component.setValue(miniMessage.deserialize(string));
}

updateDescription();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import au.com.mineauz.minigames.managers.language.langkeys.MgCommandLangKey;
import au.com.mineauz.minigames.managers.language.langkeys.MgMenuLangKey;
import au.com.mineauz.minigames.managers.language.langkeys.MinigameLangKey;
import au.com.mineauz.minigames.menu.consumer.StringConsumer;
import au.com.mineauz.minigames.objects.MinigamePlayer;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
Expand All @@ -21,7 +22,7 @@
import java.util.List;
import java.util.regex.Pattern;

public class MenuItemDecimal extends MenuItem {
public class MenuItemDecimal extends MenuItem implements StringConsumer {
private final static String DESCRIPTION_TOKEN = "Decimal_description";
private final static Pattern DOUBLE_PATTERN = Pattern.compile("[+-]?[0-9]+(.[0-9]+)?");

Expand Down Expand Up @@ -144,7 +145,7 @@ public void updateDescription() {
}

@Override
public void checkValidEntry(@NotNull String entry) {
public void acceptString(@NotNull String entry) {
if (DOUBLE_PATTERN.matcher(entry).matches()) {
double entryValue = Double.parseDouble(entry);
if ((min == null || entryValue >= min) && (max == null || entryValue <= max)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import au.com.mineauz.minigames.managers.language.MinigameMessageType;
import au.com.mineauz.minigames.managers.language.MinigamePlaceHolderKey;
import au.com.mineauz.minigames.managers.language.langkeys.MgMenuLangKey;
import au.com.mineauz.minigames.menu.consumer.StringConsumer;
import au.com.mineauz.minigames.minigame.Minigame;
import au.com.mineauz.minigames.minigame.TeamColor;
import au.com.mineauz.minigames.minigame.modules.LoadoutModule;
Expand All @@ -23,7 +24,7 @@
import java.util.ArrayList;
import java.util.List;

public class MenuItemDisplayLoadout extends MenuItem {
public class MenuItemDisplayLoadout extends MenuItem implements StringConsumer {
private final @NotNull PlayerLoadout loadout;
private @Nullable Minigame minigame = null;
private boolean allowDelete = true;
Expand Down Expand Up @@ -179,10 +180,10 @@ public MenuItemDisplayLoadout(@Nullable Material displayMat, @Nullable Component
}

@Override
public void checkValidEntry(@NotNull String entry) {
public void acceptString(@NotNull String string) {
String loadoutName = loadout.getName();

if (entry.equalsIgnoreCase("yes")) {
if (string.equalsIgnoreCase("yes")) {
if (minigame != null) {
LoadoutModule.getMinigameModule(minigame).deleteLoadout(loadoutName);
} else {
Expand Down
Loading

0 comments on commit 4c368ec

Please sign in to comment.