Skip to content

Commit

Permalink
Merge branch 'master' into enhancement/item-held-event-time-values
Browse files Browse the repository at this point in the history
  • Loading branch information
TheLimeGlass authored Jun 27, 2023
2 parents 98935b7 + 59b4bb5 commit 0e8c138
Show file tree
Hide file tree
Showing 5 changed files with 208 additions and 0 deletions.
22 changes: 22 additions & 0 deletions src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.event.player.PlayerItemMendEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerPickupArrowEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerQuitEvent.QuitReason;
Expand Down Expand Up @@ -1631,6 +1632,7 @@ public Egg get(PlayerEggThrowEvent event) {
return event.getEgg();
}
}, EventValues.TIME_NOW);

// LootGenerateEvent
if (Skript.classExists("org.bukkit.event.world.LootGenerateEvent")) {
EventValues.registerEventValue(LootGenerateEvent.class, Entity.class, new Getter<Entity, LootGenerateEvent>() {
Expand Down Expand Up @@ -1665,6 +1667,25 @@ public Slot get(PlayerItemHeldEvent event) {
}
}, EventValues.TIME_PAST);

// PlayerPickupArrowEvent
// This event value is restricted to MC 1.14+ due to an API change which has the return type changed
// which throws a NoSuchMethodError if used in a 1.13 server.
if (Skript.isRunningMinecraft(1, 14))
EventValues.registerEventValue(PlayerPickupArrowEvent.class, Projectile.class, new Getter<Projectile, PlayerPickupArrowEvent>() {
@Override
public Projectile get(PlayerPickupArrowEvent event) {
return event.getArrow();
}
}, EventValues.TIME_NOW);

EventValues.registerEventValue(PlayerPickupArrowEvent.class, ItemStack.class, new Getter<ItemStack, PlayerPickupArrowEvent>() {
@Override
@Nullable
public ItemStack get(PlayerPickupArrowEvent event) {
return event.getItem().getItemStack();
}
}, EventValues.TIME_NOW);

//PlayerQuitEvent
if (Skript.classExists("org.bukkit.event.player.PlayerQuitEvent$QuitReason"))
EventValues.registerEventValue(PlayerQuitEvent.class, QuitReason.class, new Getter<QuitReason, PlayerQuitEvent>() {
Expand All @@ -1674,6 +1695,7 @@ public QuitReason get(PlayerQuitEvent event) {
return event.getReason();
}
}, EventValues.TIME_NOW);

}

}
87 changes: 87 additions & 0 deletions src/main/java/ch/njol/skript/conditions/CondIsLeftHanded.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/**
* This file is part of Skript.
*
* Skript is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Skript is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Skript. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright Peter Güttinger, SkriptLang team and contributors
*/
package ch.njol.skript.conditions;

import ch.njol.skript.Skript;
import ch.njol.skript.conditions.base.PropertyCondition;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Examples;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.RequiredPlugins;
import ch.njol.skript.doc.Since;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.util.Kleenean;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Mob;
import org.bukkit.inventory.MainHand;

@Name("Left Handed")
@Description({
"Checks if living entities or players are left or right-handed. Armor stands are neither right nor left-handed.",
"Paper 1.17.1+ is required for non-player entities."
})
@Examples({
"on damage of player:",
"\tif victim is left handed:",
"\t\tcancel event"
})
@Since("INSERT VERSION")
@RequiredPlugins("Paper 1.17.1+ (entities)")
public class CondIsLeftHanded extends PropertyCondition<LivingEntity> {

private static final boolean CAN_USE_ENTITIES = Skript.methodExists(Mob.class, "isLeftHanded");

static {
if (CAN_USE_ENTITIES) {
register(CondIsLeftHanded.class, PropertyType.BE, "(:left|right)( |-)handed", "livingentities");
} else {
register(CondIsLeftHanded.class, PropertyType.BE, "(:left|right)( |-)handed", "players");
}
}

private MainHand hand;

@Override
public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
hand = parseResult.hasTag("left") ? MainHand.LEFT : MainHand.RIGHT;
return super.init(exprs, matchedPattern, isDelayed, parseResult);
}

