Skip to content

Commit

Permalink
Minor updates (#2241)
Browse files Browse the repository at this point in the history
* Added MaterialTag.count support for Respawn Anchor Charges.

* Added Turtle Egg hatch count.
MaterialTag.hatch_count Tag & Mechanism
MaterialTag.hatch_count_max Tag

* Add EntityPicksUp Item Event (1.16.1) Deprecates "PlayerPickupItemEvent".
Added extra check in inventory picks up item event to remove any possible matches.

* Meta Fixes cause hadurrr

* That explains that
  • Loading branch information
Fortifier42 committed Aug 4, 2020
1 parent c6764fe commit ff9386c
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 44 deletions.
Expand Up @@ -13,6 +13,7 @@
import com.denizenscript.denizen.nms.NMSHandler;
import com.denizenscript.denizen.nms.NMSVersion;
import com.denizenscript.denizencore.events.ScriptEvent;
import net.citizensnpcs.util.NMS;

public class ScriptEventRegistry {

Expand Down Expand Up @@ -65,6 +66,9 @@ public static void registerMainEvents() {
ScriptEvent.registerScriptEvent(new EntityHealsScriptEvent());
ScriptEvent.registerScriptEvent(new EntityInteractScriptEvent());
ScriptEvent.registerScriptEvent(new EntityKilledScriptEvent());
if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_16)) {
ScriptEvent.registerScriptEvent(new EntityPicksUpItemScriptEvent());
}
ScriptEvent.registerScriptEvent(new EntityPotionEffectScriptEvent());
ScriptEvent.registerScriptEvent(new EntityResurrectScriptEvent());
if (!Denizen.supportsPaper) {
Expand Down Expand Up @@ -144,7 +148,6 @@ public static void registerMainEvents() {
ScriptEvent.registerScriptEvent(new PlayerLoginScriptEvent());
ScriptEvent.registerScriptEvent(new PlayerMendsItemScriptEvent());
ScriptEvent.registerScriptEvent(new PlayerOpensInvScriptEvent());
ScriptEvent.registerScriptEvent(new PlayerPicksUpScriptEvent());
ScriptEvent.registerScriptEvent(new PlayerPlacesBlockScriptEvent());
ScriptEvent.registerScriptEvent(new PlayerPlacesHangingScriptEvent());
ScriptEvent.registerScriptEvent(new PlayerPreLoginScriptEvent());
Expand Down
@@ -1,74 +1,83 @@
package com.denizenscript.denizen.events.player;
package com.denizenscript.denizen.events.entity;

import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
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.denizenscript.denizencore.utilities.CoreUtilities;
import org.bukkit.entity.Item;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;

import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

public class PlayerPicksUpScriptEvent extends BukkitScriptEvent implements Listener {
public class EntityPicksUpItemScriptEvent extends BukkitScriptEvent implements Listener {

// <--[event]
// @Events
// player picks up item
// player picks up <item>
// player takes item
// player takes <item>
// entity picks up item
// entity picks up <item>
// <entity> picks up <item>
// <entity> picks up item
// entity takes item
// entity takes <item>
// <entity> takes item
// <entity> takes <item>
//
// @Regex ^on player (picks up|takes) [^\s]+$
// @Regex ^on [^\s]+ picks up [^\s]+$
//
// @Group Player
//
// @Switch in:<area> to only process the event if it occurred within a specified area.
//
// @Cancellable true
//
// @Triggers when a player picks up an item.
// @Triggers when an entity picks up an item.
//
// @Context
// <context.item> returns the ItemTag.
// <context.entity> returns a EntityTag of the item.
// <context.entity> returns the EntityTag of the item being picked up.
// <context.pickup_entity> returns the EntityTag of the entity picking up the item.
// <context.location> returns a LocationTag of the item's location.
//
// @Determine
// "ITEM:" + ItemTag to changed the item being picked up.
//
// @Player Always.
// @Player when the entity picking up the item is a player.
//
// @NPC when the entity picking up the item is an npc.
//
// -->

public PlayerPicksUpScriptEvent() {
public EntityPicksUpItemScriptEvent() {
instance = this;
}

public static PlayerPicksUpScriptEvent instance;
public static EntityPicksUpItemScriptEvent instance;
public ItemTag item;
public EntityTag entity;
public LocationTag location;
public PlayerPickupItemEvent event;
public EntityPickupItemEvent event;

private static final Set<UUID> editedItems = new HashSet<>();

@Override
public boolean couldMatch(ScriptPath path) {
boolean isUp = path.eventLower.startsWith("player picks up");
if (!isUp && !path.eventLower.startsWith("player takes")) {
boolean isUp = path.eventLower.contains("picks up");
if (!isUp && !path.eventArgLowerAt(1).equals("takes")) {
return false;
}
if (path.eventArgLowerAt(3).equals("from")) {
return false;
}
if (!couldMatchEntity(path.eventArgLowerAt(0))) {
return false;
}
if (!couldMatchItem(path.eventArgLowerAt(isUp ? 3 : 2))) {
return false;
}
Expand All @@ -77,9 +86,11 @@ public boolean couldMatch(ScriptPath path) {

@Override
public boolean matches(ScriptPath path) {
String iTest = path.eventArgLowerAt(1).equals("picks") ?
path.eventArgLowerAt(3) : path.eventArgLowerAt(2);
if (!tryItem(item, iTest)) {
if (!tryEntity(entity, path.eventArgAt(0))) {
return false;
}
String itemTest = path.eventArgLowerAt(path.eventArgLowerAt(1).equals("picks") ? 3 : 2);
if (!tryItem(item, itemTest)) {
return false;
}
if (!runInCheck(path, location)) {
Expand All @@ -90,7 +101,7 @@ public boolean matches(ScriptPath path) {

@Override
public String getName() {
return "PlayerPicksUp";
return "EntityPicksUpItem";
}

@Override
Expand All @@ -109,7 +120,8 @@ public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) {

@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(new PlayerTag(event.getPlayer()), null);
return new BukkitScriptEntryData(entity.isPlayer() ? entity.getDenizenPlayer() : null,
entity.isNPC() ? entity.getDenizenNPC() : null);
}

@Override
Expand All @@ -120,17 +132,18 @@ public ObjectTag getContext(String name) {
else if (name.equals("entity")) {
return new EntityTag(event.getItem());
}
else if (name.equals("pickup_entity")) {
return entity;
}
else if (name.equals("location")) {
return location;
}
return super.getContext(name);
}

@EventHandler
public void onPlayerPicksUp(PlayerPickupItemEvent event) {
if (EntityTag.isNPC(event.getPlayer())) {
return;
}
public void onEntityPicksUpItem(EntityPickupItemEvent event) {
entity = new EntityTag(event.getEntity());
Item itemEntity = event.getItem();
UUID itemUUID = itemEntity.getUniqueId();
if (editedItems.contains(itemUUID)) {
Expand Down
Expand Up @@ -49,7 +49,7 @@ public boolean couldMatch(ScriptPath path) {
if (!path.eventArgLowerAt(1).equals("picks") || !path.eventArgLowerAt(2).equals("up")) {
return false;
}
if (path.eventArgLowerAt(0).equals("player")) {
if (couldMatchEntity(path.eventArgLowerAt(0))) {
return false;
}
if (!couldMatchInventory(path.eventArgLowerAt(0))) {
Expand Down
@@ -1,12 +1,16 @@
package com.denizenscript.denizen.objects.properties.material;

import com.denizenscript.denizen.nms.NMSHandler;
import com.denizenscript.denizen.nms.NMSVersion;
import com.denizenscript.denizen.objects.MaterialTag;
import com.denizenscript.denizen.utilities.debugging.Debug;
import com.denizenscript.denizencore.objects.Mechanism;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.objects.properties.Property;
import com.denizenscript.denizencore.objects.properties.PropertyParser;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.RespawnAnchor;
import org.bukkit.block.data.type.SeaPickle;
import org.bukkit.block.data.type.TurtleEgg;

Expand All @@ -16,7 +20,9 @@ public static boolean describes(ObjectTag material) {
return material instanceof MaterialTag
&& ((MaterialTag) material).hasModernData()
&& (((MaterialTag) material).getModernData().data instanceof SeaPickle
|| ((MaterialTag) material).getModernData().data instanceof TurtleEgg);
|| ((MaterialTag) material).getModernData().data instanceof TurtleEgg
|| (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_16)
&& ((MaterialTag) material).getModernData().data instanceof RespawnAnchor));
}

public static MaterialCount getFrom(ObjectTag _material) {
Expand Down Expand Up @@ -46,7 +52,7 @@ public static void registerTags() {
// @mechanism MaterialTag.count
// @group properties
// @description
// Returns the amount of pickles in a Sea Pickle material, or eggs in a TurtleEgg material.
// Returns the amount of pickles in a Sea Pickle material, or eggs in a Turtle Egg material, or charges in a Respawn Anchor material.
// -->
PropertyParser.<MaterialCount>registerTag("count", (attribute, material) -> {
return new ElementTag(material.getCurrent());
Expand All @@ -58,7 +64,7 @@ public static void registerTags() {
// @mechanism MaterialTag.count
// @group properties
// @description
// Returns the maximum amount of pickles allowed in a Sea Pickle material, or eggs in a TurtleEgg material.
// Returns the maximum amount of pickles allowed in a Sea Pickle material, or eggs in a Turtle Egg material, or charges in a Respawn Anchor material.
// -->
PropertyParser.<MaterialCount>registerTag("count_max", (attribute, material) -> {
return new ElementTag(material.getMax());
Expand All @@ -70,51 +76,70 @@ public static void registerTags() {
// @mechanism MaterialTag.count
// @group properties
// @description
// Returns the minimum amount of pickles allowed in a Sea Pickle material, or eggs in a TurtleEgg material.
// Returns the minimum amount of pickles allowed in a Sea Pickle material, or eggs in a Turtle Egg material, or charges in a Respawn Anchor material.
// -->
PropertyParser.<MaterialCount>registerTag("count_min", (attribute, material) -> {
return new ElementTag(material.getMin());
}, "pickle_min");
}

public boolean isSeaPickle() {
return material.getModernData().data instanceof SeaPickle;
}

public SeaPickle getSeaPickle() {
return (SeaPickle) material.getModernData().data;
public boolean isTurtleEgg() {
return material.getModernData().data instanceof TurtleEgg;
}

public boolean isRespawnAnchor() {
return NMSHandler.getVersion().isAtLeast(NMSVersion.v1_16) && material.getModernData().data instanceof RespawnAnchor;
}

public TurtleEgg getTurtleEgg() {
return (TurtleEgg) material.getModernData().data;
}

public boolean isSeaPickle() {
return material.getModernData().data instanceof SeaPickle;
public SeaPickle getSeaPickle() {
return (SeaPickle) material.getModernData().data;
}

public int getCurrent() {
if (isSeaPickle()) {
return getSeaPickle().getPickles();
}
else {
else if (isTurtleEgg()) {
return getTurtleEgg().getEggs();
}
else if (isRespawnAnchor()) {
return ((RespawnAnchor) material.getModernData().data).getCharges();
}
return 0;
}

public int getMax() {
if (isSeaPickle()) {
return getSeaPickle().getMaximumPickles();
}
else {
else if (isTurtleEgg()) {
return getTurtleEgg().getMaximumEggs();
}
else if (isRespawnAnchor()) {
return ((RespawnAnchor) material.getModernData().data).getMaximumCharges();
}
return 0;
}

public int getMin() {
if (isSeaPickle()) {
return getSeaPickle().getMinimumPickles();
}
else {
else if (isTurtleEgg()) {
return getTurtleEgg().getMinimumEggs();
}
else if (isRespawnAnchor()) {
return 0;
}
return 0;
}

@Override
Expand All @@ -135,7 +160,7 @@ public void adjust(Mechanism mechanism) {
// @name count
// @input ElementTag(Number)
// @description
// Sets the amount of pickles in a Sea Pickle material, or eggs in a TurtleEgg material.
// Sets the amount of pickles in a Sea Pickle material, or eggs in a Turtle Egg material, or charges in a Respawn Anchor material.
// @tags
// <MaterialTag.count>
// <MaterialTag.count_min>
Expand All @@ -150,9 +175,12 @@ public void adjust(Mechanism mechanism) {
if (isSeaPickle()) {
getSeaPickle().setPickles(count);
}
else {
else if (isTurtleEgg()) {
getTurtleEgg().setEggs(count);
}
else if (isRespawnAnchor()) {
((RespawnAnchor) material.getModernData().data).setCharges(count);
}
}
}
}

0 comments on commit ff9386c

Please sign in to comment.