Added support for nbt tags.

This commit is contained in:
Brianna 2020-04-22 09:36:27 -04:00
parent 959193699a
commit 9007d32fd5
93 changed files with 4339 additions and 2516 deletions

View File

@ -2,8 +2,8 @@ package com.songoda.core.gui;
import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.gui.methods.Clickable; import com.songoda.core.gui.methods.Clickable;
import com.songoda.core.nms.CoreNMS; import com.songoda.core.nms.anvil.AnvilCore;
import com.songoda.core.nms.CustomAnvil; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.NmsManager; import com.songoda.core.nms.NmsManager;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -115,7 +115,7 @@ public class AnvilGui extends Gui {
@Override @Override
protected void createInventory() { protected void createInventory() {
CoreNMS nms = NmsManager.getNMS(); AnvilCore nms = NmsManager.getAnvil();
if (nms != null) { if (nms != null) {
anvil = nms.createAnvil(player, new GuiHolder(guiManager, this)); anvil = nms.createAnvil(player, new GuiHolder(guiManager, this));
anvil.setCustomTitle(title); anvil.setCustomTitle(title);

View File

@ -1,57 +1,90 @@
package com.songoda.core.nms; package com.songoda.core.nms;
import com.songoda.core.nms.anvil.AnvilCore;
import com.songoda.core.nms.nbt.NBTCore;
import org.bukkit.Bukkit;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.bukkit.Bukkit;
public class NmsManager { public class NmsManager {
private final static String serverPackagePath = Bukkit.getServer().getClass().getPackage().getName(); private final static String serverPackagePath = Bukkit.getServer().getClass().getPackage().getName();
private final static String serverPackageVersion = serverPackagePath.substring(serverPackagePath.lastIndexOf('.') + 1); private final static String serverPackageVersion = serverPackagePath.substring(serverPackagePath.lastIndexOf('.') + 1);
private final static CoreNMS nms = _getNMS(); private final static AnvilCore anvil;
private final static NBTCore nbt;
private static CoreNMS _getNMS() { static {
// try {
// return (CoreNMS) Class.forName("com.songoda.core.nms." + serverPackageVersion + ".NMS").newInstance();
// } catch (Exception ex) {
// Logger.getLogger(NmsManager.class.getName()).log(Level.SEVERE, "Failed to load NMS for this server version", ex);
// }
// this block was only added to keep minimizeJar happy
switch (serverPackageVersion) { switch (serverPackageVersion) {
case "v1_8_R1": case "v1_8_R1":
return new com.songoda.core.nms.v1_8_R1.NMS(); anvil = new com.songoda.core.nms.v1_8_R1.anvil.AnvilCore();
nbt = new com.songoda.core.nms.v1_8_R1.nbt.NBTCoreImpl();
break;
case "v1_8_R2": case "v1_8_R2":
return new com.songoda.core.nms.v1_8_R2.NMS(); anvil = new com.songoda.core.nms.v1_8_R2.anvil.AnvilCore();
nbt = new com.songoda.core.nms.v1_8_R2.nbt.NBTCoreImpl();
break;
case "v1_8_R3": case "v1_8_R3":
return new com.songoda.core.nms.v1_8_R3.NMS(); anvil = new com.songoda.core.nms.v1_8_R3.anvil.AnvilCore();
nbt = new com.songoda.core.nms.v1_8_R3.nbt.NBTCoreImpl();
break;
case "v1_9_R1": case "v1_9_R1":
return new com.songoda.core.nms.v1_9_R1.NMS(); anvil = new com.songoda.core.nms.v1_9_R1.anvil.AnvilCore();
nbt = new com.songoda.core.nms.v1_9_R1.nbt.NBTCoreImpl();
break;
case "v1_9_R2": case "v1_9_R2":
return new com.songoda.core.nms.v1_9_R2.NMS(); anvil = new com.songoda.core.nms.v1_9_R2.anvil.AnvilCore();
nbt = new com.songoda.core.nms.v1_9_R2.nbt.NBTCoreImpl();
break;
case "v1_10_R1": case "v1_10_R1":
return new com.songoda.core.nms.v1_10_R1.NMS(); anvil = new com.songoda.core.nms.v1_10_R1.anvil.AnvilCore();
nbt = new com.songoda.core.nms.v1_10_R1.nbt.NBTCoreImpl();
break;
case "v1_11_R1": case "v1_11_R1":
return new com.songoda.core.nms.v1_11_R1.NMS(); anvil = new com.songoda.core.nms.v1_11_R1.anvil.AnvilCore();
nbt = new com.songoda.core.nms.v1_11_R1.nbt.NBTCoreImpl();
break;
case "v1_12_R1": case "v1_12_R1":
return new com.songoda.core.nms.v1_12_R1.NMS(); anvil = new com.songoda.core.nms.v1_12_R1.anvil.AnvilCore();
nbt = new com.songoda.core.nms.v1_12_R1.nbt.NBTCoreImpl();
break;
case "v1_13_R1": case "v1_13_R1":
return new com.songoda.core.nms.v1_13_R1.NMS(); anvil = new com.songoda.core.nms.v1_13_R1.anvil.AnvilCore();
nbt = new com.songoda.core.nms.v1_13_R1.nbt.NBTCoreImpl();
break;
case "v1_13_R2": case "v1_13_R2":
return new com.songoda.core.nms.v1_13_R2.NMS(); anvil = new com.songoda.core.nms.v1_13_R2.anvil.AnvilCore();
nbt = new com.songoda.core.nms.v1_13_R2.nbt.NBTCoreImpl();
break;
case "v1_14_R1": case "v1_14_R1":
return new com.songoda.core.nms.v1_14_R1.NMS(); anvil = new com.songoda.core.nms.v1_14_R1.anvil.AnvilCore();
nbt = new com.songoda.core.nms.v1_14_R1.nbt.NBTCoreImpl();
break;
case "v1_15_R1": case "v1_15_R1":
return new com.songoda.core.nms.v1_15_R1.NMS(); anvil = new com.songoda.core.nms.v1_15_R1.anvil.AnvilCore();
nbt = new com.songoda.core.nms.v1_15_R1.nbt.NBTCoreImpl();
break;
default:
Logger.getLogger(NmsManager.class.getName()).log(Level.SEVERE, "Failed to load NMS for this server version: version {0} not found", serverPackageVersion);
anvil = null;
nbt = null;
break;
} }
Logger.getLogger(NmsManager.class.getName()).log(Level.SEVERE, "Failed to load NMS for this server version: version {0} not found", serverPackageVersion);
return null;
} }
public static CoreNMS getNMS() { public static AnvilCore getAnvil() {
return nms; return anvil;
} }
public static boolean hasNMS() { public static boolean hasAnvil() {
return nms != null; return anvil != null;
}
public static NBTCore getNbt() {
return nbt;
}
public static boolean hasNbt() {
return nbt != null;
} }
} }

View File

@ -1,9 +1,9 @@
package com.songoda.core.nms; package com.songoda.core.nms.anvil;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
public interface CoreNMS { public interface AnvilCore {
public CustomAnvil createAnvil(Player player); public CustomAnvil createAnvil(Player player);
public CustomAnvil createAnvil(Player player, InventoryHolder holder); public CustomAnvil createAnvil(Player player, InventoryHolder holder);
} }

View File

@ -1,54 +1,54 @@
package com.songoda.core.nms; package com.songoda.core.nms.anvil;
import com.songoda.core.nms.methods.AnvilTextChange; import com.songoda.core.nms.anvil.methods.AnvilTextChange;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
/** /**
* NMS interface for creating an anvil view for a single player * NMS interface for creating an anvil view for a single player
* *
* @since 2019-09-13 * @since 2019-09-13
* @author jascotty2 * @author jascotty2
*/ */
public interface CustomAnvil { public interface CustomAnvil {
public void setLevelCost(int cost); public void setLevelCost(int cost);
public int getLevelCost(); public int getLevelCost();
public void setCanUse(boolean bool); public void setCanUse(boolean bool);
public String getCustomTitle(); public String getCustomTitle();
public void setCustomTitle(String title); public void setCustomTitle(String title);
public String getRenameText(); public String getRenameText();
public void setRenameText(String text); public void setRenameText(String text);
public void setOnChange(AnvilTextChange handler); public void setOnChange(AnvilTextChange handler);
public ItemStack getLeftInput(); public ItemStack getLeftInput();
public ItemStack getRightInput(); public ItemStack getRightInput();
public ItemStack getOutput(); public ItemStack getOutput();
public void setLeftInput(ItemStack item); public void setLeftInput(ItemStack item);
public void setRightInput(ItemStack item); public void setRightInput(ItemStack item);
public void setOutput(ItemStack item); public void setOutput(ItemStack item);
public Inventory getInventory(); public Inventory getInventory();
/** /**
* Open this anvil for the provided player * Open this anvil for the provided player
*/ */
public void open(); public void open();
/** /**
* Force a redraw of the output * Force a redraw of the output
*/ */
public void update(); public void update();
} }

View File

@ -1,6 +1,6 @@
package com.songoda.core.nms.methods; package com.songoda.core.nms.anvil.methods;
public interface AnvilTextChange { public interface AnvilTextChange {
void onChange(); void onChange();
} }

View File

@ -0,0 +1,23 @@
package com.songoda.core.nms.nbt;
import java.util.List;
public interface NBTCompound {
NBTCompound set(String tag, String s);
NBTCompound set(String tag, boolean b);
NBTCompound set(String tag, int i);
NBTCompound set(String tag, long l);
NBTCompound set(String tag, short s);
NBTCompound set(String tag, byte b);
boolean has(String tag);
NBTObject getNBTObject(String tag);
}

View File

@ -0,0 +1,11 @@
package com.songoda.core.nms.nbt;
import org.bukkit.inventory.ItemStack;
public interface NBTCore {
NBTItem of(ItemStack item);
NBTCompound newCompound();
}

View File

@ -0,0 +1,9 @@
package com.songoda.core.nms.nbt;
import org.bukkit.inventory.ItemStack;
public interface NBTItem extends NBTCompound {
ItemStack finish();
}

View File

@ -0,0 +1,18 @@
package com.songoda.core.nms.nbt;
import java.util.List;
public interface NBTObject {
String asString();
boolean asBoolean();
int asInt();
long asLong();
short asShort();
byte asByte();
}

View File

@ -1,21 +1,20 @@
package com.songoda.core.nms.v1_10_R1; package com.songoda.core.nms.v1_10_R1.anvil;
import com.songoda.core.nms.CoreNMS; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.CustomAnvil; import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; import org.bukkit.entity.Player;
import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.InventoryHolder;
public class AnvilCore implements com.songoda.core.nms.anvil.AnvilCore {
public class NMS implements CoreNMS {
@Override
@Override public CustomAnvil createAnvil(Player player) {
public CustomAnvil createAnvil(Player player) { return new AnvilView(((CraftPlayer) player).getHandle(), null);
return new AnvilView(((CraftPlayer) player).getHandle(), null); }
}
@Override
@Override public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
public CustomAnvil createAnvil(Player player, InventoryHolder holder) { return new AnvilView(((CraftPlayer) player).getHandle(), holder);
return new AnvilView(((CraftPlayer) player).getHandle(), holder); }
}
}
}

View File

@ -1,21 +1,21 @@
package com.songoda.core.nms.v1_10_R1; package com.songoda.core.nms.v1_10_R1.anvil;
import net.minecraft.server.v1_10_R1.IInventory; import net.minecraft.server.v1_10_R1.IInventory;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventoryAnvil;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
public class AnvilInventoryCustom extends CraftInventoryAnvil { public class AnvilInventoryCustom extends CraftInventoryAnvil {
final InventoryHolder holder; final InventoryHolder holder;
public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory) { public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory) {
super(location, inventory, resultInventory); super(location, inventory, resultInventory);
this.holder = holder; this.holder = holder;
} }
@Override @Override
public InventoryHolder getHolder() { public InventoryHolder getHolder() {
return holder; return holder;
} }
} }

View File

@ -1,203 +1,203 @@
package com.songoda.core.nms.v1_10_R1; package com.songoda.core.nms.v1_10_R1.anvil;
import com.songoda.core.nms.CustomAnvil; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.methods.AnvilTextChange; import com.songoda.core.nms.anvil.methods.AnvilTextChange;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.minecraft.server.v1_10_R1.BlockPosition; import net.minecraft.server.v1_10_R1.BlockPosition;
import net.minecraft.server.v1_10_R1.ChatMessage; import net.minecraft.server.v1_10_R1.ChatMessage;
import net.minecraft.server.v1_10_R1.ContainerAnvil; import net.minecraft.server.v1_10_R1.ContainerAnvil;
import net.minecraft.server.v1_10_R1.EntityHuman; import net.minecraft.server.v1_10_R1.EntityHuman;
import net.minecraft.server.v1_10_R1.EntityPlayer; import net.minecraft.server.v1_10_R1.EntityPlayer;
import net.minecraft.server.v1_10_R1.IInventory; import net.minecraft.server.v1_10_R1.IInventory;
import net.minecraft.server.v1_10_R1.PacketPlayOutOpenWindow; import net.minecraft.server.v1_10_R1.PacketPlayOutOpenWindow;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventoryView;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
public class AnvilView extends ContainerAnvil implements CustomAnvil { public class AnvilView extends ContainerAnvil implements CustomAnvil {
private final EntityPlayer entity; private final EntityPlayer entity;
private final Inventory inventory; private final Inventory inventory;
private String title = "Repairing"; private String title = "Repairing";
private int cost = -1; private int cost = -1;
private boolean canUse = true; private boolean canUse = true;
private AnvilTextChange textChange = null; private AnvilTextChange textChange = null;
// used for setting custom inventory // used for setting custom inventory
static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result
static Field mc_ContainerAnvil_resultInventory; // full inventory static Field mc_ContainerAnvil_resultInventory; // full inventory
static Field mc_ContainerAnvil_bukkitEntity; static Field mc_ContainerAnvil_bukkitEntity;
static { static {
try { try {
mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h"); mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h");
mc_ContainerAnvil_repairInventory.setAccessible(true); mc_ContainerAnvil_repairInventory.setAccessible(true);
mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g"); mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
mc_ContainerAnvil_resultInventory.setAccessible(true); mc_ContainerAnvil_resultInventory.setAccessible(true);
mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity"); mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
mc_ContainerAnvil_bukkitEntity.setAccessible(true); mc_ContainerAnvil_bukkitEntity.setAccessible(true);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
} }
// used for grabbing the rename text string // used for grabbing the rename text string
static Field mc_ContainerAnvil_renameText; static Field mc_ContainerAnvil_renameText;
static { static {
try { try {
mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l"); mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l");
mc_ContainerAnvil_renameText.setAccessible(true); mc_ContainerAnvil_renameText.setAccessible(true);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
} }
} }
public AnvilView(EntityPlayer entity, InventoryHolder holder) { public AnvilView(EntityPlayer entity, InventoryHolder holder) {
super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity); super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
this.entity = entity; this.entity = entity;
if (holder != null) { if (holder != null) {
this.inventory = getBukkitView(entity, holder).getTopInventory(); this.inventory = getBukkitView(entity, holder).getTopInventory();
} else { } else {
this.inventory = getBukkitView().getTopInventory(); this.inventory = getBukkitView().getTopInventory();
} }
} }
public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) { public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
try { try {
AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder, AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
new Location(entity.world.getWorld(), 0, 0, 0), new Location(entity.world.getWorld(), 0, 0, 0),
(IInventory) mc_ContainerAnvil_repairInventory.get(this), (IInventory) mc_ContainerAnvil_repairInventory.get(this),
(IInventory) mc_ContainerAnvil_resultInventory.get(this)); (IInventory) mc_ContainerAnvil_resultInventory.get(this));
CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this); CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this);
mc_ContainerAnvil_bukkitEntity.set(this, view); mc_ContainerAnvil_bukkitEntity.set(this, view);
return view; return view;
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
return getBukkitView(); return getBukkitView();
} }
@Override @Override
public boolean a(EntityHuman entityhuman) { public boolean a(EntityHuman entityhuman) {
return canUse; return canUse;
} }
@Override @Override
public void e() { public void e() {
super.e(); super.e();
if (cost >= 0) { if (cost >= 0) {
this.a = cost; this.a = cost;
} }
} }
@Override @Override
public void update() { public void update() {
e(); e();
} }
@Override @Override
public String getRenameText() { public String getRenameText() {
try { try {
//return this.l; //return this.l;
return (String) mc_ContainerAnvil_renameText.get(this); return (String) mc_ContainerAnvil_renameText.get(this);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
} }
return null; return null;
} }
@Override @Override
public void setRenameText(String text) { public void setRenameText(String text) {
this.a(text); this.a(text);
} }
@Override @Override
public void setOnChange(AnvilTextChange handler) { public void setOnChange(AnvilTextChange handler) {
textChange = handler; textChange = handler;
} }
@Override @Override
public String getCustomTitle() { public String getCustomTitle() {
return title; return title;
} }
@Override @Override
public void setCustomTitle(String title) { public void setCustomTitle(String title) {
this.title = title; this.title = title;
} }
@Override @Override
public void setLevelCost(int cost) { public void setLevelCost(int cost) {
this.cost = cost; this.cost = cost;
} }
@Override @Override
public int getLevelCost() { public int getLevelCost() {
return cost >= 0 ? cost : this.a; return cost >= 0 ? cost : this.a;
} }
@Override @Override
public void setCanUse(boolean bool) { public void setCanUse(boolean bool) {
this.canUse = bool; this.canUse = bool;
} }
@Override @Override
public ItemStack getLeftInput() { public ItemStack getLeftInput() {
return inventory.getItem(0); return inventory.getItem(0);
} }
@Override @Override
public ItemStack getRightInput() { public ItemStack getRightInput() {
return inventory.getItem(1); return inventory.getItem(1);
} }
@Override @Override
public ItemStack getOutput() { public ItemStack getOutput() {
return inventory.getItem(2); return inventory.getItem(2);
} }
@Override @Override
public void setLeftInput(ItemStack item) { public void setLeftInput(ItemStack item) {
inventory.setItem(0, item); inventory.setItem(0, item);
} }
@Override @Override
public void setRightInput(ItemStack item) { public void setRightInput(ItemStack item) {
inventory.setItem(1, item); inventory.setItem(1, item);
} }
@Override @Override
public void setOutput(ItemStack item) { public void setOutput(ItemStack item) {
inventory.setItem(2, item); inventory.setItem(2, item);
} }
@Override @Override
public Inventory getInventory() { public Inventory getInventory() {
return inventory; return inventory;
} }
@Override @Override
public void open() { public void open() {
// Counter stuff that the game uses to keep track of inventories // Counter stuff that the game uses to keep track of inventories
int id = entity.nextContainerCounter(); int id = entity.nextContainerCounter();
// Send the packet // Send the packet
entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0)); entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
// Set their active container to this anvil // Set their active container to this anvil
entity.activeContainer = this; entity.activeContainer = this;
// Set their active container window id to that counter stuff // Set their active container window id to that counter stuff
entity.activeContainer.windowId = id; entity.activeContainer.windowId = id;
// Add the slot listener // Add the slot listener
entity.activeContainer.addSlotListener(entity); entity.activeContainer.addSlotListener(entity);
} }
} }

