/* * This file is part of SpoutcraftPlugin. * * Copyright (c) 2011 SpoutcraftDev <http://spoutcraft.org//> * SpoutcraftPlugin is licensed under the GNU Lesser General Public License. * * SpoutcraftPlugin is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * SpoutcraftPlugin is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.getspout.spout.item.mcitem; import java.lang.reflect.Field; import net.minecraft.server.v1_6_R3.EntityHuman; import net.minecraft.server.v1_6_R3.EnumAnimation; import net.minecraft.server.v1_6_R3.INetworkManager; import net.minecraft.server.v1_6_R3.Item; import net.minecraft.server.v1_6_R3.ItemStack; import net.minecraft.server.v1_6_R3.NetworkManager; import net.minecraft.server.v1_6_R3.World; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; import org.bukkit.entity.Player; import org.getspout.spout.Spout; import org.getspout.spoutapi.SpoutManager; import org.getspout.spoutapi.material.CustomItem; import org.getspout.spoutapi.material.Food; import org.getspout.spoutapi.material.MaterialData; import org.getspout.spoutapi.player.SpoutPlayer; public class CustomItemFlint extends Item { private Class<?> clazz = null; private Field a = null; protected CustomItemFlint() { super(62); b("flint"); Class clazz = null; try { clazz = Class.forName("net.minecraft.server.v1_6_R3.NetworkWriterThread"); } catch (ClassNotFoundException e) { // Libigot/Nover compatibility. Those two replace the classloader and as such forname fails on them. // This may be temporary as we fix it in Libigot. For now, this will do. try { clazz = Class.forName("net.minecraft.server.NetworkWriterThread"); } catch (ClassNotFoundException e1) { e.printStackTrace(); } } try { a = clazz.getDeclaredField("a"); a.setAccessible(true); } catch (Exception e) { e.printStackTrace(); } } @Override public ItemStack b(ItemStack itemstack, World world, EntityHuman entityhuman) { CustomItem item = MaterialData.getCustomItem(itemstack.getData()); if (item instanceof Food) { --itemstack.count; entityhuman.getFoodData().eat(((Food) item).getHungerRestored(), 0.6F); } return itemstack; } @Override public EnumAnimation c_(ItemStack itemstack) { CustomItem item = MaterialData.getCustomItem(itemstack.getData()); if (item instanceof Food) { return EnumAnimation.EAT; } return super.c_(itemstack); } @Override public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { CustomItem item = MaterialData.getCustomItem(itemstack.getData()); if (item instanceof Food) { Bukkit.getScheduler().scheduleSyncDelayedTask(Spout.getInstance(), new FoodUpdate(entityhuman, itemstack), 2); } return itemstack; } @Override public boolean x() { if (clazz == null || a == null) { return false; } Thread t = Thread.currentThread(); if (!clazz.isInstance(t)) { return false; } NetworkManager nm = null; try { nm = (NetworkManager) a.get(t); } catch (Exception e) { } if (nm == null) { return false; } SpoutPlayer player = lookupPlayer(nm); if (player == null) { return false; } return player.isSpoutCraftEnabled(); } private SpoutPlayer lookupPlayer(NetworkManager nm) { for (Player p : Bukkit.getOnlinePlayers()) { if (!(p instanceof CraftPlayer)) { continue; } INetworkManager n = ((CraftPlayer) p).getHandle().playerConnection.networkManager; if (n == nm) { return SpoutManager.getPlayer(p); } } return null; } public static void replaceFlint() { Item.byId[MaterialData.flint.getRawId()] = null; Item.byId[MaterialData.flint.getRawId()] = new CustomItemFlint(); } } class FoodUpdate implements Runnable { EntityHuman human; ItemStack item; public FoodUpdate(EntityHuman human, ItemStack item) { this.human = human; this.item = item; } @Override public void run() { if (human.g(false)) { human.a(item, 32); } } }