updated to 1.21.10

This commit is contained in:
2025-10-16 22:41:05 +02:00
parent 294d4bde0d
commit 67d0fad071
22 changed files with 120 additions and 131 deletions

View File

@@ -1,5 +1,5 @@
<component name="ProjectCodeStyleConfiguration"> <component name="ProjectCodeStyleConfiguration">
<state> <state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" /> <option name="PREFERRED_PROJECT_CODE_STYLE" value="Minigames" />
</state> </state>
</component> </component>

2
.idea/compiler.xml generated
View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="CompilerConfiguration"> <component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" /> <bytecodeTargetLevel target="25" />
</component> </component>
</project> </project>

2
.idea/misc.xml generated
View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK" /> <component name="ProjectRootManager" version="2" languageLevel="JDK_25" default="true" project-jdk-name="openjdk-25" project-jdk-type="JavaSDK" />
</project> </project>

1
.idea/modules.xml generated
View File

@@ -4,7 +4,6 @@
<modules> <modules>
<module fileurl="file://$PROJECT_DIR$/.idea/modules/Minigames.main.iml" filepath="$PROJECT_DIR$/.idea/modules/Minigames.main.iml" /> <module fileurl="file://$PROJECT_DIR$/.idea/modules/Minigames.main.iml" filepath="$PROJECT_DIR$/.idea/modules/Minigames.main.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/Minigames.test.iml" filepath="$PROJECT_DIR$/.idea/modules/Minigames.test.iml" /> <module fileurl="file://$PROJECT_DIR$/.idea/modules/Minigames.test.iml" filepath="$PROJECT_DIR$/.idea/modules/Minigames.test.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/eu.mhsl.minenet.Minigames.main.iml" filepath="$PROJECT_DIR$/.idea/modules/eu.mhsl.minenet.Minigames.main.iml" />
</modules> </modules>
</component> </component>
</project> </project>

View File

@@ -10,8 +10,4 @@
</configuration> </configuration>
</facet> </facet>
</component> </component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module> </module>

View File

