Skip to content

Commit 87709c7

Browse files
authored
Trial Spawners and Vaults support (#2790)
* Trial spawners and vaults compatibility * slight fixes * added BlockDispenseLootScriptEvent to accommodate vault loot dispensing * minor changes * meta correction * minor changes * better item checking for context * removed variable from determination * clarified OminousItem`Spawner` * minor changes * fix for npcs * minor changes * minor changes
1 parent 7f6475f commit 87709c7

11 files changed

Lines changed: 371 additions & 143 deletions

File tree

paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ public static void init() {
104104
ScriptEvent.registerScriptEvent(TNTPrimesScriptEvent.class);
105105
}
106106
ScriptEvent.registerScriptEvent(UnknownCommandScriptEvent.class);
107+
if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) {
108+
ScriptEvent.registerScriptEvent(VaultChangesStateScriptEvent.class);
109+
}
107110
if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) {
108111
ScriptEvent.registerScriptEvent(WardenChangesAngerLevelScriptEvent.class);
109112
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.denizenscript.denizen.paper.events;
2+
3+
import com.denizenscript.denizen.events.BukkitScriptEvent;
4+
import com.denizenscript.denizen.objects.LocationTag;
5+
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
6+
import com.denizenscript.denizencore.objects.ObjectTag;
7+
import com.denizenscript.denizencore.objects.core.ElementTag;
8+
import com.denizenscript.denizencore.scripts.ScriptEntryData;
9+
import io.papermc.paper.event.block.VaultChangeStateEvent;
10+
import org.bukkit.event.EventHandler;
11+
import org.bukkit.event.Listener;
12+
13+
public class VaultChangesStateScriptEvent extends BukkitScriptEvent implements Listener {
14+
15+
// <--[event]
16+
// @Events
17+
// vault changes state
18+
//
19+
// @Plugin Paper
20+
//
21+
// @Group Block
22+
//
23+
// @Cancellable true
24+
//
25+
// @Location true
26+
//
27+
// @Triggers when a vault block's state changes. A list of states can be found at <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/block/data/type/Vault.State.html>.
28+
//
29+
// @Context
30+
// <context.location> returns the LocationTag of the vault block.
31+
// <context.old_state> returns the vault state before the change.
32+
// <context.new_state> returns the vault state after the change.
33+
//
34+
// @Player when the entity who triggered the change is a player.
35+
//
36+
// -->
37+
38+
public VaultChangesStateScriptEvent() {
39+
registerCouldMatcher("vault changes state");
40+
}
41+
42+
public LocationTag location;
43+
public VaultChangeStateEvent event;
44+
45+
@Override
46+
public boolean matches(ScriptPath path) {
47+
if (!runInCheck(path, location)) {
48+
return false;
49+
}
50+
return super.matches(path);
51+
}
52+
53+
@Override
54+
public ScriptEntryData getScriptEntryData() {
55+
return new BukkitScriptEntryData(event.getPlayer());
56+
}
57+
58+
@Override
59+
public ObjectTag getContext(String name) {
60+
return switch (name) {
61+
case "old_state" -> new ElementTag(event.getCurrentState());
62+
case "new_state" -> new ElementTag(event.getNewState());
63+
case "location" -> location;
64+
default -> super.getContext(name);
65+
};
66+
}
67+
68+
@EventHandler
69+
public void onVaultChangesStateEvent(VaultChangeStateEvent event) {
70+
location = new LocationTag(event.getBlock().getLocation());
71+
this.event = event;
72+
fire(event);
73+
}
74+
}

plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,26 +80,34 @@ public static void registerMainEvents() {
8080
ScriptEvent.registerScriptEvent(BlockShearEntityScriptEvent.class);
8181
ScriptEvent.registerScriptEvent(BlockSpreadsScriptEvent.class);
8282
ScriptEvent.registerScriptEvent(BrewingStandFueledScriptEvent.class);
83+
if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) {
84+
ScriptEvent.registerScriptEvent(BrewingStartsScriptEvent.class);
85+
}
8386
ScriptEvent.registerScriptEvent(BrewsScriptEvent.class);
8487
ScriptEvent.registerScriptEvent(CauldronLevelChangeScriptEvent.class);
88+
if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) {
89+
ScriptEvent.registerScriptEvent(CrafterCraftsScriptEvent.class);
90+
}
8591
ScriptEvent.registerScriptEvent(DragonEggMovesScriptEvent.class);
8692
ScriptEvent.registerScriptEvent(FurnaceBurnsItemScriptEvent.class);
8793
ScriptEvent.registerScriptEvent(FurnaceStartsSmeltingScriptEvent.class);
8894
ScriptEvent.registerScriptEvent(LeafDecaysScriptEvent.class);
8995
ScriptEvent.registerScriptEvent(LiquidLevelChangeScriptEvent.class);
9096
ScriptEvent.registerScriptEvent(LiquidSpreadScriptEvent.class);
97+
if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) {
98+
ScriptEvent.registerScriptEvent(LootDispensesFromBlockScriptEvent.class);
99+
}
91100
ScriptEvent.registerScriptEvent(MoistureChangeScriptEvent.class);
92101
ScriptEvent.registerScriptEvent(NoteBlockPlaysNoteScriptEvent.class);
93102
ScriptEvent.registerScriptEvent(PistonExtendsScriptEvent.class);
94103
ScriptEvent.registerScriptEvent(PistonRetractsScriptEvent.class);
95104
ScriptEvent.registerScriptEvent(RedstoneScriptEvent.class);
96105
ScriptEvent.registerScriptEvent(SpongeAbsorbsScriptEvent.class);
97106
if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) {
98-
ScriptEvent.registerScriptEvent(BrewingStartsScriptEvent.class);
99107
ScriptEvent.registerScriptEvent(TNTPrimesScriptEvent.class);
100108
}
101109
if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) {
102-
ScriptEvent.registerScriptEvent(CrafterCraftsScriptEvent.class);
110+
ScriptEvent.registerScriptEvent(VaultDisplayItemScriptEvent.class);
103111
}
104112

