Skip to content

Commit d7542c5

Browse files
XxFran10xXclaude
andauthored
fix: let players accept a linked co-ownership token with any right-click (#47)
A player handed a linked Co-Ownership Token could only accept it by right-clicking open air. Clicking the ground did nothing, and clicking the animal or its owner replied "This is not your animal." A non-owner holding a token linked to an owned animal now accepts it on any right-click: air, block, animal or player. Owners keep linking and giving, and no longer get "Already an owner" after linking. Co-authored-by: XxFran10xX <318299142+XxFran10xX@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent 729ad1a commit d7542c5

3 files changed

Lines changed: 85 additions & 6 deletions

File tree

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package net.tfminecraft.cooking.husbandry;
2+
3+
import java.util.UUID;
4+
5+
/** Decides when a right-click with a linked Co-Ownership Token accepts it. */
6+
final class HusbandryCoOwnToken {
7+
8+
private HusbandryCoOwnToken() {}
9+
10+
/**
11+
* A token linked to someone else's animal is accepted by any right-click: the air, a block, an
12+
* animal or a player. Clients follow an entity click with a use-item packet, so every path must
13+
* agree or the player sees an error and then a success. Owners keep linking and giving.
14+
*/
15+
static boolean accepts(UUID linkedAnimal, boolean linkedHasOwners, boolean clickerOwnsLinked) {
16+
return linkedAnimal != null && linkedHasOwners && !clickerOwnsLinked;
17+
}
18+
19+
static UUID parse(String linked) {
20+
if (linked == null || linked.isBlank()) {
21+
return null;
22+
}
23+
try {
24+
return UUID.fromString(linked);
25+
} catch (IllegalArgumentException ignored) {
26+
return null;
27+
}
28+
}
29+
}

‎src/main/java/net/tfminecraft/cooking/husbandry/HusbandryTamingListener.java‎

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ public void onInteractEntity(PlayerInteractEntityEvent event) {
4747

4848
if (HusbandryItems.matches(hand, HusbandryConfig.coOwnItem())) {
4949
event.setCancelled(true);
50-
if (clicked instanceof Player target) {
50+
if (acceptsLinkedToken(player, hand)) {
51+
handleCoOwnOnPlayer(player, player, hand);
52+
} else if (clicked instanceof Player target) {
5153
handleCoOwnOnPlayer(player, target, hand);
5254
} else if (clicked instanceof LivingEntity living) {
5355
handleCoOwnLink(player, living, hand);
@@ -66,28 +68,33 @@ public void onInteractEntity(PlayerInteractEntityEvent event) {
6668
}
6769

6870
@EventHandler
69-
public void onInteractAir(PlayerInteractEvent event) {
71+
public void onInteractUse(PlayerInteractEvent event) {
7072
if (event.getHand() != EquipmentSlot.HAND) {
7173
return;
7274
}
7375
if (event.getAction() != org.bukkit.event.block.Action.RIGHT_CLICK_AIR
7476
&& event.getAction() != org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK) {
7577
return;
7678
}
77-
if (event.getClickedBlock() != null) {
78-
return;
79-
}
8079
ItemStack hand = event.getItem();
8180
if (!HusbandryItems.matches(hand, HusbandryConfig.coOwnItem())) {
8281
return;
8382
}
84-
if (HusbandryItems.linkedAnimal(hand) == null) {
83+
if (!acceptsLinkedToken(event.getPlayer(), hand)) {
8584
return;
8685
}
8786
event.setCancelled(true);
8887
handleCoOwnOnPlayer(event.getPlayer(), event.getPlayer(), hand);
8988
}
9089

90+
private static boolean acceptsLinkedToken(Player player, ItemStack hand) {
91+
UUID linked = HusbandryCoOwnToken.parse(HusbandryItems.linkedAnimal(hand));
92+
return HusbandryCoOwnToken.accepts(
93+
linked,
94+
HusbandryOwnershipService.hasAnyOwner(linked),
95+
HusbandryOwnershipService.isOwner(player, linked));
96+
}
97+
9198
private static void handleTame(Player player, LivingEntity entity, ItemStack hand) {
9299
String name = HusbandryItems.tameName(hand);
93100
if (name == null) {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package net.tfminecraft.cooking.husbandry;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertFalse;
5+
import static org.junit.jupiter.api.Assertions.assertNull;
6+
import static org.junit.jupiter.api.Assertions.assertTrue;
7+
8+
import java.util.UUID;
9+
10+
import org.junit.jupiter.api.Test;
11+
12+
class HusbandryCoOwnTokenTest {
13+
14+
private static final UUID ANIMAL = UUID.randomUUID();
15+
16+
@Test
17+
void anotherPlayerAcceptsATokenLinkedToAnOwnedAnimal() {
18+
assertTrue(HusbandryCoOwnToken.accepts(ANIMAL, true, false));
19+
}
20+
21+
@Test
22+
void ownersKeepLinkingAndGivingInsteadOfAccepting() {
23+
assertFalse(HusbandryCoOwnToken.accepts(ANIMAL, true, true));
24+
}
25+
26+
@Test
27+
void tokensForAnimalsWithoutOwnersAreNotAccepted() {
28+
assertFalse(HusbandryCoOwnToken.accepts(ANIMAL, false, false));
29+
}
30+
31+
@Test
32+
void unlinkedTokensAreNotAccepted() {
33+
assertFalse(HusbandryCoOwnToken.accepts(null, true, false));
34+
}
35+
36+
@Test
37+
void parsesOnlyValidLinks() {
38+
assertEquals(ANIMAL, HusbandryCoOwnToken.parse(ANIMAL.toString()));
39+
assertNull(HusbandryCoOwnToken.parse(null));
40+
assertNull(HusbandryCoOwnToken.parse(" "));
41+
assertNull(HusbandryCoOwnToken.parse("not-a-uuid"));
42+
}
43+
}

0 commit comments

Comments
 (0)