Skip to content
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
ec465a4
Initial Work
Fusezion Mar 16, 2025
26aceb2
CondWillConsume.java - Remove
Fusezion Mar 16, 2025
acd3a2d
Add missing newlines
Fusezion Mar 16, 2025
c2e259a
Batch 1/2
Fusezion Mar 16, 2025
63327c3
ExprShotForce.java - Rename to ExprProjectileForce.java
Fusezion Mar 16, 2025
73bdac9
ExprProjectileForce.java - Update Example
Fusezion Mar 16, 2025
aab2c48
Merge branch 'dev/feature' into feature/entity-shoot-bow-event
Fusezion Mar 16, 2025
711106a
BukkitEventValues.java - Remove EntityShootBowEvent
Fusezion Mar 16, 2025
dac9981
EvtEntityShootBow.java - Add Event-Values
Fusezion Mar 16, 2025
cfc620a
ExprConsumedItem.java - Replace ParseResult
Fusezion Mar 16, 2025
ce86297
EvtEntityShootBow.java - Add event-entity example
Fusezion Mar 16, 2025
c29c005
BukkitEventValues.java - Remove unused import
Fusezion Mar 16, 2025
29935c9
EvtEntityShootBow.java - Add 'on player shooting projectile'
Fusezion Mar 16, 2025
6abb578
Update src/main/java/ch/njol/skript/expressions/ExprProjectileForce.java
Fusezion Mar 16, 2025
ec20ddb
Update src/main/java/ch/njol/skript/expressions/ExprShooter.java
Fusezion Mar 16, 2025
35c6799
Update src/main/java/ch/njol/skript/events/EvtEntityShootBow.java
Fusezion Mar 16, 2025
709709e
EvtEntityShootBow.java - Finally look at the class the change is for
Fusezion Mar 17, 2025
1152db2
Merge branch 'dev/feature' into feature/entity-shoot-bow-event
Fusezion Mar 22, 2025
1509410
Plural entity data support
Fusezion Mar 23, 2025
da1562f
ExprConsumedItem - Player Consume Item Support
Fusezion Mar 23, 2025
39966a2
EvtEntityShootBow.java - Fix and list
Fusezion Mar 23, 2025
6497323
Merge branch 'dev/feature' into feature/entity-shoot-bow-event
Fusezion Mar 30, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 92 additions & 0 deletions src/main/java/ch/njol/skript/events/EvtEntityShootBow.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package ch.njol.skript.events;

import ch.njol.skript.Skript;
import ch.njol.skript.entity.EntityData;
import ch.njol.skript.lang.Literal;
import ch.njol.skript.lang.SkriptEvent;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.registrations.EventConverter;
import ch.njol.skript.registrations.EventValues;
import ch.njol.skript.util.slot.Slot;
import org.bukkit.entity.Entity;
import org.bukkit.event.Event;
import org.bukkit.event.entity.EntityShootBowEvent;
import org.bukkit.inventory.EntityEquipment;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import static ch.njol.skript.util.slot.EquipmentSlot.*;

public class EvtEntityShootBow extends SkriptEvent {

static {
Skript.registerEvent("Entity Shoot Bow", EvtEntityShootBow.class, EntityShootBowEvent.class,
"%entitydata% shoot[ing] (bow|projectile)")
.description("""
Called when an entity shoots a bow.
event-entity refers to the shot projectile/entity.
""")
.examples("""
on player shoot bow:
chance of 30%:
damage event-slot by 10
send "Your bow has taken increased damage!" to shooter

on stray shooting bow:
set {_e} to event-entity
spawn a cow at {_e}:
set velocity of entity to velocity of {_e}
set event-entity to last spawned entity
""")
.since("INSERT VERSION");

EventValues.registerEventValue(EntityShootBowEvent.class, ItemStack.class, EntityShootBowEvent::getBow);

EventValues.registerEventValue(EntityShootBowEvent.class, Entity.class, new EventConverter<>() {
@Override
public void set(EntityShootBowEvent event, @Nullable Entity entity) {
if (entity == null)
return;
event.setProjectile(entity);
}

@Override
public @NotNull Entity convert(EntityShootBowEvent from) {
return from.getProjectile();
}
});

EventValues.registerEventValue(EntityShootBowEvent.class, Slot.class, event -> {
EntityEquipment equipment = event.getEntity().getEquipment();
EquipSlot equipmentSlot = event.getHand() == EquipmentSlot.OFF_HAND ? EquipSlot.OFF_HAND : EquipSlot.TOOL;
return new ch.njol.skript.util.slot.EquipmentSlot(equipment, equipmentSlot);
});

}

private Literal<EntityData<?>> entityData;

@Override
public boolean init(Literal<?>[] args, int matchedPattern, SkriptParser.ParseResult parseResult) {
//noinspection unchecked
entityData = (Literal<EntityData<?>>) args[0];
return true;
}

@Override
public boolean check(Event event) {
if (!(event instanceof EntityShootBowEvent shootBowEvent))
return false;
EntityData<?> entityData = this.entityData.getSingle();
if (entityData == null) return false;
return entityData.isInstance(shootBowEvent.getEntity());
}

@Override
public String toString(@Nullable Event event, boolean debug) {
return this.entityData.toString(event, debug) + " shoot bow";
}

}
65 changes: 65 additions & 0 deletions src/main/java/ch/njol/skript/expressions/ExprConsumedItem.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package ch.njol.skript.expressions;

