Skip to content

Commit 2688d9f

Browse files
committed
Use vanilla client pickup animation
1 parent 8beec06 commit 2688d9f

22 files changed

Lines changed: 482 additions & 117 deletions

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ outside the supported range.
3030
- Static items bob and spin entirely client-side with no animation task; only
3131
active gravity motion needs per-viewer correction because Heart marks its
3232
fake items as no-gravity.
33+
- Block-to-player pickup uses Minecraft's native take-item packet through one
34+
isolated reflection bridge. The client supplies the vanilla sound and
35+
three-tick live-target absorption; arbitrary location-to-location throws keep
36+
the existing custom motion path. No Sparrow fork or ProtocolLib is required.
3337
- Display updates are revision-coalesced; there is no 5 ms packet scan loop.
3438
- Player/chunk proximity queries use one allocation-light snapshot per world and
3539
server tick.

build.gradle.kts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ val compilePaper26_2 = tasks.register<JavaCompile>("compilePaper26_2") {
115115
}
116116

117117
val verifyPaperOnlyArchitecture = tasks.register("verifyPaperOnlyArchitecture") {
118-
description = "Rejects direct in-project NMS, Armor Stands, or legacy compatibility layers."
118+
description = "Confines NMS reflection to the client pickup bridge and rejects legacy layers."
119119
group = LifecycleBasePlugin.VERIFICATION_GROUP
120120
val sources = sourceSets.main.get().allJava
121121
inputs.files(sources)
@@ -138,9 +138,16 @@ val verifyPaperOnlyArchitecture = tasks.register("verifyPaperOnlyArchitecture")
138138
"getPluginLoader()",
139139
".spigot()",
140140
)
141+
val pickupBridge = file(
142+
"common/src/main/java/com/loohp/interactionvisualizer/integration/packet/ClientPickupAnimationBridge.java",
143+
).canonicalFile
144+
val bridgeTokens = setOf("net.minecraft", "org.bukkit.craftbukkit")
141145
val violations = sources.files.flatMap { source ->
142146
val text = source.readText()
143-
forbidden.filter(text::contains).map { token -> "${source.relativeTo(rootDir)}: $token" }
147+
forbidden.filter(text::contains).mapNotNull { token ->
148+
val allowed = source.canonicalFile == pickupBridge && token in bridgeTokens
149+
if (allowed) null else "${source.relativeTo(rootDir)}: $token"
150+
}
144151
}
145152
check(violations.isEmpty()) {
146153
"Paper-only architecture violations:\n${violations.joinToString("\n")}"

common/src/main/java/com/loohp/interactionvisualizer/blocks/AnvilDisplay.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import com.loohp.interactionvisualizer.entityholders.DisplayEntity;
2828
import com.loohp.interactionvisualizer.entityholders.Item;
2929
import com.loohp.interactionvisualizer.managers.DisplayManager;
30-
import com.loohp.interactionvisualizer.managers.SoundManager;
3130
import com.loohp.interactionvisualizer.objectholders.EntryKey;
3231
import com.loohp.interactionvisualizer.utils.InventoryUtils;
3332
import com.loohp.interactionvisualizer.utils.LocationUtils;
@@ -285,19 +284,13 @@ public void onAnvil(InventoryClickEvent event) {
285284
}, 6);
286285

287286
Scheduler.runTaskLater(InteractionVisualizer.plugin, () -> {
288-
Vector lift = new Vector(0.0, 0.15, 0.0);
289-
Vector pickup = player.getEyeLocation().add(0.0, -0.5, 0.0).add(0.0, InteractionVisualizer.playerPickupYOffset, 0.0).toVector().subtract(loc.clone().add(0.5, 1.2, 0.5).toVector()).multiply(0.15).add(lift);
290287
item.setItemStack(itemstack);
291-
item.setVelocity(pickup);
292-
item.setGravity(true);
293-
item.setPickupDelay(32767);
294288
DisplayManager.updateItem(item);
289+
DisplayManager.collectItem(item, player);
295290

296291
Scheduler.runTaskLater(InteractionVisualizer.plugin, () -> {
297-
SoundManager.playItemPickup(item.getLocation(), InteractionVisualizerAPI.getPlayerModuleList(Modules.ITEMDROP, KEY));
298292
DisplayManager.removeDisplay(InteractionVisualizerAPI.getPlayers(), slot0);
299293
DisplayManager.removeDisplay(InteractionVisualizerAPI.getPlayers(), slot1);
300-
DisplayManager.removeItem(InteractionVisualizerAPI.getPlayers(), item);
301294
}, 8);
302295
}, 10);
303296
}, 1);