View File

@ -0,0 +1,65 @@
package com.songoda.core.nms.v1_10_R1.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_10_R1.NBTTagCompound;
public class NBTCompoundImpl implements NBTCompound {
protected NBTTagCompound compound;
protected NBTCompoundImpl(NBTTagCompound compound) {
this.compound = compound;
}
public NBTCompoundImpl() {
this.compound = new NBTTagCompound();
}
@Override
public NBTCompound set(String tag, String s) {
compound.setString(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, boolean b) {
compound.setBoolean(tag, b);
return this;
}
@Override
public NBTCompound set(String tag, int i) {
compound.setInt(tag, i);
return this;
}
@Override
public NBTCompound set(String tag, long l) {
compound.setLong(tag, l);
return this;
}
@Override
public NBTCompound set(String tag, short s) {
compound.setShort(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, byte b) {
compound.setByte(tag, b);
return this;
}
@Override
public boolean has(String tag) {
return compound.hasKey(tag);
}
@Override
public NBTObject getNBTObject(String tag) {
return new NBTObjectImpl(compound, tag);
}
}

View File

@ -0,0 +1,21 @@
package com.songoda.core.nms.v1_10_R1.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTCore;
import com.songoda.core.nms.nbt.NBTItem;
import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTCoreImpl implements NBTCore {
@Override
public NBTItem of(ItemStack item) {
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
}
@Override
public NBTCompound newCompound() {
return new NBTCompoundImpl();
}
}

View File

@ -0,0 +1,20 @@
package com.songoda.core.nms.v1_10_R1.nbt;
import com.songoda.core.nms.nbt.NBTItem;
import net.minecraft.server.v1_10_R1.NBTTagCompound;
import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTItemImpl extends NBTCompoundImpl implements NBTItem {
private net.minecraft.server.v1_10_R1.ItemStack nmsItem;
public NBTItemImpl(net.minecraft.server.v1_10_R1.ItemStack nmsItem) {
super(nmsItem.hasTag() ? nmsItem.getTag() : new NBTTagCompound());
this.nmsItem = nmsItem;
}
public ItemStack finish() {
return CraftItemStack.asBukkitCopy(nmsItem);
}
}

View File

@ -0,0 +1,40 @@
package com.songoda.core.nms.v1_10_R1.nbt;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_10_R1.NBTTagCompound;
public class NBTObjectImpl implements NBTObject {
private final NBTTagCompound compound;
private final String tag;
public NBTObjectImpl(NBTTagCompound compound, String tag) {
this.compound = compound;
this.tag = tag;
}
public String asString() {
return compound.getString(tag);
}
public boolean asBoolean() {
return compound.getBoolean(tag);
}
public int asInt() {
return compound.getInt(tag);
}
public long asLong() {
return compound.getLong(tag);
}
public short asShort() {
return compound.getShort(tag);
}
public byte asByte() {
return compound.getByte(tag);
}
}

View File

@ -1,21 +1,20 @@
package com.songoda.core.nms.v1_11_R1; package com.songoda.core.nms.v1_11_R1.anvil;
import com.songoda.core.nms.CoreNMS; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.CustomAnvil; import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; import org.bukkit.entity.Player;
import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.InventoryHolder;
public class AnvilCore implements com.songoda.core.nms.anvil.AnvilCore {
public class NMS implements CoreNMS {
@Override
@Override public CustomAnvil createAnvil(Player player) {
public CustomAnvil createAnvil(Player player) { return new AnvilView(((CraftPlayer) player).getHandle(), null);
return new AnvilView(((CraftPlayer) player).getHandle(), null); }
}
@Override
@Override public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
public CustomAnvil createAnvil(Player player, InventoryHolder holder) { return new AnvilView(((CraftPlayer) player).getHandle(), holder);
return new AnvilView(((CraftPlayer) player).getHandle(), holder); }
}
}
}

View File

@ -1,22 +1,22 @@
package com.songoda.core.nms.v1_11_R1; package com.songoda.core.nms.v1_11_R1.anvil;
import net.minecraft.server.v1_11_R1.ContainerAnvil; import net.minecraft.server.v1_11_R1.ContainerAnvil;
import net.minecraft.server.v1_11_R1.IInventory; import net.minecraft.server.v1_11_R1.IInventory;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventoryAnvil;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
public class AnvilInventoryCustom extends CraftInventoryAnvil { public class AnvilInventoryCustom extends CraftInventoryAnvil {
final InventoryHolder holder; final InventoryHolder holder;
public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory, ContainerAnvil container) { public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory, ContainerAnvil container) {
super(location, inventory, resultInventory, container); super(location, inventory, resultInventory, container);
this.holder = holder; this.holder = holder;
} }
@Override @Override
public InventoryHolder getHolder() { public InventoryHolder getHolder() {
return holder; return holder;
} }
} }

View File

@ -1,203 +1,203 @@
package com.songoda.core.nms.v1_11_R1; package com.songoda.core.nms.v1_11_R1.anvil;
import com.songoda.core.nms.CustomAnvil; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.methods.AnvilTextChange; import com.songoda.core.nms.anvil.methods.AnvilTextChange;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.minecraft.server.v1_11_R1.BlockPosition; import net.minecraft.server.v1_11_R1.BlockPosition;
import net.minecraft.server.v1_11_R1.ChatMessage; import net.minecraft.server.v1_11_R1.ChatMessage;
import net.minecraft.server.v1_11_R1.ContainerAnvil; import net.minecraft.server.v1_11_R1.ContainerAnvil;
import net.minecraft.server.v1_11_R1.EntityHuman; import net.minecraft.server.v1_11_R1.EntityHuman;
import net.minecraft.server.v1_11_R1.EntityPlayer; import net.minecraft.server.v1_11_R1.EntityPlayer;
import net.minecraft.server.v1_11_R1.IInventory; import net.minecraft.server.v1_11_R1.IInventory;
import net.minecraft.server.v1_11_R1.PacketPlayOutOpenWindow; import net.minecraft.server.v1_11_R1.PacketPlayOutOpenWindow;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventoryView;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
public class AnvilView extends ContainerAnvil implements CustomAnvil { public class AnvilView extends ContainerAnvil implements CustomAnvil {
private final EntityPlayer entity; private final EntityPlayer entity;
private final Inventory inventory; private final Inventory inventory;
private String title = "Repairing"; private String title = "Repairing";
private int cost = -1; private int cost = -1;
private boolean canUse = true; private boolean canUse = true;
private AnvilTextChange textChange = null; private AnvilTextChange textChange = null;
// used for setting custom inventory // used for setting custom inventory
static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result
static Field mc_ContainerAnvil_resultInventory; // full inventory static Field mc_ContainerAnvil_resultInventory; // full inventory
static Field mc_ContainerAnvil_bukkitEntity; static Field mc_ContainerAnvil_bukkitEntity;
static { static {
try { try {
mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h"); mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h");
mc_ContainerAnvil_repairInventory.setAccessible(true); mc_ContainerAnvil_repairInventory.setAccessible(true);
mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g"); mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
mc_ContainerAnvil_resultInventory.setAccessible(true); mc_ContainerAnvil_resultInventory.setAccessible(true);
mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity"); mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
mc_ContainerAnvil_bukkitEntity.setAccessible(true); mc_ContainerAnvil_bukkitEntity.setAccessible(true);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
} }
// used for grabbing the rename text string // used for grabbing the rename text string
static Field mc_ContainerAnvil_renameText; static Field mc_ContainerAnvil_renameText;
static { static {
try { try {
mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l"); mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l");
mc_ContainerAnvil_renameText.setAccessible(true); mc_ContainerAnvil_renameText.setAccessible(true);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
} }
} }
public AnvilView(EntityPlayer entity, InventoryHolder holder) { public AnvilView(EntityPlayer entity, InventoryHolder holder) {
super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity); super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
this.entity = entity; this.entity = entity;
if (holder != null) { if (holder != null) {
this.inventory = getBukkitView(entity, holder).getTopInventory(); this.inventory = getBukkitView(entity, holder).getTopInventory();
} else { } else {
this.inventory = getBukkitView().getTopInventory(); this.inventory = getBukkitView().getTopInventory();
} }
} }
public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) { public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
try { try {
AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder, AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
new Location(entity.world.getWorld(), 0, 0, 0), new Location(entity.world.getWorld(), 0, 0, 0),
(IInventory) mc_ContainerAnvil_repairInventory.get(this), (IInventory) mc_ContainerAnvil_repairInventory.get(this),
(IInventory) mc_ContainerAnvil_resultInventory.get(this), this); (IInventory) mc_ContainerAnvil_resultInventory.get(this), this);
CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this); CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this);
mc_ContainerAnvil_bukkitEntity.set(this, view); mc_ContainerAnvil_bukkitEntity.set(this, view);
return view; return view;
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
return getBukkitView(); return getBukkitView();
} }
@Override @Override
public boolean a(EntityHuman entityhuman) { public boolean a(EntityHuman entityhuman) {
return canUse; return canUse;
} }
@Override @Override
public void e() { public void e() {
super.e(); super.e();
if (cost >= 0) { if (cost >= 0) {
this.a = cost; this.a = cost;
} }
} }
@Override @Override
public void update() { public void update() {
e(); e();
} }
@Override @Override
public String getRenameText() { public String getRenameText() {
try { try {
//return this.l; //return this.l;
return (String) mc_ContainerAnvil_renameText.get(this); return (String) mc_ContainerAnvil_renameText.get(this);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
} }
return null; return null;
} }
@Override @Override
public void setRenameText(String text) { public void setRenameText(String text) {
this.a(text); this.a(text);
} }
@Override @Override
public void setOnChange(AnvilTextChange handler) { public void setOnChange(AnvilTextChange handler) {
textChange = handler; textChange = handler;
} }
@Override @Override
public String getCustomTitle() { public String getCustomTitle() {
return title; return title;
} }
@Override @Override
public void setCustomTitle(String title) { public void setCustomTitle(String title) {
this.title = title; this.title = title;
} }
@Override @Override
public void setLevelCost(int cost) { public void setLevelCost(int cost) {
this.cost = cost; this.cost = cost;
} }
@Override @Override
public int getLevelCost() { public int getLevelCost() {
return cost >= 0 ? cost : this.a; return cost >= 0 ? cost : this.a;
} }
@Override @Override
public void setCanUse(boolean bool) { public void setCanUse(boolean bool) {
this.canUse = bool; this.canUse = bool;
} }
@Override @Override
public ItemStack getLeftInput() { public ItemStack getLeftInput() {
return inventory.getItem(0); return inventory.getItem(0);
} }
@Override @Override
public ItemStack getRightInput() { public ItemStack getRightInput() {
return inventory.getItem(1); return inventory.getItem(1);
} }
@Override @Override
public ItemStack getOutput() { public ItemStack getOutput() {
return inventory.getItem(2); return inventory.getItem(2);
} }
@Override @Override
public void setLeftInput(ItemStack item) { public void setLeftInput(ItemStack item) {
inventory.setItem(0, item); inventory.setItem(0, item);
} }
@Override @Override
public void setRightInput(ItemStack item) { public void setRightInput(ItemStack item) {
inventory.setItem(1, item); inventory.setItem(1, item);
} }
@Override @Override
public void setOutput(ItemStack item) { public void setOutput(ItemStack item) {
inventory.setItem(2, item); inventory.setItem(2, item);
} }
@Override @Override
public Inventory getInventory() { public Inventory getInventory() {
return inventory; return inventory;
} }
@Override @Override
public void open() { public void open() {
// Counter stuff that the game uses to keep track of inventories // Counter stuff that the game uses to keep track of inventories
int id = entity.nextContainerCounter(); int id = entity.nextContainerCounter();
// Send the packet // Send the packet
entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0)); entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
// Set their active container to this anvil // Set their active container to this anvil
entity.activeContainer = this; entity.activeContainer = this;
// Set their active container window id to that counter stuff // Set their active container window id to that counter stuff
entity.activeContainer.windowId = id; entity.activeContainer.windowId = id;
// Add the slot listener // Add the slot listener
entity.activeContainer.addSlotListener(entity); entity.activeContainer.addSlotListener(entity);
} }
} }

View File

@ -0,0 +1,65 @@
package com.songoda.core.nms.v1_11_R1.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_11_R1.NBTTagCompound;
public class NBTCompoundImpl implements NBTCompound {
protected NBTTagCompound compound;
protected NBTCompoundImpl(NBTTagCompound compound) {
this.compound = compound;
}
public NBTCompoundImpl() {
this.compound = new NBTTagCompound();
}
@Override
public NBTCompound set(String tag, String s) {
compound.setString(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, boolean b) {
compound.setBoolean(tag, b);
return this;
}
@Override
public NBTCompound set(String tag, int i) {
compound.setInt(tag, i);
return this;
}
@Override
public NBTCompound set(String tag, long l) {
compound.setLong(tag, l);
return this;
}
@Override
public NBTCompound set(String tag, short s) {
compound.setShort(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, byte b) {
compound.setByte(tag, b);
return this;
}
@Override
public boolean has(String tag) {
return compound.hasKey(tag);
}
@Override
public NBTObject getNBTObject(String tag) {
return new NBTObjectImpl(compound, tag);
}
}

View File

@ -0,0 +1,21 @@
package com.songoda.core.nms.v1_11_R1.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTCore;
import com.songoda.core.nms.nbt.NBTItem;
import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTCoreImpl implements NBTCore {
@Override
public NBTItem of(ItemStack item) {
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
}
@Override
public NBTCompound newCompound() {
return new NBTCompoundImpl();
}
}

View File

@ -0,0 +1,20 @@
package com.songoda.core.nms.v1_11_R1.nbt;
import com.songoda.core.nms.nbt.NBTItem;
import net.minecraft.server.v1_11_R1.NBTTagCompound;
import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTItemImpl extends NBTCompoundImpl implements NBTItem {
private net.minecraft.server.v1_11_R1.ItemStack nmsItem;
public NBTItemImpl(net.minecraft.server.v1_11_R1.ItemStack nmsItem) {
super(nmsItem.hasTag() ? nmsItem.getTag() : new NBTTagCompound());
this.nmsItem = nmsItem;
}
public ItemStack finish() {
return CraftItemStack.asBukkitCopy(nmsItem);
}
}

View File

@ -0,0 +1,40 @@
package com.songoda.core.nms.v1_11_R1.nbt;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_11_R1.NBTTagCompound;
public class NBTObjectImpl implements NBTObject {
private final NBTTagCompound compound;
private final String tag;
public NBTObjectImpl(NBTTagCompound compound, String tag) {
this.compound = compound;
this.tag = tag;
}
public String asString() {
return compound.getString(tag);
}
public boolean asBoolean() {
return compound.getBoolean(tag);
}
public int asInt() {
return compound.getInt(tag);
}
public long asLong() {
return compound.getLong(tag);
}
public short asShort() {
return compound.getShort(tag);
}
public byte asByte() {
return compound.getByte(tag);
}
}

View File

@ -1,21 +1,20 @@
package com.songoda.core.nms.v1_12_R1; package com.songoda.core.nms.v1_12_R1.anvil;
import com.songoda.core.nms.CoreNMS; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.CustomAnvil; import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; import org.bukkit.entity.Player;
import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.InventoryHolder;
public class AnvilCore implements com.songoda.core.nms.anvil.AnvilCore {
public class NMS implements CoreNMS {
@Override
@Override public CustomAnvil createAnvil(Player player) {
public CustomAnvil createAnvil(Player player) { return new AnvilView(((CraftPlayer) player).getHandle(), null);
return new AnvilView(((CraftPlayer) player).getHandle(), null); }
}
@Override
@Override public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
public CustomAnvil createAnvil(Player player, InventoryHolder holder) { return new AnvilView(((CraftPlayer) player).getHandle(), holder);
return new AnvilView(((CraftPlayer) player).getHandle(), holder); }
}
}
}

View File

@ -1,22 +1,22 @@
package com.songoda.core.nms.v1_12_R1; package com.songoda.core.nms.v1_12_R1.anvil;
import net.minecraft.server.v1_12_R1.ContainerAnvil; import net.minecraft.server.v1_12_R1.ContainerAnvil;
import net.minecraft.server.v1_12_R1.IInventory; import net.minecraft.server.v1_12_R1.IInventory;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftInventoryAnvil;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
public class AnvilInventoryCustom extends CraftInventoryAnvil { public class AnvilInventoryCustom extends CraftInventoryAnvil {
final InventoryHolder holder; final InventoryHolder holder;
public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory, ContainerAnvil container) { public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory, ContainerAnvil container) {
super(location, inventory, resultInventory, container); super(location, inventory, resultInventory, container);
this.holder = holder; this.holder = holder;
} }
@Override @Override
public InventoryHolder getHolder() { public InventoryHolder getHolder() {
return holder; return holder;
} }
} }

