Skip to content

Commit

Permalink
2.6.0
Browse files Browse the repository at this point in the history
  • Loading branch information
westernat committed Jan 31, 2024
1 parent 72611ed commit 6235909
Show file tree
Hide file tree
Showing 72 changed files with 716 additions and 276 deletions.
100 changes: 69 additions & 31 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,54 +1,67 @@
# AdvancementJS

Configure Advancements by KubeJS

## Quick Example
## Quick Example(for latest version ```2.6.0```)

### KubeJS 6
### Startup script
```js
// Create a custom trigger
AdvJSEvents.trigger(event => {
event.create("advjs:get_adv")
// How many matches you defined, how many tests you should put in
// In this example, we defined 2 matches
.match(advancement => advancement.getId() == "minecraft:story/smelt_iron")
.match(playerName => playerName == "Dev")
})
```

### Server script
```js
ServerEvents.advancement((event) => {
AdvJSEvents.advancement(event => {
const { PREDICATE, TRIGGER } = event;

// Define trigger
const jump5times = TRIGGER.tick((triggerBuilder) =>
const jump5times = TRIGGER.tick(triggerBuilder =>
triggerBuilder.addStat(Stats.JUMP, Stats.CUSTOM, { min: 5 }));
const bred_in_nether = TRIGGER.bredAnimals((triggerBuilder) => {
const bred_in_nether = TRIGGER.bredAnimals(triggerBuilder => {
triggerBuilder.setChildByPredicate(PREDICATE.entityFromJson({
stepping_on: {
dimension: "the_nether"
}
}))
});
// AdvJS custom trigger
const destroy_dirt = TRIGGER.blockDestroyed((triggerBuilder) => triggerBuilder.setBlock("dirt"));
const destroy_dirt = TRIGGER.blockDestroyed(triggerBuilder => triggerBuilder.setBlock("dirt"));
// Your custom trigger
const get_adv = TRIGGER.custom("advjs:get_adv");

// Create root advancement
const root = event.create("advjs:hell")
.display((displayBuilder) => {
.display(displayBuilder => {
displayBuilder.setTitle("AdvancementJS")
displayBuilder.setDescription("Quick example")
displayBuilder.setIcon("diamond")
})
.criteria((criteriaBuilder) => criteriaBuilder.add("dirt", destroy_dirt))
.criteria(criteriaBuilder => criteriaBuilder.add("dirt", destroy_dirt))
// AdvJS custom reward
.rewards((rewardsBuilder) => rewardsBuilder.addEffect("absorption", 200));
.rewards(rewardsBuilder => rewardsBuilder.addEffect("absorption", 200));

// Add child for root
root.addChild("child1", (childBuilder) => {
root.addChild("child1", childBuilder => {
childBuilder
.display((displayBuilder) => {
.display(displayBuilder => {
displayBuilder.setTitle(Text.red("Holy"))
displayBuilder.setDescription(Text.red("Hell starts"))
})
.criteria((criteriaBuilder) => {
.criteria(criteriaBuilder => {
// 'OR' means that if you want to achieve this advancement,
// you just need one of two triggers matched below
criteriaBuilder.setStrategy(RequirementsStrategy.OR)
criteriaBuilder.add("bred", bred_in_nether)
criteriaBuilder.add("jump", jump5times)
criteriaBuilder.add("get_adv", get_adv)
})
.rewards((rewardsBuilder) => {
.rewards(rewardsBuilder => {
rewardsBuilder.setRecipes("minecraft:lodestone", "minecraft:brewing_stand")
rewardsBuilder.setExperience(100)
})
Expand All @@ -66,45 +79,70 @@ ServerEvents.advancement((event) => {
event.get("minecraft:story/smelt_iron")
// Apply offset to display
.displayOffset(1, 1, true)
.modifyDisplay((displayBuilder) => displayBuilder.setIcon("diamond_pickaxe"))
.addChild("child2", (childBuilder) => {
.modifyDisplay(displayBuilder => displayBuilder.setIcon("diamond_pickaxe"))
.addChild("child2", childBuilder => {
childBuilder
.display((displayBuilder) => {
displayBuilder.setTitle('A nice one!')
.display(displayBuilder => {
displayBuilder.setIcon("recovery_compass")
displayBuilder.setTitle('I will come back!')
displayBuilder.setDescription(Text.green("Good luck"))
// You can also apply offset at here
displayBuilder.offset(-1, 0)
})
.criteria((criteriaBuilder) => criteriaBuilder.add("jump", jump5times))
// The trigger could also be created from json
.criteria(criteriaBuilder => criteriaBuilder.add("go_back_to_home", TRIGGER.fromJson({
"trigger": "minecraft:changed_dimension",
"conditions": {
"from": "minecraft:the_end",
"to": "minecraft:overworld"
}
})))
});
})

AdvJSEvents.lock(event => {
// Lock recipe by advancement
event.lock("stone_slab", "minecraft:story/smelt_iron");
event.result("stone_slab", "minecraft:story/smelt_iron");
})

PlayerEvents.advancement(event => {
const player = event.getPlayer();
// The first argument is use for match player predicate,
// the other two is matches you defined in startup script
CustomTriggers.of("advjs:get_adv").trigger(player, event.getAdvancement(), player.username)
})
```

