3
0
Mirror von https://github.com/PaperMC/Paper.git synchronisiert 2024-12-19 04:50:06 +01:00

Throw BlockPlaceEvent when placing double slabs. Fixes BUKKIT-2469

Dieser Commit ist enthalten in:
feildmaster 2013-01-16 05:39:13 -06:00
Ursprung 647b82032b
Commit 614ef2f8c5
2 geänderte Dateien mit 61 neuen und 39 gelöschten Zeilen

Datei anzeigen

@ -1,7 +1,5 @@
package net.minecraft.server; package net.minecraft.server;
import org.bukkit.craftbukkit.block.CraftBlockState; // CraftBukkit
public class ItemBlock extends Item { public class ItemBlock extends Item {
private int id; private int id;
@ -17,7 +15,6 @@ public class ItemBlock extends Item {
} }
public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
int i1 = world.getTypeId(i, j, k); int i1 = world.getTypeId(i, j, k);
if (i1 == Block.SNOW.id) { if (i1 == Block.SNOW.id) {
@ -54,53 +51,61 @@ public class ItemBlock extends Item {
return false; return false;
} else if (j == 255 && Block.byId[this.id].material.isBuildable()) { } else if (j == 255 && Block.byId[this.id].material.isBuildable()) {
return false; return false;
// CraftBukkit start } else if (world.mayPlace(this.id, i, j, k, false, l, entityhuman)) {
} Block block = Block.byId[this.id];
int id = this.id;
if (l == -1 && itemstack.getItem() instanceof ItemStep) {
if (this.id == Block.STEP.id) {
id = Block.DOUBLE_STEP.id;
} else if (this.id == Block.WOOD_STEP.id) {
id = Block.WOOD_DOUBLE_STEP.id;
}
}
if (id != this.id || world.mayPlace(this.id, i, j, k, false, l, entityhuman)) {
Block block = Block.byId[id];
int j1 = this.filterData(itemstack.getData()); int j1 = this.filterData(itemstack.getData());
int k1 = Block.byId[this.id].getPlacedData(world, i, j, k, l, f, f1, f2, j1); int k1 = Block.byId[this.id].getPlacedData(world, i, j, k, l, f, f1, f2, j1);
CraftBlockState replacedBlockState = CraftBlockState.getBlockState(world, i, j, k); // CraftBukkit start - redirect to common function handler
/*
world.suppressPhysics = true; if (world.setTypeIdAndData(i, j, k, this.id, k1)) {
world.setTypeIdAndData(i, j, k, id, k1); if (world.getTypeId(i, j, k) == this.id) {
org.bukkit.event.block.BlockPlaceEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, replacedBlockState, clickedX, clickedY, clickedZ); Block.byId[this.id].postPlace(world, i, j, k, entityhuman);
id = world.getTypeId(i, j, k); Block.byId[this.id].postPlace(world, i, j, k, k1);
int data = world.getData(i, j, k);
replacedBlockState.update(true);
world.suppressPhysics = false;
if (event.isCancelled() || !event.canBuild()) {
return true;
}
if (world.setTypeIdAndData(i, j, k, id, data)) {
if (world.getTypeId(i, j, k) == id && Block.byId[id] != null) {
Block.byId[id].postPlace(world, i, j, k, entityhuman);
Block.byId[this.id].postPlace(world, i, j, k, data);
// CraftBukkit end
} }
world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), block.stepSound.getPlaceSound(), (block.stepSound.getVolume1() + 1.0F) / 2.0F, block.stepSound.getVolume2() * 0.8F); world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), block.stepSound.getPlaceSound(), (block.stepSound.getVolume1() + 1.0F) / 2.0F, block.stepSound.getVolume2() * 0.8F);
--itemstack.count; --itemstack.count;
} }
*/
return true; return processBlockPlace(world, entityhuman, itemstack, i, j, k, this.id, k1);
// CraftBukkit end
} else { } else {
return false; return false;
} }
} }
// CraftBukkit start - add method to process block placement
static boolean processBlockPlace(final World world, final EntityHuman entityhuman, final ItemStack itemstack, final int x, final int y, final int z, final int id, final int data) {
world.suppressPhysics = true;
world.setTypeIdAndData(x, y, z, id, data);
org.bukkit.event.block.BlockPlaceEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(world, x, y, z), x, y, z);
if (event.isCancelled() || !event.canBuild()) {
event.getBlockReplacedState().update(true);
world.suppressPhysics = false;
return false;
}
world.suppressPhysics = false;
world.applyPhysics(x, y, z, world.getTypeId(x, y, z));
Block block = Block.byId[world.getTypeId(x, y, z)];
if (block != null) {
block.postPlace(world, x, y, z, entityhuman);
block.postPlace(world, x, y, z, world.getData(x, y, z));
world.makeSound((double) ((float) x + 0.5F), (double) ((float) y + 0.5F), (double) ((float) z + 0.5F), block.stepSound.getPlaceSound(), (block.stepSound.getVolume1() + 1.0F) / 2.0F, block.stepSound.getVolume2() * 0.8F);
}
if (itemstack != null) {
--itemstack.count;
}
return true;
}
// CraftBukkit end
public String d(ItemStack itemstack) { public String d(ItemStack itemstack) {
return Block.byId[this.id].a(); return Block.byId[this.id].a();
} }