View File

@ -1,185 +1,185 @@
package com.songoda.core.nms.v1_12_R1; package com.songoda.core.nms.v1_12_R1.anvil;
import com.songoda.core.nms.CustomAnvil; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.methods.AnvilTextChange; import com.songoda.core.nms.anvil.methods.AnvilTextChange;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.minecraft.server.v1_12_R1.BlockPosition; import net.minecraft.server.v1_12_R1.BlockPosition;
import net.minecraft.server.v1_12_R1.ChatMessage; import net.minecraft.server.v1_12_R1.ChatMessage;
import net.minecraft.server.v1_12_R1.ContainerAnvil; import net.minecraft.server.v1_12_R1.ContainerAnvil;
import net.minecraft.server.v1_12_R1.EntityHuman; import net.minecraft.server.v1_12_R1.EntityHuman;
import net.minecraft.server.v1_12_R1.EntityPlayer; import net.minecraft.server.v1_12_R1.EntityPlayer;
import net.minecraft.server.v1_12_R1.IInventory; import net.minecraft.server.v1_12_R1.IInventory;
import net.minecraft.server.v1_12_R1.PacketPlayOutOpenWindow; import net.minecraft.server.v1_12_R1.PacketPlayOutOpenWindow;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftInventoryView;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
public class AnvilView extends ContainerAnvil implements CustomAnvil { public class AnvilView extends ContainerAnvil implements CustomAnvil {
private final EntityPlayer entity; private final EntityPlayer entity;
private final Inventory inventory; private final Inventory inventory;
private String title = "Repairing"; private String title = "Repairing";
private int cost = -1; private int cost = -1;
private boolean canUse = true; private boolean canUse = true;
private AnvilTextChange textChange = null; private AnvilTextChange textChange = null;
// used for setting custom inventory // used for setting custom inventory
static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result
static Field mc_ContainerAnvil_resultInventory; // full inventory static Field mc_ContainerAnvil_resultInventory; // full inventory
static Field mc_ContainerAnvil_bukkitEntity; static Field mc_ContainerAnvil_bukkitEntity;
static { static {
try { try {
mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h"); mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h");
mc_ContainerAnvil_repairInventory.setAccessible(true); mc_ContainerAnvil_repairInventory.setAccessible(true);
mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g"); mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
mc_ContainerAnvil_resultInventory.setAccessible(true); mc_ContainerAnvil_resultInventory.setAccessible(true);
mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity"); mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
mc_ContainerAnvil_bukkitEntity.setAccessible(true); mc_ContainerAnvil_bukkitEntity.setAccessible(true);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
} }
public AnvilView(EntityPlayer entity, InventoryHolder holder) { public AnvilView(EntityPlayer entity, InventoryHolder holder) {
super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity); super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
this.entity = entity; this.entity = entity;
if (holder != null) { if (holder != null) {
this.inventory = getBukkitView(entity, holder).getTopInventory(); this.inventory = getBukkitView(entity, holder).getTopInventory();
} else { } else {
this.inventory = getBukkitView().getTopInventory(); this.inventory = getBukkitView().getTopInventory();
} }
} }
public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) { public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
try { try {
AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder, AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
new Location(entity.world.getWorld(), 0, 0, 0), new Location(entity.world.getWorld(), 0, 0, 0),
(IInventory) mc_ContainerAnvil_repairInventory.get(this), (IInventory) mc_ContainerAnvil_repairInventory.get(this),
(IInventory) mc_ContainerAnvil_resultInventory.get(this), this); (IInventory) mc_ContainerAnvil_resultInventory.get(this), this);
CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this); CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this);
mc_ContainerAnvil_bukkitEntity.set(this, view); mc_ContainerAnvil_bukkitEntity.set(this, view);
return view; return view;
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
return getBukkitView(); return getBukkitView();
} }
@Override @Override
public boolean canUse(EntityHuman entityhuman) { public boolean canUse(EntityHuman entityhuman) {
return canUse; return canUse;
} }
@Override @Override
public void e() { public void e() {
super.e(); super.e();
if (cost >= 0) { if (cost >= 0) {
this.levelCost = cost; this.levelCost = cost;
} }
} }
@Override @Override
public void update() { public void update() {
e(); e();
} }
@Override @Override
public String getRenameText() { public String getRenameText() {
return this.renameText; return this.renameText;
} }
@Override @Override
public void setRenameText(String text) { public void setRenameText(String text) {
this.a(text); this.a(text);
} }
@Override @Override
public String getCustomTitle() { public String getCustomTitle() {
return title; return title;
} }
@Override @Override
public void setOnChange(AnvilTextChange handler) { public void setOnChange(AnvilTextChange handler) {
textChange = handler; textChange = handler;
} }
@Override @Override
public void setCustomTitle(String title) { public void setCustomTitle(String title) {
this.title = title; this.title = title;
} }
@Override @Override
public void setLevelCost(int cost) { public void setLevelCost(int cost) {
this.cost = cost; this.cost = cost;
} }
@Override @Override
public int getLevelCost() { public int getLevelCost() {
return cost >= 0 ? cost : this.levelCost; return cost >= 0 ? cost : this.levelCost;
} }
@Override @Override
public void setCanUse(boolean bool) { public void setCanUse(boolean bool) {
this.canUse = bool; this.canUse = bool;
} }
@Override @Override
public ItemStack getLeftInput() { public ItemStack getLeftInput() {
return inventory.getItem(0); return inventory.getItem(0);
} }
@Override @Override
public ItemStack getRightInput() { public ItemStack getRightInput() {
return inventory.getItem(1); return inventory.getItem(1);
} }
@Override @Override
public ItemStack getOutput() { public ItemStack getOutput() {
return inventory.getItem(2); return inventory.getItem(2);
} }
@Override @Override
public void setLeftInput(ItemStack item) { public void setLeftInput(ItemStack item) {
inventory.setItem(0, item); inventory.setItem(0, item);
} }
@Override @Override
public void setRightInput(ItemStack item) { public void setRightInput(ItemStack item) {
inventory.setItem(1, item); inventory.setItem(1, item);
} }
@Override @Override
public void setOutput(ItemStack item) { public void setOutput(ItemStack item) {
inventory.setItem(2, item); inventory.setItem(2, item);
} }
@Override @Override
public Inventory getInventory() { public Inventory getInventory() {
return inventory; return inventory;
} }
@Override @Override
public void open() { public void open() {
// Counter stuff that the game uses to keep track of inventories // Counter stuff that the game uses to keep track of inventories
int id = entity.nextContainerCounter(); int id = entity.nextContainerCounter();
// Send the packet // Send the packet
entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0)); entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
// Set their active container to this anvil // Set their active container to this anvil
entity.activeContainer = this; entity.activeContainer = this;
// Set their active container window id to that counter stuff // Set their active container window id to that counter stuff
entity.activeContainer.windowId = id; entity.activeContainer.windowId = id;
// Add the slot listener // Add the slot listener
entity.activeContainer.addSlotListener(entity); entity.activeContainer.addSlotListener(entity);
} }
} }

View File

@ -0,0 +1,65 @@
package com.songoda.core.nms.v1_12_R1.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_12_R1.NBTTagCompound;
public class NBTCompoundImpl implements NBTCompound {
protected NBTTagCompound compound;
protected NBTCompoundImpl(NBTTagCompound compound) {
this.compound = compound;
}
public NBTCompoundImpl() {
this.compound = new NBTTagCompound();
}
@Override
public NBTCompound set(String tag, String s) {
compound.setString(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, boolean b) {
compound.setBoolean(tag, b);
return this;
}
@Override
public NBTCompound set(String tag, int i) {
compound.setInt(tag, i);
return this;
}
@Override
public NBTCompound set(String tag, long l) {
compound.setLong(tag, l);
return this;
}
@Override
public NBTCompound set(String tag, short s) {
compound.setShort(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, byte b) {
compound.setByte(tag, b);
return this;
}
@Override
public boolean has(String tag) {
return compound.hasKey(tag);
}
@Override
public NBTObject getNBTObject(String tag) {
return new NBTObjectImpl(compound, tag);
}
}

View File

@ -0,0 +1,21 @@
package com.songoda.core.nms.v1_12_R1.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTCore;
import com.songoda.core.nms.nbt.NBTItem;
import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTCoreImpl implements NBTCore {
@Override
public NBTItem of(ItemStack item) {
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
}
@Override
public NBTCompound newCompound() {
return new NBTCompoundImpl();
}
}

View File

@ -0,0 +1,20 @@
package com.songoda.core.nms.v1_12_R1.nbt;
import com.songoda.core.nms.nbt.NBTItem;
import net.minecraft.server.v1_12_R1.NBTTagCompound;
import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTItemImpl extends NBTCompoundImpl implements NBTItem {
private net.minecraft.server.v1_12_R1.ItemStack nmsItem;
public NBTItemImpl(net.minecraft.server.v1_12_R1.ItemStack nmsItem) {
super(nmsItem.hasTag() ? nmsItem.getTag() : new NBTTagCompound());
this.nmsItem = nmsItem;
}
public ItemStack finish() {
return CraftItemStack.asBukkitCopy(nmsItem);
}
}

View File

@ -0,0 +1,40 @@
package com.songoda.core.nms.v1_12_R1.nbt;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_12_R1.NBTTagCompound;
public class NBTObjectImpl implements NBTObject {
private final NBTTagCompound compound;
private final String tag;
public NBTObjectImpl(NBTTagCompound compound, String tag) {
this.compound = compound;
this.tag = tag;
}
public String asString() {
return compound.getString(tag);
}
public boolean asBoolean() {
return compound.getBoolean(tag);
}
public int asInt() {
return compound.getInt(tag);
}
public long asLong() {
return compound.getLong(tag);
}
public short asShort() {
return compound.getShort(tag);
}
public byte asByte() {
return compound.getByte(tag);
}
}

View File

@ -1,21 +1,20 @@
package com.songoda.core.nms.v1_13_R1; package com.songoda.core.nms.v1_13_R1.anvil;
import com.songoda.core.nms.CoreNMS; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.CustomAnvil; import org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer; import org.bukkit.entity.Player;
import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.InventoryHolder;
public class AnvilCore implements com.songoda.core.nms.anvil.AnvilCore {
public class NMS implements CoreNMS {
@Override
@Override public CustomAnvil createAnvil(Player player) {
public CustomAnvil createAnvil(Player player) { return new AnvilView(((CraftPlayer) player).getHandle(), null);
return new AnvilView(((CraftPlayer) player).getHandle(), null); }
}
@Override
@Override public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
public CustomAnvil createAnvil(Player player, InventoryHolder holder) { return new AnvilView(((CraftPlayer) player).getHandle(), holder);
return new AnvilView(((CraftPlayer) player).getHandle(), holder); }
}
}
}

View File

@ -1,22 +1,22 @@
package com.songoda.core.nms.v1_13_R1; package com.songoda.core.nms.v1_13_R1.anvil;
import net.minecraft.server.v1_13_R1.ContainerAnvil; import net.minecraft.server.v1_13_R1.ContainerAnvil;
import net.minecraft.server.v1_13_R1.IInventory; import net.minecraft.server.v1_13_R1.IInventory;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_13_R1.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_13_R1.inventory.CraftInventoryAnvil;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
public class AnvilInventoryCustom extends CraftInventoryAnvil { public class AnvilInventoryCustom extends CraftInventoryAnvil {
final InventoryHolder holder; final InventoryHolder holder;
public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory, ContainerAnvil container) { public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory, ContainerAnvil container) {
super(location, inventory, resultInventory, container); super(location, inventory, resultInventory, container);
this.holder = holder; this.holder = holder;
} }
@Override @Override
public InventoryHolder getHolder() { public InventoryHolder getHolder() {
return holder; return holder;
} }
} }

View File

@ -1,195 +1,181 @@
package com.songoda.core.nms.v1_13_R1; package com.songoda.core.nms.v1_13_R1.anvil;
import com.songoda.core.nms.CustomAnvil; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.methods.AnvilTextChange; import com.songoda.core.nms.anvil.methods.AnvilTextChange;
import java.lang.reflect.Field; import net.minecraft.server.v1_13_R1.*;
import java.util.logging.Level; import org.bukkit.Location;
import java.util.logging.Logger; import org.bukkit.craftbukkit.v1_13_R1.inventory.CraftInventoryView;
import net.minecraft.server.v1_13_R1.BlockPosition; import org.bukkit.inventory.Inventory;
import net.minecraft.server.v1_13_R1.ChatMessage; import org.bukkit.inventory.InventoryHolder;
import net.minecraft.server.v1_13_R1.ContainerAnvil; import org.bukkit.inventory.ItemStack;
import net.minecraft.server.v1_13_R1.EntityHuman;
import net.minecraft.server.v1_13_R1.EntityPlayer; import java.lang.reflect.Field;
import net.minecraft.server.v1_13_R1.IInventory; import java.util.logging.Level;
import net.minecraft.server.v1_13_R1.PacketPlayOutOpenWindow; import java.util.logging.Logger;
import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_13_R1.inventory.CraftInventoryView; public class AnvilView extends ContainerAnvil implements CustomAnvil {
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; private final EntityPlayer entity;
import org.bukkit.inventory.ItemStack; private final Inventory inventory;
private String title = "Repairing";
public class AnvilView extends ContainerAnvil implements CustomAnvil { private int cost = -1;
private boolean canUse = true;
EntityPlayer entity; private AnvilTextChange textChange = null;
Inventory inventory;
String title = "Repairing"; // used for setting custom inventory
private int cost = -1; static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result
private boolean canUse = true; static Field mc_ContainerAnvil_resultInventory; // full inventory
private AnvilTextChange textChange = null; static Field mc_ContainerAnvil_bukkitEntity;
// used for setting custom inventory static {
static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result try {
static Field mc_ContainerAnvil_resultInventory; // full inventory mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("repairInventory");
static Field mc_ContainerAnvil_bukkitEntity; mc_ContainerAnvil_repairInventory.setAccessible(true);
mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("resultInventory");
static { mc_ContainerAnvil_resultInventory.setAccessible(true);
try { mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity"); mc_ContainerAnvil_bukkitEntity.setAccessible(true);
mc_ContainerAnvil_bukkitEntity.setAccessible(true); } catch (Exception ex) {
mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("repairInventory"); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
mc_ContainerAnvil_repairInventory.setAccessible(true); }
mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("resultInventory"); }
mc_ContainerAnvil_resultInventory.setAccessible(true);
} catch (NoSuchFieldException ignore) { public AnvilView(EntityPlayer entity, InventoryHolder holder) {
try { super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h"); this.checkReachable = false;
mc_ContainerAnvil_repairInventory.setAccessible(true); this.entity = entity;
mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g"); if (holder != null) {
mc_ContainerAnvil_resultInventory.setAccessible(true); this.inventory = getBukkitView(entity, holder).getTopInventory();
} catch (Exception ex) { } else {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); this.inventory = getBukkitView().getTopInventory();
} }
} catch (Exception ex) { }
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
} try {
AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
public AnvilView(EntityPlayer entity, InventoryHolder holder) { new Location(entity.world.getWorld(), 0, 0, 0),
super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity); (IInventory) mc_ContainerAnvil_repairInventory.get(this),
this.checkReachable = false; (IInventory) mc_ContainerAnvil_resultInventory.get(this), this);
this.entity = entity; CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this);
if (holder != null) { mc_ContainerAnvil_bukkitEntity.set(this, view);
this.inventory = getBukkitView(entity, holder).getTopInventory(); return view;
} else { } catch (Exception ex) {
this.inventory = getBukkitView().getTopInventory(); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
} return getBukkitView();
}
public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
try { @Override
AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder, public boolean canUse(EntityHuman entityhuman) {
new Location(entity.world.getWorld(), 0, 0, 0), return canUse;
(IInventory) mc_ContainerAnvil_repairInventory.get(this), }
(IInventory) mc_ContainerAnvil_resultInventory.get(this), this);
CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this); @Override
mc_ContainerAnvil_bukkitEntity.set(this, view); public void d() {
return view; super.d();
} catch (Exception ex) { if (cost >= 0) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); this.levelCost = cost;
} }
return getBukkitView(); }
}
@Override
@Override public void update() {
public boolean canUse(EntityHuman entityhuman) { d();
return canUse; }
}
@Override
@Override public String getRenameText() {
public void d() { return this.renameText;
super.d(); }
if (cost >= 0) {
this.levelCost = cost; @Override
} public void setRenameText(String text) {
} this.a(text);
}
@Override
public void update() { @Override
d(); public void setOnChange(AnvilTextChange handler) {
} textChange = handler;
}
@Override
public String getRenameText() { @Override
return this.renameText; public String getCustomTitle() {
} return title;
}
@Override
public void setRenameText(String text) { @Override
this.a(text); public void setCustomTitle(String title) {
} this.title = title;
}
@Override
public void setOnChange(AnvilTextChange handler) { @Override
textChange = handler; public void setLevelCost(int cost) {
} this.cost = cost;
}
@Override
public String getCustomTitle() { @Override
return title; public int getLevelCost() {
} return cost >= 0 ? cost : this.levelCost;
}
@Override
public void setCustomTitle(String title) { @Override
this.title = title; public void setCanUse(boolean bool) {
} this.canUse = bool;
}
@Override
public void setLevelCost(int cost) { @Override
this.cost = cost; public ItemStack getLeftInput() {
} return inventory.getItem(0);
}
@Override
public int getLevelCost() { @Override
return cost >= 0 ? cost : this.levelCost; public ItemStack getRightInput() {
} return inventory.getItem(1);
}
@Override
public void setCanUse(boolean bool) { @Override
this.canUse = bool; public ItemStack getOutput() {
} return inventory.getItem(2);
}
@Override
public ItemStack getLeftInput() { @Override
return inventory.getItem(0); public void setLeftInput(ItemStack item) {
} inventory.setItem(0, item);
}
@Override
public ItemStack getRightInput() { @Override
return inventory.getItem(1); public void setRightInput(ItemStack item) {
} inventory.setItem(1, item);
}
@Override
public ItemStack getOutput() { @Override
return inventory.getItem(2); public void setOutput(ItemStack item) {
} inventory.setItem(2, item);
}
@Override
public void setLeftInput(ItemStack item) { @Override
inventory.setItem(0, item); public Inventory getInventory() {
} return inventory;
}
@Override
public void setRightInput(ItemStack item) { @Override
inventory.setItem(1, item); public void open() {
}
// Counter stuff that the game uses to keep track of inventories
@Override int id = entity.nextContainerCounter();
public void setOutput(ItemStack item) {
inventory.setItem(2, item); // Send the packet
} entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
@Override // Set their active container to this anvil
public Inventory getInventory() { entity.activeContainer = this;
return inventory;
} // Set their active container window id to that counter stuff
entity.activeContainer.windowId = id;
@Override
public void open() { // Add the slot listener
entity.activeContainer.addSlotListener(entity);
// Counter stuff that the game uses to keep track of inventories }
int id = entity.nextContainerCounter();
}
// Send the packet
entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
// Set their active container to this anvil
entity.activeContainer = this;
// Set their active container window id to that counter stuff
entity.activeContainer.windowId = id;
// Add the slot listener
entity.activeContainer.addSlotListener(entity);
}
}