@@ -3,7 +3,7 @@
plugins { plugins {
id 'java' id 'java'
id "com.github.johnrengelman.shadow" version "7.1.0" id "com.github.johnrengelman.shadow" version "8.1.1"
} }
group 'eu.mhsl.minenet' group 'eu.mhsl.minenet'
@@ -35,7 +35,7 @@ allprojects {
java { java {
toolchain { toolchain {
languageVersion = JavaLanguageVersion.of(21) languageVersion = JavaLanguageVersion.of(25)
} }
} }
@@ -44,7 +44,7 @@ dependencies {
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0'
//https://jitpack.io/#Minestom/Minestom //https://jitpack.io/#Minestom/Minestom
implementation 'net.minestom:minestom-snapshots:fd51c8d17a' implementation 'net.minestom:minestom:2025.10.11-1.21.10'
//Tools //Tools
implementation 'de.articdive:jnoise:3.0.2' implementation 'de.articdive:jnoise:3.0.2'
@@ -87,5 +87,5 @@ tasks.register('copyJarToServer', Exec) {
dependsOn shadowJar dependsOn shadowJar
mustRunAfter shadowJar mustRunAfter shadowJar
commandLine 'scp', 'build/libs/Minigames-1.0-SNAPSHOT.jar', 'root@10.20.6.5:/root/minigames' commandLine 'scp', 'build/libs/Minigames-1.0-SNAPSHOT.jar', '/home/lars/Documents/Minecraft/Server/Minestom/Minigames.jar'
} }

View File

@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME

View File

@@ -3,12 +3,12 @@ package eu.mhsl.minenet.minigames;
import eu.mhsl.minenet.minigames.api.HttpServer; import eu.mhsl.minenet.minigames.api.HttpServer;
import eu.mhsl.minenet.minigames.command.Commands; import eu.mhsl.minenet.minigames.command.Commands;
import eu.mhsl.minenet.minigames.handler.Listeners; import eu.mhsl.minenet.minigames.handler.Listeners;
import eu.mhsl.minenet.minigames.instance.Dimension;
import eu.mhsl.minenet.minigames.lang.Languages; import eu.mhsl.minenet.minigames.lang.Languages;
import eu.mhsl.minenet.minigames.server.tasks.TablistUpdateTask; import eu.mhsl.minenet.minigames.server.tasks.TablistUpdateTask;
import net.minestom.server.Auth;
import net.minestom.server.MinecraftServer; import net.minestom.server.MinecraftServer;
import net.minestom.server.extras.bungee.BungeeCordProxy;
import net.minestom.server.extras.lan.OpenToLAN; import net.minestom.server.extras.lan.OpenToLAN;
import net.minestom.server.extras.velocity.VelocityProxy;
import net.minestom.server.timer.TaskSchedule; import net.minestom.server.timer.TaskSchedule;
import org.spongepowered.configurate.ConfigurateException; import org.spongepowered.configurate.ConfigurateException;
import org.spongepowered.configurate.ConfigurationNode; import org.spongepowered.configurate.ConfigurationNode;
@@ -25,7 +25,7 @@ public class Main {
public static ConfigurationNode globalConfig; public static ConfigurationNode globalConfig;
@SuppressWarnings("ResultOfMethodCallIgnored") @SuppressWarnings("ResultOfMethodCallIgnored")
public static void main(String[] args) throws ConfigurateException { static void main() throws ConfigurateException {
//noinspection ResultOfMethodCallIgnored //noinspection ResultOfMethodCallIgnored
Resource.values(); // This initializes and preloads the enum and extracts the resources Resource.values(); // This initializes and preloads the enum and extracts the resources
Languages.getInstance(); //Preload languages into the jvm Languages.getInstance(); //Preload languages into the jvm
@@ -40,29 +40,35 @@ public class Main {
logger.info("Initialize Minecraft server..."); logger.info("Initialize Minecraft server...");
MinecraftServer server = MinecraftServer.init(); MinecraftServer server = null;
if(serverConfig.node("open-to-lan").getBoolean()) OpenToLAN.open();
if(globalConfig.node("bungeecord", "enabled").getBoolean()) {
server = MinecraftServer.init(new Auth.Bungee());
}
if(globalConfig.node("velocity", "enabled").getBoolean()) {
server = MinecraftServer.init(new Auth.Velocity(Objects.requireNonNull(globalConfig.node("velocity", "secret").getString())));
}
if(server == null) server = MinecraftServer.init();
// MinestomPvP.init(); // MinestomPvP.init();
MinecraftServer.setBrandName("mhsl.eu - minenet - credits to minestom"); MinecraftServer.setBrandName("mhsl.eu - minenet - credits to minestom");
MinecraftServer.setCompressionThreshold(serverConfig.node("compression-threshold").getInt(0)); MinecraftServer.setCompressionThreshold(serverConfig.node("compression-threshold").getInt(0));
System.setProperty("minestom.chunk-view-distance", String.valueOf(serverConfig.node("view-distance").getInt())); System.setProperty("minestom.chunk-view-distance", String.valueOf(serverConfig.node("view-distance").getInt()));
System.setProperty("minestom.registry.unsafe-ops", "true");
Commands.values(); Commands.values();
Listeners.values(); Listeners.values();
Dimension.values();
new HttpServer(); new HttpServer();
MinecraftServer.getSchedulerManager().scheduleTask(new TablistUpdateTask(), TaskSchedule.tick(20), TaskSchedule.tick(20)); MinecraftServer.getSchedulerManager().scheduleTask(new TablistUpdateTask(), TaskSchedule.tick(20), TaskSchedule.tick(20));
logger.info("Starting Minecraft server ... "); logger.info("Starting Minecraft server ... ");
if(serverConfig.node("open-to-lan").getBoolean()) OpenToLAN.open();
if(globalConfig.node("bungeecord", "enabled").getBoolean()) BungeeCordProxy.enable();
if(globalConfig.node("velocity", "enabled").getBoolean()) {
VelocityProxy.enable(Objects.requireNonNull(globalConfig.node("velocity", "secret").getString()));
}
server.start("0.0.0.0", serverConfig.node("port").getInt(25565)); server.start("0.0.0.0", serverConfig.node("port").getInt(25565));
System.gc(); System.gc();

View File

@@ -21,7 +21,7 @@ public class SetMemorialCommand extends PrivilegedCommand {
ArgumentString loreArgument = ArgumentType.String("lore"); ArgumentString loreArgument = ArgumentType.String("lore");
materialArgument.setSuggestionCallback( materialArgument.setSuggestionCallback(
(sender, context, suggestion) -> Material (_, _, suggestion) -> Material
.values() .values()
.stream() .stream()
.map(material -> new SuggestionEntry(material.name(), Component.text(material.name()))) .map(material -> new SuggestionEntry(material.name(), Component.text(material.name())))
@@ -35,7 +35,7 @@ public class SetMemorialCommand extends PrivilegedCommand {
.getTournament() .getTournament()
.setMemorialConfiguration( .setMemorialConfiguration(
new MemorialConfiguration( new MemorialConfiguration(
Material.fromNamespaceId(context.get(materialArgument)), Material.fromKey(context.get(materialArgument)),
context.get(titleArgument), context.get(titleArgument),
context.get(loreArgument) context.get(loreArgument)
) )

View File

@@ -23,7 +23,7 @@ public class SetRewardCommand extends PrivilegedCommand {
ArgumentStringArray amountsArgument = ArgumentType.StringArray("amount"); ArgumentStringArray amountsArgument = ArgumentType.StringArray("amount");
materialArgument.setSuggestionCallback( materialArgument.setSuggestionCallback(
(sender, context, suggestion) -> Material (_, _, suggestion) -> Material
.values() .values()
.stream() .stream()
.map(material -> new SuggestionEntry(material.name(), Component.text(material.name()))) .map(material -> new SuggestionEntry(material.name(), Component.text(material.name())))
@@ -37,7 +37,7 @@ public class SetRewardCommand extends PrivilegedCommand {
.getTournament() .getTournament()
.setRewardConfiguration( .setRewardConfiguration(
new RewardConfiguration( new RewardConfiguration(
Material.fromNamespaceId(context.get(materialArgument)), Material.fromKey(context.get(materialArgument)),
Arrays.stream(context.get(amountsArgument)).map(Integer::valueOf).collect(Collectors.toList()) Arrays.stream(context.get(amountsArgument)).map(Integer::valueOf).collect(Collectors.toList())
) )
); );

View File

@@ -1,49 +1,50 @@
package eu.mhsl.minenet.minigames.instance; package eu.mhsl.minenet.minigames.instance;
import net.kyori.adventure.key.Key;
import net.minestom.server.MinecraftServer; import net.minestom.server.MinecraftServer;
import net.minestom.server.registry.DynamicRegistry; import net.minestom.server.registry.RegistryKey;
import net.minestom.server.utils.NamespaceID;
import net.minestom.server.world.DimensionType; import net.minestom.server.world.DimensionType;
import org.jetbrains.annotations.NotNull;
/** /**
* Prebuilt dimensions * Prebuilt dimensions
*/ */
public enum Dimension { public enum Dimension {
OVERWORLD( OVERWORLD(
NamespaceID.from("minenet:fullbright_overworld"), Key.key("minenet:fullbright_overworld"),
DimensionType DimensionType
.builder() .builder()
.ambientLight(2.0f) .ambientLight(1.0f)
.build() .build()
), ),
NETHER( NETHER(
NamespaceID.from("minenet:fullbright_nether"), Key.key("minenet:fullbright_nether"),
DimensionType DimensionType
.builder() .builder()
.ambientLight(2.0f) .ambientLight(1.0f)
.effects("minecraft:the_nether") .effects("minecraft:the_nether")
.build() .build()
), ),
THE_END( THE_END(
NamespaceID.from("minenet:fullbright_end"), Key.key("minenet:fullbright_end"),
DimensionType DimensionType
.builder() .builder()
.ambientLight(2.0f) .ambientLight(1.0f)
.effects("minecraft:the_end") .effects("minecraft:the_end")
.build() .build()
); );
public final DimensionType DIMENSION; public final DimensionType DIMENSION;
public final NamespaceID namespaceID; public final Key namespaceID;
public final DynamicRegistry.Key<DimensionType> key; public final RegistryKey<@NotNull DimensionType> key;
Dimension(NamespaceID namespaceID, DimensionType dimType) { Dimension(Key namespaceID, DimensionType dimType) {
this.DIMENSION = dimType; this.DIMENSION = dimType;
this.namespaceID = namespaceID; this.namespaceID = namespaceID;
this.key = MinecraftServer.getDimensionTypeRegistry().register(namespaceID, this.DIMENSION); this.key = MinecraftServer.getDimensionTypeRegistry().register(this.namespaceID, this.DIMENSION);
} }
} }

View File

@@ -7,14 +7,15 @@ import net.minestom.server.event.instance.AddEntityToInstanceEvent;
import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent; import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent;
import net.minestom.server.instance.Instance; import net.minestom.server.instance.Instance;
import net.minestom.server.instance.InstanceContainer; import net.minestom.server.instance.InstanceContainer;
import net.minestom.server.registry.DynamicRegistry; import net.minestom.server.registry.RegistryKey;
import net.minestom.server.timer.TaskSchedule; import net.minestom.server.timer.TaskSchedule;
import net.minestom.server.world.DimensionType; import net.minestom.server.world.DimensionType;
import org.jetbrains.annotations.NotNull;
import java.util.UUID; import java.util.UUID;
public class MineNetInstance extends InstanceContainer { public class MineNetInstance extends InstanceContainer {
public MineNetInstance(DynamicRegistry.Key<DimensionType> type) { public MineNetInstance(RegistryKey<@NotNull DimensionType> type) {
super(UUID.randomUUID(), type); super(UUID.randomUUID(), type);
MinecraftServer.getInstanceManager().registerInstance(this); MinecraftServer.getInstanceManager().registerInstance(this);

View File

@@ -16,7 +16,7 @@ import net.minestom.server.event.item.ItemDropEvent;
import net.minestom.server.event.player.PlayerBlockBreakEvent; import net.minestom.server.event.player.PlayerBlockBreakEvent;
import net.minestom.server.event.player.PlayerBlockPlaceEvent; import net.minestom.server.event.player.PlayerBlockPlaceEvent;
import net.minestom.server.event.player.PlayerMoveEvent; import net.minestom.server.event.player.PlayerMoveEvent;
import net.minestom.server.registry.DynamicRegistry; import net.minestom.server.registry.RegistryKey;
import net.minestom.server.timer.ExecutionType; import net.minestom.server.timer.ExecutionType;
import net.minestom.server.timer.TaskSchedule; import net.minestom.server.timer.TaskSchedule;
import net.minestom.server.world.DimensionType; import net.minestom.server.world.DimensionType;
@@ -34,7 +34,7 @@ public abstract class Game extends MineNetInstance implements Spawnable {
protected boolean isRunning = false; protected boolean isRunning = false;
protected boolean isBeforeBeginning = true; protected boolean isBeforeBeginning = true;
public Game(DynamicRegistry.Key<DimensionType> dimensionType) { public Game(RegistryKey<@NotNull DimensionType> dimensionType) {
super(dimensionType); super(dimensionType);
MinecraftServer.getInstanceManager().registerInstance(this); MinecraftServer.getInstanceManager().registerInstance(this);

View File

@@ -9,11 +9,12 @@ import eu.mhsl.minenet.minigames.score.Score;
import net.kyori.adventure.audience.Audience; import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import net.minestom.server.registry.DynamicRegistry; import net.minestom.server.registry.RegistryKey;
import net.minestom.server.timer.ExecutionType; import net.minestom.server.timer.ExecutionType;
import net.minestom.server.timer.Task; import net.minestom.server.timer.Task;
import net.minestom.server.timer.TaskSchedule; import net.minestom.server.timer.TaskSchedule;
import net.minestom.server.world.DimensionType; import net.minestom.server.world.DimensionType;
import org.jetbrains.annotations.NotNull;
import java.time.Duration; import java.time.Duration;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@@ -26,7 +27,7 @@ public class StatelessGame extends Game {
private int timeLimit = 0; private int timeLimit = 0;
private int timePlayed = 0; private int timePlayed = 0;
public StatelessGame(DynamicRegistry.Key<DimensionType> dimensionType, String gameName, Score score) { public StatelessGame(RegistryKey<@NotNull DimensionType> dimensionType, String gameName, Score score) {
super(dimensionType); super(dimensionType);
this.score = score; this.score = score;
this.name = gameName; this.name = gameName;

View File

@@ -15,8 +15,7 @@ import net.minestom.server.entity.Player;
import net.minestom.server.event.instance.AddEntityToInstanceEvent; import net.minestom.server.event.instance.AddEntityToInstanceEvent;
import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent; import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent;
import net.minestom.server.inventory.InventoryType; import net.minestom.server.inventory.InventoryType;
import net.minestom.server.inventory.click.ClickType; import net.minestom.server.inventory.click.Click;
import net.minestom.server.inventory.condition.InventoryConditionResult;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material; import net.minestom.server.item.Material;
import net.minestom.server.sound.SoundEvent; import net.minestom.server.sound.SoundEvent;
@@ -34,13 +33,14 @@ public class GameConfigurationInventory extends InteractableInventory {
public GameConfigurationInventory(Room room, Player p, GameFactory factory) { public GameConfigurationInventory(Room room, Player p, GameFactory factory) {
super(InventoryType.CHEST_5_ROW, factory.name().getAssembled(p)); super(InventoryType.CHEST_5_ROW, factory.name().getAssembled(p));
System.out.println("GameConfigurationInventory");
this.room = room; this.room = room;
this.p = p; this.p = p;
this.factory = factory; this.factory = factory;
room.eventNode() room.eventNode()
.addListener(AddEntityToInstanceEvent.class, addEntityToInstanceEvent -> MinecraftServer.getSchedulerManager().scheduleNextTick(this::updatePlayButton)) .addListener(AddEntityToInstanceEvent.class, _ -> MinecraftServer.getSchedulerManager().scheduleNextTick(this::updatePlayButton))
.addListener(RemoveEntityFromInstanceEvent.class, removeEntityFromInstanceEvent -> MinecraftServer.getSchedulerManager().scheduleNextTick(this::updatePlayButton)); .addListener(RemoveEntityFromInstanceEvent.class, _ -> MinecraftServer.getSchedulerManager().scheduleNextTick(this::updatePlayButton));
ConfigManager config = factory.configuration(); ConfigManager config = factory.configuration();
@@ -53,7 +53,10 @@ public class GameConfigurationInventory extends InteractableInventory {
) )
.build(), .build(),
0, 0,
itemClick -> itemClick.getPlayer().closeInventory(), itemClick -> {
System.out.println("Booot callback ist da!");
itemClick.player().closeInventory();
},
true true
); );
@@ -106,8 +109,7 @@ public class GameConfigurationInventory extends InteractableInventory {
} }
@Override @Override
protected void onClick(Player player, int slot, ClickType clickType, InventoryConditionResult inventoryConditionResult) { protected void onClick(Player player, int slot, Click clickType) {
inventoryConditionResult.setCancel(true);
if(!this.map.containsKey(slot)) return; if(!this.map.containsKey(slot)) return;
@@ -133,7 +135,7 @@ public class GameConfigurationInventory extends InteractableInventory {
.lore(restrictionHandler.getWarnings(restrictionData).stream().map(translatedComponent -> translatedComponent.getAssembled(this.p)).collect(Collectors.toList())) .lore(restrictionHandler.getWarnings(restrictionData).stream().map(translatedComponent -> translatedComponent.getAssembled(this.p)).collect(Collectors.toList()))
.build(), .build(),
8, 8,
itemClick -> Game.initialize(this.factory, this.map.values().stream().toList(), itemClick.getPlayer()), itemClick -> Game.initialize(this.factory, this.map.values().stream().toList(), itemClick.player()),
true true
); );
@@ -155,7 +157,7 @@ public class GameConfigurationInventory extends InteractableInventory {
this.updatePlayButton(); this.updatePlayButton();
return; return;
} }
itemClick.getPlayer().playSound(Sound.sound(SoundEvent.ENTITY_SILVERFISH_DEATH, Sound.Source.AMBIENT, 1f, 1f)); itemClick.player().playSound(Sound.sound(SoundEvent.ENTITY_SILVERFISH_DEATH, Sound.Source.AMBIENT, 1f, 1f));
}, },
false false
); );

View File

@@ -19,7 +19,7 @@ public class HubInventory extends InteractableInventory {
.lore(TranslatedComponent.assemble("hub#create_description", p)) .lore(TranslatedComponent.assemble("hub#create_description", p))
.build(), .build(),
12, 12,
itemClick -> Room.createRoom(itemClick.getPlayer()), itemClick -> Room.createRoom(itemClick.player()),
true true
); );
@@ -30,7 +30,7 @@ public class HubInventory extends InteractableInventory {
.lore(TranslatedComponent.assemble("hub#join_description", p)) .lore(TranslatedComponent.assemble("hub#join_description", p))
.build(), .build(),
14, 14,
itemClick -> itemClick.getPlayer().openInventory(new JoinInventory(itemClick.getPlayer())) itemClick -> itemClick.player().openInventory(new JoinInventory(itemClick.player()))
); );
} }
} }

View File

@@ -11,8 +11,7 @@ import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
import net.minestom.server.event.player.PlayerPacketEvent; import net.minestom.server.event.player.PlayerPacketEvent;
import net.minestom.server.inventory.InventoryType; import net.minestom.server.inventory.InventoryType;
import net.minestom.server.inventory.click.ClickType; import net.minestom.server.inventory.click.Click;
import net.minestom.server.inventory.condition.InventoryConditionResult;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material; import net.minestom.server.item.Material;
import net.minestom.server.network.packet.client.play.ClientNameItemPacket; import net.minestom.server.network.packet.client.play.ClientNameItemPacket;
@@ -32,7 +31,7 @@ public class JoinInventory extends InteractableInventory {
.customName(Component.text(this.prefix)) .customName(Component.text(this.prefix))
.build(), .build(),
0, 0,
itemClick -> { _ -> {
} }
); );
@@ -45,9 +44,8 @@ public class JoinInventory extends InteractableInventory {
} }
@Override @Override
protected void onClick(Player player, int slot, ClickType clickType, InventoryConditionResult inventoryConditionResult) { protected void onClick(Player player, int slot, Click clickType) {
if(slot != 2) return; if(slot != 2) return;
inventoryConditionResult.setCancel(true);
player.closeInventory(); player.closeInventory();
this.typedText = this.formatInput(this.typedText); this.typedText = this.formatInput(this.typedText);

View File

@@ -33,7 +33,7 @@ public class MinigameSelectInventory extends InteractableInventory {
.lore(type.getDescription().addWrap().getWrappedAssembled(p)) .lore(type.getDescription().addWrap().getWrappedAssembled(p))
.build(), .build(),
itemAlignment.next().get(), itemAlignment.next().get(),
itemClick -> this.drawGames(type) _ -> this.drawGames(type)
); );
} }
@@ -62,7 +62,8 @@ public class MinigameSelectInventory extends InteractableInventory {
.lore(gameFactory.description().addWrap().getWrappedAssembled(this.p)) .lore(gameFactory.description().addWrap().getWrappedAssembled(this.p))
.build(), .build(),
offset + itemAlignment.next().get(), offset + itemAlignment.next().get(),
itemClick -> itemClick.getPlayer().openInventory(new GameConfigurationInventory(this.room, itemClick.getPlayer(), gameFactory)) itemClick -> itemClick.player().openInventory(new GameConfigurationInventory(this.room, itemClick.player(), gameFactory)),
true
); );
} }
} }

View File

@@ -24,8 +24,8 @@ public class Tournament {
for(Player player : players) { for(Player player : players) {
int points = (game.getScores().size() - count) + this.boost(count, game.getScores().size()); int points = (game.getScores().size() - count) + this.boost(count, game.getScores().size());
data.computeIfPresent(player, (existingPlayer, existingPoints) -> existingPoints + points); data.computeIfPresent(player, (_, existingPoints) -> existingPoints + points);
data.computeIfAbsent(player, newPlayer -> points); data.computeIfAbsent(player, _ -> points);
} }
} }
}); });
@@ -44,11 +44,11 @@ public class Tournament {
} }
return new Rewards( return new Rewards(
this.memorialConfiguration.memorialMaterial().namespace().value(), this.memorialConfiguration.memorialMaterial().key().value(),
this.memorialConfiguration.memorialTitle(), this.memorialConfiguration.memorialTitle(),
this.memorialConfiguration.memorialLore(), this.memorialConfiguration.memorialLore(),
this.getGameScores().keySet().stream().map(Player::getUuid).toList(), this.getGameScores().keySet().stream().map(Player::getUuid).toList(),
this.rewardConfiguration.item().namespace().value(), this.rewardConfiguration.item().key().value(),
itemCount itemCount
); );
} }