common/src/main/java/com/loohp/interactionvisualizer/blocks/BlastFurnaceDisplay.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import com.loohp.interactionvisualizer.entityholders.Item;
3131
import com.loohp.interactionvisualizer.managers.DisplayManager;
3232
import com.loohp.interactionvisualizer.managers.PlayerLocationManager;
33-
import com.loohp.interactionvisualizer.managers.SoundManager;
3433
import com.loohp.interactionvisualizer.managers.TileEntityManager;
3534
import com.loohp.interactionvisualizer.objectholders.EntryKey;
3635
import com.loohp.interactionvisualizer.objectholders.TileEntity.TileEntityType;
@@ -360,7 +359,6 @@ public void onBlastFurnace(InventoryClickEvent event) {
360359

361360
int slot = event.getRawSlot();
362361
ItemStack itemstack = event.getCurrentItem().clone();
363-
Location loc = block.getLocation();
364362
Player player = (Player) event.getWhoClicked();
365363

366364
Scheduler.runTaskLater(InteractionVisualizer.plugin, () -> {
@@ -378,17 +376,8 @@ public void onBlastFurnace(InventoryClickEvent event) {
378376
item.setItemStack(itemstack);
379377
item.setLocked(true);
380378

381-
Vector lift = new Vector(0.0, 0.15, 0.0);
382-
Vector pickup = player.getEyeLocation().add(0.0, -0.5, 0.0).add(0.0, InteractionVisualizer.playerPickupYOffset, 0.0).toVector().subtract(loc.clone().add(0.5, 1.2, 0.5).toVector()).multiply(0.15).add(lift);
383-
item.setVelocity(pickup);
384-
item.setGravity(true);
385-
item.setPickupDelay(32767);
386379
DisplayManager.updateItem(item);
387-
388-
Scheduler.runTaskLater(InteractionVisualizer.plugin, () -> {
389-
SoundManager.playItemPickup(item.getLocation(), InteractionVisualizerAPI.getPlayerModuleList(Modules.ITEMDROP, KEY));
390-
DisplayManager.removeItem(InteractionVisualizerAPI.getPlayers(), item);
391-
}, 8);
380+
DisplayManager.collectItem(item, player);
392381
}, 1);
393382
}
394383

common/src/main/java/com/loohp/interactionvisualizer/blocks/CraftingTableDisplay.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import com.loohp.interactionvisualizer.entityholders.DisplayEntity;
2828
import com.loohp.interactionvisualizer.entityholders.Item;
2929
import com.loohp.interactionvisualizer.managers.DisplayManager;
30-
import com.loohp.interactionvisualizer.managers.SoundManager;
3130
import com.loohp.interactionvisualizer.objectholders.EntryKey;
3231
import com.loohp.interactionvisualizer.objectholders.LightType;
3332
import com.loohp.interactionvisualizer.utils.InventoryUtils;
@@ -381,16 +380,11 @@ public void onCraft(InventoryClickEvent event) {
381380
}, 6);
382381

383382
Scheduler.runTaskLater(InteractionVisualizer.plugin, () -> {
384-
Vector lift = new Vector(0.0, 0.15, 0.0);
385-
Vector pickup = player.getEyeLocation().add(0.0, -0.5, 0.0).add(0.0, InteractionVisualizer.playerPickupYOffset, 0.0).toVector().subtract(loc.clone().add(0.5, 1.2, 0.5).toVector()).multiply(0.15).add(lift);
386383
item.setItemStack(itemstack);
387-
item.setVelocity(pickup);
388-
item.setGravity(true);
389-
item.setPickupDelay(32767);
390384
DisplayManager.updateItem(item);
385+
DisplayManager.collectItem(item, player);
391386

392387
Scheduler.runTaskLater(InteractionVisualizer.plugin, () -> {
393-
SoundManager.playItemPickup(item.getLocation(), InteractionVisualizerAPI.getPlayerModuleList(Modules.ITEMDROP, KEY));
394388
DisplayManager.removeDisplay(InteractionVisualizerAPI.getPlayers(), slot1);
395389
DisplayManager.removeDisplay(InteractionVisualizerAPI.getPlayers(), slot2);
396390
DisplayManager.removeDisplay(InteractionVisualizerAPI.getPlayers(), slot3);
@@ -400,7 +394,6 @@ public void onCraft(InventoryClickEvent event) {
400394
DisplayManager.removeDisplay(InteractionVisualizerAPI.getPlayers(), slot7);
401395
DisplayManager.removeDisplay(InteractionVisualizerAPI.getPlayers(), slot8);
402396
DisplayManager.removeDisplay(InteractionVisualizerAPI.getPlayers(), slot9);
403-
DisplayManager.removeItem(InteractionVisualizerAPI.getPlayers(), item);
404397
}, 8);
405398
}, 10);
406399
}, 1);

