Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
1package net.minecraft.server;
2
3// CraftBukkit start
4
5import org.bukkit.Location;
6import org.bukkit.craftbukkit.event.CraftEventFactory;
7import org.bukkit.craftbukkit.inventory.CraftItemStack;
8import org.bukkit.event.player.PlayerBucketEmptyEvent;
9import org.bukkit.event.player.PlayerBucketFillEvent;
10// CraftBukkit end
11
12public class ItemBucket extends Item {
13
14 private int a;
15
16 public ItemBucket(int i, int j) {
17 super(i);
18 this.maxStackSize = 1;
19 this.a = j;
20 }
21
22 public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) {
23 float f = 1.0F;
24 float f1 = entityhuman.lastPitch + (entityhuman.pitch - entityhuman.lastPitch) * f;
25 float f2 = entityhuman.lastYaw + (entityhuman.yaw - entityhuman.lastYaw) * f;
26 double d0 = entityhuman.lastX + (entityhuman.locX - entityhuman.lastX) * (double) f;
27 double d1 = entityhuman.lastY + (entityhuman.locY - entityhuman.lastY) * (double) f + 1.62D - (double) entityhuman.height;
28 double d2 = entityhuman.lastZ + (entityhuman.locZ - entityhuman.lastZ) * (double) f;
29 Vec3D vec3d = Vec3D.create(d0, d1, d2);
30 float f3 = MathHelper.cos(-f2 * 0.017453292F - 3.1415927F);
31 float f4 = MathHelper.sin(-f2 * 0.017453292F - 3.1415927F);
32 float f5 = -MathHelper.cos(-f1 * 0.017453292F);
33 float f6 = MathHelper.sin(-f1 * 0.017453292F);
34 float f7 = f4 * f5;
35 float f8 = f3 * f5;
36 double d3 = 5.0D;
37 Vec3D vec3d1 = vec3d.add((double) f7 * d3, (double) f6 * d3, (double) f8 * d3);
38 MovingObjectPosition movingobjectposition = world.rayTrace(vec3d, vec3d1, this.a == 0);
39
40 if (movingobjectposition == null) {
41 return itemstack;
42 } else {
43 if (movingobjectposition.type == EnumMovingObjectType.TILE) {
44 int i = movingobjectposition.b;
45 int j = movingobjectposition.c;
46 int k = movingobjectposition.d;
47
48 if (!world.a(entityhuman, i, j, k)) {
49 return itemstack;
50 }
51
52 if (this.a == 0) {
53 if (world.getMaterial(i, j, k) == Material.WATER && world.getData(i, j, k) == 0) {
54 // CraftBukkit start
55 PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, i, j, k, -1, itemstack, Item.WATER_BUCKET);
56
57 if (event.isCancelled()) {
58 return itemstack;
59 }
60
61 CraftItemStack itemInHand = (CraftItemStack) event.getItemStack();
62 byte data = itemInHand.getData() == null ? (byte) 0 : itemInHand.getData().getData();
63 // CraftBukkit end
64
65 world.setTypeId(i, j, k, 0);
66 return new ItemStack(itemInHand.getTypeId(), itemInHand.getAmount(), data); // CraftBukkit
67 }
68
69 if (world.getMaterial(i, j, k) == Material.LAVA && world.getData(i, j, k) == 0) {
70 // CraftBukkit start
71 PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, i, j, k, -1, itemstack, Item.LAVA_BUCKET);
72
73 if (event.isCancelled()) {
74 return itemstack;
75 }
76
77 CraftItemStack itemInHand = (CraftItemStack) event.getItemStack();
78 byte data = itemInHand.getData() == null ? (byte) 0 : itemInHand.getData().getData();
79 // CraftBukkit end
80
81 world.setTypeId(i, j, k, 0);
82 return new ItemStack(itemInHand.getTypeId(), itemInHand.getAmount(), data); // CraftBukkit
83 }
84 } else {
85 if (this.a < 0) {
86 // CraftBukkit start
87 PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent(entityhuman, i, j, k, movingobjectposition.face, itemstack);
88
89 if (event.isCancelled()) {
90 return itemstack;
91 }
92
93 CraftItemStack itemInHand = (CraftItemStack) event.getItemStack();
94 byte data = itemInHand.getData() == null ? (byte) 0 : itemInHand.getData().getData();
95 return new ItemStack(itemInHand.getTypeId(), itemInHand.getAmount(), data);
96 }
97
98 int clickedX = i, clickedY = j, clickedZ = k;
99 // CraftBukkit end
100
101 if (movingobjectposition.face == 0) {
102 --j;
103 }
104
105 if (movingobjectposition.face == 1) {
106 ++j;
107 }
108
109 if (movingobjectposition.face == 2) {
110 --k;
111 }
112
113 if (movingobjectposition.face == 3) {
114 ++k;
115 }
116
117 if (movingobjectposition.face == 4) {
118 --i;
119 }
120
121 if (movingobjectposition.face == 5) {
122 ++i;
123 }
124
125 if (world.isEmpty(i, j, k) || !world.getMaterial(i, j, k).isBuildable()) {
126 // CraftBukkit start
127 PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent(entityhuman, clickedX, clickedY, clickedZ, movingobjectposition.face, itemstack);
128
129 if (event.isCancelled()) {
130 return itemstack;
131 }
132 // CraftBukkit end
133
134 if (world.worldProvider.d && this.a == Block.WATER.id) {
135 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);
136
137 for (int l = 0; l < 8; ++l) {
138 world.a("largesmoke", (double) i + Math.random(), (double) j + Math.random(), (double) k + Math.random(), 0.0D, 0.0D, 0.0D);
139 }
140 } else {
141 world.setTypeIdAndData(i, j, k, this.a, 0);
142 }
143
144 // CraftBukkit start
145 CraftItemStack itemInHand = (CraftItemStack) event.getItemStack();
146 byte data = itemInHand.getData() == null ? (byte) 0 : itemInHand.getData().getData();
147
148 return new ItemStack(itemInHand.getTypeId(), itemInHand.getAmount(), data);
149 // CraftBukkit end
150 }
151 }
152 } else if (this.a == 0 && movingobjectposition.entity instanceof EntityCow) {
153 // CraftBukkit start - This codepath seems to be *NEVER* called
154 Location loc = movingobjectposition.entity.getBukkitEntity().getLocation();
155 PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), -1, itemstack, Item.MILK_BUCKET);
156
157 if (event.isCancelled()) {
158 return itemstack;
159 }
160
161 CraftItemStack itemInHand = (CraftItemStack) event.getItemStack();
162 byte data = itemInHand.getData() == null ? (byte) 0 : itemInHand.getData().getData();
163 return new ItemStack(itemInHand.getTypeId(), itemInHand.getAmount(), data);
164 // CraftBukkit end
165 }
166
167 return itemstack;
168 }
169 }
170}