View File

@@ -2,38 +2,64 @@ package eu.mhsl.minenet.minigames.shared.inventory;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
import net.minestom.server.event.inventory.InventoryPreClickEvent;
import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.Inventory;
import net.minestom.server.inventory.InventoryType; import net.minestom.server.inventory.InventoryType;
import net.minestom.server.inventory.click.ClickType; import net.minestom.server.inventory.click.Click;
import net.minestom.server.inventory.condition.InventoryConditionResult;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material; import net.minestom.server.item.Material;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer; import java.util.function.Consumer;
public class InteractableInventory extends Inventory { public class InteractableInventory extends Inventory {
private final Map<Integer, ClickableItem> clickableItems = new HashMap<>();
public record ItemClick(Player player, InteractableInventory inventory, int clickedSlot, ItemStack item, Click clickType) { }
public record ClickableItem(ItemStack item, int slot, Consumer<ItemClick> callback, boolean closeAfterClick) { }
/** /**
* Defines an Inventory with direct callbacks for ItemSlots * Defines an Inventory with direct callbacks for ItemSlots
*/ */
protected InteractableInventory(@NotNull InventoryType inventoryType, @NotNull Component title) { protected InteractableInventory(@NotNull InventoryType inventoryType, @NotNull Component title) {
super(inventoryType, title); super(inventoryType, title);
this.addInventoryCondition(this::onClick); this.eventNode().addListener(
InventoryPreClickEvent.class,
inventoryPreClickEvent -> this.onClick(
inventoryPreClickEvent.getPlayer(),
inventoryPreClickEvent.getSlot(),
inventoryPreClickEvent.getClick()
)
);
this.eventNode().addListener(InventoryPreClickEvent.class, inventoryPreClickEvent -> {
@Nullable ClickableItem selectedItem = this.clickableItems.values().stream()
.filter(clickableItem -> clickableItem.slot() == inventoryPreClickEvent.getSlot())
.findFirst()
.orElse(null);
if(selectedItem == null) {
inventoryPreClickEvent.setCancelled(true);
return;
}
if(selectedItem.closeAfterClick()) inventoryPreClickEvent.getPlayer().closeInventory();
selectedItem.callback().accept(
new ItemClick(inventoryPreClickEvent.getPlayer(), this, inventoryPreClickEvent.getSlot(), selectedItem.item(), inventoryPreClickEvent.getClick())
);
inventoryPreClickEvent.setCancelled(true);
});
} }
/** /**
* Set Item with Callback * Set Item with Callback
*/ */
protected void setClickableItem(ItemStack item, int slot, Consumer<ItemClick> callback, boolean closeAfter) { protected void setClickableItem(ItemStack item, int slot, Consumer<ItemClick> callback, boolean closeAfter) {
this.setItemStack(slot, item); ClickableItem clickableItem = new ClickableItem(item, slot, callback, closeAfter);
this.addInventoryCondition((player, clickedSlot, clickType, inventoryConditionResult) -> { this.setItemStack(clickableItem.slot(), clickableItem.item());
if(clickedSlot == slot) { this.clickableItems.put(clickableItem.slot(), clickableItem);
if(closeAfter) player.closeInventory();
callback.accept(new ItemClick(player, this, clickedSlot, item, clickType));
}
inventoryConditionResult.setCancel(true);
});
} }
protected void setClickableItem(ItemStack item, int slot, Consumer<ItemClick> callback) { protected void setClickableItem(ItemStack item, int slot, Consumer<ItemClick> callback) {
@@ -47,7 +73,7 @@ public class InteractableInventory extends Inventory {
this.setClickableItem( this.setClickableItem(
item, item,
slot, slot,
itemClick -> { _ -> {
} }
); );
} }
@@ -62,7 +88,7 @@ public class InteractableInventory extends Inventory {
/** /**
* You may want to Override this method to get more generic click events * You may want to Override this method to get more generic click events
*/ */
protected void onClick(Player player, int slot, ClickType clickType, InventoryConditionResult inventoryConditionResult) { protected void onClick(Player player, int slot, Click clickType) {
} }
} }

View File

@@ -1,45 +0,0 @@
package eu.mhsl.minenet.minigames.shared.inventory;
import net.minestom.server.entity.Player;
import net.minestom.server.inventory.Inventory;
import net.minestom.server.inventory.click.ClickType;
import net.minestom.server.item.ItemStack;
public class ItemClick {
private final Player player;
private final InteractableInventory inventory;
private final int clickedSlot;
private final ItemStack item;
private final ClickType clickType;
/**
* Describes a click on an Item from an IntractableInventory
*/
public ItemClick(Player player, InteractableInventory inventory, int clickedSlot, ItemStack item, ClickType clickType) {
this.player = player;
this.inventory = inventory;
this.clickedSlot = clickedSlot;
this.item = item;
this.clickType = clickType;
}
public Player getPlayer() {
return this.player;
}
public Inventory getInventory() {
return this.inventory;
}
public int getClickedSlot() {
return this.clickedSlot;
}
public ItemStack getItem() {
return this.item;
}
public ClickType getClickType() {
return this.clickType;
}
}

View File

@@ -1,12 +1,12 @@
package eu.mhsl.minenet.minigames.util; package eu.mhsl.minenet.minigames.util;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
import net.minestom.server.instance.InstanceContainer; import net.minestom.server.instance.InstanceContainer;
import net.minestom.server.instance.batch.Batch; import net.minestom.server.instance.batch.Batch;
import net.minestom.server.instance.batch.ChunkBatch; import net.minestom.server.instance.batch.ChunkBatch;
import net.minestom.server.utils.chunk.ChunkUtils; import net.minestom.server.utils.chunk.ChunkUtils;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Map;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
public class BatchUtil { public class BatchUtil {
@@ -16,9 +16,12 @@ public class BatchUtil {
field.setAccessible(true); field.setAccessible(true);
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
Long2ObjectMap<ChunkBatch> chunkBatchesMap = (Long2ObjectMap<ChunkBatch>) field.get(batch); Map<Long, ChunkBatch> chunkBatchesMap = (Map<Long, ChunkBatch>) field.get(batch);
return chunkBatchesMap.keySet().toLongArray(); long[] out = new long[chunkBatchesMap.size()];
int i = 0;
for (Long k : chunkBatchesMap.keySet()) out[i++] = k;
return out;
} catch (NoSuchFieldException | IllegalAccessException e) { } catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }