Skip to content

Commit 12bee74

Browse files
committed
feat: add operation check for reeling entities with fishing rod
These use the relevant damage events based on the entity reeled in, and the person fisher. Addresses WiIIiam278/HuskTowns#534
1 parent b5985c1 commit 12bee74

File tree

2 files changed

+39
-7
lines changed

2 files changed

+39
-7
lines changed

bukkit/src/main/java/net/william278/cloplib/listener/BukkitEntityDamageListener.java

+38-6
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@
2222
import net.william278.cloplib.operation.Operation;
2323
import net.william278.cloplib.operation.OperationPosition;
2424
import net.william278.cloplib.operation.OperationType;
25+
import net.william278.cloplib.operation.OperationUser;
2526
import org.bukkit.entity.*;
2627
import org.bukkit.event.Cancellable;
2728
import org.bukkit.event.EventHandler;
2829
import org.bukkit.event.entity.EntityCombustByEntityEvent;
2930
import org.bukkit.event.entity.EntityDamageByEntityEvent;
3031
import org.bukkit.event.entity.EntityDamageEvent;
3132
import org.bukkit.event.entity.EntityEvent;
33+
import org.bukkit.event.player.PlayerFishEvent;
3234
import org.bukkit.inventory.InventoryHolder;
3335
import org.bukkit.projectiles.BlockProjectileSource;
3436
import org.jetbrains.annotations.NotNull;
@@ -77,6 +79,36 @@ default void onEntityLightEntityOnFire(@NotNull EntityCombustByEntityEvent e) {
7779
}
7880
}
7981

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+
80112
private <E extends EntityEvent & Cancellable> void handlePlayerDamager(@NotNull Player damager, @NotNull E e) {
81113
final Optional<Player> damaged = getPlayerSource(e.getEntity());
82114
if (damaged.isPresent()) {
@@ -94,7 +126,7 @@ private <E extends EntityEvent & Cancellable> void handlePlayerDamager(@NotNull
94126
// Determine the Operation type based on the entity being damaged
95127
if (getHandler().cancelOperation(Operation.of(
96128
getUser(damager),
97-
getPlayerDamageType(e),
129+
getPlayerDamageType(e.getEntity()),
98130
getPosition(e.getEntity().getLocation())
99131
))) {
100132
e.setCancelled(true);
@@ -128,14 +160,14 @@ private <E extends EntityEvent & Cancellable> void handleProjectileDamager(@NotN
128160
}
129161

130162
@NotNull
131-
private OperationType getPlayerDamageType(@NotNull EntityEvent e) {
163+
private OperationType getPlayerDamageType(@NotNull Entity entity) {
132164
OperationType type = OperationType.PLAYER_DAMAGE_ENTITY;
133-
if (e.getEntity() instanceof Monster) {
165+
if (entity instanceof Monster) {
134166
type = OperationType.PLAYER_DAMAGE_MONSTER;
135-
} else if (e.getEntity() instanceof Vehicle vehicle) {
167+
} else if (entity instanceof Vehicle vehicle) {
136168
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) {
139171
type = OperationType.PLAYER_DAMAGE_PERSISTENT_ENTITY;
140172
}
141173
return type;

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ javaVersion=17
33
org.gradle.jvmargs='-Dfile.encoding=UTF-8'
44
org.gradle.daemon=true
55

6-
library_version=1.0.14
6+
library_version=1.0.15
77
library_archive=cloplib
88
library_description=Common library for handling operations on Minecraft blocks within regions

0 commit comments

Comments
 (0)