### Client script
```js
// Compat with Revelationary(EventHorizon)
AdvJSEvents.revelation(event => {
event.onFlush((done, removed, isFirst) => {
event.player.sendSystemMessage(Text.aqua(done.size() + " advancement has done"))
event.player.sendSystemMessage(Text.red(removed.size() + " advancement has removed"))
event.player.sendSystemMessage(Text.green(isFirst ? "Is" : "Isn't" + " first flush"))
})
})
```

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

# Features
- Custom trigger
- You can create a custom trigger in startup event ```AdvJSEvents.trigger```.
- AdvJS 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.
- increasedKillScore: triggers when the player killed an entity.
- More idea...
- Custom reward
- AdvJS custom reward
- addEffect: to give effect.
- More idea...
- Custom method
- AdvJS custom method
- displayOffset(offsetX: number, offsetY: number, modifyChildren?: boolean)
- apply offset to advancement display and its children
- requireParentDone()
- check if parent done, else it will not be done.
- requireOthersDone(requires[]: ResourceLocation...)
- check if advancements that you put in had done.
- More idea...

# TODO
- More non-vanilla triggers
- More than vanilla rewards
- Compat
- ```Revelationary```(Fabric only), the new client event: ```AdvJSEvents.revelation```
- ```EventHorizon```(Forge only), the new client event: ```AdvJSEvents.revelation```
10 changes: 9 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,13 @@ repositories {
includeGroup "dev.latvian.mods"
}
}

maven {
url = "https://api.modrinth.com/maven"
content {
includeGroup "maven.modrinth"
}
}
}

