BlockDispenseEvent is called twice since 26.3 for most blocks
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 55/100
Direzione di ricerca
Start in DispenserBlock around line 121 and trace SulfurCubeBlockDispenseItemBehavior.execute into dispenseBlock and CraftEventFactory.handleBlockDispenseEvent. Check how the fallback through DefaultDispenseItemBehavior triggers the event, then reproduce with an event listener that logs each dispense. Done means one BlockDispenseEvent per dispense, with the sulfur cube behavior and fallback still working.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Expected behavior
BlockDispenseEvent is only called once when a dispenser throws out a block
Observed/Actual behavior
When a block is dispensed from a dispenser, it used to go through the usual DefaultDispenseItemBehavior.
With the Sulfur Cubes that changed for most blocks (DispenserBlock line 121):
} else if (itemStack.is(ItemTags.SULFUR_CUBE_SWALLOWABLE)) {
return SulfurCubeBlockDispenseItemBehavior.INSTANCE;
}
SulfurCubeBlockDispenseItemBehavior#execute (vanilla) falls back to super.execute if no Sulfur Cube took the item:
@Override
protected ItemStack execute(final BlockSource source, final ItemStack dispensed) {
return dispenseBlock(source.level(), source.pos().relative(source.state().getValue(DispenserBlock.FACING)), dispensed, source, this) // Paper - Call BlockDispenseEvent
? dispensed
: super.execute(source, dispensed);
}
Paper calls handleBlockDispenseEvent at the start of dispenseBlock, before it checks whether a Sulfur Cube is in front:
ItemStack result = org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockDispenseEvent(source, pos, dispensed, currentBehavior);
If there is none, dispenseBlock returns false and vanilla falls back to super.execute, which fires the event again in DefaultDispenseItemBehavior.spawnItem.
The same applies to TNT: the TNT behavior also calls SulfurCubeBlockDispenseItemBehavior.dispenseBlock first and then fires its own BlockDispenseEvent. The TNT is only primed once, but the event is called twice for a single dispense.
sequenceDiagram
autonumber
participant D as DispenserBlock
participant S as SulfurCubeBlockDispenseItemBehavior
participant DD as DefaultDispenseItemBehavior (super)
participant F as CraftEventFactory
participant L as Plugin Listener
D->>D: getDefaultDispenseMethod(itemStack)
Note over D: itemStack.is(SULFUR_CUBE_SWALLOWABLE)<br/>→ SulfurCubeBlockDispenseItemBehavior.INSTANCE
D->>S: dispense(source, stack)
S->>S: execute(source, stack)
S->>S: dispenseBlock(level, pos, stack, source, this)
S->>F: handleBlockDispenseEvent(source, pos, stack, this)
F->>L: BlockDispenseEvent (1st call)
L-->>F: not cancelled
F-->>S: null
S->>S: getEntitiesOfClass(SulfurCube, AABB(pos))
Note over S: no Sulfur Cube in front<br/>→ dispenseBlock returns false
S->>DD: super.execute(source, stack)
DD->>DD: spawnItem(level, stack, 6, direction, position, source)
DD->>L: BlockDispenseEvent (2nd call)
L-->>DD: not cancelled
DD->>DD: level.addFreshEntity(itemEntity)
Steps/models to reproduce
Watch the BlockDispenseEvent with a event listener and see two logs for the same dispense.
Plugin and Datapack List
Paper version
This server is running Paper version 26.3-209-main@03af8b4 (2026-10-20T21:49:44Z) (Implementing API version 26.3.build.209-stable)
Other
No response
- Lingua principale
- Java
- Stelle
- 12.8k
- Fork
- 3.6k
- Merge medio
- 3g 15h
- PR unite (30g)
- 49
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di PaperMC/Paper
-
type: bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
status: needs triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
PaperMC/Paper#14375 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Add .getIgniter() to ExplosiveMinecartForse già presa @WouterGritter l’ha presa 36 giorni fa. Apertastatus: needs triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
PaperMC/Paper#14097 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
BlockType#isOccluding is incorrectly handledForse già presa @ryoji-ikeda l’ha presa 179 giorni fa. Apertastatus: accepted
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
PaperMC/Paper#13790 · 5 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
status: needs triage version: 26.3
Difficoltà 3/5 1-2 giorni Idoneità per principianti 72/100
PaperMC/Paper#14412 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di PaperMC/Paper
Issue simili
-
[Bug] DefaultSerializationExceptionWrapper does not implement Cleanable, so cleanup() is never invoked by codecsForse già presa @binbin0325 l’ha presa oggi. Apertacomponent/need-triage type/need-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
2026 Error Report
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
triplea-game/triplea#15096 ·
I maintainer di solito rispondono entro 1 giorno
-
[Bug][API] Switching workflow versions leaves schedules onlineForse già presa @zhuangchong l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
apache/dolphinscheduler#18731 ·
I maintainer di solito rispondono entro 1 giorno
-
Implement JDBC Domain Enums (`SqlCategory`, `SqlExecutionStatus`, `SqlExecutionType`) in Core ModuleApertacore-module enhancement good first issue
Difficoltà 1/5 1-3 ore Idoneità per principianti 87/100
sdlc-pro/spring-lens#531 ·
I maintainer di solito rispondono entro 1 giorno