105113
// Entity events

plugin/src/main/java/com/denizenscript/denizen/events/block/BlockDispensesScriptEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class BlockDispensesScriptEvent extends BukkitScriptEvent implements List
2222
//
2323
// @Cancellable true
2424
//
25-
// @Triggers when a block dispenses an item.
25+
// @Triggers when a block dispenses a single item.
2626
//
2727
// @Context
2828
// <context.location> returns the LocationTag of the dispenser.
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package com.denizenscript.denizen.events.block;
2+
3+
import com.denizenscript.denizen.events.BukkitScriptEvent;
4+
import com.denizenscript.denizen.objects.*;
5+
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
6+
import com.denizenscript.denizencore.objects.ObjectTag;
7+
import com.denizenscript.denizencore.objects.core.ListTag;
8+
import com.denizenscript.denizencore.scripts.ScriptEntryData;
9+
import org.bukkit.event.EventHandler;
10+
import org.bukkit.event.Listener;
11+
import org.bukkit.event.block.BlockDispenseLootEvent;
12+
import org.bukkit.inventory.ItemStack;
13+
14+
import java.util.ArrayList;
15+
import java.util.List;
16+
17+
public class LootDispensesFromBlockScriptEvent extends BukkitScriptEvent implements Listener {
18+
19+
// <--[event]
20+
// @Events
21+
// loot dispenses from <block>
22+
//
23+
// @Group Block
24+
//
25+
// @Location true
26+
//
27+
// @Cancellable true
28+
//
29+
// @Player when a player triggered the loot to dispense.
30+
//
31+
// @Triggers when a block dispenses loot containing multiple items.
32+
//
33+
// @Context
34+
// <context.loot> returns a ListTag(ItemTag) of loot items.
35+
// <context.location> returns a LocationTag of the block that is dispensing the items.
36+
//
37+
// @Determine
38+
// "LOOT:<ListTag(ItemTag)>" to determine the new items that are outputted.
39+
//
40+
// -->
41+
42+
public LootDispensesFromBlockScriptEvent() {
43+
registerCouldMatcher("loot dispenses from <block>");
44+
this.<LootDispensesFromBlockScriptEvent, ListTag>registerDetermination("loot", ListTag.class, (evt, context, input) -> {
45+
List<ItemStack> items = new ArrayList<>(input.size());
46+
for (ItemTag item : input.filter(ItemTag.class, context)) {
47+
items.add(item.getItemStack());
48+
}
49+
evt.event.setDispensedLoot(items);
50+
});
51+
}
52+
53+
public MaterialTag block;
54+
public LocationTag location;
55+
public BlockDispenseLootEvent event;
56+
57+
@Override
58+
public boolean matches(ScriptPath path) {
59+
if (!path.tryArgObject(3, block)) {
60+
return false;
61+
}
62+
if (!runInCheck(path, location)) {
63+
return false;
64+
}
65+
return super.matches(path);
66+
}
67+
68+
@Override
69+
public ScriptEntryData getScriptEntryData() {
70+
return new BukkitScriptEntryData(event.getPlayer());
71+
}
72+
73+
@Override
74+
public ObjectTag getContext(String name) {
75+
return switch (name) {
76+
case "loot" -> new ListTag(event.getDispensedLoot(), ItemTag::new);
77+
case "location" -> location;
78+
default -> super.getContext(name);
79+
};
80+
}
81+
82+
@EventHandler
83+
public void onLootDispensesFromBlock(BlockDispenseLootEvent event) {
84+
block = new MaterialTag(event.getBlock().getType());
85+
location = new LocationTag(event.getBlock().getLocation());
86+
this.event = event;
87+
fire(event);
88+
}
89+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.denizenscript.denizen.events.block;
2+
3+
import com.denizenscript.denizen.events.BukkitScriptEvent;
4+
import com.denizenscript.denizen.objects.ItemTag;
5+
import com.denizenscript.denizen.objects.LocationTag;
6+
import com.denizenscript.denizencore.objects.ObjectTag;
7+
import org.bukkit.event.EventHandler;
8+
import org.bukkit.event.Listener;
9+
import org.bukkit.event.block.VaultDisplayItemEvent;
10+
11+
public class VaultDisplayItemScriptEvent extends BukkitScriptEvent implements Listener {
12+
13+
// <--[event]
14+
// @Events
15+
// vault displays <item>
16+
//
17+
// @Group Block
18+
//
19+
// @Location true
20+
//
21+
// @Cancellable true
22+
//
23+
// @Triggers when a vault block displays an item.
24+
//
25+
// @Context
26+
// <context.location> returns the LocationTag of the vault block.
27+
// <context.item> returns the ItemTag being displayed.
28+
//
29+
// @Determine
30+
// "ITEM:<ItemTag>" to set the item being displayed.
31+
//
32+
// -->
33+
34+
public VaultDisplayItemScriptEvent() {
35+
registerCouldMatcher("vault displays <item>");
36+
this.<VaultDisplayItemScriptEvent, ItemTag>registerDetermination("item", ItemTag.class, (evt, context, input) -> {
37+
evt.event.setDisplayItem(input.getItemStack());
38+
});
39+
}
40+
41+
public LocationTag location;
42+
public VaultDisplayItemEvent event;
43+
public ItemTag item;
44+
45+
@Override
46+
public boolean matches(ScriptPath path) {
47+
if (!runInCheck(path, location)) {
48+
return false;
49+
}
50+
if (!path.tryArgObject(2, item)) {
51+
return false;
52+
}
53+
return super.matches(path);
54+
}
55+
56+
@Override
57+
public ObjectTag getContext(String name) {
58+
return switch (name) {
59+
case "item" -> new ItemTag(event.getDisplayItem());
60+
case "location" -> location;
61+
default -> super.getContext(name);
62+
};
63+
}
64+
65+
@EventHandler
66+
public void onVaultDisplayItemEvent(VaultDisplayItemEvent event) {
67+
location = new LocationTag(event.getBlock().getLocation());
68+
item = new ItemTag(event.getDisplayItem());
69+
this.event = event;
70+
fire(event);
71+
}
72+
}

plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,9 @@ public static void registerMainProperties() {
299299
PropertyParser.registerProperty(MaterialLightable.class, MaterialTag.class);
300300
PropertyParser.registerProperty(MaterialMode.class, MaterialTag.class);
301301
PropertyParser.registerProperty(MaterialNote.class, MaterialTag.class);
302+
if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) {
303+
PropertyParser.registerProperty(MaterialOminous.class, MaterialTag.class);
304+
}
302305
PropertyParser.registerProperty(MaterialPersistent.class, MaterialTag.class);
303306
PropertyParser.registerProperty(MaterialPower.class, MaterialTag.class);
304307
PropertyParser.registerProperty(MaterialShape.class, MaterialTag.class);

0 commit comments

Comments
 (0)