aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/api/0254-EntityMoveEvent.patch
blob: d9e828eb8caf9fd87c8464d29f3cccb1585a1822 (plain)
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Tue, 11 Feb 2020 21:56:38 -0600
Subject: [PATCH] EntityMoveEvent


diff --git a/src/main/java/io/papermc/paper/event/entity/EntityMoveEvent.java b/src/main/java/io/papermc/paper/event/entity/EntityMoveEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..46990a220f70b04218b14aec1e9efbd46c2ad77c
--- /dev/null
+++ b/src/main/java/io/papermc/paper/event/entity/EntityMoveEvent.java
@@ -0,0 +1,150 @@
+package io.papermc.paper.event.entity;
+
+import com.google.common.base.Preconditions;
+import org.bukkit.Location;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.EntityEvent;
+import org.bukkit.event.player.PlayerMoveEvent;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Holds information for living entity movement events
+ * <p>
+ * Does not fire for players; use {@link PlayerMoveEvent} for player movement.
+ */
+public class EntityMoveEvent extends EntityEvent implements Cancellable {
+
+    private static final HandlerList HANDLER_LIST = new HandlerList();
+
+    private Location from;
+    private Location to;
+
+    private boolean cancelled;
+
+    @ApiStatus.Internal
+    public EntityMoveEvent(@NotNull LivingEntity entity, @NotNull Location from, @NotNull Location to) {
+        super(entity);
+        this.from = from;
+        this.to = to;
+    }
+
+    @Override
+    @NotNull
+    public LivingEntity getEntity() {
+        return (LivingEntity) super.getEntity();
+    }
+
+    /**
+     * Gets the location this entity moved from
+     *
+     * @return Location the entity moved from
+     */
+    @NotNull
+    public Location getFrom() {
+        return this.from;
+    }
+
+    /**
+     * Sets the location to mark as where the entity moved from
+     *
+     * @param from New location to mark as the entity's previous location
+     */
+    public void setFrom(@NotNull Location from) {
+        validateLocation(from);
+        this.from = from;
+    }
+
+    /**
+     * Gets the location this entity moved to
+     *
+     * @return Location the entity moved to
+     */
+    @NotNull
+    public Location getTo() {
+        return this.to;
+    }
+
+    /**
+     * Sets the location that this entity will move to
+     *
+     * @param to New Location this entity will move to
+     */
+    public void setTo(@NotNull Location to) {
+        validateLocation(to);
+        this.to = to;
+    }
+
+    /**
+     * Check if the entity has changed position (even within the same block) in the event
+     *
+     * @return whether the entity has changed position or not
+     */
+    public boolean hasChangedPosition() {
+        return hasExplicitlyChangedPosition() || !this.from.getWorld().equals(this.to.getWorld());
+    }
+
+    /**
+     * Check if the entity has changed position (even within the same block) in the event, disregarding a possible world change
+     *
+     * @return whether the entity has changed position or not
+     */
+    public boolean hasExplicitlyChangedPosition() {
+        return this.from.getX() != this.to.getX() || this.from.getY() != this.to.getY() || this.from.getZ() != this.to.getZ();
+    }
+
+    /**
+     * Check if the entity has moved to a new block in the event
+     *
+     * @return whether the entity has moved to a new block or not
+     */
+    public boolean hasChangedBlock() {
+        return hasExplicitlyChangedBlock() || !from.getWorld().equals(to.getWorld());
+    }
+
+    /**
+     * Check if the entity has moved to a new block in the event, disregarding a possible world change
+     *
+     * @return whether the entity has moved to a new block or not
+     */
+    public boolean hasExplicitlyChangedBlock() {
+        return this.from.getBlockX() != this.to.getBlockX() || this.from.getBlockY() != this.to.getBlockY() || this.from.getBlockZ() != this.to.getBlockZ();
+    }
+
+    /**
+     * Check if the entity has changed orientation in the event
+     *
+     * @return whether the entity has changed orientation or not
+     */
+    public boolean hasChangedOrientation() {
+        return this.from.getPitch() != this.to.getPitch() || this.from.getYaw() != this.to.getYaw();
+    }
+
+    private void validateLocation(@NotNull Location loc) {
+        Preconditions.checkArgument(loc != null, "Cannot use null location!");
+        Preconditions.checkArgument(loc.getWorld() != null, "Cannot use null location with null world!");
+    }
+
+    @Override
+    public boolean isCancelled() {
+        return this.cancelled;
+    }
+
+    @Override
+    public void setCancelled(boolean cancel) {
+        this.cancelled = cancel;
+    }
+
+    @Override
+    @NotNull
+    public HandlerList getHandlers() {
+        return HANDLER_LIST;
+    }
+
+    @NotNull
+    public static HandlerList getHandlerList() {
+        return HANDLER_LIST;
+    }
+}