Working Restrictions

This commit is contained in:
2022-10-01 16:58:27 +02:00
parent b5468b1fe9
commit 4bdb3f94d5
20 changed files with 244 additions and 46 deletions

View File

@@ -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();
}
}

View File

@@ -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;
}
}

View File

@@ -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<String> getWarnings(RestrictionData data) {

View File

@@ -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
);
}
}

View File

@@ -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
);
}
}

View File

@@ -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
);
}
}

View File

@@ -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
);
}
}

View File

@@ -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