CraftBukkit/src/main/java/net/minecraft/server/PortalCreator.java
GJ 81e560621f [Bleeding] Add all blocks needed to PortalCreateEvent. Fixes BUKKIT-5464
Due to changes in how portals were created in Minecraft 1.7, the code that
was previously used to find the blocks involved in the PortalCreateEvent
no longer detected all blocks. Additionally, in the process of updating to
1.7.2, a missed diff resulted in some blocks that were found not being
properly added to the blocklist. This commit corrects that missed diff,
while also adding a check to ensure that the top and bottom of the portal
frame are included in the blocklist.
2014-04-18 09:42:02 -05:00

198 lines
6.0 KiB
Java

package net.minecraft.server;
import org.bukkit.event.world.PortalCreateEvent; // CraftBukkit
public class PortalCreator {
private final World a;
private final int b;
private final int c;
private final int d;
private int e = 0;
private ChunkCoordinates f;
private int g;
private int h;
java.util.Collection<org.bukkit.block.Block> blocks = new java.util.HashSet<org.bukkit.block.Block>(); // CraftBukkit - add field
public PortalCreator(World world, int i, int j, int k, int l) {
this.a = world;
this.b = l;
this.d = BlockPortal.a[l][0];
this.c = BlockPortal.a[l][1];
for (int i1 = j; j > i1 - 21 && j > 0 && this.a(world.getType(i, j - 1, k)); --j) {
;
}
int j1 = this.a(i, j, k, this.d) - 1;
if (j1 >= 0) {
this.f = new ChunkCoordinates(i + j1 * Direction.a[this.d], j, k + j1 * Direction.b[this.d]);
this.h = this.a(this.f.x, this.f.y, this.f.z, this.c);
if (this.h < 2 || this.h > 21) {
this.f = null;
this.h = 0;
}
}
if (this.f != null) {
this.g = this.a();
}
}
protected int a(int i, int j, int k, int l) {
int i1 = Direction.a[l];
int j1 = Direction.b[l];
int k1;
Block block;
for (k1 = 0; k1 < 22; ++k1) {
block = this.a.getType(i + i1 * k1, j, k + j1 * k1);
if (!this.a(block)) {
break;
}
Block block1 = this.a.getType(i + i1 * k1, j - 1, k + j1 * k1);
if (block1 != Blocks.OBSIDIAN) {
break;
}
}
block = this.a.getType(i + i1 * k1, j, k + j1 * k1);
return block == Blocks.OBSIDIAN ? k1 : 0;
}
protected int a() {
// CraftBukkit start
this.blocks.clear();
org.bukkit.World bworld = this.a.getWorld();
// CraftBukkit end
int i;
int j;
int k;
int l;
label56:
for (this.g = 0; this.g < 21; ++this.g) {
i = this.f.y + this.g;
for (j = 0; j < this.h; ++j) {
k = this.f.x + j * Direction.a[BlockPortal.a[this.b][1]];
l = this.f.z + j * Direction.b[BlockPortal.a[this.b][1]];
Block block = this.a.getType(k, i, l);
if (!this.a(block)) {
break label56;
}
if (block == Blocks.PORTAL) {
++this.e;
}
if (j == 0) {
block = this.a.getType(k + Direction.a[BlockPortal.a[this.b][0]], i, l + Direction.b[BlockPortal.a[this.b][0]]);
if (block != Blocks.OBSIDIAN) {
break label56;
// CraftBukkit start - add the block to our list
} else {
blocks.add(bworld.getBlockAt(k + Direction.a[BlockPortal.a[this.b][0]], i, l + Direction.b[BlockPortal.a[this.b][0]]));
// CraftBukkit end
}
} else if (j == this.h - 1) {
block = this.a.getType(k + Direction.a[BlockPortal.a[this.b][1]], i, l + Direction.b[BlockPortal.a[this.b][1]]);
if (block != Blocks.OBSIDIAN) {
break label56;
// CraftBukkit start - add the block to our list
} else {
blocks.add(bworld.getBlockAt(k + Direction.a[BlockPortal.a[this.b][1]], i, l + Direction.b[BlockPortal.a[this.b][1]]));
// CraftBukkit end
}
}
}
}
for (i = 0; i < this.h; ++i) {
j = this.f.x + i * Direction.a[BlockPortal.a[this.b][1]];
k = this.f.y + this.g;
l = this.f.z + i * Direction.b[BlockPortal.a[this.b][1]];
if (this.a.getType(j, k, l) != Blocks.OBSIDIAN) {
this.g = 0;
break;
// CraftBukkit start - add the block to our list
} else {
blocks.add(bworld.getBlockAt(j, k, l));
// CraftBukkit end
}
}
if (this.g <= 21 && this.g >= 3) {
return this.g;
} else {
this.f = null;
this.h = 0;
this.g = 0;
return 0;
}
}
protected boolean a(Block block) {
return block.material == Material.AIR || block == Blocks.FIRE || block == Blocks.PORTAL;
}
public boolean b() {
return this.f != null && this.h >= 2 && this.h <= 21 && this.g >= 3 && this.g <= 21;
}
// CraftBukkit start - return boolean
public boolean c() {
org.bukkit.World bworld = this.a.getWorld();
// Copy below for loop
for (int i = 0; i < this.h; ++i) {
int j = this.f.x + Direction.a[this.c] * i;
int k = this.f.z + Direction.b[this.c] * i;
for (int l = 0; l < this.g; ++l) {
int i1 = this.f.y + l;
blocks.add(bworld.getBlockAt(j, i1, k));
}
}
PortalCreateEvent event = new PortalCreateEvent(blocks, bworld, PortalCreateEvent.CreateReason.FIRE);
this.a.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return false;
}
// CraftBukkit end
for (int i = 0; i < this.h; ++i) {
int j = this.f.x + Direction.a[this.c] * i;
int k = this.f.z + Direction.b[this.c] * i;
for (int l = 0; l < this.g; ++l) {
int i1 = this.f.y + l;
this.a.setTypeAndData(j, i1, k, Blocks.PORTAL, this.b, 2);
}
}
return true; // CraftBukkit
}
static int a(PortalCreator portalcreator) {
return portalcreator.e;
}
static int b(PortalCreator portalcreator) {
return portalcreator.h;
}
static int c(PortalCreator portalcreator) {
return portalcreator.g;
}
}