Fixed blocks not keeping data on placement
Dieser Commit ist enthalten in:
Ursprung
fe4d5db0e0
Commit
202e44ab1a
@ -87,8 +87,8 @@ public class ItemBlock extends Item {
|
||||
if (this.a == 79) {
|
||||
world.a(i, j, k, 20);
|
||||
}
|
||||
world.a(i, j, k, oldMaterial);
|
||||
world.c(i, j, k, oldData);
|
||||
world.b(i, j, k, oldMaterial);
|
||||
world.d(i, j, k, oldData);
|
||||
} else {
|
||||
world.g(i, j, k);
|
||||
world.h(i, j, k, this.a);
|
||||
|
@ -1,50 +1,50 @@
|
||||
package net.minecraft.server;
|
||||
|
||||
public class Slot {
|
||||
|
||||
public final int a; // CraftBukkit: private -> public
|
||||
public final IInventory b; // CraftBukkit: private -> public
|
||||
public int c;
|
||||
public int d;
|
||||
public int e;
|
||||
|
||||
public Slot(IInventory iinventory, int i, int j, int k) {
|
||||
b = iinventory;
|
||||
a = i;
|
||||
d = j;
|
||||
e = k;
|
||||
}
|
||||
|
||||
public void b() {
|
||||
d();
|
||||
}
|
||||
|
||||
public boolean a(ItemStack itemstack) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public ItemStack c() {
|
||||
return b.a(a);
|
||||
}
|
||||
|
||||
public void b(ItemStack itemstack) {
|
||||
b.a(a, itemstack);
|
||||
d();
|
||||
}
|
||||
|
||||
public void d() {
|
||||
b.d();
|
||||
}
|
||||
|
||||
public int a() {
|
||||
return b.c();
|
||||
}
|
||||
|
||||
public ItemStack a(int i) {
|
||||
return b.b(a, i);
|
||||
}
|
||||
|
||||
public boolean a(IInventory iinventory, int i) {
|
||||
return iinventory == b && i == a;
|
||||
}
|
||||
}
|
||||
package net.minecraft.server;
|
||||
|
||||
public class Slot {
|
||||
|
||||
public final int a; // CraftBukkit: private -> public
|
||||
public final IInventory b; // CraftBukkit: private -> public
|
||||
public int c;
|
||||
public int d;
|
||||
public int e;
|
||||
|
||||
public Slot(IInventory iinventory, int i, int j, int k) {
|
||||
b = iinventory;
|
||||
a = i;
|
||||
d = j;
|
||||
e = k;
|
||||
}
|
||||
|
||||
public void b() {
|
||||
d();
|
||||
}
|
||||
|
||||
public boolean a(ItemStack itemstack) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public ItemStack c() {
|
||||
return b.a(a);
|
||||
}
|
||||
|
||||
public void b(ItemStack itemstack) {
|
||||
b.a(a, itemstack);
|
||||
d();
|
||||
}
|
||||
|
||||
public void d() {
|
||||
b.d();
|
||||
}
|
||||
|
||||
public int a() {
|
||||
return b.c();
|
||||
}
|
||||
|
||||
public ItemStack a(int i) {
|
||||
return b.b(a, i);
|
||||
}
|
||||
|
||||
public boolean a(IInventory iinventory, int i) {
|
||||
return iinventory == b && i == a;
|
||||
}
|
||||
}
|
||||
|
@ -1,100 +1,100 @@
|
||||
package net.minecraft.server;
|
||||
|
||||
public class TileEntityChest extends TileEntity implements IInventory {
|
||||
|
||||
private ItemStack e[];
|
||||
|
||||
// CraftBukkit start
|
||||
public ItemStack[] getContents() {
|
||||
return e;
|
||||
}
|
||||
// CraftBukkit end
|
||||
|
||||
public TileEntityChest() {
|
||||
e = new ItemStack[36];
|
||||
}
|
||||
|
||||
public int h_() {
|
||||
return 27;
|
||||
}
|
||||
|
||||
public ItemStack a(int i) {
|
||||
return e[i];
|
||||
}
|
||||
|
||||
public ItemStack b(int i, int j) {
|
||||
if (e[i] != null) {
|
||||
if (e[i].a <= j) {
|
||||
ItemStack itemstack = e[i];
|
||||
|
||||
e[i] = null;
|
||||
d();
|
||||
return itemstack;
|
||||
}
|
||||
ItemStack itemstack1 = e[i].a(j);
|
||||
|
||||
if (e[i].a == 0) {
|
||||
e[i] = null;
|
||||
}
|
||||
d();
|
||||
return itemstack1;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void a(int i, ItemStack itemstack) {
|
||||
e[i] = itemstack;
|
||||
if (itemstack != null && itemstack.a > c()) {
|
||||
itemstack.a = c();
|
||||
}
|
||||
d();
|
||||
}
|
||||
|
||||
public String b() {
|
||||
return "Chest";
|
||||
}
|
||||
|
||||
public void a(NBTTagCompound nbttagcompound) {
|
||||
super.a(nbttagcompound);
|
||||
NBTTagList nbttaglist = nbttagcompound.k("Items");
|
||||
|
||||
e = new ItemStack[h_()];
|
||||
for (int i = 0; i < nbttaglist.b(); i++) {
|
||||
NBTTagCompound nbttagcompound1 = (NBTTagCompound) nbttaglist.a(i);
|
||||
int j = nbttagcompound1.b("Slot") & 0xff;
|
||||
|
||||
if (j >= 0 && j < e.length) {
|
||||
e[j] = new ItemStack(nbttagcompound1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void b(NBTTagCompound nbttagcompound) {
|
||||
super.b(nbttagcompound);
|
||||
NBTTagList nbttaglist = new NBTTagList();
|
||||
|
||||
for (int i = 0; i < e.length; i++) {
|
||||
if (e[i] != null) {
|
||||
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
|
||||
|
||||
nbttagcompound1.a("Slot", (byte) i);
|
||||
e[i].a(nbttagcompound1);
|
||||
nbttaglist.a(((NBTBase) (nbttagcompound1)));
|
||||
}
|
||||
}
|
||||
|
||||
nbttagcompound.a("Items", ((NBTBase) (nbttaglist)));
|
||||
}
|
||||
|
||||
public int c() {
|
||||
return 64;
|
||||
}
|
||||
|
||||
public boolean a_(EntityPlayer entityplayer) {
|
||||
if (a.m(b, c, d) != this) {
|
||||
return false;
|
||||
}
|
||||
return entityplayer.d((double) b + 0.5D, (double) c + 0.5D, (double) d + 0.5D) <= 64D;
|
||||
}
|
||||
}
|
||||
package net.minecraft.server;
|
||||
|
||||
public class TileEntityChest extends TileEntity implements IInventory {
|
||||
|
||||
private ItemStack e[];
|
||||
|
||||
// CraftBukkit start
|
||||
public ItemStack[] getContents() {
|
||||
return e;
|
||||
}
|
||||
// CraftBukkit end
|
||||
|
||||
public TileEntityChest() {
|
||||
e = new ItemStack[36];
|
||||
}
|
||||
|
||||
public int h_() {
|
||||
return 27;
|
||||
}
|
||||
|
||||
public ItemStack a(int i) {
|
||||
return e[i];
|
||||
}
|
||||
|
||||
public ItemStack b(int i, int j) {
|
||||
if (e[i] != null) {
|
||||
if (e[i].a <= j) {
|
||||
ItemStack itemstack = e[i];
|
||||
|
||||
e[i] = null;
|
||||
d();
|
||||
return itemstack;
|
||||
}
|
||||
ItemStack itemstack1 = e[i].a(j);
|
||||
|
||||
if (e[i].a == 0) {
|
||||
e[i] = null;
|
||||
}
|
||||
d();
|
||||
return itemstack1;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void a(int i, ItemStack itemstack) {
|
||||
e[i] = itemstack;
|
||||
if (itemstack != null && itemstack.a > c()) {
|
||||
itemstack.a = c();
|
||||
}
|
||||
d();
|
||||
}
|
||||
|
||||
public String b() {
|
||||
return "Chest";
|
||||
}
|
||||
|
||||
public void a(NBTTagCompound nbttagcompound) {
|
||||
super.a(nbttagcompound);
|
||||
NBTTagList nbttaglist = nbttagcompound.k("Items");
|
||||
|
||||
e = new ItemStack[h_()];
|
||||
for (int i = 0; i < nbttaglist.b(); i++) {
|
||||
NBTTagCompound nbttagcompound1 = (NBTTagCompound) nbttaglist.a(i);
|
||||
int j = nbttagcompound1.b("Slot") & 0xff;
|
||||
|
||||
if (j >= 0 && j < e.length) {
|
||||
e[j] = new ItemStack(nbttagcompound1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void b(NBTTagCompound nbttagcompound) {
|
||||
super.b(nbttagcompound);
|
||||
NBTTagList nbttaglist = new NBTTagList();
|
||||
|
||||
for (int i = 0; i < e.length; i++) {
|
||||
if (e[i] != null) {
|
||||
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
|
||||
|
||||
nbttagcompound1.a("Slot", (byte) i);
|
||||
e[i].a(nbttagcompound1);
|
||||
nbttaglist.a(((NBTBase) (nbttagcompound1)));
|
||||
}
|
||||
}
|
||||
|
||||
nbttagcompound.a("Items", ((NBTBase) (nbttaglist)));
|
||||
}
|
||||
|
||||
public int c() {
|
||||
return 64;
|
||||
}
|
||||
|
||||
public boolean a_(EntityPlayer entityplayer) {
|
||||
if (a.m(b, c, d) != this) {
|
||||
return false;
|
||||
}
|
||||
return entityplayer.d((double) b + 0.5D, (double) c + 0.5D, (double) d + 0.5D) <= 64D;
|
||||
}
|
||||
}
|
||||
|
@ -1,209 +1,209 @@
|
||||
package net.minecraft.server;
|
||||
|
||||
public class TileEntityFurnace extends TileEntity implements IInventory {
|
||||
|
||||
private ItemStack h[];
|
||||
public int e;
|
||||
public int f;
|
||||
public int g;
|
||||
|
||||
// CraftBukkit start
|
||||
public ItemStack[] getContents() {
|
||||
return h;
|
||||
}
|
||||
// CraftBukkit end
|
||||
|
||||
public TileEntityFurnace() {
|
||||
h = new ItemStack[3];
|
||||
e = 0;
|
||||
f = 0;
|
||||
g = 0;
|
||||
}
|
||||
|
||||
public int h_() {
|
||||
return h.length;
|
||||
}
|
||||
|
||||
public ItemStack a(int j) {
|
||||
return h[j];
|
||||
}
|
||||
|
||||
public ItemStack b(int j, int k) {
|
||||
if (h[j] != null) {
|
||||
if (h[j].a <= k) {
|
||||
ItemStack itemstack = h[j];
|
||||
|
||||
h[j] = null;
|
||||
return itemstack;
|
||||
}
|
||||
ItemStack itemstack1 = h[j].a(k);
|
||||
|
||||
if (h[j].a == 0) {
|
||||
h[j] = null;
|
||||
}
|
||||
return itemstack1;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void a(int j, ItemStack itemstack) {
|
||||
h[j] = itemstack;
|
||||
if (itemstack != null && itemstack.a > c()) {
|
||||
itemstack.a = c();
|
||||
}
|
||||
}
|
||||
|
||||
public String b() {
|
||||
return "Furnace";
|
||||
}
|
||||
|
||||
public void a(NBTTagCompound nbttagcompound) {
|
||||
super.a(nbttagcompound);
|
||||
NBTTagList nbttaglist = nbttagcompound.k("Items");
|
||||
|
||||
h = new ItemStack[h_()];
|
||||
for (int j = 0; j < nbttaglist.b(); j++) {
|
||||
NBTTagCompound nbttagcompound1 = (NBTTagCompound) nbttaglist.a(j);
|
||||
byte byte0 = nbttagcompound1.b("Slot");
|
||||
|
||||
if (byte0 >= 0 && byte0 < h.length) {
|
||||
h[byte0] = new ItemStack(nbttagcompound1);
|
||||
}
|
||||
}
|
||||
|
||||
e = ((int) (nbttagcompound.c("BurnTime")));
|
||||
g = ((int) (nbttagcompound.c("CookTime")));
|
||||
f = a(h[1]);
|
||||
}
|
||||
|
||||
public void b(NBTTagCompound nbttagcompound) {
|
||||
super.b(nbttagcompound);
|
||||
nbttagcompound.a("BurnTime", (short) e);
|
||||
nbttagcompound.a("CookTime", (short) g);
|
||||
NBTTagList nbttaglist = new NBTTagList();
|
||||
|
||||
for (int j = 0; j < h.length; j++) {
|
||||
if (h[j] != null) {
|
||||
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
|
||||
|
||||
nbttagcompound1.a("Slot", (byte) j);
|
||||
h[j].a(nbttagcompound1);
|
||||
nbttaglist.a(((NBTBase) (nbttagcompound1)));
|
||||
}
|
||||
}
|
||||
|
||||
nbttagcompound.a("Items", ((NBTBase) (nbttaglist)));
|
||||
}
|
||||
|
||||
public int c() {
|
||||
return 64;
|
||||
}
|
||||
|
||||
public boolean e() {
|
||||
return e > 0;
|
||||
}
|
||||
|
||||
public void f() {
|
||||
boolean flag = e > 0;
|
||||
boolean flag1 = false;
|
||||
|
||||
if (e > 0) {
|
||||
e--;
|
||||
}
|
||||
if (!a.z) {
|
||||
if (e == 0 && i()) {
|
||||
f = e = a(h[1]);
|
||||
if (e > 0) {
|
||||
flag1 = true;
|
||||
if (h[1] != null) {
|
||||
h[1].a--;
|
||||
if (h[1].a == 0) {
|
||||
h[1] = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (e() && i()) {
|
||||
g++;
|
||||
if (g == 200) {
|
||||
g = 0;
|
||||
h();
|
||||
flag1 = true;
|
||||
}
|
||||
} else {
|
||||
g = 0;
|
||||
}
|
||||
if (flag != (e > 0)) {
|
||||
flag1 = true;
|
||||
BlockFurnace.a(e > 0, a, b, c, d);
|
||||
}
|
||||
}
|
||||
if (flag1) {
|
||||
d();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean i() {
|
||||
if (h[0] == null) {
|
||||
return false;
|
||||
}
|
||||
ItemStack itemstack = FurnaceRecipes.a().a(h[0].a().ba);
|
||||
|
||||
if (itemstack == null) {
|
||||
return false;
|
||||
}
|
||||
if (h[2] == null) {
|
||||
return true;
|
||||
}
|
||||
if (!h[2].a(itemstack)) {
|
||||
return false;
|
||||
}
|
||||
if (h[2].a < c() && h[2].a < h[2].b()) {
|
||||
return true;
|
||||
}
|
||||
return h[2].a < itemstack.b();
|
||||
}
|
||||
|
||||
public void h() {
|
||||
if (!i()) {
|
||||
return;
|
||||
}
|
||||
ItemStack itemstack = FurnaceRecipes.a().a(h[0].a().ba);
|
||||
|
||||
if (h[2] == null) {
|
||||
h[2] = itemstack.j();
|
||||
} else if (h[2].c == itemstack.c) {
|
||||
h[2].a++;
|
||||
}
|
||||
h[0].a--;
|
||||
if (h[0].a <= 0) {
|
||||
h[0] = null;
|
||||
}
|
||||
}
|
||||
|
||||
private int a(ItemStack itemstack) {
|
||||
if (itemstack == null) {
|
||||
return 0;
|
||||
}
|
||||
int j = itemstack.a().ba;
|
||||
|
||||
if (j < 256 && Block.m[j].bt == Material.c) {
|
||||
return 300;
|
||||
}
|
||||
if (j == Item.B.ba) {
|
||||
return 100;
|
||||
}
|
||||
if (j == Item.k.ba) {
|
||||
return 1600;
|
||||
}
|
||||
return j != Item.aw.ba ? 0 : 20000;
|
||||
}
|
||||
|
||||
public boolean a_(EntityPlayer entityplayer) {
|
||||
if (a.m(b, c, d) != this) {
|
||||
return false;
|
||||
}
|
||||
return entityplayer.d((double) b + 0.5D, (double) c + 0.5D, (double) d + 0.5D) <= 64D;
|
||||
}
|
||||
package net.minecraft.server;
|
||||
|
||||
public class TileEntityFurnace extends TileEntity implements IInventory {
|
||||
|
||||
private ItemStack h[];
|
||||
public int e;
|
||||
public int f;
|
||||
public int g;
|
||||
|
||||
// CraftBukkit start
|
||||
public ItemStack[] getContents() {
|
||||
return h;
|
||||
}
|
||||
// CraftBukkit end
|
||||
|
||||
public TileEntityFurnace() {
|
||||
h = new ItemStack[3];
|
||||
e = 0;
|
||||
f = 0;
|
||||
g = 0;
|
||||
}
|
||||
|
||||
public int h_() {
|
||||
return h.length;
|
||||
}
|
||||
|
||||
public ItemStack a(int j) {
|
||||
return h[j];
|
||||
}
|
||||
|
||||
public ItemStack b(int j, int k) {
|
||||
if (h[j] != null) {
|
||||
if (h[j].a <= k) {
|
||||
ItemStack itemstack = h[j];
|
||||
|
||||
h[j] = null;
|
||||
return itemstack;
|
||||
}
|
||||
ItemStack itemstack1 = h[j].a(k);
|
||||
|
||||
if (h[j].a == 0) {
|
||||
h[j] = null;
|
||||
}
|
||||
return itemstack1;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void a(int j, ItemStack itemstack) {
|
||||
h[j] = itemstack;
|
||||
if (itemstack != null && itemstack.a > c()) {
|
||||
itemstack.a = c();
|
||||
}
|
||||
}
|
||||
|
||||
public String b() {
|
||||
return "Furnace";
|
||||
}
|
||||
|
||||
public void a(NBTTagCompound nbttagcompound) {
|
||||
super.a(nbttagcompound);
|
||||
NBTTagList nbttaglist = nbttagcompound.k("Items");
|
||||
|
||||
h = new ItemStack[h_()];
|
||||
for (int j = 0; j < nbttaglist.b(); j++) {
|
||||
NBTTagCompound nbttagcompound1 = (NBTTagCompound) nbttaglist.a(j);
|
||||
byte byte0 = nbttagcompound1.b("Slot");
|
||||
|
||||
if (byte0 >= 0 && byte0 < h.length) {
|
||||
h[byte0] = new ItemStack(nbttagcompound1);
|
||||
}
|
||||
}
|
||||
|
||||
e = ((int) (nbttagcompound.c("BurnTime")));
|
||||
g = ((int) (nbttagcompound.c("CookTime")));
|
||||
f = a(h[1]);
|
||||
}
|
||||
|
||||
public void b(NBTTagCompound nbttagcompound) {
|
||||
super.b(nbttagcompound);
|
||||
nbttagcompound.a("BurnTime", (short) e);
|
||||
nbttagcompound.a("CookTime", (short) g);
|
||||
NBTTagList nbttaglist = new NBTTagList();
|
||||
|
||||
for (int j = 0; j < h.length; j++) {
|
||||
if (h[j] != null) {
|
||||
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
|
||||
|
||||
nbttagcompound1.a("Slot", (byte) j);
|
||||
h[j].a(nbttagcompound1);
|
||||
nbttaglist.a(((NBTBase) (nbttagcompound1)));
|
||||
}
|
||||
}
|
||||
|
||||
nbttagcompound.a("Items", ((NBTBase) (nbttaglist)));
|
||||
}
|
||||
|
||||
public int c() {
|
||||
return 64;
|
||||
}
|
||||
|
||||
public boolean e() {
|
||||
return e > 0;
|
||||
}
|
||||
|
||||
public void f() {
|
||||
boolean flag = e > 0;
|
||||
boolean flag1 = false;
|
||||
|
||||
if (e > 0) {
|
||||
e--;
|
||||
}
|
||||
if (!a.z) {
|
||||
if (e == 0 && i()) {
|
||||
f = e = a(h[1]);
|
||||
if (e > 0) {
|
||||
flag1 = true;
|
||||
if (h[1] != null) {
|
||||
h[1].a--;
|
||||
if (h[1].a == 0) {
|
||||
h[1] = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (e() && i()) {
|
||||
g++;
|
||||
if (g == 200) {
|
||||
g = 0;
|
||||
h();
|
||||
flag1 = true;
|
||||
}
|
||||
} else {
|
||||
g = 0;
|
||||
}
|
||||
if (flag != (e > 0)) {
|
||||
flag1 = true;
|
||||
BlockFurnace.a(e > 0, a, b, c, d);
|
||||
}
|
||||
}
|
||||
if (flag1) {
|
||||
d();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean i() {
|
||||
if (h[0] == null) {
|
||||
return false;
|
||||
}
|
||||
ItemStack itemstack = FurnaceRecipes.a().a(h[0].a().ba);
|
||||
|
||||
if (itemstack == null) {
|
||||
return false;
|
||||
}
|
||||
if (h[2] == null) {
|
||||
return true;
|
||||
}
|
||||
if (!h[2].a(itemstack)) {
|
||||
return false;
|
||||
}
|
||||
if (h[2].a < c() && h[2].a < h[2].b()) {
|
||||
return true;
|
||||
}
|
||||
return h[2].a < itemstack.b();
|
||||
}
|
||||
|
||||
public void h() {
|
||||
if (!i()) {
|
||||
return;
|
||||
}
|
||||
ItemStack itemstack = FurnaceRecipes.a().a(h[0].a().ba);
|
||||
|
||||
if (h[2] == null) {
|
||||
h[2] = itemstack.j();
|
||||
} else if (h[2].c == itemstack.c) {
|
||||
h[2].a++;
|
||||
}
|
||||
h[0].a--;
|
||||
if (h[0].a <= 0) {
|
||||
h[0] = null;
|
||||
}
|
||||
}
|
||||
|
||||
private int a(ItemStack itemstack) {
|
||||
if (itemstack == null) {
|
||||
return 0;
|
||||
}
|
||||
int j = itemstack.a().ba;
|
||||
|
||||
if (j < 256 && Block.m[j].bt == Material.c) {
|
||||
return 300;
|
||||
}
|
||||
if (j == Item.B.ba) {
|
||||
return 100;
|
||||
}
|
||||
if (j == Item.k.ba) {
|
||||
return 1600;
|
||||
}
|
||||
return j != Item.aw.ba ? 0 : 20000;
|
||||
}
|
||||
|
||||
public boolean a_(EntityPlayer entityplayer) {
|
||||
if (a.m(b, c, d) != this) {
|
||||
return false;
|
||||
}
|
||||
return entityplayer.d((double) b + 0.5D, (double) c + 0.5D, (double) d + 0.5D) <= 64D;
|
||||
}
|
||||
}
|
@ -1,208 +1,208 @@
|
||||
package org.bukkit.craftbukkit;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import net.minecraft.server.IInventory;
|
||||
|
||||
import org.bukkit.ItemStack;
|
||||
import org.bukkit.Material;
|
||||
|
||||
public class CraftInventory implements org.bukkit.Inventory {
|
||||
protected IInventory inventory;
|
||||
|
||||
public CraftInventory(IInventory inventory) {
|
||||
this.inventory = inventory;
|
||||
}
|
||||
|
||||
public IInventory getInventory() {
|
||||
return inventory;
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return getInventory().h_();
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return getInventory().b();
|
||||
}
|
||||
|
||||
public CraftItemStack getItem(int index) {
|
||||
return new CraftItemStack(getInventory().a(index));
|
||||
}
|
||||
|
||||
public CraftItemStack[] getContents() {
|
||||
CraftItemStack[] items = new CraftItemStack[getSize()];
|
||||
net.minecraft.server.ItemStack[] mcItems = getInventory().getContents();
|
||||
|
||||
for (int i = 0; i < mcItems.length; i++ ) {
|
||||
items[i] = new CraftItemStack(mcItems[i]);
|
||||
}
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
public void setItem(int index, ItemStack item) {
|
||||
getInventory().a( index, new net.minecraft.server.ItemStack( item.getTypeID(), item.getAmount(), 0));
|
||||
}
|
||||
|
||||
public boolean contains(int materialId) {
|
||||
for (ItemStack item: getContents()) {
|
||||
if (item.getTypeID() == materialId) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean contains(Material material) {
|
||||
return contains(material.getID());
|
||||
}
|
||||
|
||||
public boolean contains(ItemStack item) {
|
||||
for (ItemStack i: getContents()) {
|
||||
if (item.equals(i)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public HashMap<Integer, ItemStack> all(int materialId) {
|
||||
HashMap<Integer, ItemStack> slots = new HashMap<Integer, ItemStack>();
|
||||
|
||||
ItemStack[] inventory = getContents();
|
||||
for (int i = 0; i < inventory.length; i++) {
|
||||
ItemStack item = inventory[i];
|
||||
if (item.getTypeID() == materialId) {
|
||||
slots.put( i, item );
|
||||
}
|
||||
}
|
||||
return slots;
|
||||
}
|
||||
|
||||
public HashMap<Integer, ItemStack> all(Material material) {
|
||||
return all(material.getID());
|
||||
}
|
||||
|
||||
public HashMap<Integer, ItemStack> all(ItemStack item) {
|
||||
HashMap<Integer, ItemStack> slots = new HashMap<Integer, ItemStack>();
|
||||
|
||||
ItemStack[] inventory = getContents();
|
||||
for (int i = 0; i < inventory.length; i++) {
|
||||
if (item.equals(inventory[i])) {
|
||||
slots.put( i, item );
|
||||
}
|
||||
}
|
||||
return slots;
|
||||
}
|
||||
|
||||
public int first(int materialId) {
|
||||
ItemStack[] inventory = getContents();
|
||||
for (int i = 0; i < inventory.length; i++) {
|
||||
if (inventory[i].getTypeID() == materialId) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public int first(Material material) {
|
||||
return first(material.getID());
|
||||
}
|
||||
|
||||
public int first(ItemStack item) {
|
||||
ItemStack[] inventory = getContents();
|
||||
for (int i = 0; i < inventory.length; i++) {
|
||||
if (item.equals(inventory[i])) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public int firstEmpty() {
|
||||
return first(Material.AIR);
|
||||
}
|
||||
|
||||
public int firstPartial(int materialId) {
|
||||
ItemStack[] inventory = getContents();
|
||||
for (int i = 0; i < inventory.length; i++) {
|
||||
ItemStack item = inventory[i];
|
||||
if (item != null && item.getTypeID() == materialId && item.getAmount() < item.getMaxStackSize()) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public int firstPartial(Material material) {
|
||||
return firstPartial(material.getID());
|
||||
}
|
||||
|
||||
public int firstPartial(ItemStack item) {
|
||||
return firstPartial(item.getTypeID());
|
||||
}
|
||||
|
||||
public HashMap<Integer, ItemStack> addItem(ItemStack... items) {
|
||||
HashMap<Integer,ItemStack> leftover = new HashMap<Integer,ItemStack>();
|
||||
|
||||
/* TODO: some optimization
|
||||
* - Create a 'firstPartial' with a 'fromIndex'
|
||||
* - Record the lastPartial per Material
|
||||
* - Cache firstEmpty result
|
||||
*/
|
||||
|
||||
for (int i = 0; i < items.length; i++) {
|
||||
ItemStack item = items[i];
|
||||
while (true) {
|
||||
// Do we already have a stack of it?
|
||||
int firstPartial = firstPartial( item.getTypeID() );
|
||||
|
||||
// Drat! no partial stack
|
||||
if (firstPartial == -1) {
|
||||
// Find a free spot!
|
||||
int firstFree = firstEmpty();
|
||||
|
||||
if (firstFree == -1) {
|
||||
// No space at all!
|
||||
leftover.put(i, item);
|
||||
break;
|
||||
} else {
|
||||
// More than a single stack!
|
||||
if (item.getAmount() > getMaxItemStack()) {
|
||||
setItem( firstFree, new ItemStack(item.getTypeID(), getMaxItemStack()));
|
||||
item.setAmount(item.getAmount() - getMaxItemStack());
|
||||
} else {
|
||||
// Just store it
|
||||
setItem( firstFree, item );
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// So, apparently it might only partially fit, well lets do just that
|
||||
ItemStack partialItem = getItem(firstPartial);
|
||||
|
||||
int amount = item.getAmount();
|
||||
int partialAmount = partialItem.getAmount();
|
||||
int maxAmount = partialItem.getMaxStackSize();
|
||||
|
||||
// Check if it fully fits
|
||||
if (amount + partialAmount <= maxAmount) {
|
||||
partialItem.setAmount( amount + partialAmount );
|
||||
break;
|
||||
}
|
||||
|
||||
// It fits partially
|
||||
partialItem.setAmount( maxAmount );
|
||||
item.setAmount( amount + partialAmount - maxAmount );
|
||||
}
|
||||
}
|
||||
}
|
||||
return leftover;
|
||||
}
|
||||
|
||||
private int getMaxItemStack() {
|
||||
return getInventory().c();
|
||||
}
|
||||
|
||||
}
|
||||
package org.bukkit.craftbukkit;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import net.minecraft.server.IInventory;
|
||||
|
||||
import org.bukkit.ItemStack;
|
||||
import org.bukkit.Material;
|
||||
|
||||
public class CraftInventory implements org.bukkit.Inventory {
|
||||
protected IInventory inventory;
|
||||
|
||||
public CraftInventory(IInventory inventory) {
|
||||
this.inventory = inventory;
|
||||
}
|
||||
|
||||
public IInventory getInventory() {
|
||||
return inventory;
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return getInventory().h_();
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return getInventory().b();
|
||||
}
|
||||
|
||||
public CraftItemStack getItem(int index) {
|
||||
return new CraftItemStack(getInventory().a(index));
|
||||
}
|
||||
|
||||
public CraftItemStack[] getContents() {
|
||||
CraftItemStack[] items = new CraftItemStack[getSize()];
|
||||
net.minecraft.server.ItemStack[] mcItems = getInventory().getContents();
|
||||
|
||||
for (int i = 0; i < mcItems.length; i++ ) {
|
||||
items[i] = new CraftItemStack(mcItems[i]);
|
||||
}
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
public void setItem(int index, ItemStack item) {
|
||||
getInventory().a( index, new net.minecraft.server.ItemStack( item.getTypeID(), item.getAmount(), 0));
|
||||
}
|
||||
|
||||
public boolean contains(int materialId) {
|
||||
for (ItemStack item: getContents()) {
|
||||
if (item.getTypeID() == materialId) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean contains(Material material) {
|
||||
return contains(material.getID());
|
||||
}
|
||||
|
||||
public boolean contains(ItemStack item) {
|
||||
for (ItemStack i: getContents()) {
|
||||
if (item.equals(i)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public HashMap<Integer, ItemStack> all(int materialId) {
|
||||
HashMap<Integer, ItemStack> slots = new HashMap<Integer, ItemStack>();
|
||||
|
||||
ItemStack[] inventory = getContents();
|
||||
for (int i = 0; i < inventory.length; i++) {
|
||||
ItemStack item = inventory[i];
|
||||
if (item.getTypeID() == materialId) {
|
||||
slots.put( i, item );
|
||||
}
|
||||
}
|
||||
return slots;
|
||||
}
|
||||
|
||||
public HashMap<Integer, ItemStack> all(Material material) {
|
||||
return all(material.getID());
|
||||
}
|
||||
|
||||
public HashMap<Integer, ItemStack> all(ItemStack item) {
|
||||
HashMap<Integer, ItemStack> slots = new HashMap<Integer, ItemStack>();
|
||||
|
||||
ItemStack[] inventory = getContents();
|
||||
for (int i = 0; i < inventory.length; i++) {
|
||||
if (item.equals(inventory[i])) {
|
||||
slots.put( i, item );
|
||||
}
|
||||
}
|
||||
return slots;
|
||||
}
|
||||
|
||||
public int first(int materialId) {
|
||||
ItemStack[] inventory = getContents();
|
||||
for (int i = 0; i < inventory.length; i++) {
|
||||
if (inventory[i].getTypeID() == materialId) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public int first(Material material) {
|
||||
return first(material.getID());
|
||||
}
|
||||
|
||||
public int first(ItemStack item) {
|
||||
ItemStack[] inventory = getContents();
|
||||
for (int i = 0; i < inventory.length; i++) {
|
||||
if (item.equals(inventory[i])) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public int firstEmpty() {
|
||||
return first(Material.AIR);
|
||||
}
|
||||
|
||||
public int firstPartial(int materialId) {
|
||||
ItemStack[] inventory = getContents();
|
||||
for (int i = 0; i < inventory.length; i++) {
|
||||
ItemStack item = inventory[i];
|
||||
if (item != null && item.getTypeID() == materialId && item.getAmount() < item.getMaxStackSize()) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public int firstPartial(Material material) {
|
||||
return firstPartial(material.getID());
|
||||
}
|
||||
|
||||
public int firstPartial(ItemStack item) {
|
||||
return firstPartial(item.getTypeID());
|
||||
}
|
||||
|
||||
public HashMap<Integer, ItemStack> addItem(ItemStack... items) {
|
||||
HashMap<Integer,ItemStack> leftover = new HashMap<Integer,ItemStack>();
|
||||
|
||||
/* TODO: some optimization
|
||||
* - Create a 'firstPartial' with a 'fromIndex'
|
||||
* - Record the lastPartial per Material
|
||||
* - Cache firstEmpty result
|
||||
*/
|
||||
|
||||
for (int i = 0; i < items.length; i++) {
|
||||
ItemStack item = items[i];
|
||||
while (true) {
|
||||
// Do we already have a stack of it?
|
||||
int firstPartial = firstPartial( item.getTypeID() );
|
||||
|
||||
// Drat! no partial stack
|
||||
if (firstPartial == -1) {
|
||||
// Find a free spot!
|
||||
int firstFree = firstEmpty();
|
||||
|
||||
if (firstFree == -1) {
|
||||
// No space at all!
|
||||
leftover.put(i, item);
|
||||
break;
|
||||
} else {
|
||||
// More than a single stack!
|
||||
if (item.getAmount() > getMaxItemStack()) {
|
||||
setItem( firstFree, new ItemStack(item.getTypeID(), getMaxItemStack()));
|
||||
item.setAmount(item.getAmount() - getMaxItemStack());
|
||||
} else {
|
||||
// Just store it
|
||||
setItem( firstFree, item );
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// So, apparently it might only partially fit, well lets do just that
|
||||
ItemStack partialItem = getItem(firstPartial);
|
||||
|
||||
int amount = item.getAmount();
|
||||
int partialAmount = partialItem.getAmount();
|
||||
int maxAmount = partialItem.getMaxStackSize();
|
||||
|
||||
// Check if it fully fits
|
||||
if (amount + partialAmount <= maxAmount) {
|
||||
partialItem.setAmount( amount + partialAmount );
|
||||
break;
|
||||
}
|
||||
|
||||
// It fits partially
|
||||
partialItem.setAmount( maxAmount );
|
||||
item.setAmount( amount + partialAmount - maxAmount );
|
||||
}
|
||||
}
|
||||
}
|
||||
return leftover;
|
||||
}
|
||||
|
||||
private int getMaxItemStack() {
|
||||
return getInventory().c();
|
||||
}
|
||||
|
||||
}
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren