Commits

TheCreeperCow authored 031322991de
Fixed SPIGOT-6745 and made requested changes
No tags

nms-patches/net/minecraft/core/dispenser/IDispenseBehavior.patch

Modified
148 148 EntityArmorStand entityarmorstand = new EntityArmorStand(worldserver, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D);
149 149
150 150 EntityTypes.a((World) worldserver, (EntityHuman) null, (Entity) entityarmorstand, itemstack.getTag());
151 151 entityarmorstand.setYRot(enumdirection.o());
152 152 worldserver.addEntity(entityarmorstand);
153 153 - itemstack.subtract(1);
154 154 + // itemstack.subtract(1); // CraftBukkit - Handled during event processing
155 155 return itemstack;
156 156 }
157 157 }));
158 -@@ -253,10 +325,16 @@
158 +@@ -253,10 +325,24 @@
159 159 });
160 160
161 161 if (!list.isEmpty()) {
162 162 - ((ISaddleable) list.get(0)).saddle(SoundCategory.BLOCKS);
163 163 - itemstack.subtract(1);
164 164 - this.a(true);
165 165 - return itemstack;
166 166 + //CraftBukkit Start
167 167 + BlockDispenseArmorEvent event = CraftEventFactory.callBlockDispenseArmorEvent(isourceblock, itemstack, list.get(0));
168 ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
169 ++ if (!eventStack.equals(itemstack)) {
170 ++ IDispenseBehavior iDispenseBehavior = BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem());
171 ++ if (iDispenseBehavior != IDispenseBehavior.NOOP && iDispenseBehavior != this) {
172 ++ iDispenseBehavior.dispense(isourceblock, eventStack);
173 ++ return itemstack;
174 ++ }
175 ++ }
168 176 + if (!event.isCancelled()) {
169 177 + ((ISaddleable) list.get(0)).saddle(SoundCategory.BLOCKS);
170 178 + itemstack.subtract(1);
171 179 + this.a(true);
172 180 + return itemstack;
173 181 + }
174 182 + return super.a(isourceblock, itemstack);
175 183 + //CraftBukkit End
176 184 } else {
177 185 return super.a(isourceblock, itemstack);
178 186 }
179 -@@ -280,10 +358,15 @@
187 +@@ -280,10 +366,23 @@
180 188
181 189 entityhorseabstract = (EntityHorseAbstract) iterator1.next();
182 190 } while (!entityhorseabstract.m(itemstack) || entityhorseabstract.gd() || !entityhorseabstract.isTamed());
183 191 -
184 192 - entityhorseabstract.k(401).a(itemstack.cloneAndSubtract(1));
185 193 - this.a(true);
186 194 - return itemstack;
187 195 + //CraftBukkit start
188 -+ BlockDispenseArmorEvent event = CraftEventFactory.callBlockDispenseArmorEvent(isourceblock, itemstack, entityhorseabstract);
196 ++ BlockDispenseArmorEvent event = CraftEventFactory.callBlockDispenseArmorEvent(isourceblock, itemstack, list.get(0));
197 ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
198 ++ if (!eventStack.equals(itemstack)) {
199 ++ IDispenseBehavior iDispenseBehavior = BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem());
200 ++ if (iDispenseBehavior != IDispenseBehavior.NOOP && iDispenseBehavior != this) {
201 ++ iDispenseBehavior.dispense(isourceblock, eventStack);
202 ++ return itemstack;
203 ++ }
204 ++ }
189 205 + if (!event.isCancelled()) {
190 -+ entityhorseabstract.k(401).a(itemstack.cloneAndSubtract(1));
206 ++ entityhorseabstract.k(401).a(eventStack.cloneAndSubtract(1));
191 207 + this.a(true);
192 208 + return itemstack;
193 209 + }
194 210 + return super.a(isourceblock, itemstack);
195 211 + //CraftBukkit End
196 212 }
197 213 };
198 214
199 -@@ -324,23 +407,57 @@
215 +@@ -324,23 +423,65 @@
200 216 }
201 217
202 218 entityhorsechestedabstract = (EntityHorseChestedAbstract) iterator1.next();
203 219 - } while (!entityhorsechestedabstract.isTamed() || !entityhorsechestedabstract.k(499).a(itemstack));
204 220 -
205 221 - itemstack.subtract(1);
206 222 - this.a(true);
207 223 - return itemstack;
208 224 + } while (!entityhorsechestedabstract.isTamed()); //CraftBukkit - Unwrapping the method call
209 225 + //CraftBukkit Start
210 226 + BlockDispenseArmorEvent event = CraftEventFactory.callBlockDispenseArmorEvent(isourceblock, itemstack, list.get(0));
227 ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
228 ++ if (!eventStack.equals(itemstack)) {
229 ++ IDispenseBehavior iDispenseBehavior = BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem());
230 ++ if (iDispenseBehavior != IDispenseBehavior.NOOP && iDispenseBehavior != this) {
231 ++ iDispenseBehavior.dispense(isourceblock, eventStack);
232 ++ return itemstack;
233 ++ }
234 ++ }
211 235 + if (!event.isCancelled()) {
212 236 + entityhorsechestedabstract.k(499).a(itemstack);
213 237 + itemstack.subtract(1);
214 238 + this.a(true);
215 239 + return itemstack;
216 240 + }
217 241 + return super.a(isourceblock, itemstack);
218 242 }
219 243 }));
220 244 BlockDispenser.a((IMaterial) Items.FIREWORK_ROCKET, (IDispenseBehavior) (new DispenseBehaviorItem() {
253 277
254 278 IDispenseBehavior.a(isourceblock, entityfireworks, enumdirection);
255 279 entityfireworks.shoot((double) enumdirection.getAdjacentX(), (double) enumdirection.getAdjacentY(), (double) enumdirection.getAdjacentZ(), 0.5F, 1.0F);
256 280 isourceblock.getWorld().addEntity(entityfireworks);
257 281 - itemstack.subtract(1);
258 282 + // itemstack.subtract(1); // Handled during event processing
259 283 + // CraftBukkit end
260 284 return itemstack;
261 285 }
262 286
263 -@@ -362,12 +479,40 @@
287 +@@ -362,12 +503,40 @@
264 288 double d3 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentX();
265 289 double d4 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentY();
266 290 double d5 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentZ();
267 291 - EntitySmallFireball entitysmallfireball = new EntitySmallFireball(worldserver, d0, d1, d2, d3, d4, d5);
268 292
269 293 - worldserver.addEntity((Entity) SystemUtils.a((Object) entitysmallfireball, (entitysmallfireball1) -> {
270 294 - entitysmallfireball1.setItem(itemstack);
271 295 - }));
272 296 - itemstack.subtract(1);
273 297 + // CraftBukkit start
299 323 + EntitySmallFireball entitysmallfireball = new EntitySmallFireball(worldserver, d0, d1, d2, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ());
300 324 + entitysmallfireball.setItem(itemstack1);
301 325 + entitysmallfireball.projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((TileEntityDispenser) isourceblock.getTileEntity());
302 326 +
303 327 + worldserver.addEntity(entitysmallfireball);
304 328 + // itemstack.subtract(1); // Handled during event processing
305 329 + // CraftBukkit end
306 330 return itemstack;
307 331 }
308 332
309 -@@ -391,9 +536,52 @@
333 +@@ -391,9 +560,52 @@
310 334 BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.getBlockData().get(BlockDispenser.FACING));
311 335 WorldServer worldserver = isourceblock.getWorld();
312 336
313 337 + // CraftBukkit start
314 338 + int x = blockposition.getX();
315 339 + int y = blockposition.getY();
316 340 + int z = blockposition.getZ();
317 341 + IBlockData iblockdata = worldserver.getType(blockposition);
318 342 + Material material = iblockdata.getMaterial();
319 343 + if (worldserver.isEmpty(blockposition) || !material.isBuildable() || material.isReplaceable() || (dispensiblecontaineritem instanceof ItemBucket && iblockdata.getBlock() instanceof IFluidContainer && ((IFluidContainer) iblockdata.getBlock()).canPlace(worldserver, blockposition, iblockdata, ((ItemBucket) dispensiblecontaineritem).content))) {
353 377 + itemstack.setItem(Items.BUCKET);
354 378 + itemstack.setCount(1);
355 379 + } else if (((TileEntityDispenser) isourceblock.getTileEntity()).addItem(new ItemStack(item)) < 0) {
356 380 + this.defaultDispenseItemBehavior.dispense(isourceblock, new ItemStack(item));
357 381 + }
358 382 + // CraftBukkit end
359 383 + return itemstack;
360 384 } else {
361 385 return this.defaultDispenseItemBehavior.dispense(isourceblock, itemstack);
362 386 }
363 -@@ -419,7 +607,7 @@
387 +@@ -419,7 +631,7 @@
364 388 Block block = iblockdata.getBlock();
365 389
366 390 if (block instanceof IFluidSource) {
367 391 - ItemStack itemstack1 = ((IFluidSource) block).removeFluid(worldserver, blockposition, iblockdata);
368 392 + ItemStack itemstack1 = ((IFluidSource) block).removeFluid(DummyGeneratorAccess.INSTANCE, blockposition, iblockdata); // CraftBukkit
369 393
370 394 if (itemstack1.isEmpty()) {
371 395 return super.a(isourceblock, itemstack);
372 -@@ -427,6 +615,32 @@
396 +@@ -427,6 +639,32 @@
373 397 worldserver.a((Entity) null, GameEvent.FLUID_PICKUP, blockposition);
374 398 Item item = itemstack1.getItem();
375 399
376 400 + // CraftBukkit start
377 401 + org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
378 402 + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack);
379 403 +
380 404 + BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ()));
381 405 + if (!BlockDispenser.eventFired) {
382 406 + worldserver.getCraftServer().getPluginManager().callEvent(event);
395 419 + return itemstack;
396 420 + }
397 421 + }
398 422 +
399 423 + itemstack1 = ((IFluidSource) block).removeFluid(worldserver, blockposition, iblockdata); // From above
400 424 + // CraftBukkit end
401 425 +
402 426 itemstack.subtract(1);
403 427 if (itemstack.isEmpty()) {
404 428 return new ItemStack(item);
405 -@@ -448,14 +662,42 @@
429 +@@ -448,14 +686,42 @@
406 430 protected ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) {
407 431 WorldServer worldserver = isourceblock.getWorld();
408 432
409 433 + // CraftBukkit start
410 434 + org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
411 435 + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack);
412 436 +
413 437 + BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0));
414 438 + if (!BlockDispenser.eventFired) {
415 439 + worldserver.getCraftServer().getPluginManager().callEvent(event);
440 464 - worldserver.a((Entity) null, GameEvent.BLOCK_PLACE, blockposition);
441 465 + // CraftBukkit start - Ignition by dispensing flint and steel
442 466 + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(worldserver, blockposition, isourceblock.getBlockPosition()).isCancelled()) {
443 467 + worldserver.setTypeUpdate(blockposition, BlockFireAbstract.a((IBlockAccess) worldserver, blockposition));
444 468 + worldserver.a((Entity) null, GameEvent.BLOCK_PLACE, blockposition);
445 469 + }
446 470 + // CraftBukkit end
447 471 } else if (!BlockCampfire.h(iblockdata) && !CandleBlock.g(iblockdata) && !CandleCakeBlock.g(iblockdata)) {
448 472 if (iblockdata.getBlock() instanceof BlockTNT) {
449 473 BlockTNT.a((World) worldserver, blockposition);
450 -@@ -481,12 +723,62 @@
474 +@@ -481,12 +747,62 @@
451 475 this.a(true);
452 476 WorldServer worldserver = isourceblock.getWorld();
453 477 BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.getBlockData().get(BlockDispenser.FACING));
454 478 + // CraftBukkit start
455 479 + org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
456 480 + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack);
457 481 +
458 482 + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0));
459 483 + if (!BlockDispenser.eventFired) {
460 484 + worldserver.getCraftServer().getPluginManager().callEvent(event);
503 527 + if (!fertilizeEvent.isCancelled()) {
504 528 + for (org.bukkit.block.BlockState blockstate : blocks) {
505 529 + blockstate.update(true);
506 530 + }
507 531 + }
508 532 + }
509 533 + // CraftBukkit end
510 534
511 535 return itemstack;
512 536 }
513 -@@ -496,12 +788,41 @@
537 +@@ -496,12 +812,41 @@
514 538 protected ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) {
515 539 WorldServer worldserver = isourceblock.getWorld();
516 540 BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.getBlockData().get(BlockDispenser.FACING));
517 541 - EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(worldserver, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, (EntityLiving) null);
518 542 + // EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(worldserver, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, (EntityLiving) null);
519 543 +
520 544 + // CraftBukkit start
521 545 + ItemStack itemstack1 = itemstack.cloneAndSubtract(1);
522 546 + org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
523 547 + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
524 548 +
525 549 + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector((double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D));
526 550 + if (!BlockDispenser.eventFired) {
527 -+ worldserver.getCraftServer().getPluginManager().callEvent(event);
551 ++ worldserver.getCraftServer().getPluginManager().callEvent(event);
528 552 + }
529 553 +
530 554 + if (event.isCancelled()) {
531 555 + itemstack.add(1);
532 556 + return itemstack;
533 557 + }
534 558 +
535 559 + if (!event.getItem().equals(craftItem)) {
536 560 + itemstack.add(1);
537 561 + // Chain to handler for new item
547 571 + // CraftBukkit end
548 572
549 573 worldserver.addEntity(entitytntprimed);
550 574 worldserver.playSound((EntityHuman) null, entitytntprimed.locX(), entitytntprimed.locY(), entitytntprimed.locZ(), SoundEffects.TNT_PRIMED, SoundCategory.BLOCKS, 1.0F, 1.0F);
551 575 worldserver.a((Entity) null, GameEvent.ENTITY_PLACE, blockposition);
552 576 - itemstack.subtract(1);
553 577 + // itemstack.subtract(1); // CraftBukkit - handled above
554 578 return itemstack;
555 579 }
556 580 }));
557 -@@ -525,6 +846,30 @@
581 +@@ -525,6 +870,30 @@
558 582 EnumDirection enumdirection = (EnumDirection) isourceblock.getBlockData().get(BlockDispenser.FACING);
559 583 BlockPosition blockposition = isourceblock.getBlockPosition().shift(enumdirection);
560 584
561 585 + // CraftBukkit start
562 586 + org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
563 587 + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack);
564 588 +
565 589 + BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ()));
566 590 + if (!BlockDispenser.eventFired) {
567 591 + worldserver.getCraftServer().getPluginManager().callEvent(event);
578 602 + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) {
579 603 + idispensebehavior.dispense(isourceblock, eventStack);
580 604 + return itemstack;
581 605 + }
582 606 + }
583 607 + // CraftBukkit end
584 608 +
585 609 if (worldserver.isEmpty(blockposition) && BlockWitherSkull.b((World) worldserver, blockposition, itemstack)) {
586 610 worldserver.setTypeAndData(blockposition, (IBlockData) Blocks.WITHER_SKELETON_SKULL.getBlockData().set(BlockSkull.ROTATION, enumdirection.n() == EnumDirection.EnumAxis.Y ? 0 : enumdirection.opposite().get2DRotationValue() * 4), 3);
587 611 worldserver.a((Entity) null, GameEvent.BLOCK_PLACE, blockposition);
588 -@@ -550,6 +895,30 @@
612 +@@ -550,6 +919,30 @@
589 613 BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.getBlockData().get(BlockDispenser.FACING));
590 614 BlockPumpkinCarved blockpumpkincarved = (BlockPumpkinCarved) Blocks.CARVED_PUMPKIN;
591 615
592 616 + // CraftBukkit start
593 617 + org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
594 618 + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack);
595 619 +
596 620 + BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ()));
597 621 + if (!BlockDispenser.eventFired) {
598 622 + worldserver.getCraftServer().getPluginManager().callEvent(event);
609 633 + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) {
610 634 + idispensebehavior.dispense(isourceblock, eventStack);
611 635 + return itemstack;
612 636 + }
613 637 + }
614 638 + // CraftBukkit end
615 639 +
616 640 if (worldserver.isEmpty(blockposition) && blockpumpkincarved.a((IWorldReader) worldserver, blockposition)) {
617 641 if (!worldserver.isClientSide) {
618 642 worldserver.setTypeAndData(blockposition, blockpumpkincarved.getBlockData(), 3);
619 -@@ -599,6 +968,30 @@
643 +@@ -599,6 +992,30 @@
620 644 BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.getBlockData().get(BlockDispenser.FACING));
621 645 IBlockData iblockdata = worldserver.getType(blockposition);
622 646
623 647 + // CraftBukkit start
624 648 + org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
625 649 + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack);
626 650 +
627 651 + BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ()));
628 652 + if (!BlockDispenser.eventFired) {
629 653 + worldserver.getCraftServer().getPluginManager().callEvent(event);

Everything looks good. We'll let you know here if there's anything you should know about.

Add shortcut