Skip to content

Commit

Permalink
updates to latest
Browse files Browse the repository at this point in the history
  • Loading branch information
westernat committed Jan 8, 2024
1 parent 9a6c2bf commit d1b498b
Show file tree
Hide file tree
Showing 34 changed files with 991 additions and 43 deletions.
27 changes: 24 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Configure Advancements by KubeJS
ServerEvents.advancement((event) => {
const { BOUNDS, PREDICATE, TRIGGER } = event;

// Define triggers
// Define trigger
const jump5times = TRIGGER.tick((triggerBuilder) =>
triggerBuilder.addStat(Stats.JUMP, Stats.CUSTOM, BOUNDS.min$Integer(5)));
const bred_in_nether = TRIGGER.bredAnimals((triggerBuilder) => {
Expand All @@ -20,6 +20,8 @@ ServerEvents.advancement((event) => {
}
}))
});
// AdvJS custom trigger
const destroy_dirt = TRIGGER.blockDestroyed((triggerBuilder) => triggerBuilder.setBlock("dirt"));

// Create root advancement
const root = event.create("advjs:hell")
Expand All @@ -28,7 +30,9 @@ ServerEvents.advancement((event) => {
displayBuilder.setDescription("Quick example")
displayBuilder.setIcon("diamond")
})
.criteria((criteriaBuilder) => criteriaBuilder.add("tick", TRIGGER.tick()));
.criteria((criteriaBuilder) => criteriaBuilder.add("dirt", destroy_dirt))
// AdvJS custom reward
.rewards((rewardsBuilder) => rewardsBuilder.addEffect("absorption", 200));