common/src/main/java/com/loohp/interactionvisualizer/blocks/FurnaceDisplay.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import com.loohp.interactionvisualizer.entityholders.Item;
3131
import com.loohp.interactionvisualizer.managers.DisplayManager;
3232
import com.loohp.interactionvisualizer.managers.PlayerLocationManager;
33-
import com.loohp.interactionvisualizer.managers.SoundManager;
3433
import com.loohp.interactionvisualizer.managers.TileEntityManager;
3534
import com.loohp.interactionvisualizer.objectholders.EntryKey;
3635
import com.loohp.interactionvisualizer.objectholders.TileEntity.TileEntityType;
@@ -361,7 +360,6 @@ public void onFurnace(InventoryClickEvent event) {
361360

362361
int slot = event.getRawSlot();
363362
ItemStack itemstack = event.getCurrentItem().clone();
364-
Location loc = block.getLocation();
365363
Player player = (Player) event.getWhoClicked();
366364

367365
Scheduler.runTaskLater(InteractionVisualizer.plugin, () -> {
@@ -380,17 +378,8 @@ public void onFurnace(InventoryClickEvent event) {
380378
item.setItemStack(itemstack);
381379
item.setLocked(true);
382380

383-
Vector lift = new Vector(0.0, 0.15, 0.0);
384-
Vector pickup = player.getEyeLocation().add(0.0, -0.5, 0.0).add(0.0, InteractionVisualizer.playerPickupYOffset, 0.0).toVector().subtract(loc.clone().add(0.5, 1.2, 0.5).toVector()).multiply(0.15).add(lift);
385-
item.setVelocity(pickup);
386-
item.setGravity(true);
387-
item.setPickupDelay(32767);
388381
DisplayManager.updateItem(item);
389-
390-
Scheduler.runTaskLater(InteractionVisualizer.plugin, () -> {
391-
SoundManager.playItemPickup(item.getLocation(), InteractionVisualizerAPI.getPlayerModuleList(Modules.ITEMDROP, KEY));
392-
DisplayManager.removeItem(InteractionVisualizerAPI.getPlayers(), item);
393-
}, 8);
382+
DisplayManager.collectItem(item, player);
394383
}, 1);
395384
}
396385

common/src/main/java/com/loohp/interactionvisualizer/blocks/GrindstoneDisplay.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import com.loohp.interactionvisualizer.entityholders.DisplayEntity;
2828
import com.loohp.interactionvisualizer.entityholders.Item;
2929
import com.loohp.interactionvisualizer.managers.DisplayManager;
30-
import com.loohp.interactionvisualizer.managers.SoundManager;
3130
import com.loohp.interactionvisualizer.objectholders.EntryKey;
3231
import com.loohp.interactionvisualizer.utils.InventoryUtils;
3332
import com.loohp.interactionvisualizer.utils.LocationUtils;
@@ -280,19 +279,13 @@ public void onGrindstone(InventoryClickEvent event) {
280279
}, 6);
281280

282281
Scheduler.runTaskLater(InteractionVisualizer.plugin, () -> {
283-
Vector lift = new Vector(0.0, 0.15, 0.0);
284-
Vector pickup = player.getEyeLocation().add(0.0, -0.5, 0.0).add(0.0, InteractionVisualizer.playerPickupYOffset, 0.0).toVector().subtract(loc.clone().add(0.5, 1.2, 0.5).toVector()).multiply(0.15).add(lift);
285282
item.setItemStack(itemstack);
286-
item.setVelocity(pickup);
287-
item.setGravity(true);
288-
item.setPickupDelay(32767);
289283
DisplayManager.updateItem(item);
284+
DisplayManager.collectItem(item, player);
290285

291286
Scheduler.runTaskLater(InteractionVisualizer.plugin, () -> {
292-
SoundManager.playItemPickup(item.getLocation(), InteractionVisualizerAPI.getPlayerModuleList(Modules.ITEMDROP, KEY));
293287
DisplayManager.removeDisplay(InteractionVisualizerAPI.getPlayers(), slot0);
294288
DisplayManager.removeDisplay(InteractionVisualizerAPI.getPlayers(), slot1);
295-
DisplayManager.removeItem(InteractionVisualizerAPI.getPlayers(), item);
296289
}, 8);
297290
}, 10);
298291
}, 1);

