Paper/src/main/java/net/minecraft/server/ItemInWorldManager.java

285 lines
9.9 KiB
Java
Raw Normal View History

2011-01-10 02:36:19 +01:00
package net.minecraft.server;
2011-02-01 18:06:17 +01:00
// CraftBukkit start
import org.bukkit.event.block.BlockBreakEvent;
2011-03-23 16:38:42 +01:00
import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.craftbukkit.event.CraftEventFactory;
import org.bukkit.event.Event;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
2011-02-01 18:06:17 +01:00
// CraftBukkit end
2011-01-10 02:36:19 +01:00
public class ItemInWorldManager {
2011-09-15 02:23:52 +02:00
public World world;
public EntityHuman player;
2011-09-15 02:23:52 +02:00
private int c = -1;
private float d = 0.0F;
private int lastDigTick;
2011-03-31 22:40:00 +02:00
private int f;
2011-01-10 09:30:34 +01:00
private int g;
2011-09-15 02:23:52 +02:00
private int h;
private int currentTick;
2011-09-15 02:23:52 +02:00
private boolean j;
2011-03-31 22:40:00 +02:00
private int k;
2011-02-23 03:37:56 +01:00
private int l;
private int m;
2011-09-15 02:23:52 +02:00
private int n;
2011-01-10 02:36:19 +01:00
2011-09-15 02:23:52 +02:00
public ItemInWorldManager(World world) {
this.world = world;
}
public void a(int i) {
this.c = i;
if (i == 0) {
this.player.K.c = false;
this.player.K.b = false;
this.player.K.d = false;
this.player.K.a = false;
} else {
this.player.K.c = true;
this.player.K.d = true;
this.player.K.a = true;
}
}
public int a() {
return this.c;
}
public boolean b() {
return this.c == 1;
}
public void b(int i) {
if (this.c == -1) {
this.c = i;
}
this.a(this.c);
2011-01-10 02:36:19 +01:00
}
2011-09-15 02:23:52 +02:00
public void c() {
this.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit
2011-09-15 02:23:52 +02:00
if (this.j) {
int i = this.currentTick - this.n;
int j = this.world.getTypeId(this.k, this.l, this.m);
2011-02-23 03:37:56 +01:00
if (j != 0) {
Block block = Block.byId[j];
float f = block.getDamage(this.player) * (float) (i + 1);
2011-02-23 03:37:56 +01:00
if (f >= 1.0F) {
2011-09-15 02:23:52 +02:00
this.j = false;
this.c(this.k, this.l, this.m);
2011-02-23 03:37:56 +01:00
}
} else {
2011-09-15 02:23:52 +02:00
this.j = false;
2011-02-23 03:37:56 +01:00
}
}
}
2011-05-26 14:48:22 +02:00
public void dig(int i, int j, int k, int l) {
// this.world.douseFire((EntityHuman) null, i, j, k, l); // CraftBukkit - moved down
2011-09-15 02:23:52 +02:00
if (this.b()) {
this.c(i, j, k);
} else {
this.lastDigTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit
int i1 = this.world.getTypeId(i, j, k);
2011-01-10 02:36:19 +01:00
2011-09-15 02:23:52 +02:00
// CraftBukkit start
// Swings at air do *NOT* exist.
if (i1 <= 0) {
return;
}
2011-09-15 02:23:52 +02:00
PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, i, j, k, l, this.player.inventory.getItemInHand());
2011-09-15 02:23:52 +02:00
if (event.useInteractedBlock() == Event.Result.DENY) {
// If we denied a door from opening, we need to send a correcting update to the client, as it already opened the door.
if (i1 == Block.WOODEN_DOOR.id) {
// For some reason *BOTH* the bottom/top part have to be marked updated.
boolean bottom = (this.world.getData(i, j, k) & 8) == 0;
((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, this.world));
((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j + (bottom ? 1 : -1), k, this.world));
} else if (i1 == Block.TRAP_DOOR.id) {
((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, this.world));
}
} else {
Block.byId[i1].b(this.world, i, j, k, this.player);
// Allow fire punching to be blocked
this.world.douseFire((EntityHuman) null, i, j, k, l);
}
2011-01-29 22:50:29 +01:00
2011-09-15 02:23:52 +02:00
// Handle hitting a block
float toolDamage = Block.byId[i1].getDamage(this.player);
if (event.useItemInHand() == Event.Result.DENY) {
// If we 'insta destroyed' then the client needs to be informed.
if (toolDamage > 1.0f) {
((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, this.world));
}
return;
2011-03-24 22:42:23 +01:00
}
2011-09-15 02:23:52 +02:00
BlockDamageEvent blockEvent = CraftEventFactory.callBlockDamageEvent(this.player, i, j, k, this.player.inventory.getItemInHand(), toolDamage >= 1.0f);
2011-03-23 16:38:42 +01:00
2011-09-15 02:23:52 +02:00
if (blockEvent.isCancelled()) {
return;
}
2011-03-23 16:38:42 +01:00
2011-09-15 02:23:52 +02:00
if (blockEvent.getInstaBreak()) {
toolDamage = 2.0f;
}
2011-03-23 16:38:42 +01:00
2011-09-15 02:23:52 +02:00
if (toolDamage >= 1.0F) {
// CraftBukkit end
this.c(i, j, k);
} else {
this.f = i;
this.g = j;
this.h = k;
}
2011-01-10 02:36:19 +01:00
}
}
2011-05-26 14:48:22 +02:00
public void a(int i, int j, int k) {
2011-09-15 02:23:52 +02:00
if (i == this.f && j == this.g && k == this.h) {
this.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit
int l = this.currentTick - this.lastDigTick;
int i1 = this.world.getTypeId(i, j, k);
2011-01-29 22:50:29 +01:00
2011-02-23 03:37:56 +01:00
if (i1 != 0) {
2011-01-29 22:50:29 +01:00
Block block = Block.byId[i1];
float f = block.getDamage(this.player) * (float) (l + 1);
2011-02-23 03:37:56 +01:00
2011-04-20 22:47:26 +02:00
if (f >= 0.7F) {
2011-05-26 14:48:22 +02:00
this.c(i, j, k);
2011-09-15 02:23:52 +02:00
} else if (!this.j) {
this.j = true;
this.k = i;
this.l = j;
this.m = k;
this.n = this.lastDigTick;
2011-01-29 22:50:29 +01:00
}
}
2011-05-14 16:29:42 +02:00
// CraftBukkit start - force blockreset to client
2011-03-24 22:42:23 +01:00
} else {
((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, this.world));
2011-03-24 22:42:23 +01:00
// CraftBukkit end
2011-01-10 02:36:19 +01:00
}
2011-02-23 03:37:56 +01:00
2011-09-15 02:23:52 +02:00
this.d = 0.0F;
2011-01-10 02:36:19 +01:00
}
2011-05-26 14:48:22 +02:00
public boolean b(int i, int j, int k) {
Block block = Block.byId[this.world.getTypeId(i, j, k)];
int l = this.world.getData(i, j, k);
boolean flag = this.world.setTypeId(i, j, k, 0);
2011-01-10 02:36:19 +01:00
if (block != null && flag) {
block.postBreak(this.world, i, j, k, l);
2011-01-10 02:36:19 +01:00
}
2011-01-29 22:50:29 +01:00
2011-01-10 02:36:19 +01:00
return flag;
}
2011-05-26 14:48:22 +02:00
public boolean c(int i, int j, int k) {
2011-02-23 03:37:56 +01:00
// CraftBukkit start
if (this.player instanceof EntityPlayer) {
org.bukkit.block.Block block = this.world.getWorld().getBlockAt(i, j, k);
2011-02-01 18:06:17 +01:00
BlockBreakEvent event = new BlockBreakEvent(block, (org.bukkit.entity.Player) this.player.getBukkitEntity());
this.world.getServer().getPluginManager().callEvent(event);
2011-02-01 18:06:17 +01:00
2011-02-23 13:56:36 +01:00
if (event.isCancelled()) {
2011-02-25 04:37:47 +01:00
return false;
2011-02-01 18:06:17 +01:00
}
}
2011-02-23 03:37:56 +01:00
// CraftBukkit end
2011-02-01 18:06:17 +01:00
int l = this.world.getTypeId(i, j, k);
int i1 = this.world.getData(i, j, k);
2011-05-26 14:48:22 +02:00
this.world.a(this.player, 2001, i, j, k, l + this.world.getData(i, j, k) * 256);
boolean flag = this.b(i, j, k);
2011-01-10 02:36:19 +01:00
2011-09-15 02:23:52 +02:00
if (this.b()) {
((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, this.world));
} else {
ItemStack itemstack = this.player.K();
if (itemstack != null) {
itemstack.a(l, i, j, k, this.player);
if (itemstack.count == 0) {
itemstack.a(this.player);
this.player.L();
}
2011-01-10 02:36:19 +01:00
}
2011-01-29 22:50:29 +01:00
2011-09-15 02:23:52 +02:00
if (flag && this.player.b(Block.byId[l])) {
Block.byId[l].a(this.world, this.player, i, j, k, i1);
}
2011-01-10 02:36:19 +01:00
}
2011-01-29 22:50:29 +01:00
2011-01-10 02:36:19 +01:00
return flag;
}
public boolean useItem(EntityHuman entityhuman, World world, ItemStack itemstack) {
2011-01-29 22:50:29 +01:00
int i = itemstack.count;
2011-09-15 02:23:52 +02:00
int j = itemstack.getData();
2011-01-29 22:50:29 +01:00
ItemStack itemstack1 = itemstack.a(world, entityhuman);
2011-01-10 02:36:19 +01:00
2011-01-29 22:50:29 +01:00
if (itemstack1 == itemstack && (itemstack1 == null || itemstack1.count == i)) {
return false;
} else {
entityhuman.inventory.items[entityhuman.inventory.itemInHandIndex] = itemstack1;
2011-09-15 02:23:52 +02:00
if (this.b()) {
itemstack1.count = i;
itemstack1.b(j);
}
2011-01-29 22:50:29 +01:00
if (itemstack1.count == 0) {
entityhuman.inventory.items[entityhuman.inventory.itemInHandIndex] = null;
2011-01-10 02:36:19 +01:00
}
2011-01-29 22:50:29 +01:00
2011-01-10 02:36:19 +01:00
return true;
}
}
2011-09-15 02:23:52 +02:00
// TODO: Review this code, it changed in 1.8 but I'm not sure if we need to update or not
public boolean interact(EntityHuman entityhuman, World world, ItemStack itemstack, int i, int j, int k, int l) {
2011-01-29 22:50:29 +01:00
int i1 = world.getTypeId(i, j, k);
2011-01-10 02:36:19 +01:00
// CraftBukkit start - Interact
boolean result = false;
if (i1 > 0) {
PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(entityhuman, Action.RIGHT_CLICK_BLOCK, i, j, k, l, itemstack);
2011-03-24 12:11:28 +01:00
if (event.useInteractedBlock() == Event.Result.DENY) {
// If we denied a door from opening, we need to send a correcting update to the client, as it already opened the door.
if (i1 == Block.WOODEN_DOOR.id) {
boolean bottom = (world.getData(i, j, k) & 8) == 0;
((EntityPlayer) entityhuman).netServerHandler.sendPacket(new Packet53BlockChange(i, j + (bottom ? 1 : -1), k, world));
}
result = (event.useItemInHand() != Event.Result.ALLOW);
} else {
result = Block.byId[i1].interact(world, i, j, k, entityhuman);
}
if (itemstack != null && !result) {
result = itemstack.placeItem(entityhuman, world, i, j, k, l);
}
2011-03-24 12:11:28 +01:00
// If we have 'true' and no explicit deny *or* an explicit allow -- run the item part of the hook
if (itemstack != null && ((!result && event.useItemInHand() != Event.Result.DENY) || event.useItemInHand() == Event.Result.ALLOW)) {
this.useItem(entityhuman, world, itemstack);
}
}
return result;
2011-05-14 16:29:42 +02:00
// CraftBukkit end
2011-01-10 02:36:19 +01:00
}
2011-09-15 02:23:52 +02:00
public void a(WorldServer worldserver) {
this.world = worldserver;
}
2011-01-10 09:30:34 +01:00
}