Commits
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 - | |
158 + | |
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 - | |
187 + | |
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 - | |
215 + | |
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 - | |
287 + | |
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 - | |
333 + | |
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 - | |
387 + | |
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 - | |
396 + | |
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 - | |
429 + | |
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 - | |
474 + | |
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 - | |
537 + | |
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 - | |
581 + | |
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 - | |
612 + | |
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 - | |
643 + | |
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); |