common/src/main/java/com/loohp/interactionvisualizer/blocks/LoomDisplay.java

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import com.loohp.interactionvisualizer.entityholders.DisplayEntity;
2828
import com.loohp.interactionvisualizer.entityholders.Item;
2929
import com.loohp.interactionvisualizer.managers.DisplayManager;
30-
import com.loohp.interactionvisualizer.managers.SoundManager;
3130
import com.loohp.interactionvisualizer.objectholders.EntryKey;
3231
import com.loohp.interactionvisualizer.objectholders.LightType;
3332
import com.loohp.interactionvisualizer.utils.InventoryUtils;
@@ -272,7 +271,6 @@ public void onLoom(InventoryClickEvent event) {
272271
}
273272

274273
ItemStack itemstack = event.getCurrentItem().clone();
275-
Location loc = block.getLocation();
276274
Player player = (Player) event.getWhoClicked();
277275

278276
Inventory before = Bukkit.createInventory(null, 9);
@@ -299,18 +297,9 @@ public void onLoom(InventoryClickEvent event) {
299297
Item item = new Item(block.getLocation().clone().add(0.5, 1.5, 0.5));
300298
item.setItemStack(itemstack);
301299
item.setLocked(true);
302-
item.setGravity(true);
303-
Vector lift = new Vector(0.0, 0.15, 0.0);
304-
Vector pickup = player.getEyeLocation().add(0.0, -0.5, 0.0).add(0.0, InteractionVisualizer.playerPickupYOffset, 0.0).toVector().subtract(loc.clone().add(0.5, 1.2, 0.5).toVector()).multiply(0.15).add(lift);
305-
item.setVelocity(pickup);
306-
item.setPickupDelay(32767);
307300
DisplayManager.sendItemSpawn(InteractionVisualizerAPI.getPlayerModuleList(Modules.ITEMDROP, KEY), item);
308301
DisplayManager.updateItem(item);
309-
310-
Scheduler.runTaskLater(InteractionVisualizer.plugin, () -> {
311-
SoundManager.playItemPickup(item.getLocation(), InteractionVisualizerAPI.getPlayerModuleList(Modules.ITEMDROP, KEY));
312-
DisplayManager.removeItem(InteractionVisualizerAPI.getPlayers(), item);
313-
}, 8);
302+
DisplayManager.collectItem(item, player);
314303
}, 1);
315304
}
316305

@@ -410,18 +399,9 @@ public void onCloseLoom(InventoryCloseEvent event) {
410399
Item item = new Item(block.getLocation().clone().add(0.5, 1.5, 0.5));
411400
item.setItemStack(event.getView().getItem(0));
412401
item.setLocked(true);
413-
item.setGravity(true);
414-
Vector lift = new Vector(0.0, 0.15, 0.0);
415-
Vector pickup = player.getEyeLocation().add(0.0, -0.5, 0.0).add(0.0, InteractionVisualizer.playerPickupYOffset, 0.0).toVector().subtract(block.getLocation().clone().add(0.5, 1.2, 0.5).toVector()).multiply(0.15).add(lift);
416-
item.setVelocity(pickup);
417-
item.setPickupDelay(32767);
418402
DisplayManager.sendItemSpawn(InteractionVisualizerAPI.getPlayerModuleList(Modules.ITEMDROP, KEY), item);
419403
DisplayManager.updateItem(item);
420-
new ScheduledRunnable() {
421-
public void run() {
422-
DisplayManager.removeItem(InteractionVisualizerAPI.getPlayers(), item);
423-
}
424-
}.runTaskLater(InteractionVisualizer.plugin, 8);
404+
DisplayManager.collectItem(item, player);
425405
}
426406
}
427407

