/
PlayerClicksFakeEntityScriptEvent.java
100 lines (89 loc) · 3.69 KB
/
PlayerClicksFakeEntityScriptEvent.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.PlayerTag;
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 clicks fake entity
// player (right/left) clicks fake entity
//
// @Regex ^on player ([^\s]+ )?clicks fake entity$
//
// @Switch in:<area> to only process the event if it occurred within a specified area.
//
// @Plugin Paper
//
// @Triggers when a player clicks a fake entity, one that is only shown to the player and not tracked by the server.
//
// @Context
// <context.entity> 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>.
// <context.hand> returns an ElementTag of the hand used to click.
// <context.click_type> returns an ElementTag of the click type (left/right).
//
// @Player Always.
//
// -->
public PlayerClicksFakeEntityScriptEvent() {
instance = this;
}
public static PlayerClicksFakeEntityScriptEvent instance;
public PlayerUseUnknownEntityEvent event;
@Override
public boolean couldMatch(ScriptEvent.ScriptPath path) {
return path.eventLower.startsWith("player clicks fake entity")
|| path.eventLower.startsWith("player right clicks fake entity")
|| path.eventLower.startsWith("player left clicks fake entity");
}
@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 String getName() {
return "PlayerClicksFakeEntity";
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(new PlayerTag(event.getPlayer()), null);
}
@Override
public ObjectTag getContext(String name) {
if (name.equals("entity")) {
FakeEntity fakeEntity = FakeEntity.getFakeEntityFor(event.getPlayer().getUniqueId(), event.getEntityId());
if (fakeEntity != null) {
return fakeEntity.entity;
}
}
else if (name.equals("hand")) {
return new ElementTag(event.getHand().name());
}
else if (name.equals("click_type")) {
return new ElementTag(event.isAttack() ? "left" : "right");
}
return super.getContext(name);
}
@EventHandler
public void clickFakeEntity(PlayerUseUnknownEntityEvent event) {
this.event = event;
fire(event);
}
}