denizenType, DataComponentType.Valued componentType, String name) {
super(componentType, denizenType, name);
}
public abstract D toDenizen(P value);
public abstract P fromDenizen(D value, Mechanism mechanism);
@Override
public D getValue(ItemStack item) {
P data = item.getData(componentType);
return data != null ? toDenizen(data) : null;
}
@Override
public void setValue(ItemStack item, D value, Mechanism mechanism) {
P converted = fromDenizen(value, mechanism);
if (converted != null) {
item.setData(componentType, converted);
}
}
}
public class Property extends ItemProperty {
private static DataComponentAdapter, ?> currentlyRegisteringComponentAdapter;
public Property(ItemTag item) {
this.object = item;
}
@Override
public D getPropertyValue() {
return getValue(getItemStack());
}
@Override
public D getPropertyValueNoDefault() {
if (!getItemStack().isDataOverridden(componentType)) {
return null;
}
return super.getPropertyValueNoDefault();
}
@Override
public boolean isDefaultValue(D value) {
return DataComponentAdapter.this.isDefaultValue(value);
}
@Override
public void setPropertyValue(D value, Mechanism mechanism) {
if (value == null) {
getItemStack().resetData(componentType);
return;
}
setValue(getItemStack(), value, mechanism);
}
@Override
public String getPropertyId() {
return name;
}
public static void register() {
autoRegisterNullable(currentlyRegisteringComponentAdapter.name, DataComponentAdapter.Property.class, currentlyRegisteringComponentAdapter.denizenType, false);
}
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/FoodAdapter.java
================================================
package com.denizenscript.denizen.paper.datacomponents;
import com.denizenscript.denizencore.objects.Mechanism;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.objects.core.MapTag;
import io.papermc.paper.datacomponent.DataComponentTypes;
import io.papermc.paper.datacomponent.item.FoodProperties;
public class FoodAdapter extends DataComponentAdapter.Valued {
// <--[property]
// @object ItemTag
// @name food
// @input MapTag
// @description
// Controls an item's food <@link language Item Components>.
// The map includes keys:
// - "nutrition", ElementTag(Number) representing the amount of food points restored by this item.
// - "saturation", ElementTag(Decimal) representing the amount of saturation points restored by this item.
// - "can_always_eat", ElementTag(Boolean) controlling whether the item can always be eaten, even if the player isn't hungry.
// @mechanism
// Provide no input to reset the item to its default value.
// -->
public FoodAdapter() {
super(MapTag.class, DataComponentTypes.FOOD, "food");
}
@Override
public MapTag toDenizen(FoodProperties value) {
MapTag foodData = new MapTag();
foodData.putObject("nutrition", new ElementTag(value.nutrition()));
foodData.putObject("saturation", new ElementTag(value.saturation()));
foodData.putObject("can_always_eat", new ElementTag(value.canAlwaysEat()));
return foodData;
}
@Override
public FoodProperties fromDenizen(MapTag value, Mechanism mechanism) {
FoodProperties.Builder builder = FoodProperties.food();
setIfValid(builder::nutrition, value, "nutrition", ElementTag.class, ElementTag::isInt, ElementTag::asInt, "number", mechanism);
setIfValid(builder::saturation, value, "saturation", ElementTag.class, ElementTag::isFloat, ElementTag::asFloat, "decimal number", mechanism);
setIfValid(builder::canAlwaysEat, value, "can_always_eat", ElementTag.class, ElementTag::isBoolean, ElementTag::asBoolean, "boolean", mechanism);
return builder.build();
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/GliderAdapter.java
================================================
package com.denizenscript.denizen.paper.datacomponents;
import io.papermc.paper.datacomponent.DataComponentTypes;
public class GliderAdapter extends DataComponentAdapter.NonValued {
// <--[property]
// @object ItemTag
// @name glider
// @input ElementTag(Boolean)
// @description
// Controls whether an item can be used to glide when equipped (like elytras by default), see <@link language Item Components>.
// @mechanism
// Provide no input to reset the item to its default value.
// -->
public GliderAdapter() {
super(DataComponentTypes.GLIDER, "glider");
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ItemModelAdapter.java
================================================
package com.denizenscript.denizen.paper.datacomponents;
import com.denizenscript.denizen.utilities.Utilities;
import com.denizenscript.denizencore.objects.Mechanism;
import com.denizenscript.denizencore.objects.core.ElementTag;
import io.papermc.paper.datacomponent.DataComponentTypes;
import net.kyori.adventure.key.Key;
public class ItemModelAdapter extends DataComponentAdapter.Valued {
// <--[property]
// @object ItemTag
// @name item_model
// @input ElementTag
// @description
// Controls an item's model <@link language Item Components> in namespaced key format.
// The default namespace is "minecraft", so for example an input of "stone" becomes "minecraft:stone", and will set the item model to a stone block.
// This can also be used to display item models from your own custom resource packs.
// @mechanism
// Provide no input to reset the item to its default value.
// -->
public ItemModelAdapter() {
super(ElementTag.class, DataComponentTypes.ITEM_MODEL, "item_model");
}
@Override
public ElementTag toDenizen(Key value) {
return new ElementTag(value.asMinimalString(), true);
}
@Override
public Key fromDenizen(ElementTag value, Mechanism mechanism) {
return Utilities.parseNamespacedKey(value.asString());
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxDurabilityAdapter.java
================================================
package com.denizenscript.denizen.paper.datacomponents;
import com.denizenscript.denizencore.objects.Mechanism;
import com.denizenscript.denizencore.objects.core.ElementTag;
import io.papermc.paper.datacomponent.DataComponentTypes;
public class MaxDurabilityAdapter extends DataComponentAdapter.Valued {
// <--[property]
// @object ItemTag
// @name max_durability
// @input ElementTag(Number)
// @description
// Controls an item's max durability <@link language Item Components>.
// @mechanism
// Provide no input to reset the item to its default value.
// -->
public MaxDurabilityAdapter() {
super(ElementTag.class, DataComponentTypes.MAX_DAMAGE, "max_durability");
}
@Override
public ElementTag toDenizen(Integer value) {
return new ElementTag(value);
}
@Override
public Integer fromDenizen(ElementTag value, Mechanism mechanism) {
return mechanism.requireInteger() ? value.asInt() : null;
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxStackSizeAdapter.java
================================================
package com.denizenscript.denizen.paper.datacomponents;
import com.denizenscript.denizencore.objects.Mechanism;
import com.denizenscript.denizencore.objects.core.ElementTag;
import io.papermc.paper.datacomponent.DataComponentTypes;
public class MaxStackSizeAdapter extends DataComponentAdapter.Valued {
// <--[property]
// @object ItemTag
// @name max_stack_size
// @input ElementTag(Number)
// @description
// Controls an item's max stack size <@link language Item Components>.
// @mechanism
// Provide no input to reset the item to its default value.
// -->
public MaxStackSizeAdapter() {
super(ElementTag.class, DataComponentTypes.MAX_STACK_SIZE, "max_stack_size");
}
@Override
public ElementTag toDenizen(Integer value) {
return new ElementTag(value);
}
@Override
public Integer fromDenizen(ElementTag value, Mechanism mechanism) {
return mechanism.requireInteger() ? value.asInt() : null;
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/RarityAdapter.java
================================================
package com.denizenscript.denizen.paper.datacomponents;
import com.denizenscript.denizencore.objects.Mechanism;
import com.denizenscript.denizencore.objects.core.ElementTag;
import io.papermc.paper.datacomponent.DataComponentTypes;
import org.bukkit.inventory.ItemRarity;
public class RarityAdapter extends DataComponentAdapter.Valued {
// <--[property]
// @object ItemTag
// @name rarity
// @input ElementTag
// @description
// Controls an item's rarity <@link language Item Components>.
// See <@link url https://jd.papermc.io/paper/org/bukkit/inventory/ItemRarity.html> for valid rarity values.
// @mechanism
// Provide no input to reset the item to its default value.
// -->
public RarityAdapter() {
super(ElementTag.class, DataComponentTypes.RARITY, "rarity");
}
@Override
public ElementTag toDenizen(ItemRarity value) {
return new ElementTag(value);
}
@Override
public ItemRarity fromDenizen(ElementTag value, Mechanism mechanism) {
return mechanism.requireEnum(ItemRarity.class) ? value.asEnum(ItemRarity.class) : null;
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/AnvilBlockDamagedScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.InventoryTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizen.utilities.inventory.InventoryViewUtil;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.block.AnvilDamagedEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class AnvilBlockDamagedScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// anvil block damaged|breaks
//
// @Group Paper
//
// @Location true
//
// @Plugin Paper
//
// @Cancellable true
//
// @Switch state: to only process the event if the anvil's new damage state matches the specified state.
//
// @Triggers when an anvil is damaged from being used.
//
// @Context
// returns an ElementTag of the anvil's new damage state. Refer to <@link url https://jd.papermc.io/paper/1.19/com/destroystokyo/paper/event/block/AnvilDamagedEvent.DamageState.html>.
// returns an ElementTag(Boolean) that signifies whether the anvil will break.
// returns the InventoryTag of the anvil's inventory.
//
// @Determine
// "STATE:" to set the anvil's new damage state.
// "BREAK:" to set weather the anvil will break.
// -->
public AnvilBlockDamagedScriptEvent() {
registerCouldMatcher("anvil block damaged|breaks");
registerSwitches("state");
this.registerOptionalDetermination("state", ElementTag.class, (evt, context, state) -> {
if (state.matchesEnum(AnvilDamagedEvent.DamageState.class)) {
evt.event.setDamageState(state.asEnum(AnvilDamagedEvent.DamageState.class));
return true;
}
return false;
});
this.registerOptionalDetermination("break", ElementTag.class, (evt, context, value) -> {
if (value.isBoolean()) {
evt.event.setBreaking(value.asBoolean());
return true;
}
return false;
});
}
public AnvilDamagedEvent event;
@Override
public boolean matches(ScriptPath path) {
if (path.eventArgLowerAt(2).equals("breaks") && !event.isBreaking()) {
return false;
}
if (!runInCheck(path, event.getInventory().getLocation())) {
return false;
}
if (!runGenericSwitchCheck(path, "state", event.getDamageState().name())) {
return false;
}
return super.matches(path);
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "state" -> new ElementTag(event.getDamageState());
case "inventory" -> InventoryTag.mirrorBukkitInventory(event.getInventory());
case "break" -> new ElementTag(event.isBreaking());
default -> super.getContext(name);
};
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(InventoryViewUtil.getPlayer(event.getView()));
}
@EventHandler
public void onAnvilDamaged(AnvilDamagedEvent event) {
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/AreaEnterExitScriptEventPaperImpl.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.entity.AreaEnterExitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import io.papermc.paper.event.entity.EntityMoveEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.EntityDeathEvent;
public class AreaEnterExitScriptEventPaperImpl extends AreaEnterExitScriptEvent {
@Override
public ObjectTag getContext(String name) {
if (name.equals("cause") && currentEvent instanceof EntityMoveEvent) {
return new ElementTag("WALK");
}
else if (name.equals("from") && currentEvent instanceof EntityMoveEvent) {
return new LocationTag(((EntityMoveEvent) currentEvent).getFrom());
}
return super.getContext(name);
}
@Override
public void registerCorrectClass() {
if (onlyTrackPlayers) {
initListener(new SpigotListeners());
}
else {
initListener(new PaperListeners());
}
}
public class PaperListeners extends SpigotListeners {
@EventHandler
public void onEntityMove(EntityMoveEvent event) {
if (event.getEntity().isValid()) {
processNewPosition(new EntityTag(event.getEntity()), event.getTo(), event);
}
}
@EventHandler
public void onEntityDeath(EntityDeathEvent event) {
processNewPosition(new EntityTag(event.getEntity()), null, event);
}
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/BellRingScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import io.papermc.paper.event.block.BellRingEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class BellRingScriptEvent extends BukkitScriptEvent implements Listener {
public BellRingScriptEvent() {
registerCouldMatcher("bell rings");
}
public BellRingEvent event;
public LocationTag location;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, location)) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getEntity());
}
@Override
public ObjectTag getContext(String name) {
switch (name) {
case "entity":
return event.getEntity() == null ? null : new EntityTag(event.getEntity()).getDenizenObject();
case "location": return location;
}
return super.getContext(name);
}
@EventHandler
public void bellRingEvent(BellRingEvent event) {
this.event = event;
location = new LocationTag(event.getBlock().getLocation());
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/BlockPreDispenseScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import io.papermc.paper.event.block.BlockPreDispenseEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class BlockPreDispenseScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// tries to dispense -
//
// @Group Block
//
// @Location true
//
// @Cancellable true
//
// @Triggers before a block dispenses an item.
// This event fires before the dispenser fully processes a drop, allowing access to the dispensing slot and cancellation of sound effects.
//
// @Context
// returns the LocationTag of the dispenser.
// returns the ItemTag of the item about to be dispensed.
// returns a ElementTag(Number) of the slot that will be dispensed from.
//
// -->
public BlockPreDispenseScriptEvent() {
registerCouldMatcher(" tries to dispense
- ");
}
public BlockPreDispenseEvent event;
public ItemTag item;
public LocationTag location;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, location)) {
return false;
}
if (!path.tryArgObject(0, location)) {
return false;
}
if (!path.tryArgObject(4, item)) {
return false;
}
return super.matches(path);
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "item" -> item;
case "location" -> location;
case "slot" -> new ElementTag(event.getSlot() + 1);
default -> super.getContext(name);
};
}
@EventHandler
public void onBlockPreDispense(BlockPreDispenseEvent event) {
this.event = event;
item = new ItemTag(event.getItemStack());
location = new LocationTag(event.getBlock().getLocation());
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/CreeperIgnitesScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.objects.ObjectTag;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import com.destroystokyo.paper.event.entity.CreeperIgniteEvent;
public class CreeperIgnitesScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// creeper ignites
//
// @Plugin Paper
//
// @Group Paper
//
// @Location true
//
// @Cancellable true
//
// @Triggers when a creeper is ignited by flint and steel, or by certain plugin-based activations.
//
// @Context
// returns the EntityTag of the creeper.
// returns true if the creeper is ignited, or false if not. NOTE: In most cases, this will return true.
//
// -->
public CreeperIgnitesScriptEvent() {
registerCouldMatcher("creeper ignites");
}
public EntityTag entity;
public CreeperIgniteEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, entity.getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public ObjectTag getContext(String name) {
switch (name) {
case "entity":
return entity;
case "ignited":
return new ElementTag(event.isIgnited());
}
return super.getContext(name);
}
@EventHandler
public void onCreeperIgnites(CreeperIgniteEvent event) {
entity = new EntityTag(event.getEntity());
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/DragonEggFormScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.objects.core.ListTag;
import io.papermc.paper.event.block.DragonEggFormEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class DragonEggFormScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// dragon egg forms
//
// @Plugin Paper
//
// @Group Paper
//
// @Location true
//
// @Triggers when the ender dragon is defeated and the dragon egg forms.
//
// @Context
// returns the EntityTag of the ender dragon right before it's removed.
// returns the LocationTag of the dragon egg.
// returns the LocationTag of the end portal.
// returns an ElementTag(Boolean) of whether the dragon has been previously killed.
// returns an ElementTag of the respawn phase. Valid values can be found at <@link url https://jd.papermc.io/paper/1.21.3/org/bukkit/boss/DragonBattle.RespawnPhase.html>.
// returns a ListTag(EntityTag) of the healing end crystals.
// returns a ListTag(EntityTag) of the respawn end crystals.
//
// -->
public DragonEggFormScriptEvent() {
registerCouldMatcher("dragon egg forms");
}
public LocationTag location;
public EntityTag entity;
public DragonEggFormEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, location)) {
return false;
}
return super.matches(path);
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "entity" -> entity;
case "location" -> location;
case "end_portal_location" -> new LocationTag(event.getDragonBattle().getEndPortalLocation());
case "previously_killed" -> new ElementTag(event.getDragonBattle().hasBeenPreviouslyKilled());
case "respawn_phase" -> new ElementTag(event.getDragonBattle().getRespawnPhase());
case "healing_crystals" -> new ListTag(event.getDragonBattle().getHealingCrystals(), EntityTag::new);
case "respawn_crystals" -> new ListTag(event.getDragonBattle().getRespawnCrystals(), EntityTag::new);
default -> super.getContext(name);
};
}
@EventHandler
public void onDragonEggForms(DragonEggFormEvent event) {
location = new LocationTag(event.getBlock().getLocation());
entity = new EntityTag(event.getDragonBattle().getEnderDragon());
this.event = event;
EntityTag.rememberEntity(entity.getBukkitEntity());
fire(event);
EntityTag.forgetEntity(entity.getBukkitEntity());
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/EntityAddToWorldScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.entity.EntityAddToWorldEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class EntityAddToWorldScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// added to world
//
// @Plugin Paper
//
// @Group Paper
//
// @Location true
//
// @Triggers any time an entity is added to the world for any reason, including chunks loading pre-existing entities.
//
// @Context
// returns the EntityTag that will be added. Note that this entity will not necessarily be fully spawned yet, so usage will be limited.
// returns the LocationTag that the entity will be added at.
//
// -->
public EntityAddToWorldScriptEvent() {
registerCouldMatcher(" added to world");
}
public EntityTag entity;
public LocationTag location;
public EntityAddToWorldEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!path.tryArgObject(0, entity)) {
return false;
}
if (!runInCheck(path, location)) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(null, null);
}
@Override
public ObjectTag getContext(String name) {
switch (name) {
case "entity": return entity;
case "location": return location;
}
return super.getContext(name);
}
@EventHandler
public void onPreCreatureSpawn(EntityAddToWorldEvent event) {
this.entity = new EntityTag(event.getEntity());
this.location = new LocationTag(event.getEntity().getLocation());
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class EntityKnocksbackEntityScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// knocks back
//
// @Location true
//
// @Warning this event may in some cases double-fire, requiring usage of the 'ratelimit' command (like 'ratelimit 1t') to prevent doubling actions.
//
// @Switch with:
- to only process the event when the item used to cause damage (in the damager's hand) is a specified item.
//
// @Plugin Paper
//
// @Group Paper
//
// @Cancellable true
//
// @Triggers when an entity is knocked back from the hit of another entity.
//
// @Context
// returns the EntityTag that was knocked back.
// returns the EntityTag of the one who knocked.
// returns the knockback applied as a vector.
// returns the cause of the knockback (only on MC 1.20+). Causes list: <@link url https://jd.papermc.io/paper/1.21.1/io/papermc/paper/event/entity/EntityKnockbackEvent.Cause.html>
//
// @Determine
// LocationTag as a vector to change the acceleration applied.
//
// @Player when the damager or damaged entity is a player. Cannot be both.
//
// @NPC when the damager or damaged entity is an NPC. Cannot be both.
//
// -->
public EntityKnocksbackEntityScriptEvent() {
registerCouldMatcher(" knocks back ");
registerSwitches("with");
}
public EntityTag entity;
public EntityTag hitBy;
public ItemTag held;
public EntityKnockbackByEntityEvent event;
@Override
public boolean matches(ScriptPath path) {
String attacker = path.eventArgLowerAt(0);
String target = path.eventArgLowerAt(3);
if (!hitBy.tryAdvancedMatcher(attacker, path.context) || (!entity.tryAdvancedMatcher(target, path.context))) {
return false;
}
if (!runInCheck(path, entity.getLocation())) {
return false;
}
if (!runWithCheck(path, held)) {
return false;
}
return super.matches(path);
}
@Override
public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) {
if (determinationObj.canBeType(LocationTag.class)) {
event.getAcceleration().copy(determinationObj.asType(LocationTag.class, getTagContext(path)).toVector());
return true;
}
return super.applyDetermination(path, determinationObj);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(
hitBy.isPlayer() ? hitBy.getDenizenPlayer() : entity.isPlayer() ? entity.getDenizenPlayer() : null,
hitBy.isCitizensNPC() ? hitBy.getDenizenNPC() : entity.isCitizensNPC() ? entity.getDenizenNPC() : null);
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "entity" -> entity.getDenizenObject();
case "damager" -> hitBy.getDenizenObject();
case "acceleration" -> new LocationTag(event.getAcceleration());
case "cause" -> new ElementTag(event.getCause().name(), true); // TODO: once 1.20 is the minimum supported version, use the enum constructor
default -> super.getContext(name);
};
}
@EventHandler
public void onEntityKnockbackEntity(EntityKnockbackByEntityEvent event) {
entity = new EntityTag(event.getEntity());
hitBy = new EntityTag(event.getHitBy());
held = hitBy.getItemInHand();
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/EntityLoadCrossbowScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import io.papermc.paper.event.entity.EntityLoadCrossbowEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class EntityLoadCrossbowScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// loads crossbow
//
// @Location true
//
// @Plugin Paper
//
// @Group Paper
//
// @Cancellable true
//
// @Switch crossbow:
- to only process the event if the crossbow is a specified item.
//
// @Triggers when a living entity loads a crossbow with a projectile.
//
// @Context
// returns the EntityTag that is loading the crossbow.
// returns the ItemTag of the crossbow.
// returns true if the loading will consume a projectile item, otherwise false.
// returns "HAND" or "OFF_HAND" depending on which hand is holding the crossbow item.
//
// @Determine
// "KEEP_ITEM" to keep the projectile item in the shooter's inventory.
//
// @Player when the entity is a player.
//
// @NPC when the entity is an NPC.
//
// -->
public EntityLoadCrossbowScriptEvent() {
registerCouldMatcher(" loads crossbow");
registerSwitches("crossbow");
this.registerTextDetermination("keep_item", (evt) -> {
evt.event.setConsumeItem(false);
});
}
public EntityLoadCrossbowEvent event;
public EntityTag entity;
@Override
public boolean matches(ScriptPath path) {
if (!path.tryArgObject(0, entity)) {
return false;
}
if (!runWithCheck(path, new ItemTag(event.getCrossbow()), "crossbow")) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(entity);
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "entity" -> entity.getDenizenObject();
case "crossbow" -> new ItemTag(event.getCrossbow());
case "hand" -> new ElementTag(event.getHand());
case "consumes" -> new ElementTag(event.shouldConsumeItem());
default -> super.getContext(name);
};
}
@EventHandler
public void onLoadCrossbow(EntityLoadCrossbowEvent event) {
this.event = event;
this.entity = new EntityTag(event.getEntity());
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/EntityPathfindScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.entity.EntityPathfindEvent;
import org.bukkit.entity.Entity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class EntityPathfindScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// pathfinds
//
// @Location true
// @Switch to: to only process the event if the entity is pathfinding into a specified area.
// @Switch at: to only process the event when the entity is pathfinding at a specified entity.
//
// @Plugin Paper
//
// @Group Paper
//
// @Cancellable true
//
// @Triggers when an entity starts pathfinding towards a location or entity.
//
// @Context
// returns the EntityTag that is pathfinding.
// returns the LocationTag that is being pathfound to.
// returns the EntityTag that is being targeted, if any.
//
// @Player when the target entity is a player.
//
// @NPC when the target entity is an NPC.
//
// -->
public EntityPathfindScriptEvent() {
registerCouldMatcher(" pathfinds");
registerSwitches("to", "at");
}
public EntityTag entity;
public EntityTag target;
public EntityPathfindEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!path.tryArgObject(0, entity)) {
return false;
}
if (!runInCheck(path, entity.getLocation())) {
return false;
}
if (!runInCheck(path, event.getLoc(), "to")) {
return false;
}
if (!path.tryObjectSwitch("at", target)) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(target);
}
@Override
public ObjectTag getContext(String name) {
if (name.equals("entity")) {
return entity.getDenizenObject();
}
else if (name.equals("target") && target != null) {
return target.getDenizenObject();
}
else if (name.equals("location")) {
return new LocationTag(event.getLoc());
}
return super.getContext(name);
}
@EventHandler
public void onEntityPathfind(EntityPathfindEvent event) {
this.event = event;
this.entity = new EntityTag(event.getEntity());
Entity target = event.getTargetEntity();
this.target = target != null ? new EntityTag(target) : null;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/EntityRemoveFromWorldScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.entity.EntityRemoveFromWorldEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class EntityRemoveFromWorldScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// removed from world
//
// @Plugin Paper
//
// @Group Paper
//
// @Location true
//
// @Triggers any time an entity is removed from the world for any reason, including chunks unloading.
//
// @Context
// returns the EntityTag that will be removed. Note that this entity will not necessarily be fully spawned at time of firing, so usage will be limited.
//
// -->
public EntityRemoveFromWorldScriptEvent() {
registerCouldMatcher(" removed from world");
}
public EntityTag entity;
public EntityRemoveFromWorldEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!path.tryArgObject(0, entity)) {
return false;
}
if (!runInCheck(path, entity.getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(null, null);
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "entity" -> entity;
default -> super.getContext(name);
};
}
@EventHandler
public void onPreCreatureSpawn(EntityRemoveFromWorldEvent event) {
this.entity = new EntityTag(event.getEntity());
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/EntityStepsOnScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.objects.MaterialTag;
import com.denizenscript.denizen.utilities.Utilities;
import com.denizenscript.denizencore.objects.ObjectTag;
import io.papermc.paper.event.entity.EntityMoveEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class EntityStepsOnScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// entity steps on block
// steps on
//
// @Location true
//
// @Group Paper
//
// @Plugin Paper
//
// @Warning This event may fire very rapidly.
//
// @Cancellable true
//
// @Triggers when a non-player entity steps onto a specific block material. For players, use <@link event player steps on block>.
//
// @Context
// returns an EntityTag of the entity stepping onto the block.
// returns a LocationTag of the block the entity is stepping on.
// returns a LocationTag of where the entity was before stepping onto the block.
// returns a LocationTag of where the entity is now.
//
// @Example
// # Announce the name of the entity stepping on the block and the material of block.
// on entity steps on block:
// - announce " stepped on a !"
//
// @Example
// # Announce the material of the block a sheep has stepped on.
// on sheep steps on block:
// - announce "A sheep has stepped on a !"
//
// @Example
// # Announce that a sheep has stepped on a diamond block.
// on sheep steps on diamond_block:
// - announce "A sheep has stepped on a diamond block! Must be a wealthy sheep!"
// -->
public EntityStepsOnScriptEvent() {
registerCouldMatcher(" steps on ");
}
public EntityMoveEvent event;
public EntityTag entity;
public LocationTag location;
public MaterialTag material;
@Override
public boolean couldMatch(ScriptPath path) {
if (!super.couldMatch(path)) {
return false;
}
if (path.eventLower.startsWith("player")) {
return false;
}
return true;
}
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, location)) {
return false;
}
if (!path.tryArgObject(0, entity)) {
return false;
}
if (!path.tryArgObject(3, material)) {
return false;
}
return super.matches(path);
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "entity" -> entity;
case "location" -> location;
case "previous_location" -> new LocationTag(event.getFrom());
case "new_location" -> new LocationTag(event.getTo());
default -> super.getContext(name);
};
}
@EventHandler
public void entityStepsOnBlockEvent(EntityMoveEvent event) {
if (!event.hasChangedBlock()) {
return;
}
location = new LocationTag(event.getTo().clone().subtract(0.0, 0.05, 0.0));
if (!Utilities.isLocationYSafe(location)) {
return;
}
material = new MaterialTag(location.getBlock());
entity = new EntityTag(event.getEntity());
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/EntityTeleportedByPortalScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.WorldTag;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import io.papermc.paper.event.entity.EntityPortalReadyEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class EntityTeleportedByPortalScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// teleported by portal
//
// @Switch to: to only process the event if the world the entity is being teleported to matches the specified WorldTag matcher.
// @Switch portal_type: to only process the event if the portal's type matches the specified portal type.
//
// @Plugin Paper
//
// @Group Paper
//
// @Location true
//
// @Cancellable true
//
// @Triggers When an entity is about to be teleported by a portal (currently only fires for nether portals).
//
// @Context
// returns an EntityTag of the entity being teleported.
// returns a WorldTag of the world the entity is being teleported to.
// returns an ElementTag of the portal's type. Will be one of <@link url https://jd.papermc.io/paper/1.19/org/bukkit/PortalType.html>.
//
// @Determine
// "TARGET_WORLD:" to set the world the entity will be teleported to.
// "REMOVE_TARGET_WORLD" to remove the target world. Should usually cancel the event instead of using this.
//
// -->
public EntityTeleportedByPortalScriptEvent() {
registerCouldMatcher(" teleported by portal");
registerSwitches("to", "portal_type");
this.registerDetermination("target_world", WorldTag.class, (evt, context, targetWorld) -> {
evt.event.setTargetWorld(targetWorld.getWorld());
});
this.registerTextDetermination("remove_target_world", (evt) -> {
evt.event.setTargetWorld(null);
});
}
EntityPortalReadyEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!path.tryObjectSwitch("to", event.getTargetWorld() == null ? null : new WorldTag(event.getTargetWorld()))) {
return false;
}
if (!runGenericSwitchCheck(path, "portal_type", event.getPortalType().name())) {
return false;
}
if (!path.tryArgObject(0, new EntityTag(event.getEntity()))) {
return false;
}
if (!runInCheck(path, event.getEntity().getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "entity" -> new EntityTag(event.getEntity());
case "target_world" -> event.getTargetWorld() != null ? new WorldTag(event.getTargetWorld()) : null;
case "portal_type" -> new ElementTag(event.getPortalType());
default -> super.getContext(name);
};
}
@EventHandler
public void onEntityPortalReady(EntityPortalReadyEvent event) {
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/ExperienceOrbMergeScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.entity.ExperienceOrbMergeEvent;
import org.bukkit.entity.Entity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class ExperienceOrbMergeScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// experience orbs merge
//
// @Location true
//
// @Plugin Paper
//
// @Group Paper
//
// @Cancellable true
//
// @Triggers when two experience orbs are about to merge.
//
// @Context
// returns the EntityTag of the orb that will absorb the other experience orb.
// returns the EntityTag of the orb that will be removed and merged into the target.
//
// -->
public ExperienceOrbMergeScriptEvent() {
registerCouldMatcher("experience orbs merge");
}
public ExperienceOrbMergeEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, event.getMergeTarget().getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(null, null);
}
@Override
public ObjectTag getContext(String name) {
if (name.equals("target")) {
return new EntityTag(event.getMergeTarget()).getDenizenObject();
}
else if (name.equals("source")) {
return new EntityTag(event.getMergeSource()).getDenizenObject();
}
return super.getContext(name);
}
@EventHandler
public void experienceOrbsMerge(ExperienceOrbMergeEvent event) {
this.event = event;
Entity target = event.getMergeTarget();
EntityTag.rememberEntity(target);
fire(event);
EntityTag.forgetEntity(target);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerAbsorbsExperienceScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.events.ScriptEvent;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerAbsorbsExperienceScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player absorbs experience
//
// @Location true
//
// @Plugin Paper
//
// @Group Paper
//
// @Cancellable true
//
// @Triggers when a player is absorbing an experience orb.
//
// @Context
// returns the EntityTag of the experience orb.
//
// @Player Always.
//
// -->
public PlayerAbsorbsExperienceScriptEvent() {
registerCouldMatcher("player absorbs experience");
}
public PlayerPickupExperienceEvent event;
@Override
public boolean matches(ScriptEvent.ScriptPath path) {
if (!runInCheck(path, event.getPlayer().getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@Override
public ObjectTag getContext(String name) {
if (name.equals("entity")) {
return new EntityTag(event.getExperienceOrb());
}
return super.getContext(name);
}
@EventHandler
public void absorbsExperience(PlayerPickupExperienceEvent event) {
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerBeaconEffectScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.objects.properties.item.ItemPotion;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.block.BeaconEffectEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerBeaconEffectScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player beacon effect applied
//
// @Location true
//
// @Plugin Paper
//
// @Group Paper
//
// @Cancellable true
//
// @Triggers when a beacon applies an effect to a player.
//
// @Context
// returns the LocationTag of the beacon applying an effect.
// returns a MapTag of the potion effect in <@link language Potion Effect Format>.
// returns an ElementTag of the effect type.
// returns an ElementTag(Boolean) of whether the beacon effect is the primary effect.
//
// @Determine
// ElementTag to change the applied potion effect (in the same format as <@link tag EntityTag.list_effects>).
//
// @Player Always.
//
// -->
public PlayerBeaconEffectScriptEvent() {
registerCouldMatcher("player beacon effect applied");
}
public BeaconEffectEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, event.getPlayer().getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) {
try {
event.setEffect(ItemPotion.parseLegacyEffectString(determinationObj.toString(), getTagContext(path)));
return true;
}
catch (Exception e) {
Debug.echoError(e);
}
return super.applyDetermination(path, determinationObj);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "location" -> new LocationTag(event.getBlock().getLocation());
case "effect" -> new ElementTag(ItemPotion.effectToLegacyString(event.getEffect(), null));
case "effect_data" -> ItemPotion.effectToMap(event.getEffect(), true);
case "effect_type" -> new ElementTag(event.getEffect().getType().getName());
case "is_primary" -> new ElementTag(event.isPrimary());
default -> super.getContext(name);
};
}
@EventHandler
public void beaconEffectEvent(BeaconEffectEvent event) {
if (EntityTag.isNPC(event.getPlayer())) {
return;
}
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerChangesFramedItemScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import io.papermc.paper.event.player.PlayerItemFrameChangeEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerChangesFramedItemScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player changes framed
-
//
// @Location true
//
// @Plugin Paper
//
// @Group Paper
//
// @Cancellable true
//
// @Triggers when a player interacts with an item frame by adding, removing, or rotating the item held in it.
//
// @Switch frame: to only process the event if the item frame entity being matches the input.
// @Switch action: to only process the event if the change matches the input.
//
// @Context
// returns the EntityTag of the item frame.
// returns the ItemTag of the item held in the item frame.
// returns the ElementTag of the action being performed, based on <@link url https://jd.papermc.io/paper/1.20/io/papermc/paper/event/player/PlayerItemFrameChangeEvent.ItemFrameChangeAction.html>
//
// @Determine
// "ITEM:" to change the item held by the item frame. If there is an item already in the frame, it will be replaced. To remove the item, set it to air.
//
// @Player Always.
// -->
public PlayerChangesFramedItemScriptEvent() {
registerCouldMatcher("player changes framed
- ");
registerSwitches("frame", "action");
this.registerDetermination("item", ItemTag.class, (evt, context, item) -> {
evt.event.setItemStack(item.getItemStack());
});
}
public ItemTag item;
public EntityTag frame;
public ElementTag action;
public PlayerItemFrameChangeEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!path.tryArgObject(3, item)) {
return false;
}
if (!path.tryObjectSwitch("frame", frame)) {
return false;
}
if (!path.tryObjectSwitch("action", action)) {
return false;
}
if (!runInCheck(path, frame.getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "frame" -> frame;
case "item" -> new ItemTag(event.getItemStack());
case "action" -> action;
default -> super.getContext(name);
};
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@EventHandler
public void onPlayerChangesFramedItem(PlayerItemFrameChangeEvent event) {
item = new ItemTag(event.getItemStack());
frame = new EntityTag(event.getItemFrame());
action = new ElementTag(event.getAction());
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerChoosesArrowScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.Denizen;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.*;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.player.PlayerReadyArrowEvent;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerChoosesArrowScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player chooses arrow
//
// @Cancellable true
//
// @Group Player
//
// @Location true
//
// @Plugin Paper
//
// @Triggers when a player chooses an arrow to load a bow/crossbow.
//
// @Switch arrow:
- to only process the event when the players chosen arrow matches the input.
// @Switch bow:
- to only process the event when the players bow matches the input.
//
// @Context
// returns the ItemTag of the arrow that was chosen.
// returns the ItemTag of the bow that is about to get loaded.
//
// @Player Always.
//
// @Example
// # This example prevents using any arrow but spectral_arrows.
// on player chooses arrow arrow:!spectral_arrow:
// - determine cancelled
// -->
public PlayerChoosesArrowScriptEvent() {
registerCouldMatcher("player chooses arrow");
registerSwitches("arrow", "bow");
}
public PlayerReadyArrowEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!path.tryObjectSwitch("arrow", new ItemTag(event.getArrow()))) {
return false;
}
if (!path.tryObjectSwitch("bow", new ItemTag(event.getBow()))) {
return false;
}
if (!runInCheck(path, event.getPlayer().getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public ObjectTag getContext(String name) {
switch (name) {
case "arrow": return new ItemTag(event.getArrow());
case "bow": return new ItemTag(event.getBow());
}
return super.getContext(name);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(new PlayerTag(event.getPlayer()), null);
}
@Override
public void cancellationChanged() {
if (cancelled) {
final Player p = event.getPlayer();
Bukkit.getScheduler().scheduleSyncDelayedTask(Denizen.getInstance(), p::updateInventory, 1);
}
super.cancellationChanged();
}
@EventHandler
public void onPlayerChoosesArrow(PlayerReadyArrowEvent event) {
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerChunkUnloadScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.ChunkTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import io.papermc.paper.event.packet.PlayerChunkUnloadEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerChunkUnloadScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player receives chunk unload
//
// @Group Paper
//
// @Location true
//
// @Plugin Paper
//
// @Warning This event will fire *extremely* rapidly and almost guarantees lag. Use with maximum caution.
//
// @Triggers when a Player receives a chunk unload packet.
// Should only be used for packet/clientside related stuff. Not intended for modifying server side.
// Generally prefer <@link event chunk unloads> in most cases.
//
// @Context
// returns a ChunkTag of the chunk being unloaded.
//
// @Player Always.
// -->
public PlayerChunkUnloadScriptEvent() {
registerCouldMatcher("player receives chunk unload");
}
public PlayerChunkUnloadEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, event.getPlayer().getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "chunk" -> new ChunkTag(event.getChunk());
default -> super.getContext(name);
};
}
@EventHandler
public void playerChunkUnloadEvent(PlayerChunkUnloadEvent event) {
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerClicksFakeEntityScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.utilities.entity.FakeEntity;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.events.ScriptEvent;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.player.PlayerUseUnknownEntityEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerClicksFakeEntityScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player (right|left) clicks fake entity
//
// @Location true
//
// @Plugin Paper
//
// @Group Paper
//
// @Triggers when a player clicks a fake entity, one that is only shown to the player and not tracked by the server.
//
// @Context
// returns the EntityTag of the entity that was clicked. Note that this entity is not being tracked by the server, so many operations may not be possible on it.
// This will return null if the player clicks a fake entity that was not spawned via <@link command fakespawn>.
// returns an ElementTag of the hand used to click.
// returns an ElementTag of the click type (left/right).
//
// @Player Always.
//
// -->
public PlayerClicksFakeEntityScriptEvent() {
registerCouldMatcher("player (right|left) clicks fake entity");
}
public PlayerUseUnknownEntityEvent event;
@Override
public boolean matches(ScriptEvent.ScriptPath path) {
if (path.eventArgLowerAt(1).equals("left") && !event.isAttack()) {
return false;
}
else if (path.eventArgLowerAt(1).equals("right") && event.isAttack()) {
return false;
}
if (!runInCheck(path, event.getPlayer().getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@Override
public ObjectTag getContext(String name) {
switch (name) {
case "entity":
FakeEntity fakeEntity = FakeEntity.getFakeEntityFor(event.getPlayer().getUniqueId(), event.getEntityId());
if (fakeEntity != null) {
return fakeEntity.entity;
}
break;
case "hand":
return new ElementTag(event.getHand());
case "click_type":
return new ElementTag(event.isAttack() ? "left" : "right");
}
return super.getContext(name);
}
@EventHandler
public void clickFakeEntity(PlayerUseUnknownEntityEvent event) {
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerClicksInRecipeBookScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.player.PlayerRecipeBookClickEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerClicksInRecipeBookScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player uses recipe book
//
// @Location true
//
// @Plugin Paper
//
// @Group Paper
//
// @Cancellable true
//
// @Triggers when a player interacts with their recipe book.
//
// @Context
// returns the key of the recipe that was clicked.
// returns 'true' if the player is trying to make the maximum amount of items from the recipe, otherwise 'false'.
//
// @Player Always.
//
// -->
public PlayerClicksInRecipeBookScriptEvent() {
registerCouldMatcher("player uses recipe book");
}
public PlayerRecipeBookClickEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, event.getPlayer().getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@Override
public ObjectTag getContext(String name) {
switch (name) {
case "recipe":
return new ElementTag(event.getRecipe().toString());
case "is_all":
return new ElementTag(event.isMakeAll());
}
return super.getContext(name);
}
@EventHandler
public void playerUsesRecipeBook(PlayerRecipeBookClickEvent event) {
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerClientOptionsChangeScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.nms.NMSHandler;
import com.denizenscript.denizen.nms.NMSVersion;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.objects.core.MapTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.SkinParts;
import com.destroystokyo.paper.event.player.PlayerClientOptionsChangeEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerClientOptionsChangeScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player client options change
//
// @Plugin Paper
//
// @Group Paper
//
// @Player Always.
//
// @Triggers when a player changes their client options.
//
// @Context
// returns a ElementTag(Boolean) of whether the player has server listings enabled. Available only on MC 1.19+.
// returns an ElementTag of the player's chat visibility. Valid chat visibility options can be found at <@link url https://jd.papermc.io/paper/1.20/com/destroystokyo/paper/ClientOption.ChatVisibility.html>
// returns an ElementTag of the player's current locale.
// returns a ElementTag of the player's main hand. Can either be LEFT or RIGHT.
// returns a MapTag of whether the player's skin parts are enabled or not. For example: [cape=true;jacket=false;left_sleeve=true;right_sleeve=false;left_pants=true;right_pants=false;hat=true]
// returns a ElementTag(Number) of the player's view distance.
// returns a ElementTag(Boolean) of whether the player's server listings have changed. Available only on MC 1.19+.
// returns a ElementTag(Boolean) of whether the player has chat colors enabled.
// returns a ElementTag(Boolean) of whether the player has toggled their chat colors.
// returns a ElementTag(Boolean) of whether the player's chat visibility has changed. Available only on MC 1.19+.
// returns a ElementTag(Boolean) of whether the player's locale has changed.
// returns a ElementTag(Boolean) of whether the player's main hand has changed.
// returns a ElementTag(Boolean) of whether the player's skin parts have changed.
// returns a ElementTag(Boolean) of whether the player's text filtering has changed. Available only on MC 1.19+.
// returns a ElementTag(Boolean) of whether the player has text filtering enabled. Available only on MC 1.19+.
// returns a ElementTag(Boolean) of whether the player's view distance has changed.
//
// @Player Always.
//
// -->
public PlayerClientOptionsChangeScriptEvent() {
registerCouldMatcher("player client options change");
}
public PlayerClientOptionsChangeEvent event;
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "server_listings_enabled" -> NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) ? new ElementTag(event.allowsServerListings()) : null;
case "chat_visibility" -> new ElementTag(event.getChatVisibility());
case "locale" -> new ElementTag(event.getLocale());
case "main_hand" -> new ElementTag(event.getMainHand());
case "skin_parts" -> {
MapTag map = new MapTag();
SkinParts skinParts = event.getSkinParts();
map.putObject("cape", new ElementTag(skinParts.hasCapeEnabled()));
map.putObject("jacket", new ElementTag(skinParts.hasJacketEnabled()));
map.putObject("left_sleeve", new ElementTag(skinParts.hasLeftSleeveEnabled()));
map.putObject("right_sleeve", new ElementTag(skinParts.hasRightSleeveEnabled()));
map.putObject("left_pants", new ElementTag(skinParts.hasLeftPantsEnabled()));
map.putObject("right_pants", new ElementTag(skinParts.hasRightPantsEnabled()));
map.putObject("hat", new ElementTag(skinParts.hasHatsEnabled()));
yield map;
}
case "view_distance" -> new ElementTag(event.getViewDistance());
case "server_listings_changed" -> NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) ? new ElementTag(event.hasAllowServerListingsChanged()) : null;
case "chat_colors_enabled" -> new ElementTag(event.hasChatColorsEnabled());
case "chat_colors_changed" -> new ElementTag(event.hasChatColorsEnabledChanged());
case "chat_visibility_changed" -> NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) ? new ElementTag(event.hasChatVisibilityChanged()) : null;
case "locale_changed" -> new ElementTag(event.hasLocaleChanged());
case "main_hand_changed" -> new ElementTag(event.hasMainHandChanged());
case "skin_parts_changed" -> new ElementTag(event.hasSkinPartsChanged());
case "text_filtering_changed" -> NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) ? new ElementTag(event.hasTextFilteringChanged()) : null;
case "text_filtering_enabled" -> NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) ? new ElementTag(event.hasTextFilteringEnabled()) : null;
case "view_distance_changed" -> new ElementTag(event.hasViewDistanceChanged());
default -> super.getContext(name);
};
}
@EventHandler
public void onPlayerClientOptionsChange(PlayerClientOptionsChangeEvent event) {
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerCompletesAdvancementScriptEventPaperImpl.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.player.PlayerCompletesAdvancementScriptEvent;
import com.denizenscript.denizen.paper.PaperModule;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import net.md_5.bungee.api.ChatColor;
public class PlayerCompletesAdvancementScriptEventPaperImpl extends PlayerCompletesAdvancementScriptEvent {
@Override
public ObjectTag getContext(String name) {
switch (name) {
case "message": return new ElementTag(PaperModule.stringifyComponent(event.message()));
}
return super.getContext(name);
}
@Override
public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) {
if (determinationObj instanceof ElementTag) {
String determination = determinationObj.toString();
String lower = CoreUtilities.toLowerCase(determination);
if (lower.equals("no_message")) {
event.message(null);
return true;
}
event.message(PaperModule.parseFormattedText(determination, ChatColor.WHITE));
return true;
}
else {
return super.applyDetermination(path, determinationObj);
}
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerDeepSleepScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import io.papermc.paper.event.player.PlayerDeepSleepEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerDeepSleepScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player deep sleeps
//
// @Location true
//
// @Plugin Paper
//
// @Group Paper
//
// @Cancellable true
//
// @Triggers when a player has slept long enough in a bed to count as being in deep sleep and thus skip the night. Cancelling the event prevents the player from qualifying to skip the night.
//
// @Player Always.
//
// -->
public PlayerDeepSleepScriptEvent() {
registerCouldMatcher("player deep sleeps");
}
public PlayerDeepSleepEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, event.getPlayer().getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@EventHandler
public void playerDeepSleep(PlayerDeepSleepEvent event) {
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerElytraBoostScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.player.PlayerElytraBoostEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerElytraBoostScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player boosts elytra
//
// @Location true
//
// @Plugin Paper
//
// @Group Paper
//
// @Cancellable true
//
// @Switch with:
- to only process the event if the firework item used matches the specified item.
// @Switch elytra:
- to only process the event if the elytra used matches the specified item.
//
// @Triggers when a player boosts their elytra with a firework rocket while gliding.
//
// @Context
// returns the firework item used to boost.
// returns the firework entity that was spawned.
// returns whether the firework item gets consumed.
//
// @Player Always.
//
// @Determine
// "KEEP:" to set whether the firework item should be kept.
//
// -->
public PlayerElytraBoostScriptEvent() {
registerCouldMatcher("player boosts elytra");
registerSwitches("with", "elytra");
this.registerOptionalDetermination("keep", ElementTag.class, (evt, context, value) -> {
if (value.isBoolean()) {
evt.event.setShouldConsume(!value.asBoolean());
return true;
}
return false;
});
}
public PlayerElytraBoostEvent event;
public ItemTag firework;
public PlayerTag player;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, player.getLocation())) {
return false;
}
if (!runWithCheck(path, firework)) {
return false;
}
if (!path.tryObjectSwitch("elytra", new ItemTag(player.getPlayerEntity().getEquipment().getChestplate()))) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(player, null);
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "item" -> firework;
case "entity" -> new EntityTag(event.getFirework());
case "should_keep" -> new ElementTag(!event.shouldConsume());
default -> super.getContext(name);
};
}
@EventHandler
public void onPlayerElytraBoost(PlayerElytraBoostEvent event) {
firework = new ItemTag(event.getItemStack());
player = new PlayerTag(event.getPlayer());
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerEquipsArmorScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import com.destroystokyo.paper.event.player.PlayerArmorChangeEvent;
import org.bukkit.Material;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack;
import java.util.HashMap;
public class PlayerEquipsArmorScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player equips|unequips armor|helmet|chestplate|leggings|boots
// player equips|unequips
-
//
// @Plugin Paper
//
// @Group Paper
//
// @Triggers when a player (un)equips armor.
//
// @Warning This event is not reliable, and may miss some types of equipment changes or fire when equipment hasn't actually changed.
//
// @Context
// returns the ItemTag that is now in the slot.
// returns the ItemTag that used to be in the slot.
// returns the name of the slot.
//
// @Player Always.
//
// -->
public static HashMap slotsByName = new HashMap<>();
public static HashMap namesBySlot = new HashMap<>();
public static void registerSlot(String name, PlayerArmorChangeEvent.SlotType slot) {
slotsByName.put(name, slot);
namesBySlot.put(slot, name);
}
public PlayerEquipsArmorScriptEvent() {
registerSlot("helmet", PlayerArmorChangeEvent.SlotType.HEAD);
registerSlot("chestplate", PlayerArmorChangeEvent.SlotType.CHEST);
registerSlot("leggings", PlayerArmorChangeEvent.SlotType.LEGS);
registerSlot("boots", PlayerArmorChangeEvent.SlotType.FEET);
registerCouldMatcher("player (equips|unequips) armor|helmet|chestplate|leggings|boots");
registerCouldMatcher("player (equips|unequips)
- ");
}
public ItemTag oldItem;
public ItemTag newItem;
public PlayerArmorChangeEvent.SlotType slot;
public PlayerTag player;
@Override
public boolean matches(ScriptPath path) {
String type = path.eventArgLowerAt(1);
String itemCompare = path.eventArgLowerAt(2);
PlayerArmorChangeEvent.SlotType slotType = slotsByName.get(itemCompare);
if (slotType != null && slot != slotType) {
return false;
}
if (type.equals("equips")) {
if (slotType != null) {
if (newItem.getMaterial().getMaterial() == Material.AIR) {
return false;
}
}
else if (!itemCompare.equals("armor") && !newItem.tryAdvancedMatcher(itemCompare, path.context)) {
return false;
}
}
else { // unequips
if (slotType != null) {
if (oldItem.getMaterial().getMaterial() == Material.AIR) {
return false;
}
}
else if (!itemCompare.equals("armor") && !oldItem.tryAdvancedMatcher(itemCompare, path.context)) {
return false;
}
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(player, null);
}
@Override
public ObjectTag getContext(String name) {
switch (name) {
case "new_item":
return newItem;
case "old_item":
return oldItem;
case "slot":
return new ElementTag(namesBySlot.get(slot));
}
return super.getContext(name);
}
public String simpleComparisonString(ItemStack stack) {
if (stack == null) {
return "null";
}
stack = stack.clone();
stack.setAmount(1);
stack.setDurability((short) 0);
return CoreUtilities.toLowerCase(new ItemTag(stack).identify());
}
@EventHandler
public void armorChangeEvent(PlayerArmorChangeEvent event) {
if (EntityTag.isCitizensNPC(event.getPlayer())) {
return;
}
if (simpleComparisonString(event.getOldItem()).equals(simpleComparisonString(event.getNewItem()))) {
return;
}
newItem = new ItemTag(event.getNewItem());
oldItem = new ItemTag(event.getOldItem());
slot = event.getSlotType();
player = new PlayerTag(event.getPlayer());
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerGrantedAdvancementCriterionScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.utilities.Utilities;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.player.PlayerAdvancementCriterionGrantEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerGrantedAdvancementCriterionScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player granted advancement criterion
//
// @Group Paper
//
// @Plugin Paper
//
// @Cancellable true
//
// @Switch advancement: to only fire if the advancement for the criterion has the specified name.
// @Switch criterion: to only fire if the criterion being granted has the specified name.
//
// @Triggers when a player is granted a single criterion for an advancement.
// To fire when ALL the criteria for an advancement is met, use <@link event player completes advancement>
//
// @Context
// returns the advancement's minecraft ID key.
// returns the criterion minecraft ID key.
//
// @Player Always.
//
// @Example
// # Prevent a player from being granted an advancement criterion.
// on player granted advancement criterion:
// - determine cancelled
//
// @Example
// # This will only narrate when the player is granted the criterion for taming a Calico cat
// # for the "A Complete Catalogue" advancement.
// on player granted advancement criterion advancement:husbandry/complete_catalogue criterion:calico:
// - narrate "That is a pretty cute Calico cat you have there!"
//
// @Example
// # This will fire for a custom Denizen advancement called "my_advancement".
// on player granted advancement criterion advancement:denizen:my_advancement:
// - narrate "You got the advancement!"
// -->
public PlayerGrantedAdvancementCriterionScriptEvent() {
registerCouldMatcher("player granted advancement criterion");
registerSwitches("advancement", "criterion");
}
public ElementTag criterion;
public ElementTag advancement;
public PlayerAdvancementCriterionGrantEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!path.tryObjectSwitch("advancement", advancement)) {
return false;
}
if (!path.tryObjectSwitch("criterion", criterion)) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "criterion" -> criterion;
case "advancement" -> advancement;
default -> super.getContext(name);
};
}
@EventHandler
public void playerGrantedAdvancementCriterionEvent(PlayerAdvancementCriterionGrantEvent event) {
this.event = event;
criterion = new ElementTag(Utilities.namespacedKeyToString(Utilities.parseNamespacedKey(event.getCriterion())));
advancement = new ElementTag(Utilities.namespacedKeyToString(event.getAdvancement().getKey()));
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerInventorySlotChangeScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import io.papermc.paper.event.player.PlayerInventorySlotChangeEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerInventorySlotChangeScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player inventory slot changes
//
// @Group Paper
//
// @Location true
//
// @Plugin Paper
//
// @Switch from:
- to only process the event if the previous item in the slot matches the specified item.
// @Switch to:
- to only process the event if the new item in the slot matches the specified item.
// @Switch slot: to only process the event if a specific slot was clicked. For slot input options, see <@link language Slot Inputs>.
//
// @Triggers when the item in a slot of a player's inventory changes.
// Note that this fires for every item in the player's inventory when they join.
//
// @Context
// returns an ItemTag of the new item in the slot.
// returns an ItemTag of the previous item in the slot.
// returns an ElementTag(Number) of the slot that was changed.
// returns an ElementTag(Number) of the raw number of the slot that was changed.
//
// @Player Always.
//
// -->
public PlayerInventorySlotChangeScriptEvent() {
registerCouldMatcher("player inventory slot changes");
registerSwitches("from", "to", "slot");
}
public PlayerInventorySlotChangeEvent event;
public ItemTag oldItem;
public ItemTag newItem;
@Override
public boolean matches(ScriptPath path) {
if (!trySlot(path, "slot", event.getPlayer(), event.getSlot())) {
return false;
}
if (!runWithCheck(path, oldItem, "from")) {
return false;
}
if (!runWithCheck(path, newItem, "to")) {
return false;
}
if (!runInCheck(path, event.getPlayer().getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public ObjectTag getContext(String name) {
switch (name) {
case "new_item": return newItem;
case "old_item": return oldItem;
case "slot": return new ElementTag(event.getSlot() + 1);
case "raw_slot": return new ElementTag(event.getRawSlot());
}
return super.getContext(name);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@EventHandler
public void onPlayerInventorySlotChange(PlayerInventorySlotChangeEvent event) {
if (EntityTag.isNPC(event.getPlayer())) {
return;
}
oldItem = new ItemTag(event.getOldItemStack());
newItem = new ItemTag(event.getNewItemStack());
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerItemTakesDamageScriptEventPaperImpl.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.player.PlayerItemTakesDamageScriptEvent;
import com.denizenscript.denizen.nms.NMSHandler;
import com.denizenscript.denizen.nms.NMSVersion;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
public class PlayerItemTakesDamageScriptEventPaperImpl extends PlayerItemTakesDamageScriptEvent {
@Override
public ObjectTag getContext(String name) {
switch (name) {
case "original_damage": return NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18) ? new ElementTag(event.getOriginalDamage()) : null;
}
return super.getContext(name);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerJumpsScriptEventPaperImpl.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.player.PlayerJumpScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.objects.PlayerTag;
import com.destroystokyo.paper.event.player.PlayerJumpEvent;
import org.bukkit.event.EventHandler;
public class PlayerJumpsScriptEventPaperImpl extends PlayerJumpScriptEvent {
@EventHandler
public void onPlayerJumps(PlayerJumpEvent event) {
if (EntityTag.isNPC(event.getPlayer())) {
return;
}
location = new LocationTag(event.getFrom());
player = new PlayerTag(event.getPlayer());
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerLecternPageChangeScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import io.papermc.paper.event.player.PlayerLecternPageChangeEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerLecternPageChangeScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player flips lectern page
//
// @Plugin Paper
//
// @Group Paper
//
// @Location true
//
// @Cancellable true
//
// @Player Always.
//
// @Triggers when the player flips to a page in a lectern.
//
// @Switch book:
- to only process the event if the book on the lectern matches the given item.
//
// @Context
// returns an ItemTag of the book in the lectern.
// returns a LocationTag of the lectern.
// returns an ElementTag(Number) of the last page the player was on.
// returns an ElementTag(Number) of the new page that the player flipped to.
// returns the direction in which the player flips the lectern book page, can be either LEFT or RIGHT.
//
// @Determine
// "PAGE:" to set the page that the player will flip to.
//
// @Example
// # Announce the page the player flipped to.
// on player flips lectern page:
// - announce " flipped to page #!"
//
// @Example
// # Flips the player to page 5 if they are flagged with "pancakes".
// on player flips lectern page flagged:pancakes:
// - determine page:5
//
// -->
public PlayerLecternPageChangeScriptEvent() {
registerCouldMatcher("player flips lectern page");
registerSwitches("book");
this.registerOptionalDetermination("page", ElementTag.class, (evt, context, page) -> {
if (page.isInt()) {
evt.event.setNewPage(page.asInt() - 1);
return true;
}
return false;
});
}
public PlayerLecternPageChangeEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, event.getLectern().getLocation())) {
return false;
}
if (!path.tryObjectSwitch("book", new ItemTag(event.getBook()))) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "book" -> new ItemTag(event.getBook());
case "lectern" -> new LocationTag(event.getLectern().getLocation());
case "old_page" -> new ElementTag(event.getOldPage() + 1);
case "new_page" -> new ElementTag(event.getNewPage() + 1);
case "flip_direction" -> new ElementTag(event.getPageChangeDirection());
default -> super.getContext(name);
};
}
@EventHandler
public void onPlayerFlipsLecternPage(PlayerLecternPageChangeEvent event) {
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerLoomPatternSelectScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.InventoryTag;
import com.denizenscript.denizen.utilities.Utilities;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import io.papermc.paper.event.player.PlayerLoomPatternSelectEvent;
import org.bukkit.block.banner.PatternType;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerLoomPatternSelectScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player selects loom pattern
//
// @Plugin Paper
//
// @Group Paper
//
// @Location true
//
// @Cancellable true
//
// @Player Always.
//
// @Triggers when a player selects a loom pattern.
//
// @Switch type: to only process the event if the specified pattern is selected.
//
// @Context
// returns an InventoryTag of the loom.
// returns an ElementTag of the selected pattern. Valid pattern types can be found at: <@link url https://jd.papermc.io/paper/1.19/org/bukkit/block/banner/PatternType.html>
//
// @Determine
// "PATTERN:" to set the pattern type of the loom.
//
// @Example
// # Announce the player's selected loom pattern.
// on player selects loom pattern:
// - announce " selected the pattern!"
//
// @Example
// # If the player selects the "CREEPER" pattern type, publicly shames them before setting the pattern to "SKULL".
// on player selects loom pattern type:CREEPER:
// - announce "Shame on for selecting the creeper pattern!"
// - determine pattern:SKULL
//
// -->
public PlayerLoomPatternSelectScriptEvent() {
registerCouldMatcher("player selects loom pattern");
registerSwitches("type");
this.registerOptionalDetermination("pattern", ElementTag.class, (evt, context, pattern) -> {
if (Utilities.matchesEnumlike(pattern, PatternType.class)) {
evt.event.setPatternType(Utilities.elementToEnumlike(pattern, PatternType.class));
return true;
}
return false;
});
}
public PlayerLoomPatternSelectEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, event.getLoomInventory().getLocation())) {
return false;
}
if (!path.tryObjectSwitch("type", Utilities.enumlikeToElement(event.getPatternType()))) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "loom" -> InventoryTag.mirrorBukkitInventory(event.getLoomInventory());
case "pattern" -> Utilities.enumlikeToElement(event.getPatternType());
default -> super.getContext(name);
};
}
@EventHandler
public void onPlayerSelectsLoomPattern(PlayerLoomPatternSelectEvent event) {
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerNamesEntityScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.paper.PaperModule;
import com.denizenscript.denizen.utilities.PaperAPITools;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import io.papermc.paper.event.player.PlayerNameEntityEvent;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerNamesEntityScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player names
//
// @Location true
//
// @Plugin Paper
//
// @Group Paper
//
// @Cancellable true
//
// @Triggers when a player attempts to rename an entity with a name tag.
//
// @Context
// returns an EntityTag of the renamed entity.
// returns the old name of the entity, if any.
// returns the new name of the entity.
// returns whether this will cause the entity to persist through server restarts.
//
// @Determine
// "NAME:" to set a different name for the entity.
// "PERSISTENT:" to set whether the event will cause the entity to persist through restarts. NOTE: Entities may still persist for other reasons. To ensure they do not, use <@link mechanism EntityTag.force_no_persist>.
//
// @Player Always.
//
// -->
public PlayerNamesEntityScriptEvent() {
registerCouldMatcher("player names ");
this.registerOptionalDetermination("persistent", ElementTag.class, (evt, context, determination) -> {
if (determination.isBoolean()) {
evt.event.setPersistent(determination.asBoolean());
return true;
}
return false;
});
this.registerDetermination("name", ElementTag.class, (evt, context, determination) -> {
evt.event.setName(PaperModule.parseFormattedText(determination.toString(), ChatColor.WHITE));
});
}
public PlayerNameEntityEvent event;
public EntityTag entity;
public ElementTag oldName;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, entity.getLocation())) {
return false;
}
if (!path.tryArgObject(2, entity)) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "entity" -> entity.getDenizenObject();
case "name" -> new ElementTag(PaperModule.stringifyComponent(event.getName()), true);
case "old_name" -> oldName;
case "persistent" -> new ElementTag(event.isPersistent());
default -> super.getContext(name);
};
}
@EventHandler
public void playerNamesEntity(PlayerNameEntityEvent event) {
this.event = event;
entity = new EntityTag(event.getEntity());
String name = PaperAPITools.instance.getCustomName(entity.getBukkitEntity());
oldName = name == null ? null : new ElementTag(name, true);
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerOpenSignScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import io.papermc.paper.event.player.PlayerOpenSignEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerOpenSignScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player opens sign
//
// @Plugin Paper
//
// @Group Paper
//
// @Location true
//
// @Cancellable true
//
// @Triggers When a player opens a sign (eg after placing a sign, or by clicking on it to edit it).
//
// @Context
// returns an ElementTag of the side of the sign that was clicked (FRONT or BACK).
// returns an ElementTag of reason the sign was opened - see <@link url https://jd.papermc.io/paper/1.20/io/papermc/paper/event/player/PlayerOpenSignEvent.Cause.html>.
// returns a LocationTag of the sign's location.
//
// @Player Always.
//
// -->
public PlayerOpenSignScriptEvent() {
registerCouldMatcher("player opens sign");
}
public PlayerOpenSignEvent event;
public LocationTag location;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, location)) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "side" -> new ElementTag(event.getSide());
case "cause" -> new ElementTag(event.getCause());
case "location" -> location;
default -> super.getContext(name);
};
}
@EventHandler
public void playerOpenSignEvent(PlayerOpenSignEvent event) {
location = new LocationTag(event.getSign().getLocation());
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerPreparesGrindstoneCraftScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.*;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.inventory.PrepareResultEvent;
import org.bukkit.entity.HumanEntity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.inventory.GrindstoneInventory;
public class PlayerPreparesGrindstoneCraftScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player prepares grindstone craft
-
//
// @Group Player
//
// @Location true
//
// @Plugin Paper
//
// @Triggers when a player prepares to grind an item.
//
// @Context
// returns the InventoryTag of the grindstone inventory.
// returns the ItemTag to be crafted.
//
// @Determine
// "RESULT:" to change the item that is crafted.
//
// @Player Always.
//
// @Warning The player doing the grinding is estimated and may be inaccurate.
//
// @Example
// # This example removes the usually not removable curse of binding enchantment.
// on player prepares grindstone craft item:
// - determine result:
//
// -->
public PlayerPreparesGrindstoneCraftScriptEvent() {
registerCouldMatcher("player prepares grindstone craft
- ");
this.registerDetermination("result", ItemTag.class, (evt, context, item) -> {
evt.event.setResult(item.getItemStack());
});
}
public PrepareResultEvent event;
public PlayerTag player;
@Override
public boolean matches(ScriptPath path) {
if (!path.tryArgObject(4, new ItemTag(event.getResult()))) {
return false;
}
if (!runInCheck(path, event.getInventory().getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "inventory" -> InventoryTag.mirrorBukkitInventory(event.getInventory());
case "result" -> new ItemTag(event.getResult());
default -> super.getContext(name);
};
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(player, null);
}
@EventHandler
public void onPlayerPreparesGrindstoneCraft(PrepareResultEvent event) {
if (!(event.getInventory() instanceof GrindstoneInventory)) {
return;
}
if (event.getViewers().isEmpty()) {
return;
}
HumanEntity humanEntity = event.getViewers().get(0);
if (EntityTag.isNPC(humanEntity)) {
return;
}
player = EntityTag.getPlayerFrom(humanEntity);
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerQuitsScriptEventPaperImpl.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.player.PlayerQuitsScriptEvent;
import com.denizenscript.denizen.paper.PaperModule;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import net.md_5.bungee.api.ChatColor;
public class PlayerQuitsScriptEventPaperImpl extends PlayerQuitsScriptEvent {
public PlayerQuitsScriptEventPaperImpl() {
registerSwitches("cause");
this.registerTextDetermination("none", (evt) -> {
event.quitMessage(null);
});
this.registerDetermination(null, ElementTag.class, (evt, context, determination) -> {
event.quitMessage(PaperModule.parseFormattedText(determination.toString(), ChatColor.WHITE));
});
}
@Override
public boolean matches(ScriptPath path) {
if (!runGenericSwitchCheck(path, "cause", event.getReason().name())) {
return false;
}
return super.matches(path);
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "message" -> new ElementTag(PaperModule.stringifyComponent(event.quitMessage()));
case "cause" -> new ElementTag(event.getReason());
default -> super.getContext(name);
};
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerRaiseLowerItemScriptEventPaperImpl.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.player.PlayerRaiseLowerItemScriptEvent;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.DurationTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import io.papermc.paper.event.player.PlayerStopUsingItemEvent;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
public class PlayerRaiseLowerItemScriptEventPaperImpl extends PlayerRaiseLowerItemScriptEvent {
public DurationTag heldFor;
public ElementTag hand;
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "held_for" -> heldFor;
case "hand" -> hand;
case "item" -> item;
default -> super.getContext(name);
};
}
@Override
public void run(Player pl, String reason) {
this.reason = new ElementTag(reason);
player = new PlayerTag(pl);
item = new ItemTag(pl.getActiveItem());
hand = new ElementTag(pl.getHandRaised());
if (item.getBukkitMaterial() == Material.AIR) {
item = new ItemTag(pl.getEquipment().getItemInMainHand());
hand = new ElementTag("HAND");
}
if (item.getBukkitMaterial() == Material.AIR) {
item = new ItemTag(pl.getEquipment().getItemInOffHand());
hand = new ElementTag("OFF_HAND");
}
if (item.getBukkitMaterial() == Material.AIR) {
return;
}
heldFor = state ? null : new DurationTag((long) pl.getHandRaisedTime());
fire();
}
@EventHandler
public void onStopUsingItem(PlayerStopUsingItemEvent event) {
signalDidLower(event.getPlayer(), "lower");
}
public boolean isHandRaised(Player player, EquipmentSlot slot) {
if (player.isHandRaised()) {
return slot == player.getHandRaised();
}
return raisedItems.contains(player.getUniqueId());
}
@EventHandler
public void onPlayerDropItem(PlayerDropItemEvent event) {
// You can only drop items from your main hand, so if the player's main hand isn't raised, ignore
if (isHandRaised(event.getPlayer(), EquipmentSlot.HAND) && raisedItems.remove(event.getPlayer().getUniqueId())) {
cancelled = false;
state = false;
Player pl = event.getPlayer();
player = new PlayerTag(pl);
// Work around Player#getActiveItem being air in the drop item event
ItemStack loweredItem = event.getItemDrop().getItemStack();
item = new ItemTag(loweredItem);
heldFor = new DurationTag((long) loweredItem.getMaxItemUseDuration() - pl.getItemUseRemainingTime());
hand = new ElementTag(pl.getHandRaised());
reason = new ElementTag("drop");
fire();
}
}
@EventHandler
public void onPlayerChangeHeldItem(PlayerItemHeldEvent event) {
if (isHandRaised(event.getPlayer(), EquipmentSlot.HAND)) {
signalDidLower(event.getPlayer(), "hold");
}
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerReceivesLinksScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizen.utilities.Utilities;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.core.ListTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import io.papermc.paper.connection.PlayerConfigurationConnection;
import io.papermc.paper.connection.PlayerGameConnection;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerLinksSendEvent;
public class PlayerReceivesLinksScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player receives links
//
// @Group Paper
//
// @Plugin Paper
//
// @Triggers when a player receives a list of server links.
//
// @Determine
// "LINKS:" to set the links sent to the player. Each item in the list must be a MapTag in <@link language Server Links Format>.
// "ADD_LINKS:" to send additional links to the player. Each item in the list must be a MapTag in <@link language Server Links Format>.
//
// @Player Always.
//
// @Warning this may fire early in the player login process, during which the linked player is essentially an offline player.
//
// -->
public PlayerLinksSendEvent event;
public PlayerTag player;
public PlayerReceivesLinksScriptEvent() {
registerCouldMatcher("player receives links");
this.registerDetermination("links", ListTag.class, (evt, context, value) -> {
Utilities.replaceServerLinks(evt.event.getLinks(), value, context);
});
this.registerDetermination("add_links", ListTag.class, (evt, context, value) -> {
Utilities.fillServerLinks(evt.event.getLinks(), value, context);
});
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(player, null);
}
@EventHandler
public void onPlayerLinksSend(PlayerLinksSendEvent event) {
if (event.getConnection() instanceof PlayerGameConnection gameConnection) {
player = new PlayerTag(gameConnection.getPlayer());
}
else if (event.getConnection() instanceof PlayerConfigurationConnection configConnection) {
player = new PlayerTag(configConnection.getProfile().getId());
}
else {
throw new IllegalStateException("Links send event fired with unknown connection type! " + event.getConnection() + " / " + event.getConnection().getClass().getName());
}
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerSelectsStonecutterRecipeScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.InventoryTag;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import io.papermc.paper.event.player.PlayerStonecutterRecipeSelectEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerSelectsStonecutterRecipeScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player selects stonecutter recipe
//
// @Group Player
//
// @Cancellable true
//
// @Location true
//
// @Triggers when a player selects a recipe in a stonecutter.
//
// @Switch recipe_id: to only process the event if the recipe matches the recipe ID.
//
// @Context
// returns the InventoryTag of the stonecutter inventory.
// returns an ItemTag of the item in the input slot.
// returns an ItemTag of the item in the result slot.
// returns the ID of the recipe that was selected.
//
// @Player Always.
//
// -->
public PlayerSelectsStonecutterRecipeScriptEvent() {
registerCouldMatcher("player selects stonecutter recipe");
registerSwitches("recipe_id");
}
public PlayerStonecutterRecipeSelectEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, event.getStonecutterInventory().getLocation())) {
return false;
}
if (!runGenericSwitchCheck(path, "recipe_id", event.getStonecuttingRecipe().getKey().toString())) {
return false;
}
return super.matches(path);
}
@Override
public ObjectTag getContext(String name) {
switch (name) {
case "inventory": return InventoryTag.mirrorBukkitInventory(event.getStonecutterInventory());
case "input": return new ItemTag(event.getStonecutterInventory().getInputItem());
case "result": return new ItemTag(event.getStonecuttingRecipe().getResult());
case "recipe_id": return new ElementTag(String.valueOf(event.getStonecuttingRecipe().getKey()));
}
return super.getContext(name);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@EventHandler
public void onPlayerSelectsStonecutterRecipe(PlayerStonecutterRecipeSelectEvent event) {
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerSetSpawnScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.paper.PaperModule;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.player.PlayerSetSpawnEvent;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerSetSpawnScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player sets spawn
//
// @Cancellable true
//
// @Location true
//
// @Plugin Paper
//
// @Group Paper
//
// @Triggers when a player's spawn point changes.
//
// @Switch cause: to only process when the cause for the event matches the input.
//
// @Context
// returns the reason the player's spawn point changed. A list of causes can be found at <@link url https://jd.papermc.io/paper/1.21.5/com/destroystokyo/paper/event/player/PlayerSetSpawnEvent.Cause.html>.
// returns whether this event will persist through source block (bed or respawn anchor) removal.
// returns a LocationTag of the new respawn location, if any.
// returns the notification message that is sent to the player.
// returns whether the player will be notified their spawn point changed.
//
// @Determine
// "FORCED:" to set whether the player's new spawnpoint will persist even if the bed or respawn anchor that triggered the event is removed.
// "MESSAGE:" to set the notification message that is sent to the player.
// "NOTIFY:" to set whether the player will be notified their spawnpoint changed.
// LocationTag to change the respawn location.
//
// @Player Always.
//
// -->
public PlayerSetSpawnScriptEvent() {
registerCouldMatcher("player sets spawn");
registerSwitches("cause");
this.registerOptionalDetermination("forced", ElementTag.class, (evt, context, value) -> {
if (value.isBoolean()) {
evt.event.setForced(value.asBoolean());
return true;
}
return false;
});
this.registerDetermination("message", ElementTag.class, (evt, context, message) -> {
evt.event.setNotification(PaperModule.parseFormattedText(message.toString(), ChatColor.WHITE));
});
this.registerOptionalDetermination("notify", ElementTag.class, (evt, context, value) -> {
if (value.isBoolean()) {
evt.event.setNotifyPlayer(value.asBoolean());
return true;
}
return false;
});
this.registerDetermination(null, LocationTag.class, (evt, context, location) -> {
evt.event.setLocation(location);
evt.event.setForced(true); // required if the cause is a bed or respawn anchor
});
}
public PlayerSetSpawnEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, event.getLocation())) {
return false;
}
if (!runGenericSwitchCheck(path, "cause", event.getCause().toString())) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "cause" -> new ElementTag(event.getCause());
case "forced" -> new ElementTag(event.isForced());
case "location" -> event.getLocation() != null ? new LocationTag(event.getLocation()) : null;
case "message" -> event.getNotification() != null ? new ElementTag(PaperModule.stringifyComponent(event.getNotification()), true) : null;
case "notify" -> new ElementTag(event.willNotifyPlayer());
default -> super.getContext(name);
};
}
@EventHandler
public void onPlayerSetsSpawn(PlayerSetSpawnEvent event) {
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerShieldDisableScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.DurationTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import io.papermc.paper.event.player.PlayerShieldDisableEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerShieldDisableScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player shield disables
//
// @Plugin Paper
//
// @Group Paper
//
// @Location true
//
// @Cancellable true
//
// @Triggers When a players shield is disabled.
//
// @Context
// returns an EntityTag of the attacker who disabled the shield.
// returns a DurationTag of the cooldown the shield is disabled for.
//
// @Determine
// "COOLDOWN:" to change the cooldown.
//
// @Player Always.
//
// -->
public PlayerShieldDisableScriptEvent() {
registerCouldMatcher("player shield disables");
this.registerDetermination("cooldown", DurationTag.class, (evt, context, duration) -> {
evt.event.setCooldown(duration.getTicksAsInt());
});
}
public PlayerShieldDisableEvent event;
public LocationTag location;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, location)) {
return false;
}
return super.matches(path);
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "damager" -> new EntityTag(event.getDamager()).getDenizenObject();
case "cooldown" -> new DurationTag((long) event.getCooldown());
default -> super.getContext(name);
};
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@EventHandler
public void playerShieldDisableEvent(PlayerShieldDisableEvent event) {
location = new LocationTag(event.getPlayer().getLocation());
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerSpectatesEntityScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.player.PlayerStartSpectatingEntityEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerSpectatesEntityScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player spectates
//
// @Location true
//
// @Plugin Paper
//
// @Group Paper
//
// @Cancellable true
//
// @Triggers when a player starts spectating an entity.
//
// @Context
// returns the entity that is being spectated.
// returns the entity that was previously being spectated (or the player themself if they weren't spectating anything).
//
// @Player Always.
//
// -->
public PlayerSpectatesEntityScriptEvent() {
registerCouldMatcher("player spectates ");
}
public PlayerStartSpectatingEntityEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!path.tryArgObject(2, new EntityTag(event.getNewSpectatorTarget()))) {
return false;
}
if (!runInCheck(path, event.getPlayer().getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@Override
public ObjectTag getContext(String name) {
if (name.equals("entity")) {
return new EntityTag(event.getNewSpectatorTarget()).getDenizenObject();
}
else if (name.equals("old_entity")) {
return new EntityTag(event.getCurrentSpectatorTarget()).getDenizenObject();
}
return super.getContext(name);
}
@EventHandler
public void playerSpectateEvent(PlayerStartSpectatingEntityEvent event) {
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerStopsSpectatingScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.player.PlayerStopSpectatingEntityEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerStopsSpectatingScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player stops spectating ()
//
// @Location true
//
// @Plugin Paper
//
// @Group Paper
//
// @Cancellable true
//
// @Triggers when a player stops spectating an entity.
//
// @Context
// returns the entity that was being spectated.
//
// @Player Always.
//
// -->
public PlayerStopsSpectatingScriptEvent() {
registerCouldMatcher("player stops spectating ()");
}
public PlayerStopSpectatingEntityEvent event;
@Override
public boolean matches(ScriptPath path) {
if (path.eventArgLowerAt(3).length() > 0 && !path.tryArgObject(3, new EntityTag(event.getSpectatorTarget()))) {
return false;
}
if (!runInCheck(path, event.getPlayer().getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@Override
public ObjectTag getContext(String name) {
if (name.equals("entity")) {
return new EntityTag(event.getSpectatorTarget()).getDenizenObject();
}
return super.getContext(name);
}
@EventHandler
public void playerSpectateEvent(PlayerStopSpectatingEntityEvent event) {
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerTracksEntityScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import io.papermc.paper.event.player.PlayerTrackEntityEvent;
import io.papermc.paper.event.player.PlayerUntrackEntityEvent;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerTracksEntityScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player tracks|untracks
//
// @Location true
//
// @Group Paper
//
// @Plugin Paper
//
// @Warning This event may fire very rapidly.
//
// @Triggers when a player starts or stops tracking an entity. An entity is tracked/untracked by a player's client when the player moves in/out of its <@link mechanism EntityTag.tracking_range>.
//
// @Context
// returns an EntityTag of the entity being tracked or untracked.
//
// @Player Always.
//
// @Example
// # Narrate when the player tracks any entities except for item frames.
// on player tracks !item_frame:
// - narrate "You are now tracking at "
//
// @Example
// on player untracks chicken:
// - narrate "CHICKEN: No! Come back! :("
// -->
public PlayerTracksEntityScriptEvent() {
registerCouldMatcher("player tracks|untracks ");
}
public String type;
public Player player;
public EntityTag entity;
@Override
public boolean matches(ScriptPath path) {
if (!path.eventArgLowerAt(1).equals(type)) {
return false;
}
if (!path.tryArgObject(2, entity)) {
return false;
}
if (!runInCheck(path, entity.getLocation())) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(player);
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "entity" -> entity;
default -> super.getContext(name);
};
}
@EventHandler
public void onPlayerTracksEntityEvent(PlayerTrackEntityEvent event) {
entity = new EntityTag(event.getEntity());
player = event.getPlayer();
type = "tracks";
fire(event);
}
@EventHandler
public void onPlayerUntracksEntityEvent(PlayerUntrackEntityEvent event) {
entity = new EntityTag(event.getEntity());
player = event.getPlayer();
type = "untracks";
EntityTag.rememberEntity(event.getEntity());
fire(event);
EntityTag.forgetEntity(event.getEntity());
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerTradesWithMerchantScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.objects.TradeTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import io.papermc.paper.event.player.PlayerPurchaseEvent;
import io.papermc.paper.event.player.PlayerTradeEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PlayerTradesWithMerchantScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player trades with merchant
//
// @Switch result: to only process the event if the player received a specific result item.
//
// @Location true
//
// @Plugin Paper
//
// @Group Paper
//
// @Cancellable true
//
// @Triggers when a player trades with a merchant (villager).
//
// @Context
// returns the villager that was traded with, if any (may be null for example with 'opentrades' command usage).
// returns a TradeTag of the trade that was done.
//
// @Determine
// TradeTag to change the trade that should be processed.
//
//
// @Player Always.
//
// -->
public PlayerTradesWithMerchantScriptEvent() {
registerCouldMatcher("player trades with merchant");
registerSwitches("result");
this.registerDetermination(null, TradeTag.class, (evt, context, trade) -> {
evt.event.setTrade(trade.getRecipe());
});
}
public PlayerPurchaseEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!runInCheck(path, event.getPlayer().getLocation())) {
return false;
}
if (!path.tryObjectSwitch("result", new ItemTag(event.getTrade().getResult()))) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(event.getPlayer());
}
@Override
public ObjectTag getContext(String name) {
return switch (name) {
case "merchant" -> event instanceof PlayerTradeEvent tradeEvent ? new EntityTag(tradeEvent.getVillager()) : null;
case "trade" -> new TradeTag(event.getTrade()).duplicate();
default -> super.getContext(name);
};
}
@EventHandler
public void playerTradeEvent(PlayerPurchaseEvent event) {
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PreEntitySpawnScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent;
import com.destroystokyo.paper.event.entity.PreSpawnerSpawnEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PreEntitySpawnScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// prespawns (because <'cause'>)
//
// @Plugin Paper
//
// @Group Paper
//
// @Location true
//
// @Cancellable true
//
// @Warning This event may fire very rapidly, and only fires for NATURAL and SPAWNER reasons.
//
// @Triggers before a mob spawns and before the mob is created for spawning. Note that this has a limited number of use cases.
// The intent of this event is to save server resources for blanket mob banning/limiting scripts. Use the entity spawn event as a backup.
//
// @Context
// returns the EntityTag that will be spawned. Note that this entity will not be spawned yet, so usage will be limited.
// returns the LocationTag the entity will spawn at.
// returns an ElementTag of the reason for spawning. Currently, this event only fires for NATURAL and SPAWNER reasons.
// returns the LocationTag of the spawner's location if this mob is spawning from a spawner.
//
// -->
public PreEntitySpawnScriptEvent() {
registerCouldMatcher(" prespawns (because <'cause'>)");
}
public EntityTag entity;
public LocationTag location;
public PreCreatureSpawnEvent event;
@Override
public boolean matches(ScriptPath path) {
if (!path.tryArgObject(0, entity)) {
return false;
}
if (path.eventArgLowerAt(2).equals("because")
&& !path.eventArgLowerAt(3).equalsIgnoreCase(event.getReason().name())) {
return false;
}
if (!runInCheck(path, location)) {
return false;
}
return super.matches(path);
}
@Override
public void cancellationChanged() {
event.setShouldAbortSpawn(cancelled);
super.cancellationChanged();
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(null, null);
}
@Override
public ObjectTag getContext(String name) {
if (name.equals("entity")) {
return entity;
}
else if (name.equals("location")) {
return location;
}
else if (name.equals("reason")) {
return new ElementTag(event.getReason());
}
else if (name.equals("spawner_location") && event instanceof PreSpawnerSpawnEvent) {
return new LocationTag(((PreSpawnerSpawnEvent) event).getSpawnerLocation());
}
return super.getContext(name);
}
@EventHandler
public void onPreCreatureSpawn(PreCreatureSpawnEvent event) {
this.entity = new EntityTag(event.getType());
this.location = new LocationTag(event.getSpawnLocation());
this.event = event;
fire(event);
}
}
================================================
FILE: paper/src/main/java/com/denizenscript/denizen/paper/events/PrePlayerAttackEntityScriptEvent.java
================================================
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import io.papermc.paper.event.player.PrePlayerAttackEntityEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class PrePlayerAttackEntityScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player tries to attack
//
// @Plugin Paper
//
// @Group Paper
//
// @Cancellable true
//
// @Switch with:
- to only process the event if the player attacks the entity with the specified item.
//
// @Triggers when the player tries to attack an entity. This occurs before any of the damage logic, so cancelling this event will prevent any sort of sounds from being played when attacking.
//
// @Context
//