2011-01-08 11:49:42 +01:00
package net.minecraft.server ;
2011-01-11 09:25:13 +01:00
// CraftBukkit start
2011-03-16 16:13:42 +01:00
import org.bukkit.craftbukkit.event.CraftEventFactory ;
2011-01-15 22:29:17 +01:00
import org.bukkit.craftbukkit.inventory.CraftItemStack ;
2011-03-16 16:13:42 +01:00
import org.bukkit.event.player.PlayerBucketEmptyEvent ;
import org.bukkit.event.player.PlayerBucketFillEvent ;
2011-01-11 09:25:13 +01:00
// CraftBukkit end
2011-01-08 11:49:42 +01:00
public class ItemBucket extends Item {
private int a ;
public ItemBucket ( int i , int j ) {
super ( i ) ;
2011-01-29 22:50:29 +01:00
this . maxStackSize = 1 ;
this . a = j ;
2012-07-29 09:33:13 +02:00
this . a ( CreativeModeTab . f ) ;
2011-01-08 11:49:42 +01:00
}
2011-01-29 22:50:29 +01:00
public ItemStack a ( ItemStack itemstack , World world , EntityHuman entityhuman ) {
2011-01-08 11:49:42 +01:00
float f = 1 . 0F ;
2011-01-29 22:50:29 +01:00
double d0 = entityhuman . lastX + ( entityhuman . locX - entityhuman . lastX ) * ( double ) f ;
double d1 = entityhuman . lastY + ( entityhuman . locY - entityhuman . lastY ) * ( double ) f + 1 . 62D - ( double ) entityhuman . height ;
double d2 = entityhuman . lastZ + ( entityhuman . locZ - entityhuman . lastZ ) * ( double ) f ;
2011-11-20 09:01:14 +01:00
boolean flag = this . a = = 0 ;
MovingObjectPosition movingobjectposition = this . a ( world , entityhuman , flag ) ;
2011-01-08 11:49:42 +01:00
if ( movingobjectposition = = null ) {
return itemstack ;
2011-01-29 22:50:29 +01:00
} else {
2011-04-20 19:05:14 +02:00
if ( movingobjectposition . type = = EnumMovingObjectType . TILE ) {
2011-01-29 22:50:29 +01:00
int i = movingobjectposition . b ;
int j = movingobjectposition . c ;
int k = movingobjectposition . d ;
2011-01-11 09:25:13 +01:00
2011-01-29 22:50:29 +01:00
if ( ! world . a ( entityhuman , i , j , k ) ) {
return itemstack ;
2011-01-08 11:49:42 +01:00
}
2011-01-11 09:25:13 +01:00
2011-01-29 22:50:29 +01:00
if ( this . a = = 0 ) {
2012-10-25 05:53:23 +02:00
if ( ! entityhuman . a ( i , j , k , movingobjectposition . face , itemstack ) ) {
2011-09-15 02:23:52 +02:00
return itemstack ;
}
2011-01-29 22:50:29 +01:00
if ( world . getMaterial ( i , j , k ) = = Material . WATER & & world . getData ( i , j , k ) = = 0 ) {
// CraftBukkit start
2011-03-16 16:13:42 +01:00
PlayerBucketFillEvent event = CraftEventFactory . callPlayerBucketFillEvent ( entityhuman , i , j , k , - 1 , itemstack , Item . WATER_BUCKET ) ;
2011-03-27 21:57:46 +02:00
2011-01-29 22:50:29 +01:00
if ( event . isCancelled ( ) ) {
return itemstack ;
2011-01-08 11:49:42 +01:00
}
2012-07-29 09:33:13 +02:00
// CraftBukkit end
2011-12-21 03:20:43 +01:00
world . setTypeId ( i , j , k , 0 ) ;
2011-11-20 09:01:14 +01:00
if ( entityhuman . abilities . canInstantlyBuild ) {
return itemstack ;
}
2011-01-29 22:50:29 +01:00
2012-07-29 09:33:13 +02:00
ItemStack result = CraftItemStack . createNMSItemStack ( event . getItemStack ( ) ) ; // CraftBukkit - TODO: Check this stuff later... Not sure how this behavior should work
if ( - - itemstack . count < = 0 ) {
return result ; // CraftBukkit
}
if ( ! entityhuman . inventory . pickup ( result ) ) { // CraftBukkit
entityhuman . drop ( CraftItemStack . createNMSItemStack ( event . getItemStack ( ) ) ) ; // CraftBukkit
}
return itemstack ;
2011-01-29 22:50:29 +01:00
}
2011-01-11 09:25:13 +01:00
2011-01-29 22:50:29 +01:00
if ( world . getMaterial ( i , j , k ) = = Material . LAVA & & world . getData ( i , j , k ) = = 0 ) {
// CraftBukkit start
2011-03-27 21:57:46 +02:00
PlayerBucketFillEvent event = CraftEventFactory . callPlayerBucketFillEvent ( entityhuman , i , j , k , - 1 , itemstack , Item . LAVA_BUCKET ) ;
2011-01-29 22:50:29 +01:00
if ( event . isCancelled ( ) ) {
2011-01-08 11:49:42 +01:00
return itemstack ;
}
2012-07-29 09:33:13 +02:00
// CraftBukkit end
2011-12-21 03:20:43 +01:00
world . setTypeId ( i , j , k , 0 ) ;
2011-11-20 09:01:14 +01:00
if ( entityhuman . abilities . canInstantlyBuild ) {
return itemstack ;
}
2011-01-29 22:50:29 +01:00
2012-07-29 09:33:13 +02:00
ItemStack result = CraftItemStack . createNMSItemStack ( event . getItemStack ( ) ) ; // CraftBukkit - TODO: Check this stuff later... Not sure how this behavior should work
if ( - - itemstack . count < = 0 ) {
return result ; // CraftBukkit
}
if ( ! entityhuman . inventory . pickup ( result ) ) { // CraftBukkit
entityhuman . drop ( CraftItemStack . createNMSItemStack ( event . getItemStack ( ) ) ) ; // CraftBukkit
}
return itemstack ;
2011-01-29 22:50:29 +01:00
}
} else {
if ( this . a < 0 ) {
2011-03-16 16:13:42 +01:00
// CraftBukkit start
2011-04-20 19:05:14 +02:00
PlayerBucketEmptyEvent event = CraftEventFactory . callPlayerBucketEmptyEvent ( entityhuman , i , j , k , movingobjectposition . face , itemstack ) ;
2011-03-16 16:13:42 +01:00
if ( event . isCancelled ( ) ) {
return itemstack ;
}
2011-12-12 15:40:35 +01:00
return CraftItemStack . createNMSItemStack ( event . getItemStack ( ) ) ;
2011-01-29 22:50:29 +01:00
}
2011-05-14 16:29:42 +02:00
int clickedX = i , clickedY = j , clickedZ = k ;
// CraftBukkit end
2011-01-29 22:50:29 +01:00
2011-04-20 19:05:14 +02:00
if ( movingobjectposition . face = = 0 ) {
2011-01-29 22:50:29 +01:00
- - j ;
}
2011-04-20 19:05:14 +02:00
if ( movingobjectposition . face = = 1 ) {
2011-01-29 22:50:29 +01:00
+ + j ;
}
2011-04-20 19:05:14 +02:00
if ( movingobjectposition . face = = 2 ) {
2011-01-29 22:50:29 +01:00
- - k ;
}
2011-04-20 19:05:14 +02:00
if ( movingobjectposition . face = = 3 ) {
2011-01-29 22:50:29 +01:00
+ + k ;
}
2011-04-20 19:05:14 +02:00
if ( movingobjectposition . face = = 4 ) {
2011-01-29 22:50:29 +01:00
- - i ;
}
2011-04-20 19:05:14 +02:00
if ( movingobjectposition . face = = 5 ) {
2011-01-29 22:50:29 +01:00
+ + i ;
}
2012-10-25 05:53:23 +02:00
if ( ! entityhuman . a ( i , j , k , movingobjectposition . face , itemstack ) ) {
2011-09-15 02:23:52 +02:00
return itemstack ;
}
2012-08-03 19:07:04 +02:00
// CraftBukkit start
PlayerBucketEmptyEvent event = CraftEventFactory . callPlayerBucketEmptyEvent ( entityhuman , clickedX , clickedY , clickedZ , movingobjectposition . face , itemstack ) ;
2011-03-16 16:13:42 +01:00
2012-08-03 19:07:04 +02:00
if ( event . isCancelled ( ) ) {
return itemstack ;
}
// CraftBukkit end
if ( this . a ( world , d0 , d1 , d2 , i , j , k ) & & ! entityhuman . abilities . canInstantlyBuild ) {
return CraftItemStack . createNMSItemStack ( event . getItemStack ( ) ) ; // CraftBukkit
2011-01-08 11:49:42 +01:00
}
}
2011-04-20 19:05:14 +02:00
} else if ( this . a = = 0 & & movingobjectposition . entity instanceof EntityCow ) {
2011-05-14 16:29:42 +02:00
// CraftBukkit start - This codepath seems to be *NEVER* called
2012-07-22 08:18:00 +02:00
org . bukkit . Location loc = movingobjectposition . entity . getBukkitEntity ( ) . getLocation ( ) ;
2011-03-16 16:13:42 +01:00
PlayerBucketFillEvent event = CraftEventFactory . callPlayerBucketFillEvent ( entityhuman , loc . getBlockX ( ) , loc . getBlockY ( ) , loc . getBlockZ ( ) , - 1 , itemstack , Item . MILK_BUCKET ) ;
if ( event . isCancelled ( ) ) {
return itemstack ;
}
2011-12-12 15:40:35 +01:00
return CraftItemStack . createNMSItemStack ( event . getItemStack ( ) ) ;
2011-03-16 16:13:42 +01:00
// CraftBukkit end
2011-01-08 11:49:42 +01:00
}
2011-01-29 22:50:29 +01:00
return itemstack ;
2011-01-08 11:49:42 +01:00
}
}
2012-07-29 09:33:13 +02:00
public boolean a ( World world , double d0 , double d1 , double d2 , int i , int j , int k ) {
if ( this . a < = 0 ) {
return false ;
} else if ( ! world . isEmpty ( i , j , k ) & & world . getMaterial ( i , j , k ) . isBuildable ( ) ) {
return false ;
} else {
2012-10-25 05:53:23 +02:00
if ( world . worldProvider . e & & this . a = = Block . WATER . id ) {
2012-07-29 09:33:13 +02:00
world . makeSound ( d0 + 0 . 5D , d1 + 0 . 5D , d2 + 0 . 5D , " random.fizz " , 0 . 5F , 2 . 6F + ( world . random . nextFloat ( ) - world . random . nextFloat ( ) ) * 0 . 8F ) ;
for ( int l = 0 ; l < 8 ; + + l ) {
2012-10-25 05:53:23 +02:00
world . addParticle ( " largesmoke " , ( double ) i + Math . random ( ) , ( double ) j + Math . random ( ) , ( double ) k + Math . random ( ) , 0 . 0D , 0 . 0D , 0 . 0D ) ;
2012-07-29 09:33:13 +02:00
}
} else {
world . setTypeIdAndData ( i , j , k , this . a , 0 ) ;
}
return true ;
}
}
2011-01-08 11:49:42 +01:00
}