@Override
public boolean check(LivingEntity livingEntity) {
// check if entity is a mob and if the method exists
if (CAN_USE_ENTITIES && livingEntity instanceof Mob)
return ((Mob) livingEntity).isLeftHanded() == (hand == MainHand.LEFT);

// check if entity is a player
if (livingEntity instanceof HumanEntity)
return ((HumanEntity) livingEntity).getMainHand() == hand;

// invalid entity
return false;
}

@Override
protected String getPropertyName() {
return (hand == MainHand.LEFT ? "left" : "right") + " handed";
}

}
77 changes: 77 additions & 0 deletions src/main/java/ch/njol/skript/effects/EffHandedness.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/**
* This file is part of Skript.
*
* Skript is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Skript is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Skript. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright Peter Güttinger, SkriptLang team and contributors
*/
package ch.njol.skript.effects;

import ch.njol.skript.Skript;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Examples;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.RequiredPlugins;
import ch.njol.skript.doc.Since;
import ch.njol.skript.lang.Effect;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.util.Kleenean;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Mob;
import org.bukkit.event.Event;
import org.eclipse.jdt.annotation.Nullable;

@Name("Handedness")
@Description("Make mobs left or right-handed. This does not affect players.")
@Examples({
"spawn skeleton at spawn of world \"world\":",
"\tmake entity left handed",
"",
"make all zombies in radius 10 of player right handed"
})
@Since("INSERT VERSION")
@RequiredPlugins("Paper 1.17.1+")
public class EffHandedness extends Effect {

static {
if (Skript.methodExists(Mob.class, "setLeftHanded", boolean.class))
Skript.registerEffect(EffHandedness.class, "make %livingentities% (:left|right)( |-)handed");
}

private boolean leftHanded;
private Expression<LivingEntity> livingEntities;

@Override
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
leftHanded = parseResult.hasTag("left");
livingEntities = (Expression<LivingEntity>) exprs[0];
return true;
}

@Override
protected void execute(Event event) {
for (LivingEntity livingEntity : livingEntities.getArray(event)) {
if (livingEntity instanceof Mob) {
((Mob) livingEntity).setLeftHanded(leftHanded);
}
}
}

@Override
public String toString(@Nullable Event event, boolean debug) {
return "make " + livingEntities.toString(event, debug) + " " + (leftHanded ? "left" : "right") + " handed";
}

}
11 changes: 11 additions & 0 deletions src/main/java/ch/njol/skript/events/SimpleEvents.java
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerLocaleChangeEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerPickupArrowEvent;
import org.bukkit.event.player.PlayerPortalEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
Expand Down Expand Up @@ -710,6 +711,16 @@ public class SimpleEvents {
.requiredPlugins("Paper 1.16+");
}

Skript.registerEvent("Player Pickup Arrow", SimpleEvent.class, PlayerPickupArrowEvent.class, "[player] (pick[ing| ]up [an] arrow|arrow pick[ing| ]up)")
.description("Called when a player picks up an arrow from the ground.")
.examples(
"on arrow pickup:",
"\tcancel the event",
"\tteleport event-projectile to block 5 above event-projectile"
)
.since("INSERT VERSION")
.requiredPlugins("Minecraft 1.14+ (event-projectile)");

Skript.registerEvent("Inventory Drag", SimpleEvent.class, InventoryDragEvent.class, "inventory drag[ging]")
.description("Called when a player drags an item in their cursor across the inventory.")
.examples(
Expand Down
11 changes: 11 additions & 0 deletions src/test/skript/tests/syntaxes/effects/EffHandedness.sk
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
test "left handedness" when running minecraft "1.17.1":
spawn skeleton at spawn of world "world":
make entity right handed
assert entity is not left handed with "zombie is left handed after being made right handed"
assert entity is right handed with "zombie is not right handed after being made right handed"
make entity left handed
assert entity is not right handed with "zombie is right handed after being made left handed"
assert entity is left handed with "zombie is not left handed after being made left handed"
make entity left handed
assert entity is left handed with "zombie is not left handed after being made left handed again"
delete entity

0 comments on commit 0e8c138

Please sign in to comment.