22
22
import net .william278 .cloplib .operation .Operation ;
23
23
import net .william278 .cloplib .operation .OperationPosition ;
24
24
import net .william278 .cloplib .operation .OperationType ;
25
+ import net .william278 .cloplib .operation .OperationUser ;
25
26
import org .bukkit .entity .*;
26
27
import org .bukkit .event .Cancellable ;
27
28
import org .bukkit .event .EventHandler ;
28
29
import org .bukkit .event .entity .EntityCombustByEntityEvent ;
29
30
import org .bukkit .event .entity .EntityDamageByEntityEvent ;
30
31
import org .bukkit .event .entity .EntityDamageEvent ;
31
32
import org .bukkit .event .entity .EntityEvent ;
33
+ import org .bukkit .event .player .PlayerFishEvent ;
32
34
import org .bukkit .inventory .InventoryHolder ;
33
35
import org .bukkit .projectiles .BlockProjectileSource ;
34
36
import org .jetbrains .annotations .NotNull ;
@@ -77,6 +79,36 @@ default void onEntityLightEntityOnFire(@NotNull EntityCombustByEntityEvent e) {
77
79
}
78
80
}
79
81
82
+ @ EventHandler (ignoreCancelled = true )
83
+ default void onPlayerFishEntity (@ NotNull PlayerFishEvent e ) {
84
+ // Protect against players reeling in others with fishing rods
85
+ if (e .getState () != PlayerFishEvent .State .CAUGHT_ENTITY || e .getCaught () == null ) return ;
86
+ final OperationUser catcher = getUser (e .getPlayer ());
87
+
88
+ // Handle a player reeling in a player
89
+ final Optional <Player > caughtPlayer = getPlayerSource (e .getCaught ());
90
+ if (caughtPlayer .isPresent ()) {
91
+ if (getHandler ().cancelOperation (Operation .of (
92
+ catcher ,
93
+ getUser (caughtPlayer .get ()),
94
+ OperationType .PLAYER_DAMAGE_PLAYER ,
95
+ getPosition (caughtPlayer .get ().getLocation ())
96
+ ))) {
97
+ e .setCancelled (true );
98
+ }
99
+ return ;
100
+ }
101
+
102
+ // Determine the Operation type based on the entity being reeled in
103
+ if (getHandler ().cancelOperation (Operation .of (
104
+ catcher ,
105
+ getPlayerDamageType (e .getCaught ()),
106
+ getPosition (e .getCaught ().getLocation ())
107
+ ))) {
108
+ e .setCancelled (true );
109
+ }
110
+ }
111
+
80
112
private <E extends EntityEvent & Cancellable > void handlePlayerDamager (@ NotNull Player damager , @ NotNull E e ) {
81
113
final Optional <Player > damaged = getPlayerSource (e .getEntity ());
82
114
if (damaged .isPresent ()) {
@@ -94,7 +126,7 @@ private <E extends EntityEvent & Cancellable> void handlePlayerDamager(@NotNull
94
126
// Determine the Operation type based on the entity being damaged
95
127
if (getHandler ().cancelOperation (Operation .of (
96
128
getUser (damager ),
97
- getPlayerDamageType (e ),
129
+ getPlayerDamageType (e . getEntity () ),
98
130
getPosition (e .getEntity ().getLocation ())
99
131
))) {
100
132
e .setCancelled (true );
@@ -128,14 +160,14 @@ private <E extends EntityEvent & Cancellable> void handleProjectileDamager(@NotN
128
160
}
129
161
130
162
@ NotNull
131
- private OperationType getPlayerDamageType (@ NotNull EntityEvent e ) {
163
+ private OperationType getPlayerDamageType (@ NotNull Entity entity ) {
132
164
OperationType type = OperationType .PLAYER_DAMAGE_ENTITY ;
133
- if (e . getEntity () instanceof Monster ) {
165
+ if (entity instanceof Monster ) {
134
166
type = OperationType .PLAYER_DAMAGE_MONSTER ;
135
- } else if (e . getEntity () instanceof Vehicle vehicle ) {
167
+ } else if (entity instanceof Vehicle vehicle ) {
136
168
type = vehicle instanceof InventoryHolder ? OperationType .BLOCK_BREAK : OperationType .BREAK_VEHICLE ;
137
- } else if (e . getEntity () instanceof LivingEntity living && !living .getRemoveWhenFarAway ()
138
- || e . getEntity () .getCustomName () != null ) {
169
+ } else if (entity instanceof LivingEntity living && !living .getRemoveWhenFarAway ()
170
+ || entity .getCustomName () != null ) {
139
171
type = OperationType .PLAYER_DAMAGE_PERSISTENT_ENTITY ;
140
172
}
141
173
return type ;
0 commit comments