View File

@ -0,0 +1,65 @@
package com.songoda.core.nms.v1_13_R1.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_13_R1.NBTTagCompound;
public class NBTCompoundImpl implements NBTCompound {
protected NBTTagCompound compound;
protected NBTCompoundImpl(NBTTagCompound compound) {
this.compound = compound;
}
public NBTCompoundImpl() {
this.compound = new NBTTagCompound();
}
@Override
public NBTCompound set(String tag, String s) {
compound.setString(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, boolean b) {
compound.setBoolean(tag, b);
return this;
}
@Override
public NBTCompound set(String tag, int i) {
compound.setInt(tag, i);
return this;
}
@Override
public NBTCompound set(String tag, long l) {
compound.setLong(tag, l);
return this;
}
@Override
public NBTCompound set(String tag, short s) {
compound.setShort(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, byte b) {
compound.setByte(tag, b);
return this;
}
@Override
public boolean has(String tag) {
return compound.hasKey(tag);
}
@Override
public NBTObject getNBTObject(String tag) {
return new NBTObjectImpl(compound, tag);
}
}

View File

@ -0,0 +1,21 @@
package com.songoda.core.nms.v1_13_R1.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTCore;
import com.songoda.core.nms.nbt.NBTItem;
import org.bukkit.craftbukkit.v1_13_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTCoreImpl implements NBTCore {
@Override
public NBTItem of(ItemStack item) {
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
}
@Override
public NBTCompound newCompound() {
return new NBTCompoundImpl();
}
}

View File

@ -0,0 +1,20 @@
package com.songoda.core.nms.v1_13_R1.nbt;
import com.songoda.core.nms.nbt.NBTItem;
import net.minecraft.server.v1_13_R1.NBTTagCompound;
import org.bukkit.craftbukkit.v1_13_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTItemImpl extends NBTCompoundImpl implements NBTItem {
private net.minecraft.server.v1_13_R1.ItemStack nmsItem;
public NBTItemImpl(net.minecraft.server.v1_13_R1.ItemStack nmsItem) {
super(nmsItem.hasTag() ? nmsItem.getTag() : new NBTTagCompound());
this.nmsItem = nmsItem;
}
public ItemStack finish() {
return CraftItemStack.asBukkitCopy(nmsItem);
}
}

View File

@ -0,0 +1,40 @@
package com.songoda.core.nms.v1_13_R1.nbt;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_13_R1.NBTTagCompound;
public class NBTObjectImpl implements NBTObject {
private final NBTTagCompound compound;
private final String tag;
public NBTObjectImpl(NBTTagCompound compound, String tag) {
this.compound = compound;
this.tag = tag;
}
public String asString() {
return compound.getString(tag);
}
public boolean asBoolean() {
return compound.getBoolean(tag);
}
public int asInt() {
return compound.getInt(tag);
}
public long asLong() {
return compound.getLong(tag);
}
public short asShort() {
return compound.getShort(tag);
}
public byte asByte() {
return compound.getByte(tag);
}
}

View File

@ -1,21 +1,20 @@
package com.songoda.core.nms.v1_13_R2; package com.songoda.core.nms.v1_13_R2.anvil;
import com.songoda.core.nms.CoreNMS; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.CustomAnvil; import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer; import org.bukkit.entity.Player;
import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.InventoryHolder;
public class AnvilCore implements com.songoda.core.nms.anvil.AnvilCore {
public class NMS implements CoreNMS {
@Override
@Override public CustomAnvil createAnvil(Player player) {
public CustomAnvil createAnvil(Player player) { return new AnvilView(((CraftPlayer) player).getHandle(), null);
return new AnvilView(((CraftPlayer) player).getHandle(), null); }
}
@Override
@Override public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
public CustomAnvil createAnvil(Player player, InventoryHolder holder) { return new AnvilView(((CraftPlayer) player).getHandle(), holder);
return new AnvilView(((CraftPlayer) player).getHandle(), holder); }
}
}
}

View File

@ -1,22 +1,22 @@
package com.songoda.core.nms.v1_13_R2; package com.songoda.core.nms.v1_13_R2.anvil;
import net.minecraft.server.v1_13_R2.ContainerAnvil; import net.minecraft.server.v1_13_R2.ContainerAnvil;
import net.minecraft.server.v1_13_R2.IInventory; import net.minecraft.server.v1_13_R2.IInventory;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftInventoryAnvil;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
public class AnvilInventoryCustom extends CraftInventoryAnvil { public class AnvilInventoryCustom extends CraftInventoryAnvil {
final InventoryHolder holder; final InventoryHolder holder;
public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory, ContainerAnvil container) { public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory, ContainerAnvil container) {
super(location, inventory, resultInventory, container); super(location, inventory, resultInventory, container);
this.holder = holder; this.holder = holder;
} }
@Override @Override
public InventoryHolder getHolder() { public InventoryHolder getHolder() {
return holder; return holder;
} }
} }

View File

@ -1,186 +1,186 @@
package com.songoda.core.nms.v1_13_R2; package com.songoda.core.nms.v1_13_R2.anvil;
import com.songoda.core.nms.CustomAnvil; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.methods.AnvilTextChange; import com.songoda.core.nms.anvil.methods.AnvilTextChange;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.minecraft.server.v1_13_R2.BlockPosition; import net.minecraft.server.v1_13_R2.BlockPosition;
import net.minecraft.server.v1_13_R2.ChatMessage; import net.minecraft.server.v1_13_R2.ChatMessage;
import net.minecraft.server.v1_13_R2.ContainerAnvil; import net.minecraft.server.v1_13_R2.ContainerAnvil;
import net.minecraft.server.v1_13_R2.EntityHuman; import net.minecraft.server.v1_13_R2.EntityHuman;
import net.minecraft.server.v1_13_R2.EntityPlayer; import net.minecraft.server.v1_13_R2.EntityPlayer;
import net.minecraft.server.v1_13_R2.IInventory; import net.minecraft.server.v1_13_R2.IInventory;
import net.minecraft.server.v1_13_R2.PacketPlayOutOpenWindow; import net.minecraft.server.v1_13_R2.PacketPlayOutOpenWindow;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftInventoryView;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
public class AnvilView extends ContainerAnvil implements CustomAnvil { public class AnvilView extends ContainerAnvil implements CustomAnvil {
private final EntityPlayer entity; private final EntityPlayer entity;
private final Inventory inventory; private final Inventory inventory;
private String title = "Repairing"; private String title = "Repairing";
private int cost = -1; private int cost = -1;
private boolean canUse = true; private boolean canUse = true;
private AnvilTextChange textChange = null; private AnvilTextChange textChange = null;
// used for setting custom inventory // used for setting custom inventory
static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result
static Field mc_ContainerAnvil_resultInventory; // full inventory static Field mc_ContainerAnvil_resultInventory; // full inventory
static Field mc_ContainerAnvil_bukkitEntity; static Field mc_ContainerAnvil_bukkitEntity;
static { static {
try { try {
mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("repairInventory"); mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("repairInventory");
mc_ContainerAnvil_repairInventory.setAccessible(true); mc_ContainerAnvil_repairInventory.setAccessible(true);
mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("resultInventory"); mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("resultInventory");
mc_ContainerAnvil_resultInventory.setAccessible(true); mc_ContainerAnvil_resultInventory.setAccessible(true);
mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity"); mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
mc_ContainerAnvil_bukkitEntity.setAccessible(true); mc_ContainerAnvil_bukkitEntity.setAccessible(true);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
} }
public AnvilView(EntityPlayer entity, InventoryHolder holder) { public AnvilView(EntityPlayer entity, InventoryHolder holder) {
super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity); super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
this.checkReachable = false; this.checkReachable = false;
this.entity = entity; this.entity = entity;
if (holder != null) { if (holder != null) {
this.inventory = getBukkitView(entity, holder).getTopInventory(); this.inventory = getBukkitView(entity, holder).getTopInventory();
} else { } else {
this.inventory = getBukkitView().getTopInventory(); this.inventory = getBukkitView().getTopInventory();
} }
} }
public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) { public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
try { try {
AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder, AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
new Location(entity.world.getWorld(), 0, 0, 0), new Location(entity.world.getWorld(), 0, 0, 0),
(IInventory) mc_ContainerAnvil_repairInventory.get(this), (IInventory) mc_ContainerAnvil_repairInventory.get(this),
(IInventory) mc_ContainerAnvil_resultInventory.get(this), this); (IInventory) mc_ContainerAnvil_resultInventory.get(this), this);
CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this); CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this);
mc_ContainerAnvil_bukkitEntity.set(this, view); mc_ContainerAnvil_bukkitEntity.set(this, view);
return view; return view;
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
return getBukkitView(); return getBukkitView();
} }
@Override @Override
public boolean canUse(EntityHuman entityhuman) { public boolean canUse(EntityHuman entityhuman) {
return canUse; return canUse;
} }
@Override @Override
public void d() { public void d() {
super.d(); super.d();
if (cost >= 0) { if (cost >= 0) {
this.levelCost = cost; this.levelCost = cost;
} }
} }
@Override @Override
public void update() { public void update() {
d(); d();
} }
@Override @Override
public String getRenameText() { public String getRenameText() {
return this.renameText; return this.renameText;
} }
@Override @Override
public void setRenameText(String text) { public void setRenameText(String text) {
this.a(text); this.a(text);
} }
@Override @Override
public void setOnChange(AnvilTextChange handler) { public void setOnChange(AnvilTextChange handler) {
textChange = handler; textChange = handler;
} }
@Override @Override
public String getCustomTitle() { public String getCustomTitle() {
return title; return title;
} }
@Override @Override
public void setCustomTitle(String title) { public void setCustomTitle(String title) {
this.title = title; this.title = title;
} }
@Override @Override
public void setLevelCost(int cost) { public void setLevelCost(int cost) {
this.cost = cost; this.cost = cost;
} }
@Override @Override
public int getLevelCost() { public int getLevelCost() {
return cost >= 0 ? cost : this.levelCost; return cost >= 0 ? cost : this.levelCost;
} }
@Override @Override
public void setCanUse(boolean bool) { public void setCanUse(boolean bool) {
this.canUse = bool; this.canUse = bool;
} }
@Override @Override
public ItemStack getLeftInput() { public ItemStack getLeftInput() {
return inventory.getItem(0); return inventory.getItem(0);
} }
@Override @Override
public ItemStack getRightInput() { public ItemStack getRightInput() {
return inventory.getItem(1); return inventory.getItem(1);
} }
@Override @Override
public ItemStack getOutput() { public ItemStack getOutput() {
return inventory.getItem(2); return inventory.getItem(2);
} }
@Override @Override
public void setLeftInput(ItemStack item) { public void setLeftInput(ItemStack item) {
inventory.setItem(0, item); inventory.setItem(0, item);
} }
@Override @Override
public void setRightInput(ItemStack item) { public void setRightInput(ItemStack item) {
inventory.setItem(1, item); inventory.setItem(1, item);
} }
@Override @Override
public void setOutput(ItemStack item) { public void setOutput(ItemStack item) {
inventory.setItem(2, item); inventory.setItem(2, item);
} }
@Override @Override
public Inventory getInventory() { public Inventory getInventory() {
return inventory; return inventory;
} }
@Override @Override
public void open() { public void open() {
// Counter stuff that the game uses to keep track of inventories // Counter stuff that the game uses to keep track of inventories
int id = entity.nextContainerCounter(); int id = entity.nextContainerCounter();
// Send the packet // Send the packet
entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0)); entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
// Set their active container to this anvil // Set their active container to this anvil
entity.activeContainer = this; entity.activeContainer = this;
// Set their active container window id to that counter stuff // Set their active container window id to that counter stuff
entity.activeContainer.windowId = id; entity.activeContainer.windowId = id;
// Add the slot listener // Add the slot listener
entity.activeContainer.addSlotListener(entity); entity.activeContainer.addSlotListener(entity);
} }
} }

View File

