diff --git a/minigame/build.gradle b/minigame/build.gradle new file mode 100644 index 0000000..4101f78 --- /dev/null +++ b/minigame/build.gradle @@ -0,0 +1,5 @@ +dependencies { + implementation project(':tools') + + compileOnly libs.bukkit +} \ No newline at end of file diff --git a/minigame/gradle.properties b/minigame/gradle.properties new file mode 100644 index 0000000..353141d --- /dev/null +++ b/minigame/gradle.properties @@ -0,0 +1,2 @@ +moduleName=ghast-mg +moduleVersion=1.0-SNAPSHOT \ No newline at end of file diff --git a/minigame/src/main/java/ghast/mg/Game.java b/minigame/src/main/java/ghast/mg/Game.java new file mode 100644 index 0000000..54acac5 --- /dev/null +++ b/minigame/src/main/java/ghast/mg/Game.java @@ -0,0 +1,29 @@ +package ghast.mg; + +import com.google.common.collect.Maps; +import ghast.mg.stage.GameStage; +import ghast.mg.stage.StageContext; +import lombok.Getter; + +import java.util.Map; + +public abstract class Game { + + private final Map stageMap = Maps.newHashMap(); + + @Getter + private GameStage stage; + + public StageContext setupStage(GameStage stage) { + return stageMap.computeIfAbsent(stage, stage1 -> new StageContext(this, stage1)); + } + + public void changeStage(GameStage nextStage) { + StageContext stageContext = stageMap.get(nextStage); + if (stageContext != null && stageContext.getScenario() != null) { + stageContext.getScenario().run(); + } + + this.stage = nextStage; + } +} diff --git a/minigame/src/main/java/ghast/mg/stage/GameStage.java b/minigame/src/main/java/ghast/mg/stage/GameStage.java new file mode 100644 index 0000000..3a9bd7b --- /dev/null +++ b/minigame/src/main/java/ghast/mg/stage/GameStage.java @@ -0,0 +1,5 @@ +package ghast.mg.stage; + +public interface GameStage { + +} diff --git a/minigame/src/main/java/ghast/mg/stage/StageContext.java b/minigame/src/main/java/ghast/mg/stage/StageContext.java new file mode 100644 index 0000000..650bbc2 --- /dev/null +++ b/minigame/src/main/java/ghast/mg/stage/StageContext.java @@ -0,0 +1,47 @@ +package ghast.mg.stage; + +import ghast.EventContext; +import ghast.mg.Game; +import lombok.Getter; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.EventPriority; + +import java.util.function.Consumer; + +public class StageContext { + + private final EventContext eventContext; + + @Getter + private Runnable scenario; + + public StageContext(Game gameInstance, GameStage stage) { + eventContext = EventContext.create(); + eventContext.filter(() -> gameInstance.getStage() == (stage)); + } + + public StageContext onSetStage(Runnable scenario) { + this.scenario = scenario; + return this; + } + + public StageContext onEvent(Class eventType, EventPriority eventPriority, Consumer consumer) { + eventContext.onEvent(eventType, eventPriority, consumer); + return this; + } + + public StageContext onEvent(Class eventType, Consumer consumer) { + return onEvent(eventType, EventPriority.NORMAL, consumer); + } + + public StageContext cancelEvent(Class eventType, EventPriority eventPriority) { + eventContext.cancelEvent(eventType, eventPriority); + return this; + } + + public StageContext cancelEvent(Class eventType) { + eventContext.cancelEvent(eventType); + return this; + } +} diff --git a/minigame/src/main/java/ghast/mg/stage/StandartGameStage.java b/minigame/src/main/java/ghast/mg/stage/StandartGameStage.java new file mode 100644 index 0000000..0950339 --- /dev/null +++ b/minigame/src/main/java/ghast/mg/stage/StandartGameStage.java @@ -0,0 +1,19 @@ +package ghast.mg.stage; + +public enum StandartGameStage implements GameStage { + + /** + * Ожидание новой игровой сессии. + */ + WAIT_NEW_GAME, + + /** + * Начало игровой сессии. + */ + START_GAME, + + /** + * Завершение игровой сессии. + */ + END_GAME +} diff --git a/settings.gradle b/settings.gradle index dcdebbd..84e5aee 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,3 @@ include 'tools' +include 'minigame'