Datei anzeigen

@ -37,7 +37,18 @@ public class ItemStep extends ItemBlock {
boolean flag = (j1 & 8) != 0; boolean flag = (j1 & 8) != 0;
if ((l == 1 && !flag || l == 0 && flag) && i1 == this.b.id && k1 == itemstack.getData()) { if ((l == 1 && !flag || l == 0 && flag) && i1 == this.b.id && k1 == itemstack.getData()) {
return super.interactWith(itemstack, entityhuman, world, i, j, k, -1, f, f1, f2); // CraftBukkit - handle this in super // CraftBukkit start - handle in processBlockPlace()
/*
if (world.b(this.c.e(world, i, j, k)) && world.setTypeIdAndData(i, j, k, this.c.id, k1)) {
world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), this.c.stepSound.getPlaceSound(), (this.c.stepSound.getVolume1() + 1.0F) / 2.0F, this.c.stepSound.getVolume2() * 0.8F);
--itemstack.count;
}
*/
if (world.b(this.c.e(world, i, j, k))) {
processBlockPlace(world, entityhuman, itemstack, i, j, k, this.c.id, k1);
}
// CraftBukkit end
return true;
} else { } else {
return this.a(itemstack, entityhuman, world, i, j, k, l) ? true : super.interactWith(itemstack, entityhuman, world, i, j, k, l, f, f1, f2); return this.a(itemstack, entityhuman, world, i, j, k, l) ? true : super.interactWith(itemstack, entityhuman, world, i, j, k, l, f, f1, f2);
} }
@ -74,11 +85,17 @@ public class ItemStep extends ItemBlock {
int k1 = j1 & 7; int k1 = j1 & 7;
if (i1 == this.b.id && k1 == itemstack.getData()) { if (i1 == this.b.id && k1 == itemstack.getData()) {
// CraftBukkit start - handle in processBlockPlace()
/*
if (world.b(this.c.e(world, i, j, k)) && world.setTypeIdAndData(i, j, k, this.c.id, k1)) { if (world.b(this.c.e(world, i, j, k)) && world.setTypeIdAndData(i, j, k, this.c.id, k1)) {
world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), this.c.stepSound.getPlaceSound(), (this.c.stepSound.getVolume1() + 1.0F) / 2.0F, this.c.stepSound.getVolume2() * 0.8F); world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), this.c.stepSound.getPlaceSound(), (this.c.stepSound.getVolume1() + 1.0F) / 2.0F, this.c.stepSound.getVolume2() * 0.8F);
--itemstack.count; --itemstack.count;
} }
*/
if (world.b(this.c.e(world, i, j, k))) {
processBlockPlace(world, entityhuman, itemstack, i, j, k, this.c.id, k1);
}
// CraftBukkit end
return true; return true;
} else { } else {
return false; return false;