dependencies {
Expand All @@ -34,7 +41,8 @@ dependencies {
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"

modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
modImplementation("dev.latvian.mods:kubejs-fabric:${kubejs_version}")
modImplementation "dev.latvian.mods:kubejs-fabric:${kubejs_version}"
modCompileOnly "maven.modrinth:Revelationary:${revelationary_version}"
}

processResources {
Expand Down
5 changes: 3 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ yarn_mappings=1.20.1+build.10
loader_version=0.15.3

# Mod Properties
mod_version=2001fabric-2.4.0
mod_version=2001fabric-2.6.0
maven_group=org.mesdag.advjs
archives_base_name=AdvJS

# Dependencies
fabric_version=0.91.0+1.20.1
kubejs_version=2001.6.4-build.121
kubejs_version=2001.6.4-build.121
revelationary_version=1.3.5+1.20.1
17 changes: 12 additions & 5 deletions src/main/java/org/mesdag/advjs/AdvJS.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,36 @@

import dev.latvian.mods.kubejs.CommonProperties;
import dev.latvian.mods.kubejs.KubeJSPaths;
import dev.latvian.mods.kubejs.bindings.event.ServerEvents;
import dev.latvian.mods.kubejs.event.EventHandler;
import dev.latvian.mods.kubejs.util.ConsoleJS;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.minecraft.util.Identifier;
import org.mesdag.advjs.command.AdvCommand;
import org.mesdag.advjs.configure.AdvConfigureEvent;
import org.mesdag.advjs.trigger.custom.CriteriaTriggers;

import java.nio.file.Path;

public class AdvJS implements ModInitializer {
public static final EventHandler ADVANCEMENT = ServerEvents.GROUP.server("advancement", () -> AdvConfigureEvent.class);
public static final Path EXAMPLE = KubeJSPaths.SERVER_SCRIPTS.resolve("advjs_example.js");
public static final Path SERVER_EXAMPLE = KubeJSPaths.SERVER_SCRIPTS.resolve("advjs_server.js");
public static final Path STARTUP_EXAMPLE = KubeJSPaths.STARTUP_SCRIPTS.resolve("advjs_startup.js");
public static final Path STORY = KubeJSPaths.SERVER_SCRIPTS.resolve("advjs_story.js");
public static final Path ADVENTURE = KubeJSPaths.SERVER_SCRIPTS.resolve("advjs_adventure.js");
public static final Path NETHER = KubeJSPaths.SERVER_SCRIPTS.resolve("advjs_nether.js");
public static final Path HUSBANDRY = KubeJSPaths.SERVER_SCRIPTS.resolve("advjs_husbandry.js");
public static final Path END = KubeJSPaths.SERVER_SCRIPTS.resolve("advjs_end.js");

public static final Identifier PARENT = new Identifier("advjs", "parent");

@Override
public void onInitialize() {
CommonProperties.reload();
CriteriaTriggers.initialize();
CommandRegistrationCallback.EVENT.register(AdvCommand::register);
}

public static void debugInfo(String info) {
if (AdvJSPlugin.DEBUG) {
ConsoleJS.SERVER.info(info);
}
}
}
43 changes: 31 additions & 12 deletions src/main/java/org/mesdag/advjs/AdvJSPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,24 @@
import dev.latvian.mods.kubejs.script.ScriptType;
import dev.latvian.mods.kubejs.util.ConsoleJS;
import dev.latvian.mods.rhino.util.wrap.TypeWrappers;
import org.mesdag.advjs.advancement.AdvLockEventJS;
import org.mesdag.advjs.command.AdvCommand;
import org.mesdag.advjs.trigger.registry.CustomTriggers;
import org.mesdag.advjs.trigger.registry.TriggerRegistryEventJS;
import org.mesdag.advjs.util.*;

import java.nio.file.Files;

import static org.mesdag.advjs.util.Data.*;

public class AdvJSPlugin extends KubeJSPlugin {
public static boolean DEBUG;
static boolean DEBUG;

@Override
public void registerBindings(BindingsEvent event) {
event.add("FrameType", FrameTypeWrapper.class);
event.add("RequirementsStrategy", RequirementsStrategyWrapper.class);
event.add("GameType", GameTypeWrapper.class);
event.add("Bounds", Bounds.class);
event.add("CustomTriggers", CustomTriggers.class);
}

@Override
Expand All @@ -30,14 +32,21 @@ public void registerTypeWrappers(ScriptType type, TypeWrappers typeWrappers) {
typeWrappers.registerSimple(AdvRemoveFilter.class, AdvRemoveFilter::of);
}

@Override
public void initStartup() {
AdvJSEvents.TRIGGER.post(new TriggerRegistryEventJS());
CustomTriggers.registerAll();
}

@Override
public void onServerReload() {
FILTERS.clear();
GETTER_MAP.clear();
BUILDER_MAP.clear();
LOCK_MAP.clear();
REQUIRE_DONE.clear();
DISPLAY_OFFSET.clear();
Data.clear();
AdvJSEvents.LOCK.post(new AdvLockEventJS());
}

@Override
public void registerEvents() {
AdvJSEvents.GROUP.register();
}

@Override
Expand All @@ -47,10 +56,20 @@ public void loadCommonProperties(CommonProperties properties) {
}

private static void example(boolean generate) {
if (generate && Files.notExists(AdvJS.EXAMPLE)) {
if (!generate) return;

if (Files.notExists(AdvJS.STARTUP_EXAMPLE)) {
try {
Files.writeString(AdvJS.STARTUP_EXAMPLE, AdvCommand.STARTUP_EXAMPLE);
ConsoleJS.SERVER.info("AdvJS: Generated advjs_startup.js");
} catch (Exception ex) {
ex.printStackTrace();
}
}
if (Files.notExists(AdvJS.SERVER_EXAMPLE)) {
try {
Files.writeString(AdvJS.EXAMPLE, AdvCommand.EXAMPLE);
ConsoleJS.SERVER.info("AdvJS: Generated advjs_example.js");
Files.writeString(AdvJS.SERVER_EXAMPLE, AdvCommand.SERVER_EXAMPLE);
ConsoleJS.SERVER.info("AdvJS: Generated advjs_server.js");
} catch (Exception ex) {
ex.printStackTrace();
}
Expand Down
Loading

0 comments on commit 6235909

Please sign in to comment.