
Currently when dealing with physical interactions with pressure plates and tripwires we immediately block their activation as soon as a single entity involved has their event cancelled. We also fire events whenever an entity intersects the block a wooden button is in even if they aren't actually pressing it. To correct this we move the button interaction to the correct place and modify all three to only block the activation if every entity is blocked from using them instead of just one of them.
202 lines
5.9 KiB
Java
202 lines
5.9 KiB
Java
package net.minecraft.server;
|
|
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import java.util.Random;
|
|
|
|
import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit
|
|
|
|
public class BlockTripwire extends Block {
|
|
|
|
public BlockTripwire(int i) {
|
|
super(i, Material.ORIENTABLE);
|
|
this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.15625F, 1.0F);
|
|
this.b(true);
|
|
}
|
|
|
|
public int a(World world) {
|
|
return 10;
|
|
}
|
|
|
|
public AxisAlignedBB b(World world, int i, int j, int k) {
|
|
return null;
|
|
}
|
|
|
|
public boolean c() {
|
|
return false;
|
|
}
|
|
|
|
public boolean b() {
|
|
return false;
|
|
}
|
|
|
|
public int d() {
|
|
return 30;
|
|
}
|
|
|
|
public int getDropType(int i, Random random, int j) {
|
|
return Item.STRING.id;
|
|
}
|
|
|
|
public void doPhysics(World world, int i, int j, int k, int l) {
|
|
int i1 = world.getData(i, j, k);
|
|
boolean flag = (i1 & 2) == 2;
|
|
boolean flag1 = !world.w(i, j - 1, k);
|
|
|
|
if (flag != flag1) {
|
|
this.c(world, i, j, k, i1, 0);
|
|
world.setAir(i, j, k);
|
|
}
|
|
}
|
|
|
|
public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) {
|
|
int l = iblockaccess.getData(i, j, k);
|
|
boolean flag = (l & 4) == 4;
|
|
boolean flag1 = (l & 2) == 2;
|
|
|
|
if (!flag1) {
|
|
this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.09375F, 1.0F);
|
|
} else if (!flag) {
|
|
this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F);
|
|
} else {
|
|
this.a(0.0F, 0.0625F, 0.0F, 1.0F, 0.15625F, 1.0F);
|
|
}
|
|
}
|
|
|
|
public void onPlace(World world, int i, int j, int k) {
|
|
int l = world.w(i, j - 1, k) ? 0 : 2;
|
|
|
|
world.setData(i, j, k, l, 3);
|
|
this.d(world, i, j, k, l);
|
|
}
|
|
|
|
public void remove(World world, int i, int j, int k, int l, int i1) {
|
|
this.d(world, i, j, k, i1 | 1);
|
|
}
|
|
|
|
public void a(World world, int i, int j, int k, int l, EntityHuman entityhuman) {
|
|
if (!world.isStatic) {
|
|
if (entityhuman.cb() != null && entityhuman.cb().id == Item.SHEARS.id) {
|
|
world.setData(i, j, k, l | 8, 4);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void d(World world, int i, int j, int k, int l) {
|
|
int i1 = 0;
|
|
|
|
while (i1 < 2) {
|
|
int j1 = 1;
|
|
|
|
while (true) {
|
|
if (j1 < 42) {
|
|
int k1 = i + Direction.a[i1] * j1;
|
|
int l1 = k + Direction.b[i1] * j1;
|
|
int i2 = world.getTypeId(k1, j, l1);
|
|
|
|
if (i2 == Block.TRIPWIRE_SOURCE.id) {
|
|
int j2 = world.getData(k1, j, l1) & 3;
|
|
|
|
if (j2 == Direction.f[i1]) {
|
|
Block.TRIPWIRE_SOURCE.a(world, k1, j, l1, i2, world.getData(k1, j, l1), true, j1, l);
|
|
}
|
|
} else if (i2 == Block.TRIPWIRE.id) {
|
|
++j1;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
++i1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void a(World world, int i, int j, int k, Entity entity) {
|
|
if (!world.isStatic) {
|
|
if ((world.getData(i, j, k) & 1) != 1) {
|
|
this.k(world, i, j, k);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void a(World world, int i, int j, int k, Random random) {
|
|
if (!world.isStatic) {
|
|
if ((world.getData(i, j, k) & 1) == 1) {
|
|
this.k(world, i, j, k);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void k(World world, int i, int j, int k) {
|
|
int l = world.getData(i, j, k);
|
|
boolean flag = (l & 1) == 1;
|
|
boolean flag1 = false;
|
|
List list = world.getEntities((Entity) null, AxisAlignedBB.a().a((double) i + this.minX, (double) j + this.minY, (double) k + this.minZ, (double) i + this.maxX, (double) j + this.maxY, (double) k + this.maxZ));
|
|
|
|
if (!list.isEmpty()) {
|
|
Iterator iterator = list.iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
Entity entity = (Entity) iterator.next();
|
|
|
|
if (!entity.at()) {
|
|
flag1 = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// CraftBukkit start - Call interact even when triggering connected tripwire
|
|
if (flag != flag1 && flag1 && (world.getData(i, j, k) & 4) == 4) {
|
|
org.bukkit.World bworld = world.getWorld();
|
|
org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager();
|
|
org.bukkit.block.Block block = bworld.getBlockAt(i, j, k);
|
|
boolean allowed = false;
|
|
|
|
// If all of the events are cancelled block the tripwire trigger, else allow
|
|
for (Object object : list) {
|
|
if (object != null) {
|
|
org.bukkit.event.Cancellable cancellable;
|
|
|
|
if (object instanceof EntityHuman) {
|
|
cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) object, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null);
|
|
} else if (object instanceof Entity) {
|
|
cancellable = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block);
|
|
manager.callEvent((EntityInteractEvent) cancellable);
|
|
} else {
|
|
continue;
|
|
}
|
|
|
|
if (!cancellable.isCancelled()) {
|
|
allowed = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!allowed) {
|
|
return;
|
|
}
|
|
}
|
|
// CraftBukkit end
|
|
|
|
if (flag1 && !flag) {
|
|
l |= 1;
|
|
}
|
|
|
|
if (!flag1 && flag) {
|
|
l &= -2;
|
|
}
|
|
|
|
if (flag1 != flag) {
|
|
world.setData(i, j, k, l, 3);
|
|
this.d(world, i, j, k, l);
|
|
}
|
|
|
|
if (flag1) {
|
|
world.a(i, j, k, this.id, this.a(world));
|
|
}
|
|
}
|
|
}
|