@ -0,0 +1,65 @@
package com.songoda.core.nms.v1_13_R2.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_13_R2.NBTTagCompound;
public class NBTCompoundImpl implements NBTCompound {
protected NBTTagCompound compound;
protected NBTCompoundImpl(NBTTagCompound compound) {
this.compound = compound;
}
public NBTCompoundImpl() {
this.compound = new NBTTagCompound();
}
@Override
public NBTCompound set(String tag, String s) {
compound.setString(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, boolean b) {
compound.setBoolean(tag, b);
return this;
}
@Override
public NBTCompound set(String tag, int i) {
compound.setInt(tag, i);
return this;
}
@Override
public NBTCompound set(String tag, long l) {
compound.setLong(tag, l);
return this;
}
@Override
public NBTCompound set(String tag, short s) {
compound.setShort(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, byte b) {
compound.setByte(tag, b);
return this;
}
@Override
public boolean has(String tag) {
return compound.hasKey(tag);
}
@Override
public NBTObject getNBTObject(String tag) {
return new NBTObjectImpl(compound, tag);
}
}

View File

@ -0,0 +1,21 @@
package com.songoda.core.nms.v1_13_R2.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTCore;
import com.songoda.core.nms.nbt.NBTItem;
import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTCoreImpl implements NBTCore {
@Override
public NBTItem of(ItemStack item) {
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
}
@Override
public NBTCompound newCompound() {
return new NBTCompoundImpl();
}
}

View File

@ -0,0 +1,20 @@
package com.songoda.core.nms.v1_13_R2.nbt;
import com.songoda.core.nms.nbt.NBTItem;
import net.minecraft.server.v1_13_R2.NBTTagCompound;
import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTItemImpl extends NBTCompoundImpl implements NBTItem {
private net.minecraft.server.v1_13_R2.ItemStack nmsItem;
public NBTItemImpl(net.minecraft.server.v1_13_R2.ItemStack nmsItem) {
super(nmsItem.hasTag() ? nmsItem.getTag() : new NBTTagCompound());
this.nmsItem = nmsItem;
}
public ItemStack finish() {
return CraftItemStack.asBukkitCopy(nmsItem);
}
}

View File

@ -0,0 +1,40 @@
package com.songoda.core.nms.v1_13_R2.nbt;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_13_R2.NBTTagCompound;
public class NBTObjectImpl implements NBTObject {
private final NBTTagCompound compound;
private final String tag;
public NBTObjectImpl(NBTTagCompound compound, String tag) {
this.compound = compound;
this.tag = tag;
}
public String asString() {
return compound.getString(tag);
}
public boolean asBoolean() {
return compound.getBoolean(tag);
}
public int asInt() {
return compound.getInt(tag);
}
public long asLong() {
return compound.getLong(tag);
}
public short asShort() {
return compound.getShort(tag);
}
public byte asByte() {
return compound.getByte(tag);
}
}

View File

@ -1,13 +1,12 @@
package com.songoda.core.nms.v1_14_R1; package com.songoda.core.nms.v1_14_R1.anvil;
import com.songoda.core.nms.CoreNMS; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.CustomAnvil;
import net.minecraft.server.v1_14_R1.EntityPlayer; import net.minecraft.server.v1_14_R1.EntityPlayer;
import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
public class NMS implements CoreNMS { public class AnvilCore implements com.songoda.core.nms.anvil.AnvilCore {
@Override @Override
public CustomAnvil createAnvil(Player player) { public CustomAnvil createAnvil(Player player) {

View File

@ -1,4 +1,4 @@
package com.songoda.core.nms.v1_14_R1; package com.songoda.core.nms.v1_14_R1.anvil;
import net.minecraft.server.v1_14_R1.ContainerAnvil; import net.minecraft.server.v1_14_R1.ContainerAnvil;
import net.minecraft.server.v1_14_R1.IInventory; import net.minecraft.server.v1_14_R1.IInventory;

View File

@ -1,7 +1,7 @@
package com.songoda.core.nms.v1_14_R1; package com.songoda.core.nms.v1_14_R1.anvil;
import com.songoda.core.nms.CustomAnvil; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.methods.AnvilTextChange; import com.songoda.core.nms.anvil.methods.AnvilTextChange;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.logging.Level; import java.util.logging.Level;

View File

@ -0,0 +1,65 @@
package com.songoda.core.nms.v1_14_R1.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_14_R1.NBTTagCompound;
public class NBTCompoundImpl implements NBTCompound {
protected NBTTagCompound compound;
protected NBTCompoundImpl(NBTTagCompound compound) {
this.compound = compound;
}
public NBTCompoundImpl() {
this.compound = new NBTTagCompound();
}
@Override
public NBTCompound set(String tag, String s) {
compound.setString(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, boolean b) {
compound.setBoolean(tag, b);
return this;
}
@Override
public NBTCompound set(String tag, int i) {
compound.setInt(tag, i);
return this;
}
@Override
public NBTCompound set(String tag, long l) {
compound.setLong(tag, l);
return this;
}
@Override
public NBTCompound set(String tag, short s) {
compound.setShort(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, byte b) {
compound.setByte(tag, b);
return this;
}
@Override
public boolean has(String tag) {
return compound.hasKey(tag);
}
@Override
public NBTObject getNBTObject(String tag) {
return new NBTObjectImpl(compound, tag);
}
}

View File

@ -0,0 +1,21 @@
package com.songoda.core.nms.v1_14_R1.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTCore;
import com.songoda.core.nms.nbt.NBTItem;
import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTCoreImpl implements NBTCore {
@Override
public NBTItem of(ItemStack item) {
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
}
@Override
public NBTCompound newCompound() {
return new NBTCompoundImpl();
}
}

View File

@ -0,0 +1,20 @@
package com.songoda.core.nms.v1_14_R1.nbt;
import com.songoda.core.nms.nbt.NBTItem;
import net.minecraft.server.v1_14_R1.NBTTagCompound;
import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTItemImpl extends NBTCompoundImpl implements NBTItem {
private net.minecraft.server.v1_14_R1.ItemStack nmsItem;
public NBTItemImpl(net.minecraft.server.v1_14_R1.ItemStack nmsItem) {
super(nmsItem.hasTag() ? nmsItem.getTag() : new NBTTagCompound());
this.nmsItem = nmsItem;
}
public ItemStack finish() {
return CraftItemStack.asBukkitCopy(nmsItem);
}
}

View File

@ -0,0 +1,40 @@
package com.songoda.core.nms.v1_14_R1.nbt;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_14_R1.NBTTagCompound;
public class NBTObjectImpl implements NBTObject {
private final NBTTagCompound compound;
private final String tag;
public NBTObjectImpl(NBTTagCompound compound, String tag) {
this.compound = compound;
this.tag = tag;
}
public String asString() {
return compound.getString(tag);
}
public boolean asBoolean() {
return compound.getBoolean(tag);
}
public int asInt() {
return compound.getInt(tag);
}
public long asLong() {
return compound.getLong(tag);
}
public short asShort() {
return compound.getShort(tag);
}
public byte asByte() {
return compound.getByte(tag);
}
}

View File

@ -1,13 +1,12 @@
package com.songoda.core.nms.v1_15_R1; package com.songoda.core.nms.v1_15_R1.anvil;
import com.songoda.core.nms.CoreNMS; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.CustomAnvil;
import net.minecraft.server.v1_15_R1.EntityPlayer; import net.minecraft.server.v1_15_R1.EntityPlayer;
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
public class NMS implements CoreNMS { public class AnvilCore implements com.songoda.core.nms.anvil.AnvilCore {
@Override @Override
public CustomAnvil createAnvil(Player player) { public CustomAnvil createAnvil(Player player) {

View File

@ -1,4 +1,4 @@
package com.songoda.core.nms.v1_15_R1; package com.songoda.core.nms.v1_15_R1.anvil;
import net.minecraft.server.v1_15_R1.ContainerAnvil; import net.minecraft.server.v1_15_R1.ContainerAnvil;
import net.minecraft.server.v1_15_R1.IInventory; import net.minecraft.server.v1_15_R1.IInventory;

View File

@ -1,7 +1,7 @@
package com.songoda.core.nms.v1_15_R1; package com.songoda.core.nms.v1_15_R1.anvil;
import com.songoda.core.nms.CustomAnvil; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.methods.AnvilTextChange; import com.songoda.core.nms.anvil.methods.AnvilTextChange;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;

View File

@ -0,0 +1,68 @@
package com.songoda.core.nms.v1_15_R1.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_15_R1.NBTTagCompound;
import net.minecraft.server.v1_15_R1.NBTTagList;
import java.util.List;
public class NBTCompoundImpl implements NBTCompound {
protected NBTTagCompound compound;
protected NBTCompoundImpl(NBTTagCompound compound) {
this.compound = compound;
}
public NBTCompoundImpl() {
this.compound = new NBTTagCompound();
}
@Override
public NBTCompound set(String tag, String s) {
compound.setString(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, boolean b) {
compound.setBoolean(tag, b);
return this;
}
@Override
public NBTCompound set(String tag, int i) {
compound.setInt(tag, i);
return this;
}
@Override
public NBTCompound set(String tag, long l) {
compound.setLong(tag, l);
return this;
}
@Override
public NBTCompound set(String tag, short s) {
compound.setShort(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, byte b) {
compound.setByte(tag, b);
return this;
}
@Override
public boolean has(String tag) {
return compound.hasKey(tag);
}
@Override
public NBTObject getNBTObject(String tag) {
return new NBTObjectImpl(compound, tag);
}
}

View File

@ -0,0 +1,21 @@
package com.songoda.core.nms.v1_15_R1.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTCore;
import com.songoda.core.nms.nbt.NBTItem;
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTCoreImpl implements NBTCore {
@Override
public NBTItem of(ItemStack item) {
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
}
@Override
public NBTCompound newCompound() {
return new NBTCompoundImpl();
}
}

View File

@ -0,0 +1,20 @@
package com.songoda.core.nms.v1_15_R1.nbt;
import com.songoda.core.nms.nbt.NBTItem;
import net.minecraft.server.v1_15_R1.NBTTagCompound;
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTItemImpl extends NBTCompoundImpl implements NBTItem {
private net.minecraft.server.v1_15_R1.ItemStack nmsItem;
public NBTItemImpl(net.minecraft.server.v1_15_R1.ItemStack nmsItem) {
super(nmsItem.hasTag() ? nmsItem.getTag() : new NBTTagCompound());
this.nmsItem = nmsItem;
}
public ItemStack finish() {
return CraftItemStack.asBukkitCopy(nmsItem);
}
}

View File

@ -0,0 +1,40 @@
package com.songoda.core.nms.v1_15_R1.nbt;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_15_R1.NBTTagCompound;
public class NBTObjectImpl implements NBTObject {
private final NBTTagCompound compound;
private final String tag;
public NBTObjectImpl(NBTTagCompound compound, String tag) {
this.compound = compound;
this.tag = tag;
}
public String asString() {
return compound.getString(tag);
}
public boolean asBoolean() {
return compound.getBoolean(tag);
}
public int asInt() {
return compound.getInt(tag);
}
public long asLong() {
return compound.getLong(tag);
}
public short asShort() {
return compound.getShort(tag);
}
public byte asByte() {
return compound.getByte(tag);
}
}

View File

@ -1,21 +1,20 @@
package com.songoda.core.nms.v1_8_R1; package com.songoda.core.nms.v1_8_R1.anvil;
import com.songoda.core.nms.CoreNMS; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.CustomAnvil; import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; import org.bukkit.entity.Player;
import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.InventoryHolder;
public class AnvilCore implements com.songoda.core.nms.anvil.AnvilCore {
public class NMS implements CoreNMS {
@Override
@Override public CustomAnvil createAnvil(Player player) {
public CustomAnvil createAnvil(Player player) { return new AnvilView(((CraftPlayer) player).getHandle(), null);
return new AnvilView(((CraftPlayer) player).getHandle(), null); }
}
@Override
@Override public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
public CustomAnvil createAnvil(Player player, InventoryHolder holder) { return new AnvilView(((CraftPlayer) player).getHandle(), holder);
return new AnvilView(((CraftPlayer) player).getHandle(), holder); }
}
}
}

View File

@ -1,20 +1,20 @@
package com.songoda.core.nms.v1_8_R1; package com.songoda.core.nms.v1_8_R1.anvil;
import net.minecraft.server.v1_8_R1.IInventory; import net.minecraft.server.v1_8_R1.IInventory;
import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftInventoryAnvil;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
public class AnvilInventoryCustom extends CraftInventoryAnvil { public class AnvilInventoryCustom extends CraftInventoryAnvil {
final InventoryHolder holder; final InventoryHolder holder;
public AnvilInventoryCustom(InventoryHolder holder, IInventory inventory, IInventory resultInventory) { public AnvilInventoryCustom(InventoryHolder holder, IInventory inventory, IInventory resultInventory) {
super(inventory, resultInventory); super(inventory, resultInventory);
this.holder = holder; this.holder = holder;
} }
@Override @Override
public InventoryHolder getHolder() { public InventoryHolder getHolder() {
return holder; return holder;
} }
} }

View File

@ -1,201 +1,201 @@
package com.songoda.core.nms.v1_8_R1; package com.songoda.core.nms.v1_8_R1.anvil;
import com.songoda.core.nms.CustomAnvil; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.methods.AnvilTextChange; import com.songoda.core.nms.anvil.methods.AnvilTextChange;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.minecraft.server.v1_8_R1.BlockPosition; import net.minecraft.server.v1_8_R1.BlockPosition;
import net.minecraft.server.v1_8_R1.ChatMessage; import net.minecraft.server.v1_8_R1.ChatMessage;
import net.minecraft.server.v1_8_R1.ContainerAnvil; import net.minecraft.server.v1_8_R1.ContainerAnvil;
import net.minecraft.server.v1_8_R1.EntityHuman; import net.minecraft.server.v1_8_R1.EntityHuman;
import net.minecraft.server.v1_8_R1.EntityPlayer; import net.minecraft.server.v1_8_R1.EntityPlayer;
import net.minecraft.server.v1_8_R1.IInventory; import net.minecraft.server.v1_8_R1.IInventory;
import net.minecraft.server.v1_8_R1.PacketPlayOutOpenWindow; import net.minecraft.server.v1_8_R1.PacketPlayOutOpenWindow;
import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftInventoryView;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
public class AnvilView extends ContainerAnvil implements CustomAnvil { public class AnvilView extends ContainerAnvil implements CustomAnvil {
private final EntityPlayer entity; private final EntityPlayer entity;
private final Inventory inventory; private final Inventory inventory;
private String title = "Repairing"; private String title = "Repairing";
private int cost = -1; private int cost = -1;
private boolean canUse = true; private boolean canUse = true;
private AnvilTextChange textChange = null; private AnvilTextChange textChange = null;
// used for setting custom inventory // used for setting custom inventory
static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result
static Field mc_ContainerAnvil_resultInventory; // full inventory static Field mc_ContainerAnvil_resultInventory; // full inventory
static Field mc_ContainerAnvil_bukkitEntity; static Field mc_ContainerAnvil_bukkitEntity;
static { static {
try { try {
mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h"); mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h");
mc_ContainerAnvil_repairInventory.setAccessible(true); mc_ContainerAnvil_repairInventory.setAccessible(true);
mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g"); mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
mc_ContainerAnvil_resultInventory.setAccessible(true); mc_ContainerAnvil_resultInventory.setAccessible(true);
mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity"); mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
mc_ContainerAnvil_bukkitEntity.setAccessible(true); mc_ContainerAnvil_bukkitEntity.setAccessible(true);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
} }
// used for grabbing the rename text string // used for grabbing the rename text string
static Field mc_ContainerAnvil_renameText; static Field mc_ContainerAnvil_renameText;
static { static {
try { try {
mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l"); mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l");
mc_ContainerAnvil_renameText.setAccessible(true); mc_ContainerAnvil_renameText.setAccessible(true);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
} }
} }
public AnvilView(EntityPlayer entity, InventoryHolder holder) { public AnvilView(EntityPlayer entity, InventoryHolder holder) {
super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity); super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
this.entity = entity; this.entity = entity;
if (holder != null) { if (holder != null) {
this.inventory = getBukkitView(entity, holder).getTopInventory(); this.inventory = getBukkitView(entity, holder).getTopInventory();
} else { } else {
this.inventory = getBukkitView().getTopInventory(); this.inventory = getBukkitView().getTopInventory();
} }
} }
public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) { public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
try { try {
AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder, AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
(IInventory) mc_ContainerAnvil_repairInventory.get(this), (IInventory) mc_ContainerAnvil_repairInventory.get(this),
(IInventory) mc_ContainerAnvil_resultInventory.get(this)); (IInventory) mc_ContainerAnvil_resultInventory.get(this));
CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this); CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this);
mc_ContainerAnvil_bukkitEntity.set(this, view); mc_ContainerAnvil_bukkitEntity.set(this, view);
return view; return view;
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
return getBukkitView(); return getBukkitView();
} }
@Override @Override
public boolean a(EntityHuman entityhuman) { public boolean a(EntityHuman entityhuman) {
return canUse; return canUse;
} }
@Override @Override
public void e() { public void e() {
super.e(); super.e();
if (cost >= 0) { if (cost >= 0) {
this.a = cost; this.a = cost;
} }
} }
@Override @Override
public void update() { public void update() {
e(); e();
} }
@Override @Override
public String getRenameText() { public String getRenameText() {
try { try {
//return this.l; //return this.l;
return (String) mc_ContainerAnvil_renameText.get(this); return (String) mc_ContainerAnvil_renameText.get(this);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
} }
return null; return null;
} }
@Override @Override
public void setRenameText(String text) { public void setRenameText(String text) {
this.a(text); this.a(text);
} }
@Override @Override
public void setOnChange(AnvilTextChange handler) { public void setOnChange(AnvilTextChange handler) {
textChange = handler; textChange = handler;
} }
@Override @Override
public String getCustomTitle() { public String getCustomTitle() {
return title; return title;
} }
@Override @Override
public void setCustomTitle(String title) { public void setCustomTitle(String title) {
this.title = title; this.title = title;
} }
@Override @Override
public void setLevelCost(int cost) { public void setLevelCost(int cost) {
this.cost = cost; this.cost = cost;
} }
@Override @Override
public int getLevelCost() { public int getLevelCost() {
return cost >= 0 ? cost : this.a; return cost >= 0 ? cost : this.a;
} }
@Override @Override
public void setCanUse(boolean bool) { public void setCanUse(boolean bool) {
this.canUse = bool; this.canUse = bool;
} }
@Override @Override
public ItemStack getLeftInput() { public ItemStack getLeftInput() {
return inventory.getItem(0); return inventory.getItem(0);
} }
@Override @Override
public ItemStack getRightInput() { public ItemStack getRightInput() {
return inventory.getItem(1); return inventory.getItem(1);
} }
@Override @Override
public ItemStack getOutput() { public ItemStack getOutput() {
return inventory.getItem(2); return inventory.getItem(2);
} }
@Override @Override
public void setLeftInput(ItemStack item) { public void setLeftInput(ItemStack item) {
inventory.setItem(0, item); inventory.setItem(0, item);
} }
@Override @Override
public void setRightInput(ItemStack item) { public void setRightInput(ItemStack item) {
inventory.setItem(1, item); inventory.setItem(1, item);
} }
@Override @Override
public void setOutput(ItemStack item) { public void setOutput(ItemStack item) {
inventory.setItem(2, item); inventory.setItem(2, item);
} }
@Override @Override
public Inventory getInventory() { public Inventory getInventory() {
return inventory; return inventory;
} }
@Override @Override
public void open() { public void open() {
// Counter stuff that the game uses to keep track of inventories // Counter stuff that the game uses to keep track of inventories
int id = entity.nextContainerCounter(); int id = entity.nextContainerCounter();
// Send the packet // Send the packet
entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0)); entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
// Set their active container to this anvil // Set their active container to this anvil
entity.activeContainer = this; entity.activeContainer = this;
// Set their active container window id to that counter stuff // Set their active container window id to that counter stuff
entity.activeContainer.windowId = id; entity.activeContainer.windowId = id;
// Add the slot listener // Add the slot listener
entity.activeContainer.addSlotListener(entity); entity.activeContainer.addSlotListener(entity);
} }
} }

View File

@ -0,0 +1,65 @@
package com.songoda.core.nms.v1_8_R1.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_8_R1.NBTTagCompound;
public class NBTCompoundImpl implements NBTCompound {
protected NBTTagCompound compound;
protected NBTCompoundImpl(NBTTagCompound compound) {
this.compound = compound;
}
public NBTCompoundImpl() {
this.compound = new NBTTagCompound();
}
@Override
public NBTCompound set(String tag, String s) {
compound.setString(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, boolean b) {
compound.setBoolean(tag, b);
return this;
}
@Override
public NBTCompound set(String tag, int i) {
compound.setInt(tag, i);
return this;
}
@Override
public NBTCompound set(String tag, long l) {
compound.setLong(tag, l);
return this;
}
@Override
public NBTCompound set(String tag, short s) {
compound.setShort(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, byte b) {
compound.setByte(tag, b);
return this;
}
@Override
public boolean has(String tag) {
return compound.hasKey(tag);
}
@Override
public NBTObject getNBTObject(String tag) {
return new NBTObjectImpl(compound, tag);
}
}

View File

@ -0,0 +1,21 @@
package com.songoda.core.nms.v1_8_R1.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTCore;
import com.songoda.core.nms.nbt.NBTItem;
import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTCoreImpl implements NBTCore {
@Override
public NBTItem of(ItemStack item) {
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
}
@Override
public NBTCompound newCompound() {
return new NBTCompoundImpl();
}
}

View File

@ -0,0 +1,20 @@
package com.songoda.core.nms.v1_8_R1.nbt;
import com.songoda.core.nms.nbt.NBTItem;
import net.minecraft.server.v1_8_R1.NBTTagCompound;
import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTItemImpl extends NBTCompoundImpl implements NBTItem {
private net.minecraft.server.v1_8_R1.ItemStack nmsItem;
public NBTItemImpl(net.minecraft.server.v1_8_R1.ItemStack nmsItem) {
super(nmsItem.hasTag() ? nmsItem.getTag() : new NBTTagCompound());
this.nmsItem = nmsItem;
}
public ItemStack finish() {
return CraftItemStack.asBukkitCopy(nmsItem);
}
}

View File

@ -0,0 +1,40 @@
package com.songoda.core.nms.v1_8_R1.nbt;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_8_R1.NBTTagCompound;
public class NBTObjectImpl implements NBTObject {
private final NBTTagCompound compound;
private final String tag;
public NBTObjectImpl(NBTTagCompound compound, String tag) {
this.compound = compound;
this.tag = tag;
}
public String asString() {
return compound.getString(tag);
}
public boolean asBoolean() {
return compound.getBoolean(tag);
}
public int asInt() {
return compound.getInt(tag);
}
public long asLong() {
return compound.getLong(tag);
}
public short asShort() {
return compound.getShort(tag);
}
public byte asByte() {
return compound.getByte(tag);
}
}

View File

@ -1,21 +1,20 @@
package com.songoda.core.nms.v1_8_R2; package com.songoda.core.nms.v1_8_R2.anvil;
import com.songoda.core.nms.CoreNMS; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.CustomAnvil; import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer; import org.bukkit.entity.Player;
import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.InventoryHolder;
public class AnvilCore implements com.songoda.core.nms.anvil.AnvilCore {
public class NMS implements CoreNMS {
@Override
@Override public CustomAnvil createAnvil(Player player) {
public CustomAnvil createAnvil(Player player) { return new AnvilView(((CraftPlayer) player).getHandle(), null);
return new AnvilView(((CraftPlayer) player).getHandle(), null); }
}
@Override
@Override public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
public CustomAnvil createAnvil(Player player, InventoryHolder holder) { return new AnvilView(((CraftPlayer) player).getHandle(), holder);
return new AnvilView(((CraftPlayer) player).getHandle(), holder); }
}
}
}

View File

@ -1,20 +1,20 @@
package com.songoda.core.nms.v1_8_R2; package com.songoda.core.nms.v1_8_R2.anvil;
import net.minecraft.server.v1_8_R2.IInventory; import net.minecraft.server.v1_8_R2.IInventory;
import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftInventoryAnvil;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
public class AnvilInventoryCustom extends CraftInventoryAnvil { public class AnvilInventoryCustom extends CraftInventoryAnvil {
final InventoryHolder holder; final InventoryHolder holder;
public AnvilInventoryCustom(InventoryHolder holder, IInventory inventory, IInventory resultInventory) { public AnvilInventoryCustom(InventoryHolder holder, IInventory inventory, IInventory resultInventory) {
super(inventory, resultInventory); super(inventory, resultInventory);
this.holder = holder; this.holder = holder;
} }
@Override @Override
public InventoryHolder getHolder() { public InventoryHolder getHolder() {
return holder; return holder;
} }
} }

View File

@ -1,201 +1,201 @@
package com.songoda.core.nms.v1_8_R2; package com.songoda.core.nms.v1_8_R2.anvil;
import com.songoda.core.nms.CustomAnvil; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.methods.AnvilTextChange; import com.songoda.core.nms.anvil.methods.AnvilTextChange;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.minecraft.server.v1_8_R2.BlockPosition; import net.minecraft.server.v1_8_R2.BlockPosition;
import net.minecraft.server.v1_8_R2.ChatMessage; import net.minecraft.server.v1_8_R2.ChatMessage;
import net.minecraft.server.v1_8_R2.ContainerAnvil; import net.minecraft.server.v1_8_R2.ContainerAnvil;
import net.minecraft.server.v1_8_R2.EntityHuman; import net.minecraft.server.v1_8_R2.EntityHuman;
import net.minecraft.server.v1_8_R2.EntityPlayer; import net.minecraft.server.v1_8_R2.EntityPlayer;
import net.minecraft.server.v1_8_R2.IInventory; import net.minecraft.server.v1_8_R2.IInventory;
import net.minecraft.server.v1_8_R2.PacketPlayOutOpenWindow; import net.minecraft.server.v1_8_R2.PacketPlayOutOpenWindow;
import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftInventoryView;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
public class AnvilView extends ContainerAnvil implements CustomAnvil { public class AnvilView extends ContainerAnvil implements CustomAnvil {
private final EntityPlayer entity; private final EntityPlayer entity;
private final Inventory inventory; private final Inventory inventory;
private String title = "Repairing"; private String title = "Repairing";
private int cost = -1; private int cost = -1;
private boolean canUse = true; private boolean canUse = true;
private AnvilTextChange textChange = null; private AnvilTextChange textChange = null;
// used for setting custom inventory // used for setting custom inventory
static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result
static Field mc_ContainerAnvil_resultInventory; // full inventory static Field mc_ContainerAnvil_resultInventory; // full inventory
static Field mc_ContainerAnvil_bukkitEntity; static Field mc_ContainerAnvil_bukkitEntity;
static { static {
try { try {
mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h"); mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h");
mc_ContainerAnvil_repairInventory.setAccessible(true); mc_ContainerAnvil_repairInventory.setAccessible(true);
mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g"); mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
mc_ContainerAnvil_resultInventory.setAccessible(true); mc_ContainerAnvil_resultInventory.setAccessible(true);
mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity"); mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
mc_ContainerAnvil_bukkitEntity.setAccessible(true); mc_ContainerAnvil_bukkitEntity.setAccessible(true);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
} }
// used for grabbing the rename text string // used for grabbing the rename text string
static Field mc_ContainerAnvil_renameText; static Field mc_ContainerAnvil_renameText;
static { static {
try { try {
mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l"); mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l");
mc_ContainerAnvil_renameText.setAccessible(true); mc_ContainerAnvil_renameText.setAccessible(true);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
} }
} }
public AnvilView(EntityPlayer entity, InventoryHolder holder) { public AnvilView(EntityPlayer entity, InventoryHolder holder) {
super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity); super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
this.entity = entity; this.entity = entity;
if (holder != null) { if (holder != null) {
this.inventory = getBukkitView(entity, holder).getTopInventory(); this.inventory = getBukkitView(entity, holder).getTopInventory();
} else { } else {
this.inventory = getBukkitView().getTopInventory(); this.inventory = getBukkitView().getTopInventory();
} }
} }
public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) { public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
try { try {
AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder, AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
(IInventory) mc_ContainerAnvil_repairInventory.get(this), (IInventory) mc_ContainerAnvil_repairInventory.get(this),
(IInventory) mc_ContainerAnvil_resultInventory.get(this)); (IInventory) mc_ContainerAnvil_resultInventory.get(this));
CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this); CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this);
mc_ContainerAnvil_bukkitEntity.set(this, view); mc_ContainerAnvil_bukkitEntity.set(this, view);
return view; return view;
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
return getBukkitView(); return getBukkitView();
} }
@Override @Override
public boolean a(EntityHuman entityhuman) { public boolean a(EntityHuman entityhuman) {
return canUse; return canUse;
} }
@Override @Override
public void e() { public void e() {
super.e(); super.e();
if (cost >= 0) { if (cost >= 0) {
this.a = cost; this.a = cost;
} }
} }
@Override @Override
public void update() { public void update() {
e(); e();
} }
@Override @Override
public String getRenameText() { public String getRenameText() {
try { try {
//return this.l; //return this.l;
return (String) mc_ContainerAnvil_renameText.get(this); return (String) mc_ContainerAnvil_renameText.get(this);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
} }
return null; return null;
} }
@Override @Override
public void setRenameText(String text) { public void setRenameText(String text) {
this.a(text); this.a(text);
} }
@Override @Override
public void setOnChange(AnvilTextChange handler) { public void setOnChange(AnvilTextChange handler) {
textChange = handler; textChange = handler;
} }
@Override @Override
public String getCustomTitle() { public String getCustomTitle() {
return title; return title;
} }
@Override @Override
public void setCustomTitle(String title) { public void setCustomTitle(String title) {
this.title = title; this.title = title;
} }
@Override @Override
public void setLevelCost(int cost) { public void setLevelCost(int cost) {
this.cost = cost; this.cost = cost;
} }
@Override @Override
public int getLevelCost() { public int getLevelCost() {
return cost >= 0 ? cost : this.a; return cost >= 0 ? cost : this.a;
} }
@Override @Override
public void setCanUse(boolean bool) { public void setCanUse(boolean bool) {
this.canUse = bool; this.canUse = bool;
} }
@Override @Override
public ItemStack getLeftInput() { public ItemStack getLeftInput() {
return inventory.getItem(0); return inventory.getItem(0);
} }
@Override @Override
public ItemStack getRightInput() { public ItemStack getRightInput() {
return inventory.getItem(1); return inventory.getItem(1);
} }
@Override @Override
public ItemStack getOutput() { public ItemStack getOutput() {
return inventory.getItem(2); return inventory.getItem(2);
} }
@Override @Override
public void setLeftInput(ItemStack item) { public void setLeftInput(ItemStack item) {
inventory.setItem(0, item); inventory.setItem(0, item);
} }
@Override @Override
public void setRightInput(ItemStack item) { public void setRightInput(ItemStack item) {
inventory.setItem(1, item); inventory.setItem(1, item);
} }
@Override @Override
public void setOutput(ItemStack item) { public void setOutput(ItemStack item) {
inventory.setItem(2, item); inventory.setItem(2, item);
} }
@Override @Override
public Inventory getInventory() { public Inventory getInventory() {
return inventory; return inventory;
} }
@Override @Override
public void open() { public void open() {
// Counter stuff that the game uses to keep track of inventories // Counter stuff that the game uses to keep track of inventories
int id = entity.nextContainerCounter(); int id = entity.nextContainerCounter();
// Send the packet // Send the packet
entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0)); entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
// Set their active container to this anvil // Set their active container to this anvil
entity.activeContainer = this; entity.activeContainer = this;
// Set their active container window id to that counter stuff // Set their active container window id to that counter stuff
entity.activeContainer.windowId = id; entity.activeContainer.windowId = id;
// Add the slot listener // Add the slot listener
entity.activeContainer.addSlotListener(entity); entity.activeContainer.addSlotListener(entity);
} }
} }

View File

@ -0,0 +1,65 @@
package com.songoda.core.nms.v1_8_R2.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_8_R2.NBTTagCompound;
public class NBTCompoundImpl implements NBTCompound {
protected NBTTagCompound compound;
protected NBTCompoundImpl(NBTTagCompound compound) {
this.compound = compound;
}
public NBTCompoundImpl() {
this.compound = new NBTTagCompound();
}
@Override
public NBTCompound set(String tag, String s) {
compound.setString(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, boolean b) {
compound.setBoolean(tag, b);
return this;
}
@Override
public NBTCompound set(String tag, int i) {
compound.setInt(tag, i);
return this;
}
@Override
public NBTCompound set(String tag, long l) {
compound.setLong(tag, l);
return this;
}
@Override
public NBTCompound set(String tag, short s) {
compound.setShort(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, byte b) {
compound.setByte(tag, b);
return this;
}
@Override
public boolean has(String tag) {
return compound.hasKey(tag);
}
@Override
public NBTObject getNBTObject(String tag) {
return new NBTObjectImpl(compound, tag);
}
}

View File

@ -0,0 +1,21 @@
package com.songoda.core.nms.v1_8_R2.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTCore;
import com.songoda.core.nms.nbt.NBTItem;
import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTCoreImpl implements NBTCore {
@Override
public NBTItem of(ItemStack item) {
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
}
@Override
public NBTCompound newCompound() {
return new NBTCompoundImpl();
}
}

View File

@ -0,0 +1,20 @@
package com.songoda.core.nms.v1_8_R2.nbt;
import com.songoda.core.nms.nbt.NBTItem;
import net.minecraft.server.v1_8_R2.NBTTagCompound;
import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTItemImpl extends NBTCompoundImpl implements NBTItem {
private net.minecraft.server.v1_8_R2.ItemStack nmsItem;
public NBTItemImpl(net.minecraft.server.v1_8_R2.ItemStack nmsItem) {
super(nmsItem.hasTag() ? nmsItem.getTag() : new NBTTagCompound());
this.nmsItem = nmsItem;
}
public ItemStack finish() {
return CraftItemStack.asBukkitCopy(nmsItem);
}
}

View File

@ -0,0 +1,40 @@
package com.songoda.core.nms.v1_8_R2.nbt;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_8_R2.NBTTagCompound;
public class NBTObjectImpl implements NBTObject {
private final NBTTagCompound compound;
private final String tag;
public NBTObjectImpl(NBTTagCompound compound, String tag) {
this.compound = compound;
this.tag = tag;
}
public String asString() {
return compound.getString(tag);
}
public boolean asBoolean() {
return compound.getBoolean(tag);
}
public int asInt() {
return compound.getInt(tag);
}
public long asLong() {
return compound.getLong(tag);
}
public short asShort() {
return compound.getShort(tag);
}
public byte asByte() {
return compound.getByte(tag);
}
}

View File

@ -1,21 +1,20 @@
package com.songoda.core.nms.v1_8_R3; package com.songoda.core.nms.v1_8_R3.anvil;
import com.songoda.core.nms.CoreNMS; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.CustomAnvil; import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.entity.Player;
import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.InventoryHolder;
public class AnvilCore implements com.songoda.core.nms.anvil.AnvilCore {
public class NMS implements CoreNMS {
@Override
@Override public CustomAnvil createAnvil(Player player) {
public CustomAnvil createAnvil(Player player) { return new AnvilView(((CraftPlayer) player).getHandle(), null);
return new AnvilView(((CraftPlayer) player).getHandle(), null); }
}
@Override
@Override public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
public CustomAnvil createAnvil(Player player, InventoryHolder holder) { return new AnvilView(((CraftPlayer) player).getHandle(), holder);
return new AnvilView(((CraftPlayer) player).getHandle(), holder); }
}
}
}

View File

@ -1,20 +1,20 @@
package com.songoda.core.nms.v1_8_R3; package com.songoda.core.nms.v1_8_R3.anvil;
import net.minecraft.server.v1_8_R3.IInventory; import net.minecraft.server.v1_8_R3.IInventory;
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftInventoryAnvil;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
public class AnvilInventoryCustom extends CraftInventoryAnvil { public class AnvilInventoryCustom extends CraftInventoryAnvil {
final InventoryHolder holder; final InventoryHolder holder;
public AnvilInventoryCustom(InventoryHolder holder, IInventory inventory, IInventory resultInventory) { public AnvilInventoryCustom(InventoryHolder holder, IInventory inventory, IInventory resultInventory) {
super(inventory, resultInventory); super(inventory, resultInventory);
this.holder = holder; this.holder = holder;
} }
@Override @Override
public InventoryHolder getHolder() { public InventoryHolder getHolder() {
return holder; return holder;
} }
} }

View File

@ -1,201 +1,201 @@
package com.songoda.core.nms.v1_8_R3; package com.songoda.core.nms.v1_8_R3.anvil;
import com.songoda.core.nms.CustomAnvil; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.methods.AnvilTextChange; import com.songoda.core.nms.anvil.methods.AnvilTextChange;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.minecraft.server.v1_8_R3.BlockPosition; import net.minecraft.server.v1_8_R3.BlockPosition;
import net.minecraft.server.v1_8_R3.ChatMessage; import net.minecraft.server.v1_8_R3.ChatMessage;
import net.minecraft.server.v1_8_R3.ContainerAnvil; import net.minecraft.server.v1_8_R3.ContainerAnvil;
import net.minecraft.server.v1_8_R3.EntityHuman; import net.minecraft.server.v1_8_R3.EntityHuman;
import net.minecraft.server.v1_8_R3.EntityPlayer; import net.minecraft.server.v1_8_R3.EntityPlayer;
import net.minecraft.server.v1_8_R3.IInventory; import net.minecraft.server.v1_8_R3.IInventory;
import net.minecraft.server.v1_8_R3.PacketPlayOutOpenWindow; import net.minecraft.server.v1_8_R3.PacketPlayOutOpenWindow;
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftInventoryView;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
public class AnvilView extends ContainerAnvil implements CustomAnvil { public class AnvilView extends ContainerAnvil implements CustomAnvil {
private final EntityPlayer entity; private final EntityPlayer entity;
private final Inventory inventory; private final Inventory inventory;
private String title = "Repairing"; private String title = "Repairing";
private int cost = -1; private int cost = -1;
private boolean canUse = true; private boolean canUse = true;
private AnvilTextChange textChange = null; private AnvilTextChange textChange = null;
// used for setting custom inventory // used for setting custom inventory
static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result
static Field mc_ContainerAnvil_resultInventory; // full inventory static Field mc_ContainerAnvil_resultInventory; // full inventory
static Field mc_ContainerAnvil_bukkitEntity; static Field mc_ContainerAnvil_bukkitEntity;
static { static {
try { try {
mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h"); mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h");
mc_ContainerAnvil_repairInventory.setAccessible(true); mc_ContainerAnvil_repairInventory.setAccessible(true);
mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g"); mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
mc_ContainerAnvil_resultInventory.setAccessible(true); mc_ContainerAnvil_resultInventory.setAccessible(true);
mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity"); mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
mc_ContainerAnvil_bukkitEntity.setAccessible(true); mc_ContainerAnvil_bukkitEntity.setAccessible(true);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
} }
// used for grabbing the rename text string // used for grabbing the rename text string
static Field mc_ContainerAnvil_renameText; static Field mc_ContainerAnvil_renameText;
static { static {
try { try {
mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l"); mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l");
mc_ContainerAnvil_renameText.setAccessible(true); mc_ContainerAnvil_renameText.setAccessible(true);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
} }
} }
public AnvilView(EntityPlayer entity, InventoryHolder holder) { public AnvilView(EntityPlayer entity, InventoryHolder holder) {
super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity); super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
this.entity = entity; this.entity = entity;
if (holder != null) { if (holder != null) {
this.inventory = getBukkitView(entity, holder).getTopInventory(); this.inventory = getBukkitView(entity, holder).getTopInventory();
} else { } else {
this.inventory = getBukkitView().getTopInventory(); this.inventory = getBukkitView().getTopInventory();
} }
} }
public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) { public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
try { try {
AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder, AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
(IInventory) mc_ContainerAnvil_repairInventory.get(this), (IInventory) mc_ContainerAnvil_repairInventory.get(this),
(IInventory) mc_ContainerAnvil_resultInventory.get(this)); (IInventory) mc_ContainerAnvil_resultInventory.get(this));
CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this); CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this);
mc_ContainerAnvil_bukkitEntity.set(this, view); mc_ContainerAnvil_bukkitEntity.set(this, view);
return view; return view;
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
return getBukkitView(); return getBukkitView();
} }
@Override @Override
public boolean a(EntityHuman entityhuman) { public boolean a(EntityHuman entityhuman) {
return canUse; return canUse;
} }
@Override @Override
public void e() { public void e() {
super.e(); super.e();
if (cost >= 0) { if (cost >= 0) {
this.a = cost; this.a = cost;
} }
} }
@Override @Override
public void update() { public void update() {
e(); e();
} }
@Override @Override
public String getRenameText() { public String getRenameText() {
try { try {
//return this.l; //return this.l;
return (String) mc_ContainerAnvil_renameText.get(this); return (String) mc_ContainerAnvil_renameText.get(this);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
} }
return null; return null;
} }
@Override @Override
public void setRenameText(String text) { public void setRenameText(String text) {
this.a(text); this.a(text);
} }
@Override @Override
public void setOnChange(AnvilTextChange handler) { public void setOnChange(AnvilTextChange handler) {
textChange = handler; textChange = handler;
} }
@Override @Override
public String getCustomTitle() { public String getCustomTitle() {
return title; return title;
} }
@Override @Override
public void setCustomTitle(String title) { public void setCustomTitle(String title) {
this.title = title; this.title = title;
} }
@Override @Override
public void setLevelCost(int cost) { public void setLevelCost(int cost) {
this.cost = cost; this.cost = cost;
} }
@Override @Override
public int getLevelCost() { public int getLevelCost() {
return cost >= 0 ? cost : this.a; return cost >= 0 ? cost : this.a;
} }
@Override @Override
public void setCanUse(boolean bool) { public void setCanUse(boolean bool) {
this.canUse = bool; this.canUse = bool;
} }
@Override @Override
public ItemStack getLeftInput() { public ItemStack getLeftInput() {
return inventory.getItem(0); return inventory.getItem(0);
} }
@Override @Override
public ItemStack getRightInput() { public ItemStack getRightInput() {
return inventory.getItem(1); return inventory.getItem(1);
} }
@Override @Override
public ItemStack getOutput() { public ItemStack getOutput() {
return inventory.getItem(2); return inventory.getItem(2);
} }
@Override @Override
public void setLeftInput(ItemStack item) { public void setLeftInput(ItemStack item) {
inventory.setItem(0, item); inventory.setItem(0, item);
} }
@Override @Override
public void setRightInput(ItemStack item) { public void setRightInput(ItemStack item) {
inventory.setItem(1, item); inventory.setItem(1, item);
} }
@Override @Override
public void setOutput(ItemStack item) { public void setOutput(ItemStack item) {
inventory.setItem(2, item); inventory.setItem(2, item);
} }
@Override @Override
public Inventory getInventory() { public Inventory getInventory() {
return inventory; return inventory;
} }
@Override @Override
public void open() { public void open() {
// Counter stuff that the game uses to keep track of inventories // Counter stuff that the game uses to keep track of inventories
int id = entity.nextContainerCounter(); int id = entity.nextContainerCounter();
// Send the packet // Send the packet
entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0)); entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
// Set their active container to this anvil // Set their active container to this anvil
entity.activeContainer = this; entity.activeContainer = this;
// Set their active container window id to that counter stuff // Set their active container window id to that counter stuff
entity.activeContainer.windowId = id; entity.activeContainer.windowId = id;
// Add the slot listener // Add the slot listener
entity.activeContainer.addSlotListener(entity); entity.activeContainer.addSlotListener(entity);
} }
} }

View File

@ -0,0 +1,65 @@
package com.songoda.core.nms.v1_8_R3.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_8_R3.NBTTagCompound;
public class NBTCompoundImpl implements NBTCompound {
protected NBTTagCompound compound;
protected NBTCompoundImpl(NBTTagCompound compound) {
this.compound = compound;
}
public NBTCompoundImpl() {
this.compound = new NBTTagCompound();
}
@Override
public NBTCompound set(String tag, String s) {
compound.setString(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, boolean b) {
compound.setBoolean(tag, b);
return this;
}
@Override
public NBTCompound set(String tag, int i) {
compound.setInt(tag, i);
return this;
}
@Override
public NBTCompound set(String tag, long l) {
compound.setLong(tag, l);
return this;
}
@Override
public NBTCompound set(String tag, short s) {
compound.setShort(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, byte b) {
compound.setByte(tag, b);
return this;
}
@Override
public boolean has(String tag) {
return compound.hasKey(tag);
}
@Override
public NBTObject getNBTObject(String tag) {
return new NBTObjectImpl(compound, tag);
}
}

View File

@ -0,0 +1,21 @@
package com.songoda.core.nms.v1_8_R3.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTCore;
import com.songoda.core.nms.nbt.NBTItem;
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTCoreImpl implements NBTCore {
@Override
public NBTItem of(ItemStack item) {
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
}
@Override
public NBTCompound newCompound() {
return new NBTCompoundImpl();
}
}

View File

@ -0,0 +1,20 @@
package com.songoda.core.nms.v1_8_R3.nbt;
import com.songoda.core.nms.nbt.NBTItem;
import net.minecraft.server.v1_8_R3.NBTTagCompound;
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTItemImpl extends NBTCompoundImpl implements NBTItem {
private net.minecraft.server.v1_8_R3.ItemStack nmsItem;
public NBTItemImpl(net.minecraft.server.v1_8_R3.ItemStack nmsItem) {
super(nmsItem.hasTag() ? nmsItem.getTag() : new NBTTagCompound());
this.nmsItem = nmsItem;
}
public ItemStack finish() {
return CraftItemStack.asBukkitCopy(nmsItem);
}
}

View File

@ -0,0 +1,40 @@
package com.songoda.core.nms.v1_8_R3.nbt;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_8_R3.NBTTagCompound;
public class NBTObjectImpl implements NBTObject {
private final NBTTagCompound compound;
private final String tag;
public NBTObjectImpl(NBTTagCompound compound, String tag) {
this.compound = compound;
this.tag = tag;
}
public String asString() {
return compound.getString(tag);
}
public boolean asBoolean() {
return compound.getBoolean(tag);
}
public int asInt() {
return compound.getInt(tag);
}
public long asLong() {
return compound.getLong(tag);
}
public short asShort() {
return compound.getShort(tag);
}
public byte asByte() {
return compound.getByte(tag);
}
}

View File

@ -1,21 +1,20 @@
package com.songoda.core.nms.v1_9_R1; package com.songoda.core.nms.v1_9_R1.anvil;
import com.songoda.core.nms.CoreNMS; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.CustomAnvil; import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer; import org.bukkit.entity.Player;
import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.InventoryHolder;
public class AnvilCore implements com.songoda.core.nms.anvil.AnvilCore {
public class NMS implements CoreNMS {
@Override
@Override public CustomAnvil createAnvil(Player player) {
public CustomAnvil createAnvil(Player player) { return new AnvilView(((CraftPlayer) player).getHandle(), null);
return new AnvilView(((CraftPlayer) player).getHandle(), null); }
}
@Override
@Override public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
public CustomAnvil createAnvil(Player player, InventoryHolder holder) { return new AnvilView(((CraftPlayer) player).getHandle(), holder);
return new AnvilView(((CraftPlayer) player).getHandle(), holder); }
}
}
}

View File

@ -1,21 +1,21 @@
package com.songoda.core.nms.v1_9_R1; package com.songoda.core.nms.v1_9_R1.anvil;
import net.minecraft.server.v1_9_R1.IInventory; import net.minecraft.server.v1_9_R1.IInventory;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftInventoryAnvil;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
public class AnvilInventoryCustom extends CraftInventoryAnvil { public class AnvilInventoryCustom extends CraftInventoryAnvil {
final InventoryHolder holder; final InventoryHolder holder;
public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory) { public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory) {
super(location, inventory, resultInventory); super(location, inventory, resultInventory);
this.holder = holder; this.holder = holder;
} }
@Override @Override
public InventoryHolder getHolder() { public InventoryHolder getHolder() {
return holder; return holder;
} }
} }

View File

@ -1,203 +1,203 @@
package com.songoda.core.nms.v1_9_R1; package com.songoda.core.nms.v1_9_R1.anvil;
import com.songoda.core.nms.CustomAnvil; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.methods.AnvilTextChange; import com.songoda.core.nms.anvil.methods.AnvilTextChange;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.minecraft.server.v1_9_R1.BlockPosition; import net.minecraft.server.v1_9_R1.BlockPosition;
import net.minecraft.server.v1_9_R1.ChatMessage; import net.minecraft.server.v1_9_R1.ChatMessage;
import net.minecraft.server.v1_9_R1.ContainerAnvil; import net.minecraft.server.v1_9_R1.ContainerAnvil;
import net.minecraft.server.v1_9_R1.EntityHuman; import net.minecraft.server.v1_9_R1.EntityHuman;
import net.minecraft.server.v1_9_R1.EntityPlayer; import net.minecraft.server.v1_9_R1.EntityPlayer;
import net.minecraft.server.v1_9_R1.IInventory; import net.minecraft.server.v1_9_R1.IInventory;
import net.minecraft.server.v1_9_R1.PacketPlayOutOpenWindow; import net.minecraft.server.v1_9_R1.PacketPlayOutOpenWindow;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftInventoryView;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
public class AnvilView extends ContainerAnvil implements CustomAnvil { public class AnvilView extends ContainerAnvil implements CustomAnvil {
private final EntityPlayer entity; private final EntityPlayer entity;
private final Inventory inventory; private final Inventory inventory;
private String title = "Repairing"; private String title = "Repairing";
private int cost = -1; private int cost = -1;
private boolean canUse = true; private boolean canUse = true;
private AnvilTextChange textChange = null; private AnvilTextChange textChange = null;
// used for setting custom inventory // used for setting custom inventory
static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result
static Field mc_ContainerAnvil_resultInventory; // full inventory static Field mc_ContainerAnvil_resultInventory; // full inventory
static Field mc_ContainerAnvil_bukkitEntity; static Field mc_ContainerAnvil_bukkitEntity;
static { static {
try { try {
mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h"); mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h");
mc_ContainerAnvil_repairInventory.setAccessible(true); mc_ContainerAnvil_repairInventory.setAccessible(true);
mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g"); mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
mc_ContainerAnvil_resultInventory.setAccessible(true); mc_ContainerAnvil_resultInventory.setAccessible(true);
mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity"); mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
mc_ContainerAnvil_bukkitEntity.setAccessible(true); mc_ContainerAnvil_bukkitEntity.setAccessible(true);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
} }
// used for grabbing the rename text string // used for grabbing the rename text string
static Field mc_ContainerAnvil_renameText; static Field mc_ContainerAnvil_renameText;
static { static {
try { try {
mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l"); mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l");
mc_ContainerAnvil_renameText.setAccessible(true); mc_ContainerAnvil_renameText.setAccessible(true);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
} }
} }
public AnvilView(EntityPlayer entity, InventoryHolder holder) { public AnvilView(EntityPlayer entity, InventoryHolder holder) {
super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity); super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
this.entity = entity; this.entity = entity;
if (holder != null) { if (holder != null) {
this.inventory = getBukkitView(entity, holder).getTopInventory(); this.inventory = getBukkitView(entity, holder).getTopInventory();
} else { } else {
this.inventory = getBukkitView().getTopInventory(); this.inventory = getBukkitView().getTopInventory();
} }
} }
public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) { public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
try { try {
AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder, AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
new Location(entity.world.getWorld(), 0, 0, 0), new Location(entity.world.getWorld(), 0, 0, 0),
(IInventory) mc_ContainerAnvil_repairInventory.get(this), (IInventory) mc_ContainerAnvil_repairInventory.get(this),
(IInventory) mc_ContainerAnvil_resultInventory.get(this)); (IInventory) mc_ContainerAnvil_resultInventory.get(this));
CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this); CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this);
mc_ContainerAnvil_bukkitEntity.set(this, view); mc_ContainerAnvil_bukkitEntity.set(this, view);
return view; return view;
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
return getBukkitView(); return getBukkitView();
} }
@Override @Override
public boolean a(EntityHuman entityhuman) { public boolean a(EntityHuman entityhuman) {
return canUse; return canUse;
} }
@Override @Override
public void e() { public void e() {
super.e(); super.e();
if (cost >= 0) { if (cost >= 0) {
this.a = cost; this.a = cost;
} }
} }
@Override @Override
public void update() { public void update() {
e(); e();
} }
@Override @Override
public String getRenameText() { public String getRenameText() {
try { try {
//return this.l; //return this.l;
return (String) mc_ContainerAnvil_renameText.get(this); return (String) mc_ContainerAnvil_renameText.get(this);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
} }
return null; return null;
} }
@Override @Override
public void setRenameText(String text) { public void setRenameText(String text) {
this.a(text); this.a(text);
} }
@Override @Override
public void setOnChange(AnvilTextChange handler) { public void setOnChange(AnvilTextChange handler) {
textChange = handler; textChange = handler;
} }
@Override @Override
public String getCustomTitle() { public String getCustomTitle() {
return title; return title;
} }
@Override @Override
public void setCustomTitle(String title) { public void setCustomTitle(String title) {
this.title = title; this.title = title;
} }
@Override @Override
public void setLevelCost(int cost) { public void setLevelCost(int cost) {
this.cost = cost; this.cost = cost;
} }
@Override @Override
public int getLevelCost() { public int getLevelCost() {
return cost >= 0 ? cost : this.a; return cost >= 0 ? cost : this.a;
} }
@Override @Override
public void setCanUse(boolean bool) { public void setCanUse(boolean bool) {
this.canUse = bool; this.canUse = bool;
} }
@Override @Override
public ItemStack getLeftInput() { public ItemStack getLeftInput() {
return inventory.getItem(0); return inventory.getItem(0);
} }
@Override @Override
public ItemStack getRightInput() { public ItemStack getRightInput() {
return inventory.getItem(1); return inventory.getItem(1);
} }
@Override @Override
public ItemStack getOutput() { public ItemStack getOutput() {
return inventory.getItem(2); return inventory.getItem(2);
} }
@Override @Override
public void setLeftInput(ItemStack item) { public void setLeftInput(ItemStack item) {
inventory.setItem(0, item); inventory.setItem(0, item);
} }
@Override @Override
public void setRightInput(ItemStack item) { public void setRightInput(ItemStack item) {
inventory.setItem(1, item); inventory.setItem(1, item);
} }
@Override @Override
public void setOutput(ItemStack item) { public void setOutput(ItemStack item) {
inventory.setItem(2, item); inventory.setItem(2, item);
} }
@Override @Override
public Inventory getInventory() { public Inventory getInventory() {
return inventory; return inventory;
} }
@Override @Override
public void open() { public void open() {
// Counter stuff that the game uses to keep track of inventories // Counter stuff that the game uses to keep track of inventories
int id = entity.nextContainerCounter(); int id = entity.nextContainerCounter();
// Send the packet // Send the packet
entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0)); entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
// Set their active container to this anvil // Set their active container to this anvil
entity.activeContainer = this; entity.activeContainer = this;
// Set their active container window id to that counter stuff // Set their active container window id to that counter stuff
entity.activeContainer.windowId = id; entity.activeContainer.windowId = id;
// Add the slot listener // Add the slot listener
entity.activeContainer.addSlotListener(entity); entity.activeContainer.addSlotListener(entity);
} }
} }

