Skip to content

Commit 5444586

Browse files
committed
Add an advancement trigger for when a player has a stage.
"criteria": { "get_the_stage": { "trigger": "gamestages:has_stage", "conditions": { "stage": "target_stage_name" } } }
1 parent add1c8e commit 5444586

File tree

3 files changed

+79
-17
lines changed

3 files changed

+79
-17
lines changed

src/main/java/net/darkhax/gamestages/GameStageHelper.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.darkhax.gamestages;
22

3+
import net.darkhax.gamestages.advancement.HasStageTrigger;
34
import net.darkhax.gamestages.data.GameStageSaveHandler;
45
import net.darkhax.gamestages.data.IStageData;
56
import net.darkhax.gamestages.event.GameStageEvent;
@@ -303,6 +304,10 @@ public static void syncPlayer (ServerPlayer player) {
303304

304305
GameStages.LOG.debug("Syncing {} stages for {}.", info.getStages().size(), player.getName());
305306
GameStages.NETWORK.syncPlayerStages(player, new MessageStages(info.getStages()));
307+
308+
for (String stage : info.getStages()) {
309+
HasStageTrigger.INSTANCE.trigger(player, stage);
310+
}
306311
}
307312
}
308313
}

src/main/java/net/darkhax/gamestages/GameStages.java

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,77 @@
11
package net.darkhax.gamestages;
22

3+
import net.darkhax.gamestages.advancement.HasStageTrigger;
34
import net.darkhax.gamestages.command.GameStageCommands;
45
import net.darkhax.gamestages.data.GameStageSaveHandler;
56
import net.darkhax.gamestages.data.IStageData;
67
import net.darkhax.gamestages.packet.GameStagesPacketHandler;
78
import net.minecraft.ChatFormatting;
9+
import net.minecraft.advancements.CriteriaTriggers;
810
import net.minecraft.client.Minecraft;
911
import net.minecraftforge.api.distmarker.Dist;
1012
import net.minecraftforge.api.distmarker.OnlyIn;
1113
import net.minecraftforge.client.event.CustomizeGuiOverlayEvent;
1214
import net.minecraftforge.common.MinecraftForge;
1315
import net.minecraftforge.event.AddReloadListenerEvent;
1416
import net.minecraftforge.fml.common.Mod;
17+
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
18+
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
1519
import net.minecraftforge.fml.loading.FMLEnvironment;
1620
import org.apache.logging.log4j.LogManager;
1721
import org.apache.logging.log4j.Logger;
1822

1923
@Mod(GameStages.MOD_ID)
2024
public class GameStages {
21-
25+
2226
public static final String MOD_ID = "gamestages";
2327
public static final Logger LOG = LogManager.getLogger("Game Stages");
2428
public static final GameStagesPacketHandler NETWORK = new GameStagesPacketHandler();
25-
29+
2630
public GameStages() {
2731

2832
GameStageSaveHandler.reloadFakePlayers();
2933
GameStageSaveHandler.reloadKnownStages();
3034
GameStageCommands.initializeCommands();
31-
3235
if (FMLEnvironment.dist.isClient()) {
33-
3436
MinecraftForge.EVENT_BUS.addListener(this::onF3Text);
3537
}
36-
3738
MinecraftForge.EVENT_BUS.addListener(this::registerReloadListeners);
39+
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
40+
}
41+
42+
private void setup(final FMLCommonSetupEvent event) {
43+
event.enqueueWork(() -> {
44+
CriteriaTriggers.register(HasStageTrigger.INSTANCE);
45+
});
3846
}
39-
47+
4048
private void registerReloadListeners(AddReloadListenerEvent event) {
41-
49+
4250
event.addListener(new GameStageReloader());
4351
}
44-
52+
4553
@OnlyIn(Dist.CLIENT)
46-
private void onF3Text (CustomizeGuiOverlayEvent.DebugText event) {
47-
54+
private void onF3Text(CustomizeGuiOverlayEvent.DebugText event) {
55+
4856
final Minecraft mc = Minecraft.getInstance();
49-
57+
5058
if (mc.options.renderDebug) {
51-
59+
5260
if (mc.player != null && mc.player.isShiftKeyDown()) {
53-
61+
5462
final IStageData data = GameStageHelper.getPlayerData(mc.player);
55-
63+
5664
if (data != null) {
57-
65+
5866
event.getRight().add(ChatFormatting.GOLD + ChatFormatting.UNDERLINE.toString() + "GameStages");
5967
event.getRight().add("Count: " + data.getStages().size());
6068
event.getRight().add("Type: " + data.getClass().getName());
6169
event.getRight().add("Stages: " + data.getStages().toString());
6270
}
6371
}
64-
72+
6573
else {
66-
74+
6775
event.getRight().add(ChatFormatting.GOLD + ChatFormatting.UNDERLINE.toString() + "GameStages [Shift]");
6876
}
6977
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package net.darkhax.gamestages.advancement;
2+
3+
import com.google.gson.JsonObject;
4+
import net.darkhax.gamestages.GameStageHelper;
5+
import net.darkhax.gamestages.GameStages;
6+
import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance;
7+
import net.minecraft.advancements.critereon.ContextAwarePredicate;
8+
import net.minecraft.advancements.critereon.DeserializationContext;
9+
import net.minecraft.advancements.critereon.SerializationContext;
10+
import net.minecraft.advancements.critereon.SimpleCriterionTrigger;
11+
import net.minecraft.resources.ResourceLocation;
12+
import net.minecraft.server.level.ServerPlayer;
13+
14+
public class HasStageTrigger extends SimpleCriterionTrigger<HasStageTrigger.Instance> {
15+
16+
public static final ResourceLocation TRIGGER_ID = new ResourceLocation(GameStages.MOD_ID, "has_stage");
17+
public static final HasStageTrigger INSTANCE = new HasStageTrigger();
18+
19+
public void trigger(ServerPlayer player, String stage) {
20+
this.trigger(player, predicate -> GameStageHelper.hasAllOf(player, stage));
21+
}
22+
23+
@Override
24+
protected Instance createInstance(JsonObject json, ContextAwarePredicate playerContext, DeserializationContext context) {
25+
return new Instance(playerContext, json.get("stage").getAsString());
26+
}
27+
28+
@Override
29+
public ResourceLocation getId() {
30+
return TRIGGER_ID;
31+
}
32+
33+
public static class Instance extends AbstractCriterionTriggerInstance {
34+
35+
private final String stage;
36+
37+
public Instance(ContextAwarePredicate context, String stage) {
38+
super(TRIGGER_ID, context);
39+
this.stage = stage;
40+
}
41+
42+
@Override
43+
public JsonObject serializeToJson(SerializationContext context) {
44+
final JsonObject json = super.serializeToJson(context);
45+
json.addProperty("stage", this.stage);
46+
return json;
47+
}
48+
}
49+
}

0 commit comments

Comments
 (0)