diff --git a/.gradle/7.4/checksums/checksums.lock b/.gradle/7.4/checksums/checksums.lock index 7db5587..4645d9d 100644 Binary files a/.gradle/7.4/checksums/checksums.lock and b/.gradle/7.4/checksums/checksums.lock differ diff --git a/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock b/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock index 3584a88..2f7c6eb 100644 Binary files a/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock and b/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock differ diff --git a/.gradle/7.4/executionHistory/executionHistory.bin b/.gradle/7.4/executionHistory/executionHistory.bin index 131559f..639d241 100644 Binary files a/.gradle/7.4/executionHistory/executionHistory.bin and b/.gradle/7.4/executionHistory/executionHistory.bin differ diff --git a/.gradle/7.4/executionHistory/executionHistory.lock b/.gradle/7.4/executionHistory/executionHistory.lock index 02c9182..31e347d 100644 Binary files a/.gradle/7.4/executionHistory/executionHistory.lock and b/.gradle/7.4/executionHistory/executionHistory.lock differ diff --git a/.gradle/7.4/fileHashes/fileHashes.bin b/.gradle/7.4/fileHashes/fileHashes.bin index 73df5bf..8fd5436 100644 Binary files a/.gradle/7.4/fileHashes/fileHashes.bin and b/.gradle/7.4/fileHashes/fileHashes.bin differ diff --git a/.gradle/7.4/fileHashes/fileHashes.lock b/.gradle/7.4/fileHashes/fileHashes.lock index caba861..c7c2b5b 100644 Binary files a/.gradle/7.4/fileHashes/fileHashes.lock and b/.gradle/7.4/fileHashes/fileHashes.lock differ diff --git a/.gradle/7.4/fileHashes/resourceHashesCache.bin b/.gradle/7.4/fileHashes/resourceHashesCache.bin index 129f650..65bba1d 100644 Binary files a/.gradle/7.4/fileHashes/resourceHashesCache.bin and b/.gradle/7.4/fileHashes/resourceHashesCache.bin differ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 163d9fa..549e54c 100644 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index 172ce55..e84003e 100644 Binary files a/build/tmp/compileJava/previous-compilation-data.bin and b/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/src/main/java/eu/mhsl/minenet/minigames/command/user/HubCommand.java b/src/main/java/eu/mhsl/minenet/minigames/command/user/HubCommand.java index 8f89f04..feb6726 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/command/user/HubCommand.java +++ b/src/main/java/eu/mhsl/minenet/minigames/command/user/HubCommand.java @@ -13,6 +13,7 @@ public class HubCommand extends Command { setCondition((sender, commandString) -> ((Player) sender).getInstance() instanceof Room); setDefaultExecutor((sender, context) -> { + Room.unsetRoom((Player) sender); MoveInstance.move((Player) sender, Hub.INSTANCE); }); } diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/GameConfigurationInventory.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/GameConfigurationInventory.java index b0d34f3..ec38512 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/GameConfigurationInventory.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/GameConfigurationInventory.java @@ -1,18 +1,22 @@ package eu.mhsl.minenet.minigames.instance.game.minigame.config; +import com.extollit.linalg.mutable.Vec2d; import eu.mhsl.minenet.minigames.instance.game.Game; import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.IRestriction; import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.Restriction; import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.RestrictionData; import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.RestrictionHandler; import eu.mhsl.minenet.minigames.shared.inventory.InteractableInventory; +import eu.mhsl.minenet.minigames.util.InventoryItemAlignment; import eu.mhsl.minenet.minigames.util.TextUtil; import eu.mhsl.minenet.minigames.instance.room.Room; import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; +import net.minestom.server.MinecraftServer; import net.minestom.server.entity.Player; import net.minestom.server.event.instance.AddEntityToInstanceEvent; +import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent; import net.minestom.server.inventory.InventoryType; import net.minestom.server.inventory.click.ClickType; import net.minestom.server.inventory.condition.InventoryConditionResult; @@ -36,10 +40,8 @@ public class GameConfigurationInventory extends InteractableInventory { this.factory = factory; room.eventNode() - .addListener(AddEntityToInstanceEvent.class, addEntityToInstanceEvent -> { - System.out.println("UPDATE"); - updatePlayButton(); - }); + .addListener(AddEntityToInstanceEvent.class, addEntityToInstanceEvent -> MinecraftServer.getSchedulerManager().scheduleNextTick(this::updatePlayButton)) + .addListener(RemoveEntityFromInstanceEvent.class, removeEntityFromInstanceEvent -> MinecraftServer.getSchedulerManager().scheduleNextTick(this::updatePlayButton)); ConfigManager config = factory.configuration(); @@ -70,18 +72,22 @@ public class GameConfigurationInventory extends InteractableInventory { ItemStack.builder(Material.BARRIER).displayName(Component.text("Keine Optionen")).lore(TextUtil.autoWrap("Für dieses Spiel sind keine Einstellungen verfügbar!")).build(), 31 ); - return; + + } else { + int offset = 18; + InventoryItemAlignment itemAlignment = new InventoryItemAlignment(config.getAll().size(), 3); + for(Option item : config.getAll()) { + Vec2d current = itemAlignment.next(); + System.out.println(current.x + " : " + current.y); + map.put((int) (offset + (current.y * 9) + current.x), item); + + setDummyItem( + item.getCurrent(), + (int) (offset + (current.y * 9) + current.x) + ); + } } - int pos = 18; - for(Option item : config.getAll()) { - map.put(pos, item); - - setDummyItem( - item.getCurrent(), - pos++ - ); - } } @Override @@ -104,6 +110,8 @@ public class GameConfigurationInventory extends InteractableInventory { RestrictionHandler restrictionHandler = factory.globalRestrictions(); RestrictionData restrictionData = new RestrictionData(room); + System.out.println("UpdatePlayButton:" + restrictionHandler.canPlay(restrictionData)); + if(restrictionHandler.canPlay(restrictionData)) { setClickableItem( @@ -132,11 +140,17 @@ public class GameConfigurationInventory extends InteractableInventory { .build(), 8, itemClick -> { + if(restrictionHandler.canPlay(restrictionData)) { + updatePlayButton(); + return; + } itemClick.getPlayer().playSound(Sound.sound(SoundEvent.ENTITY_SILVERFISH_DEATH, Sound.Source.AMBIENT, 1f, 1f)); }, false ); } + + update(); } } diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/RestrictionData.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/RestrictionData.java index 747347a..be7595c 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/RestrictionData.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/RestrictionData.java @@ -1,16 +1,15 @@ package eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction; -import eu.mhsl.minenet.minigames.instance.MineNetInstance; import eu.mhsl.minenet.minigames.instance.room.Room; public class RestrictionData { - final private Room instance; + final private Room room; - public RestrictionData(Room instance) { - this.instance = instance; + public RestrictionData(Room room) { + this.room = room; } - public MineNetInstance getInstance() { - return instance; + public Room getRoom() { + return room; } } diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/RestrictionHandler.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/RestrictionHandler.java index c9966b1..0014ac9 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/RestrictionHandler.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/RestrictionHandler.java @@ -25,8 +25,9 @@ public class RestrictionHandler { } public boolean canPlay(RestrictionData data) { + if(restrictions.size() < 1) return true; return this.restrictions.stream() - .anyMatch(iRestriction -> !iRestriction.calculate(data).getType().equals(Restriction.Type.OK)); + .noneMatch(iRestriction -> iRestriction.calculate(data).getType().equals(Restriction.Type.FAIL)); } public List getWarnings(RestrictionData data) { diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MaximalPlayeramountGameRestriction.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MaximalPlayeramountGameRestriction.java new file mode 100644 index 0000000..63dfeab --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MaximalPlayeramountGameRestriction.java @@ -0,0 +1,23 @@ +package eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.common; + +import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.IRestriction; +import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.Restriction; +import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.RestrictionData; + +public class MaximalPlayeramountGameRestriction implements IRestriction { + private int max; + + public MaximalPlayeramountGameRestriction(int max) { + this.max = max; + } + + @Override + public Restriction calculate(RestrictionData data) { + return new Restriction( + "Minimal players needed", + "Minimal players", + null, + data.getRoom().getAllMembers().size() > this.max ? Restriction.Type.FAIL : Restriction.Type.OK + ); + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MaximalPlayeramountRestriction.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MaximalPlayeramountInstanceRestriction.java similarity index 71% rename from src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MaximalPlayeramountRestriction.java rename to src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MaximalPlayeramountInstanceRestriction.java index cbf4d30..5584345 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MaximalPlayeramountRestriction.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MaximalPlayeramountInstanceRestriction.java @@ -3,12 +3,11 @@ package eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.comm import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.IRestriction; import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.Restriction; import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.RestrictionData; -import kotlin.Result; -public class MaximalPlayeramountRestriction implements IRestriction { +public class MaximalPlayeramountInstanceRestriction implements IRestriction { final private int max; - public MaximalPlayeramountRestriction(int max) { + public MaximalPlayeramountInstanceRestriction(int max) { this.max = max; } @@ -18,7 +17,7 @@ public class MaximalPlayeramountRestriction implements IRestriction { "Maxplayers", "Maximale spieleranzahl", null, - data.getInstance().getPlayers().size() > this.max ? Restriction.Type.FAIL : Restriction.Type.OK + data.getRoom().getPlayers().size() > this.max ? Restriction.Type.FAIL : Restriction.Type.OK ); } } diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MinimalPlayeramountGameRestriction.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MinimalPlayeramountGameRestriction.java new file mode 100644 index 0000000..5fe038d --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MinimalPlayeramountGameRestriction.java @@ -0,0 +1,25 @@ +package eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.common; + +import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.IRestriction; +import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.Restriction; +import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.RestrictionData; + +import javax.xml.transform.OutputKeys; + +public class MinimalPlayeramountGameRestriction implements IRestriction { + private int min; + + public MinimalPlayeramountGameRestriction(int min) { + this.min = min; + } + + @Override + public Restriction calculate(RestrictionData data) { + return new Restriction( + "Minimal players", + "minimal Players needed", + null, + data.getRoom().getAllMembers().size() < this.min ? Restriction.Type.FAIL : Restriction.Type.OK + ); + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MinimalPlayeramountRestriction.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MinimalPlayeramountInstanceRestriction.java similarity index 72% rename from src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MinimalPlayeramountRestriction.java rename to src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MinimalPlayeramountInstanceRestriction.java index be69390..acf3abb 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MinimalPlayeramountRestriction.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/config/restriction/common/MinimalPlayeramountInstanceRestriction.java @@ -4,10 +4,10 @@ import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.IRest import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.Restriction; import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.RestrictionData; -public class MinimalPlayeramountRestriction implements IRestriction { +public class MinimalPlayeramountInstanceRestriction implements IRestriction { final int min; - public MinimalPlayeramountRestriction(int min) { + public MinimalPlayeramountInstanceRestriction(int min) { this.min = min; } @@ -17,7 +17,7 @@ public class MinimalPlayeramountRestriction implements IRestriction { "Minimal players", "Minimal amount of players needed", null, - data.getInstance().getPlayers().size() < min ? Restriction.Type.FAIL : Restriction.Type.OK + data.getRoom().getPlayers().size() < min ? Restriction.Type.FAIL : Restriction.Type.OK ); } } diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/types/stickfight/StickFightFactory.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/types/stickfight/StickFightFactory.java index 5824bf7..d6760a1 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/types/stickfight/StickFightFactory.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/minigame/types/stickfight/StickFightFactory.java @@ -4,9 +4,12 @@ import eu.mhsl.minenet.minigames.instance.game.minigame.Minigame; import eu.mhsl.minenet.minigames.instance.game.minigame.config.ConfigManager; import eu.mhsl.minenet.minigames.instance.game.minigame.config.GameFactory; import eu.mhsl.minenet.minigames.instance.game.minigame.config.Option; +import eu.mhsl.minenet.minigames.instance.game.minigame.config.common.NumericOption; import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.RestrictionHandler; -import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.common.MaximalPlayeramountRestriction; -import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.common.MinimalPlayeramountRestriction; +import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.common.MaximalPlayeramountGameRestriction; +import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.common.MaximalPlayeramountInstanceRestriction; +import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.common.MinimalPlayeramountGameRestriction; +import eu.mhsl.minenet.minigames.instance.game.minigame.config.restriction.common.MinimalPlayeramountInstanceRestriction; import net.kyori.adventure.text.Component; import net.minestom.server.item.Material; @@ -20,14 +23,15 @@ public class StickFightFactory implements GameFactory { @Override public ConfigManager configuration() { - return null; + return new ConfigManager() + .addOption(new NumericOption("lenght", Material.SANDSTONE, "Länge", 5, 7, 9, 11)); } @Override public RestrictionHandler globalRestrictions() { return new RestrictionHandler() - .addRestriction(new MinimalPlayeramountRestriction(2)) - .addRestriction(new MaximalPlayeramountRestriction(4)); + .addRestriction(new MinimalPlayeramountGameRestriction(2)) + .addRestriction(new MaximalPlayeramountGameRestriction(4)); } @Override diff --git a/src/main/java/eu/mhsl/minenet/minigames/shared/entity/InteractableEntity.java b/src/main/java/eu/mhsl/minenet/minigames/shared/entity/InteractableEntity.java index abe5a5f..3cd8dd2 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/shared/entity/InteractableEntity.java +++ b/src/main/java/eu/mhsl/minenet/minigames/shared/entity/InteractableEntity.java @@ -1,6 +1,7 @@ package eu.mhsl.minenet.minigames.shared.entity; import eu.mhsl.minenet.minigames.instance.Spawnable; +import net.minestom.server.coordinate.Pos; import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Player; @@ -36,26 +37,22 @@ public class InteractableEntity extends EntityCreature { private void setInstanceEvent(@NotNull AddEntityToInstanceEvent addEntityToInstanceEvent) { if(addEntityToInstanceEvent.getInstance() instanceof Spawnable instance) { scheduleNextTick((unused) -> { - this.lookAt(instance.getSpawn()); //TODO only works someitmes? + this.teleport(this.position.withPitch(180).withYaw(0)); }); } addEntityToInstanceEvent.getInstance().eventNode() .addListener(PlayerEntityInteractEvent.class, playerEntityInteractEvent -> { - if(playerEntityInteractEvent.getTarget() == this) onInteract(playerEntityInteractEvent); + if(playerEntityInteractEvent.getTarget() == this) { + onInteract(playerEntityInteractEvent); + this.lookAt(playerEntityInteractEvent.getPlayer()); + } }) .addListener(EntityAttackEvent.class, entityAttackEvent -> { - if(entityAttackEvent.getTarget() == this) onAttack(entityAttackEvent); - }) - .addListener(PlayerMoveEvent.class, playerMoveEvent -> { - //TODO this is heavy in production - //maybe store the player and update to the closest Entity only periodic - scheduler().submitTask(() -> { - setTarget(new ClosestEntityTarget(this, 5, entity -> entity instanceof Player).findTarget()); - if(getTarget() != null) lookAt(getTarget()); - - return TaskSchedule.stop(); - }, ExecutionType.ASYNC); + if(entityAttackEvent.getTarget() == this) { + onAttack(entityAttackEvent); + this.lookAt(entityAttackEvent.getEntity()); + } }); } diff --git a/src/main/java/eu/mhsl/minenet/minigames/util/InventoryItemAlignment.java b/src/main/java/eu/mhsl/minenet/minigames/util/InventoryItemAlignment.java new file mode 100644 index 0000000..4a900e0 --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/util/InventoryItemAlignment.java @@ -0,0 +1,135 @@ +package eu.mhsl.minenet.minigames.util; + + +import com.extollit.linalg.mutable.Vec2d; +import it.unimi.dsi.fastutil.Pair; +import net.minestom.server.coordinate.Vec; + +import java.util.ArrayList; +import java.util.List; + +public class InventoryItemAlignment { + private int size; + private int x; + private int y; + + private int counter = -1; + + public InventoryItemAlignment(int size, int x, int y) { + this.size = size; + this.x = x; + this.y = y; + + if(x * y < size) throw new RuntimeException("Not enough space for Item alignment"); + } + + public InventoryItemAlignment(int size, int y) { + this.size = size; + this.x = 9; + this.y = y; + + if(x * y < size) throw new RuntimeException("Not enough space for Item alignment"); + } + + public Vec2d next() { + counter++; + + if(this.size < 9) return new Vec2d(this.row(this.size).get(counter), y/2); + //TODO more items? + return new Vec2d(0,0); + + } + + + private List row(int count) { + return new ArrayList>() { + { + add(new ArrayList<>() { + { + } + }); + add(new ArrayList<>() { + { + add(4); + } + }); + add(new ArrayList<>() { + { + add(3); + add(5); + } + }); + add(new ArrayList<>() { + { + add(2); + add(4); + add(6); + } + }); + add(new ArrayList<>() { + { + add(1); + add(3); + add(5); + add(7); + } + }); + add(new ArrayList<>() { + { + add(2); + add(3); + add(4); + add(5); + add(6); + } + }); + add(new ArrayList<>() { + { + add(1); + add(2); + add(3); + add(5); + add(6); + add(7); + } + }); + add(new ArrayList<>() { + { + add(1); + add(2); + add(3); + add(4); + add(5); + add(6); + add(7); + } + }); + add(new ArrayList<>() { + { + add(0); + add(1); + add(2); + add(3); + add(5); + add(6); + add(7); + add(8); + } + }); + add(new ArrayList<>() { + { + add(0); + add(1); + add(2); + add(3); + add(4); + add(5); + add(6); + add(7); + add(8); + } + }); + } + }.get(count); + } +}