View File

@ -0,0 +1,65 @@
package com.songoda.core.nms.v1_9_R1.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_9_R1.NBTTagCompound;
public class NBTCompoundImpl implements NBTCompound {
protected NBTTagCompound compound;
protected NBTCompoundImpl(NBTTagCompound compound) {
this.compound = compound;
}
public NBTCompoundImpl() {
this.compound = new NBTTagCompound();
}
@Override
public NBTCompound set(String tag, String s) {
compound.setString(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, boolean b) {
compound.setBoolean(tag, b);
return this;
}
@Override
public NBTCompound set(String tag, int i) {
compound.setInt(tag, i);
return this;
}
@Override
public NBTCompound set(String tag, long l) {
compound.setLong(tag, l);
return this;
}
@Override
public NBTCompound set(String tag, short s) {
compound.setShort(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, byte b) {
compound.setByte(tag, b);
return this;
}
@Override
public boolean has(String tag) {
return compound.hasKey(tag);
}
@Override
public NBTObject getNBTObject(String tag) {
return new NBTObjectImpl(compound, tag);
}
}

View File

@ -0,0 +1,21 @@
package com.songoda.core.nms.v1_9_R1.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTCore;
import com.songoda.core.nms.nbt.NBTItem;
import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTCoreImpl implements NBTCore {
@Override
public NBTItem of(ItemStack item) {
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
}
@Override
public NBTCompound newCompound() {
return new NBTCompoundImpl();
}
}

View File

@ -0,0 +1,20 @@
package com.songoda.core.nms.v1_9_R1.nbt;
import com.songoda.core.nms.nbt.NBTItem;
import net.minecraft.server.v1_9_R1.NBTTagCompound;
import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTItemImpl extends NBTCompoundImpl implements NBTItem {
private net.minecraft.server.v1_9_R1.ItemStack nmsItem;
public NBTItemImpl(net.minecraft.server.v1_9_R1.ItemStack nmsItem) {
super(nmsItem.hasTag() ? nmsItem.getTag() : new NBTTagCompound());
this.nmsItem = nmsItem;
}
public ItemStack finish() {
return CraftItemStack.asBukkitCopy(nmsItem);
}
}

View File

@ -0,0 +1,40 @@
package com.songoda.core.nms.v1_9_R1.nbt;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_9_R1.NBTTagCompound;
public class NBTObjectImpl implements NBTObject {
private final NBTTagCompound compound;
private final String tag;
public NBTObjectImpl(NBTTagCompound compound, String tag) {
this.compound = compound;
this.tag = tag;
}
public String asString() {
return compound.getString(tag);
}
public boolean asBoolean() {
return compound.getBoolean(tag);
}
public int asInt() {
return compound.getInt(tag);
}
public long asLong() {
return compound.getLong(tag);
}
public short asShort() {
return compound.getShort(tag);
}
public byte asByte() {
return compound.getByte(tag);
}
}

View File

@ -1,21 +1,20 @@
package com.songoda.core.nms.v1_9_R2; package com.songoda.core.nms.v1_9_R2.anvil;
import com.songoda.core.nms.CoreNMS; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.CustomAnvil; import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer; import org.bukkit.entity.Player;
import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.InventoryHolder;
public class AnvilCore implements com.songoda.core.nms.anvil.AnvilCore {
public class NMS implements CoreNMS {
@Override
@Override public CustomAnvil createAnvil(Player player) {
public CustomAnvil createAnvil(Player player) { return new AnvilView(((CraftPlayer) player).getHandle(), null);
return new AnvilView(((CraftPlayer) player).getHandle(), null); }
}
@Override
@Override public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
public CustomAnvil createAnvil(Player player, InventoryHolder holder) { return new AnvilView(((CraftPlayer) player).getHandle(), holder);
return new AnvilView(((CraftPlayer) player).getHandle(), holder); }
}
}
}

View File

@ -1,21 +1,21 @@
package com.songoda.core.nms.v1_9_R2; package com.songoda.core.nms.v1_9_R2.anvil;
import net.minecraft.server.v1_9_R2.IInventory; import net.minecraft.server.v1_9_R2.IInventory;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftInventoryAnvil;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
public class AnvilInventoryCustom extends CraftInventoryAnvil { public class AnvilInventoryCustom extends CraftInventoryAnvil {
final InventoryHolder holder; final InventoryHolder holder;
public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory) { public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory) {
super(location, inventory, resultInventory); super(location, inventory, resultInventory);
this.holder = holder; this.holder = holder;
} }
@Override @Override
public InventoryHolder getHolder() { public InventoryHolder getHolder() {
return holder; return holder;
} }
} }

View File

@ -1,202 +1,202 @@
package com.songoda.core.nms.v1_9_R2; package com.songoda.core.nms.v1_9_R2.anvil;
import com.songoda.core.nms.CustomAnvil; import com.songoda.core.nms.anvil.CustomAnvil;
import com.songoda.core.nms.methods.AnvilTextChange; import com.songoda.core.nms.anvil.methods.AnvilTextChange;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.minecraft.server.v1_9_R2.BlockPosition; import net.minecraft.server.v1_9_R2.BlockPosition;
import net.minecraft.server.v1_9_R2.ChatMessage; import net.minecraft.server.v1_9_R2.ChatMessage;
import net.minecraft.server.v1_9_R2.ContainerAnvil; import net.minecraft.server.v1_9_R2.ContainerAnvil;
import net.minecraft.server.v1_9_R2.EntityHuman; import net.minecraft.server.v1_9_R2.EntityHuman;
import net.minecraft.server.v1_9_R2.EntityPlayer; import net.minecraft.server.v1_9_R2.EntityPlayer;
import net.minecraft.server.v1_9_R2.IInventory; import net.minecraft.server.v1_9_R2.IInventory;
import net.minecraft.server.v1_9_R2.PacketPlayOutOpenWindow; import net.minecraft.server.v1_9_R2.PacketPlayOutOpenWindow;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftInventoryView;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
public class AnvilView extends ContainerAnvil implements CustomAnvil { public class AnvilView extends ContainerAnvil implements CustomAnvil {
private final EntityPlayer entity; private final EntityPlayer entity;
private final Inventory inventory; private final Inventory inventory;
private String title = "Repairing"; private String title = "Repairing";
private int cost = -1; private int cost = -1;
private boolean canUse = true; private boolean canUse = true;
private AnvilTextChange textChange = null; private AnvilTextChange textChange = null;
// used for setting custom inventory // used for setting custom inventory
static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result
static Field mc_ContainerAnvil_resultInventory; // full inventory static Field mc_ContainerAnvil_resultInventory; // full inventory
static Field mc_ContainerAnvil_bukkitEntity; static Field mc_ContainerAnvil_bukkitEntity;
static { static {
try { try {
mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h"); mc_ContainerAnvil_repairInventory = ContainerAnvil.class.getDeclaredField("h");
mc_ContainerAnvil_repairInventory.setAccessible(true); mc_ContainerAnvil_repairInventory.setAccessible(true);
mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g"); mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
mc_ContainerAnvil_resultInventory.setAccessible(true); mc_ContainerAnvil_resultInventory.setAccessible(true);
mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity"); mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
mc_ContainerAnvil_bukkitEntity.setAccessible(true); mc_ContainerAnvil_bukkitEntity.setAccessible(true);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
} }
// used for grabbing the rename text string // used for grabbing the rename text string
static Field mc_ContainerAnvil_renameText; static Field mc_ContainerAnvil_renameText;
static { static {
try { try {
mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l"); mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l");
mc_ContainerAnvil_renameText.setAccessible(true); mc_ContainerAnvil_renameText.setAccessible(true);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
} }
} }
public AnvilView(EntityPlayer entity, InventoryHolder holder) { public AnvilView(EntityPlayer entity, InventoryHolder holder) {
super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity); super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
this.entity = entity; this.entity = entity;
if (holder != null) { if (holder != null) {
this.inventory = getBukkitView(entity, holder).getTopInventory(); this.inventory = getBukkitView(entity, holder).getTopInventory();
} else { } else {
this.inventory = getBukkitView().getTopInventory(); this.inventory = getBukkitView().getTopInventory();
} }
} }
public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) { public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
try { try {
AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder, AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
new Location(entity.world.getWorld(), 0, 0, 0), new Location(entity.world.getWorld(), 0, 0, 0),
(IInventory) mc_ContainerAnvil_repairInventory.get(this), (IInventory) mc_ContainerAnvil_repairInventory.get(this),
(IInventory) mc_ContainerAnvil_resultInventory.get(this)); (IInventory) mc_ContainerAnvil_resultInventory.get(this));
CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this); CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this);
mc_ContainerAnvil_bukkitEntity.set(this, view); mc_ContainerAnvil_bukkitEntity.set(this, view);
return view; return view;
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
} }
return getBukkitView(); return getBukkitView();
} }
@Override @Override
public boolean a(EntityHuman entityhuman) { public boolean a(EntityHuman entityhuman) {
return canUse; return canUse;
} }
@Override @Override
public void e() { public void e() {
super.e(); super.e();
if (cost >= 0) { if (cost >= 0) {
this.a = cost; this.a = cost;
} }
} }
@Override @Override
public void update() { public void update() {
e(); e();
} }
@Override @Override
public String getRenameText() { public String getRenameText() {
try { try {
//return this.l; //return this.l;
return (String) mc_ContainerAnvil_renameText.get(this); return (String) mc_ContainerAnvil_renameText.get(this);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex); Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
} }
return null; return null;
} }
@Override @Override
public void setRenameText(String text) { public void setRenameText(String text) {
this.a(text); this.a(text);
} }
@Override @Override
public void setOnChange(AnvilTextChange handler) { public void setOnChange(AnvilTextChange handler) {
textChange = handler; textChange = handler;
} }
@Override @Override
public String getCustomTitle() { public String getCustomTitle() {
return title; return title;
} }
@Override @Override
public void setCustomTitle(String title) { public void setCustomTitle(String title) {
this.title = title; this.title = title;
} }
@Override @Override
public void setLevelCost(int cost) { public void setLevelCost(int cost) {
this.cost = cost; this.cost = cost;
} }
@Override @Override
public int getLevelCost() { public int getLevelCost() {
return cost >= 0 ? cost : this.a; return cost >= 0 ? cost : this.a;
} }
@Override @Override
public void setCanUse(boolean bool) { public void setCanUse(boolean bool) {
this.canUse = bool; this.canUse = bool;
} }
@Override @Override
public ItemStack getLeftInput() { public ItemStack getLeftInput() {
return inventory.getItem(0); return inventory.getItem(0);
} }
@Override @Override
public ItemStack getRightInput() { public ItemStack getRightInput() {
return inventory.getItem(1); return inventory.getItem(1);
} }
@Override @Override
public ItemStack getOutput() { public ItemStack getOutput() {
return inventory.getItem(2); return inventory.getItem(2);
} }
@Override @Override
public void setLeftInput(ItemStack item) { public void setLeftInput(ItemStack item) {
inventory.setItem(0, item); inventory.setItem(0, item);
} }
@Override @Override
public void setRightInput(ItemStack item) { public void setRightInput(ItemStack item) {
inventory.setItem(1, item); inventory.setItem(1, item);
} }
@Override @Override
public void setOutput(ItemStack item) { public void setOutput(ItemStack item) {
inventory.setItem(2, item); inventory.setItem(2, item);
} }
@Override @Override
public Inventory getInventory() { public Inventory getInventory() {
return inventory; return inventory;
} }
@Override @Override
public void open() { public void open() {
// Counter stuff that the game uses to keep track of inventories // Counter stuff that the game uses to keep track of inventories
int id = entity.nextContainerCounter(); int id = entity.nextContainerCounter();
// Send the packet // Send the packet
entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0)); entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
// Set their active container to this anvil // Set their active container to this anvil
entity.activeContainer = this; entity.activeContainer = this;
// Set their active container window id to that counter stuff // Set their active container window id to that counter stuff
entity.activeContainer.windowId = id; entity.activeContainer.windowId = id;
// Add the slot listener // Add the slot listener
entity.activeContainer.addSlotListener(entity); entity.activeContainer.addSlotListener(entity);
} }
} }

View File

@ -0,0 +1,65 @@
package com.songoda.core.nms.v1_9_R2.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_9_R2.NBTTagCompound;
public class NBTCompoundImpl implements NBTCompound {
protected NBTTagCompound compound;
protected NBTCompoundImpl(NBTTagCompound compound) {
this.compound = compound;
}
public NBTCompoundImpl() {
this.compound = new NBTTagCompound();
}
@Override
public NBTCompound set(String tag, String s) {
compound.setString(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, boolean b) {
compound.setBoolean(tag, b);
return this;
}
@Override
public NBTCompound set(String tag, int i) {
compound.setInt(tag, i);
return this;
}
@Override
public NBTCompound set(String tag, long l) {
compound.setLong(tag, l);
return this;
}
@Override
public NBTCompound set(String tag, short s) {
compound.setShort(tag, s);
return this;
}
@Override
public NBTCompound set(String tag, byte b) {
compound.setByte(tag, b);
return this;
}
@Override
public boolean has(String tag) {
return compound.hasKey(tag);
}
@Override
public NBTObject getNBTObject(String tag) {
return new NBTObjectImpl(compound, tag);
}
}

View File

@ -0,0 +1,21 @@
package com.songoda.core.nms.v1_9_R2.nbt;
import com.songoda.core.nms.nbt.NBTCompound;
import com.songoda.core.nms.nbt.NBTCore;
import com.songoda.core.nms.nbt.NBTItem;
import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTCoreImpl implements NBTCore {
@Override
public NBTItem of(ItemStack item) {
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
}
@Override
public NBTCompound newCompound() {
return new NBTCompoundImpl();
}
}

View File

@ -0,0 +1,20 @@
package com.songoda.core.nms.v1_9_R2.nbt;
import com.songoda.core.nms.nbt.NBTItem;
import net.minecraft.server.v1_9_R2.NBTTagCompound;
import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
public class NBTItemImpl extends NBTCompoundImpl implements NBTItem {
private net.minecraft.server.v1_9_R2.ItemStack nmsItem;
public NBTItemImpl(net.minecraft.server.v1_9_R2.ItemStack nmsItem) {
super(nmsItem.hasTag() ? nmsItem.getTag() : new NBTTagCompound());
this.nmsItem = nmsItem;
}
public ItemStack finish() {
return CraftItemStack.asBukkitCopy(nmsItem);
}
}

View File

@ -0,0 +1,40 @@
package com.songoda.core.nms.v1_9_R2.nbt;
import com.songoda.core.nms.nbt.NBTObject;
import net.minecraft.server.v1_9_R2.NBTTagCompound;
public class NBTObjectImpl implements NBTObject {
private final NBTTagCompound compound;
private final String tag;
public NBTObjectImpl(NBTTagCompound compound, String tag) {
this.compound = compound;
this.tag = tag;
}
public String asString() {
return compound.getString(tag);
}
public boolean asBoolean() {
return compound.getBoolean(tag);
}
public int asInt() {
return compound.getInt(tag);
}
public long asLong() {
return compound.getLong(tag);
}
public short asShort() {
return compound.getShort(tag);
}
public byte asByte() {
return compound.getByte(tag);
}
}