common/src/main/java/com/loohp/interactionvisualizer/blocks/SmithingTableDisplay.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import com.loohp.interactionvisualizer.entityholders.DisplayEntity;
2828
import com.loohp.interactionvisualizer.entityholders.Item;
2929
import com.loohp.interactionvisualizer.managers.DisplayManager;
30-
import com.loohp.interactionvisualizer.managers.SoundManager;
3130
import com.loohp.interactionvisualizer.objectholders.EntryKey;
3231
import com.loohp.interactionvisualizer.objectholders.LightType;
3332
import com.loohp.interactionvisualizer.utils.InventoryUtils;
@@ -307,22 +306,16 @@ public void onSmithingTable(InventoryClickEvent event) {
307306
}, 6);
308307

309308
Scheduler.runTaskLater(InteractionVisualizer.plugin, () -> {
310-
Vector lift = new Vector(0.0, 0.15, 0.0);
311-
Vector pickup = player.getEyeLocation().add(0.0, -0.5, 0.0).add(0.0, InteractionVisualizer.playerPickupYOffset, 0.0).toVector().subtract(loc.clone().add(0.5, 1.2, 0.5).toVector()).multiply(0.15).add(lift);
312309
item.setItemStack(itemstack);
313-
item.setVelocity(pickup);
314-
item.setGravity(true);
315-
item.setPickupDelay(32767);
316310
DisplayManager.updateItem(item);
311+
DisplayManager.collectItem(item, player);
317312

318313
Scheduler.runTaskLater(InteractionVisualizer.plugin, () -> {
319-
SoundManager.playItemPickup(item.getLocation(), InteractionVisualizerAPI.getPlayerModuleList(Modules.ITEMDROP, KEY));
320314
if (slot0 != null) {
321315
DisplayManager.removeDisplay(InteractionVisualizerAPI.getPlayers(), slot0);
322316
}
323317
DisplayManager.removeDisplay(InteractionVisualizerAPI.getPlayers(), slot1);
324318
DisplayManager.removeDisplay(InteractionVisualizerAPI.getPlayers(), slot2);
325-
DisplayManager.removeItem(InteractionVisualizerAPI.getPlayers(), item);
326319
}, 8);
327320
}, 10);
328321
}, 1);

common/src/main/java/com/loohp/interactionvisualizer/blocks/SmokerDisplay.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import com.loohp.interactionvisualizer.entityholders.Item;
3030
import com.loohp.interactionvisualizer.managers.DisplayManager;
3131
import com.loohp.interactionvisualizer.managers.PlayerLocationManager;
32-
import com.loohp.interactionvisualizer.managers.SoundManager;
3332
import com.loohp.interactionvisualizer.managers.TileEntityManager;
3433
import com.loohp.interactionvisualizer.objectholders.EntryKey;
3534
import com.loohp.interactionvisualizer.objectholders.TileEntity.TileEntityType;
@@ -360,7 +359,6 @@ public void onSmoker(InventoryClickEvent event) {
360359

361360
int slot = event.getRawSlot();
362361
ItemStack itemstack = event.getCurrentItem().clone();
363-
Location loc = block.getLocation();
364362
Player player = (Player) event.getWhoClicked();
365363

366364
Scheduler.runTaskLater(InteractionVisualizer.plugin, () -> {
@@ -378,17 +376,8 @@ public void onSmoker(InventoryClickEvent event) {
378376
item.setItemStack(itemstack);
379377
item.setLocked(true);
380378

381-
Vector lift = new Vector(0.0, 0.15, 0.0);
382-
Vector pickup = player.getEyeLocation().add(0.0, -0.5, 0.0).add(0.0, InteractionVisualizer.playerPickupYOffset, 0.0).toVector().subtract(loc.clone().add(0.5, 1.2, 0.5).toVector()).multiply(0.15).add(lift);
383-
item.setVelocity(pickup);
384-
item.setGravity(true);
385-
item.setPickupDelay(32767);
386379
DisplayManager.updateItem(item);
387-
388-
Scheduler.runTaskLater(InteractionVisualizer.plugin, () -> {
389-
SoundManager.playItemPickup(item.getLocation(), InteractionVisualizerAPI.getPlayerModuleList(Modules.ITEMDROP, KEY));
390-
DisplayManager.removeItem(InteractionVisualizerAPI.getPlayers(), item);
391-
}, 8);
380+
DisplayManager.collectItem(item, player);
392381
}, 1);
393382
}
394383

0 commit comments

Comments
 (0)