import ch.njol.skript.Skript;
import ch.njol.skript.doc.*;
import ch.njol.skript.lang.EventRestrictedSyntax;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.ExpressionType;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;
import ch.njol.util.coll.CollectionUtils;
import org.bukkit.event.Event;
import org.bukkit.event.entity.EntityShootBowEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Nullable;

@Name("Consumed Item")
@Description("Represents the item consumed within an entity shoot bow event.")
@Example("""
on player shoot bow:
if the consumed item is an arrow:
cancel event
send "You're now allowed to shoot your arrows." to shooter
""")
@Since("INSERT VERSION")
public class ExprConsumedItem extends SimpleExpression<ItemStack> implements EventRestrictedSyntax {

static {
Skript.registerExpression(ExprConsumedItem.class, ItemStack.class, ExpressionType.SIMPLE,
"[the] consumed item");
}

@Override
public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
return true;
}

@Override
protected ItemStack @Nullable [] get(Event event) {
if (!(event instanceof EntityShootBowEvent shootBowEvent))
return null;
return new ItemStack[]{shootBowEvent.getConsumable()};
}

@Override
public Class<? extends Event>[] supportedEvents() {
return CollectionUtils.array(EntityShootBowEvent.class);
}

@Override
public boolean isSingle() {
return true;
}

@Override
public Class<? extends ItemStack> getReturnType() {
return ItemStack.class;
}

@Override
public String toString(@Nullable Event event, boolean debug) {
return "the consumed item";
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package ch.njol.skript.expressions;

import ch.njol.skript.Skript;
import ch.njol.skript.doc.*;
import ch.njol.skript.lang.EventRestrictedSyntax;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.ExpressionType;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;
import ch.njol.util.coll.CollectionUtils;
import org.bukkit.event.Event;
import org.bukkit.event.entity.EntityShootBowEvent;
import org.jetbrains.annotations.Nullable;

@Name("Projectile Force")
@Description("Returns the force at which a projectile was shot within an entity shoot bow event.")
@Example("""
on entity shoot projectile:
set the velocity of shooter to vector(0,1,0) * projectile force
""")
@Since("INSERT VERSION")
public class ExprProjectileForce extends SimpleExpression<Float> implements EventRestrictedSyntax {

static {
Skript.registerExpression(ExprProjectileForce.class, Float.class, ExpressionType.SIMPLE,
"[the] projectile force");
}

@Override
public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
return true;
}

@Override
protected Float @Nullable [] get(Event event) {
if (!(event instanceof EntityShootBowEvent shotBowEvent))
return null;
return new Float[]{shotBowEvent.getForce()};
}

@Override
public Class<? extends Event>[] supportedEvents() {
return CollectionUtils.array(EntityShootBowEvent.class);
}

@Override
public boolean isSingle() {
return true;
}

@Override
public Class<? extends Float> getReturnType() {
return Float.class;
}

@Override
public String toString(@Nullable Event event, boolean debug) {
return "projectile force";
}

}
15 changes: 6 additions & 9 deletions src/main/java/ch/njol/skript/expressions/ExprShooter.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@

import ch.njol.skript.Skript;
import ch.njol.skript.classes.Changer.ChangeMode;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Examples;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.Since;
import ch.njol.skript.doc.*;
import ch.njol.skript.expressions.base.PropertyExpression;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.ExpressionType;
Expand All @@ -15,16 +12,14 @@
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Projectile;
import org.bukkit.event.Event;
import org.bukkit.event.entity.EntityShootBowEvent;
import org.bukkit.projectiles.ProjectileSource;
import org.jetbrains.annotations.Nullable;

/**
* @author Peter Güttinger
*/
@Name("Shooter")
@Description("The shooter of a projectile.")
@Examples({"shooter is a skeleton"})
@Since("1.3.7")
@Example("shooter is a skeleton")
@Since("1.3.7, INSERT VERSION (entity shoot bow event)")
public class ExprShooter extends PropertyExpression<Projectile, LivingEntity> {
static {
Skript.registerExpression(ExprShooter.class, LivingEntity.class, ExpressionType.SIMPLE, "[the] shooter [of %projectile%]");
Expand All @@ -41,6 +36,8 @@ public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelaye
protected LivingEntity @Nullable [] get(Event event, Projectile[] source) {
if (event instanceof EffSecShoot.ShootEvent shootEvent && getExpr().isDefault() && !(shootEvent.getProjectile() instanceof Projectile)) {
return new LivingEntity[]{shootEvent.getShooter()};
} else if (event instanceof EntityShootBowEvent shootBowEvent && getExpr().isDefault()) {
return new LivingEntity[]{shootBowEvent.getEntity()};
}

return get(source, projectile -> {
Expand Down