// Add child for root
root.addChild("child1", (childBuilder) => {
Expand Down Expand Up @@ -66,6 +70,23 @@ ServerEvents.advancement((event) => {
});

// Lock recipe by advancement
event.lock("stone_slab", "minecraft:story/smelt_iron")
event.lock("stone_slab", "minecraft:story/smelt_iron");
})
```

# How to reload
Just use ```/reload```

# Custom trigger
- blockDestroyed: triggers when the player breaks a block.
- playerTouch: triggers when the player touch an entity.
- bossEvent: triggers when the play joins a boss fight.
- More idea...

# Custom reward
- addEffect: to give effect.
- More idea...

# TODO
- More non-vanilla triggers
- More than vanilla rewards
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ minecraft_version=1.19.2
yarn_mappings=1.19.2+build.28
loader_version=0.15.3
# Mod Properties
mod_version=1902fabric-1.6.0
mod_version=1902fabric-1.7.0
maven_group=org.mesdag.advjs
archives_base_name=AdvJS
# Dependencies
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/org/mesdag/advjs/AdvJS.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import dev.latvian.mods.kubejs.bindings.event.ServerEvents;
import dev.latvian.mods.kubejs.event.EventHandler;
import net.fabricmc.api.ModInitializer;
import org.mesdag.advjs.trigger.custom.CriteriaTriggers;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -18,5 +19,6 @@ public class AdvJS implements ModInitializer {
@Override
public void onInitialize() {
CommonProperties.reload();
CriteriaTriggers.initialize();
}
}
6 changes: 5 additions & 1 deletion src/main/java/org/mesdag/advjs/AdvJSPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ private static void example(boolean generate) {
}
}))
});
// AdvJS custom trigger
const destroy_dirt = TRIGGER.blockDestroyed((triggerBuilder) => triggerBuilder.setBlock("dirt"));
// Create root advancement
const root = event.create("advjs:hell")
Expand All @@ -69,7 +71,9 @@ private static void example(boolean generate) {
displayBuilder.setDescription("Quick example")
displayBuilder.setIcon("diamond")
})
.criteria((criteriaBuilder) => criteriaBuilder.add("tick", TRIGGER.tick()));
.criteria((criteriaBuilder) => criteriaBuilder.add("dirt", destroy_dirt))
// AdvJS custom reward
.rewards((rewardsBuilder) => rewardsBuilder.addEffect("absorption", 200));
// Add child for root
root.addChild("child1", (childBuilder) => {
Expand Down
10 changes: 7 additions & 3 deletions src/main/java/org/mesdag/advjs/AdvancementEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,22 @@
import org.mesdag.advjs.adv.AdvGetter;
import org.mesdag.advjs.predicate.Predicate;
import org.mesdag.advjs.trigger.Trigger;
import org.mesdag.advjs.util.MinMaxBoundsProvider;
import org.mesdag.advjs.util.Bounds;

import static org.mesdag.advjs.adv.Data.LOCK_MAP;
import static org.mesdag.advjs.adv.Data.REMOVES;

public class AdvancementEvent extends EventJS {
@Info("Trigger required in advancement.")
@Info("""
Trigger required in advancement.
More details please goto https://minecraft.wiki/w/Advancement/JSON_format
""")
public final Trigger TRIGGER = new Trigger();
@Info("Predicate required in trigger.")
public final Predicate PREDICATE = new Predicate();
@Info("Bounds required in predicate.")
public final MinMaxBoundsProvider BOUNDS = new MinMaxBoundsProvider();
public final Bounds BOUNDS = new Bounds();

@Info("Create a new advancement root")
public AdvBuilder create(Identifier rootPath) {
Expand Down
10 changes: 6 additions & 4 deletions src/main/java/org/mesdag/advjs/adv/AdvBuilder.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.mesdag.advjs.adv;

import dev.latvian.mods.kubejs.typings.Info;
import dev.latvian.mods.rhino.util.HideFromJS;
import net.minecraft.advancement.AdvancementCriterion;
import net.minecraft.advancement.AdvancementDisplay;
import net.minecraft.advancement.AdvancementRewards;
Expand All @@ -25,6 +26,7 @@ public class AdvBuilder {

private final boolean warn;

@HideFromJS
public AdvBuilder(@Nullable Identifier parent, String name, Identifier rootPath, boolean warn) {
this.parent = parent;
this.name = name;
Expand Down Expand Up @@ -87,22 +89,22 @@ public Identifier getSavePath() {
return new Identifier(rootPath.getNamespace(), rootPath.getPath() + "/" + name);
}

@Info("Get the built display.")
@HideFromJS
public AdvancementDisplay getDisplayInfo() {
return displayBuilder.build();
}

@Info("Get the built criteria.")
@HideFromJS
public Map<String, AdvancementCriterion> getCriteria() {
return criteriaBuilder.getCriteria();
}

@Info("Get the built requirements.")
@HideFromJS
public String[][] getRequirements() {
return criteriaBuilder.getRequirements();
}

@Info("Get the built rewards.")
@HideFromJS
public AdvancementRewards getRewards() {
return rewardsBuilder.build();
}
Expand Down
8 changes: 5 additions & 3 deletions src/main/java/org/mesdag/advjs/adv/AdvGetter.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.mesdag.advjs.adv;

import dev.latvian.mods.kubejs.typings.Info;
import dev.latvian.mods.rhino.util.HideFromJS;
import net.minecraft.util.Identifier;

import java.util.UUID;
Expand All @@ -14,6 +15,7 @@ public class AdvGetter {
private Consumer<RewardsBuilder> rewardsConsumer;
private Consumer<CriteriaBuilder> criteriaConsumer;

@HideFromJS
public AdvGetter(Identifier savePath) {
this.savePath = savePath;
this.displayConsumer = displayBuilder -> {
Expand Down Expand Up @@ -66,17 +68,17 @@ public AdvBuilder addChild(String name, Consumer<AdvBuilder> advBuilderConsumer)
return child;
}

@Info("Get display builder consumer that you just modified.")
@HideFromJS
public Consumer<DisplayBuilder> getDisplayConsumer() {
return displayConsumer;
}

@Info("Get criteria builder consumer that you just modified.")
@HideFromJS
public Consumer<CriteriaBuilder> getCriteriaConsumer() {
return criteriaConsumer;
}

@Info("Get rewards builder consumer that you just modified.")
@HideFromJS
public Consumer<RewardsBuilder> getRewardsConsumer() {
return rewardsConsumer;
}
Expand Down
10 changes: 7 additions & 3 deletions src/main/java/org/mesdag/advjs/adv/CriteriaBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
import com.google.gson.JsonArray;
import dev.latvian.mods.kubejs.typings.Info;
import dev.latvian.mods.kubejs.typings.Param;
import dev.latvian.mods.rhino.util.HideFromJS;
import net.minecraft.advancement.AdvancementCriterion;
import net.minecraft.advancement.CriterionMerger;
import net.minecraft.advancement.criterion.AbstractCriterionConditions;
import net.minecraft.advancement.criterion.CriterionConditions;
import net.minecraft.advancement.criterion.InventoryChangedCriterion;
import net.minecraft.item.Items;
import net.minecraft.util.JsonHelper;
Expand All @@ -30,6 +31,7 @@ public class CriteriaBuilder {
requirements = null;
}

@HideFromJS
public CriteriaBuilder(Map<String, AdvancementCriterion> criteria, JsonArray requirements) {
this.criteria = criteria;
this.strategy = CriterionMerger.AND;
Expand All @@ -41,12 +43,12 @@ public CriteriaBuilder(Map<String, AdvancementCriterion> criteria, JsonArray req
@Param(name = "name", value = "The name of this trigger"),
@Param(name = "trigger", value = "The trigger itself")
})
public <Trigger extends AbstractCriterionConditions> void add(String name, Trigger instance) {
public <Trigger extends CriterionConditions> void add(String name, Trigger instance) {
criteria.put(name, new AdvancementCriterion(instance));
}

@Info("Add a nameless trigger for this advancement.")
public <Trigger extends AbstractCriterionConditions> void add(Trigger instance) {
public <Trigger extends CriterionConditions> void add(Trigger instance) {
criteria.put(UUID.randomUUID().toString(), new AdvancementCriterion(instance));
}

Expand All @@ -55,6 +57,7 @@ public void remove(String name) {
criteria.remove(name);
}

@HideFromJS
public Map<String, AdvancementCriterion> getCriteria() {
if (criteria.isEmpty()) {
criteria.put("default", new AdvancementCriterion(InventoryChangedCriterion.Conditions.items(Items.APPLE)));
Expand Down Expand Up @@ -95,6 +98,7 @@ public void setRequirements(JsonArray jsonArray) {
this.requirements = astring;
}

@HideFromJS
public String[][] getRequirements() {
Set<String> names = getCriteria().keySet();
if (requirements == null) {
Expand Down
1 change: 1 addition & 0 deletions src/main/java/org/mesdag/advjs/adv/Data.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ public class Data {
public static final HashMap<Identifier, AdvGetter> GETTER_MAP = new HashMap<>();
public static final HashMap<Identifier, AdvBuilder> BUILDER_MAP = new HashMap<>();
public static final HashMap<Item, Identifier> LOCK_MAP = new HashMap<>();

public static final Text ATTENTION = Text.translatable("advjs.attention").formatted(Formatting.RED);
public static final Text ATTENTION_DESC = Text.translatable("advjs.attention.desc");
static final Identifier DEFAULT_BACKGROUND = new Identifier("textures/gui/advancements/backgrounds/stone.png");
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/org/mesdag/advjs/adv/DisplayBuilder.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.mesdag.advjs.adv;

import dev.latvian.mods.kubejs.typings.Info;
import dev.latvian.mods.rhino.util.HideFromJS;
import net.minecraft.advancement.AdvancementDisplay;
import net.minecraft.advancement.AdvancementFrame;
import net.minecraft.item.ItemStack;
Expand Down Expand Up @@ -31,6 +32,7 @@ public class DisplayBuilder {
this.hidden = false;
}

@HideFromJS
public DisplayBuilder(ItemStack icon, Text title, Text description, @Nullable Identifier background, AdvancementFrame frameType, boolean showToast, boolean announceToChat, boolean hidden) {
this.icon = icon;
this.title = title;
Expand Down Expand Up @@ -91,6 +93,7 @@ public void setHidden(boolean hidden) {
this.hidden = hidden;
}

@HideFromJS
public AdvancementDisplay build() {
return new AdvancementDisplay(icon, title, description, background, frameType, showToast, announceToChat, hidden);
}
Expand Down
45 changes: 44 additions & 1 deletion src/main/java/org/mesdag/advjs/adv/RewardsBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,22 @@

import dev.latvian.mods.kubejs.typings.Info;
import dev.latvian.mods.kubejs.typings.Param;
import dev.latvian.mods.rhino.util.HideFromJS;
import net.minecraft.advancement.AdvancementRewards;
import net.minecraft.entity.effect.StatusEffect;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.server.function.CommandFunction;
import net.minecraft.util.Identifier;
import org.mesdag.advjs.util.RewardsAccessor;

import java.util.ArrayList;

public class RewardsBuilder {
private int experience;
private Identifier[] loot;
private Identifier[] recipes;
private CommandFunction.LazyContainer function;
private final ArrayList<StatusEffectInstance> mobEffectInstances = new ArrayList<>();

RewardsBuilder() {
this.experience = 0;
Expand All @@ -20,6 +27,7 @@ public class RewardsBuilder {
this.function = CommandFunction.LazyContainer.EMPTY;
}

@HideFromJS
public RewardsBuilder(int experience, Identifier[] loot, Identifier[] recipes, CommandFunction.LazyContainer function) {
this.experience = experience;
this.loot = loot;
Expand Down Expand Up @@ -49,7 +57,42 @@ public void setFunction(Identifier functionId) {
this.function = new CommandFunction.LazyContainer(functionId);
}

@Info(value = "To give effect.",
params = {
@Param(name = "mobEffect"),
@Param(name = "duration")
})
public void addEffect(StatusEffect mobEffect, int duration) {
this.mobEffectInstances.add(new StatusEffectInstance(mobEffect, duration));
}

@Info(value = "To give effect.",
params = {
@Param(name = "mobEffect"),
@Param(name = "duration"),
@Param(name = "amplifier")
})
public void addEffect(StatusEffect mobEffect, int duration, int amplifier) {
this.mobEffectInstances.add(new StatusEffectInstance(mobEffect, duration, amplifier));
}

@Info(value = "To give effect.",
params = {
@Param(name = "mobEffect"),
@Param(name = "duration"),
@Param(name = "amplifier"),
@Param(name = "ambient"),
@Param(name = "visible"),
@Param(name = "showIcon")
})
public void addEffect(StatusEffect mobEffect, int duration, int amplifier, boolean ambient, boolean visible, boolean showIcon) {
this.mobEffectInstances.add(new StatusEffectInstance(mobEffect, duration, amplifier, ambient, visible, showIcon));
}

@HideFromJS
public AdvancementRewards build() {
return new AdvancementRewards(experience, loot, recipes, function);
RewardsAccessor accessor = (RewardsAccessor) new AdvancementRewards(experience, loot, recipes, function);
accessor.advJS$setMobEffectInstances(mobEffectInstances.toArray(StatusEffectInstance[]::new));
return accessor.advJS$getSelf();
}
}
35 changes: 35 additions & 0 deletions src/main/java/org/mesdag/advjs/mixin/AdvancementRewardsMixin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.mesdag.advjs.mixin;

import dev.latvian.mods.rhino.util.HideFromJS;
import net.minecraft.advancement.AdvancementRewards;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.server.network.ServerPlayerEntity;
import org.jetbrains.annotations.Nullable;
import org.mesdag.advjs.util.RewardsAccessor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(AdvancementRewards.class)
public abstract class AdvancementRewardsMixin implements RewardsAccessor {
@Nullable
private StatusEffectInstance[] advJS$mobEffectInstances = null;

@Override
@HideFromJS
public void advJS$setMobEffectInstances(StatusEffectInstance[] mobEffectInstances) {
advJS$mobEffectInstances = mobEffectInstances;
}

@Inject(method = "apply", at = @At("HEAD"))
private void advJS$grant(ServerPlayerEntity serverPlayer, CallbackInfo ci) {
if (advJS$mobEffectInstances != null) {
for (StatusEffectInstance mobEffectInstance : advJS$mobEffectInstances) {
if (mobEffectInstance != null) {
serverPlayer.addStatusEffect(mobEffectInstance);
}
}
}
}
}
Loading

0 comments on commit d1b498b

Please sign in to comment.