CraftBukkit/src/main/java/net/minecraft/server/BlockTripwire.java
Travis Watkins 444ced306a Cleanup and rework physical interaction events. Fixes BUKKIT-3686
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.
2013-03-22 17:18:19 -05:00

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));
}
}
}