public static void startCookTime(Block block, FurnaceInfo info) {
Furnace furnace = (Furnace)block.getState();
if (info.getCooktime() != 0) {
new BukkitRunnable(){
public void run() {
if (furnace.getInventory().getSmelting() == null) {
this.cancel();
return;
}
if (furnace.getCookTime() < 0) {
furnace.setCookTime((short)0);
furnace.update();
}
Furnaces.setCookTime(block, Furnaces.getCappedTicks(200, info.getCooktime(), 0.5));
}
}.runTask(Main.getInstance());
}
}
public static void setCookTime(Block block, int duration) {
try {
String version = Main.getInstance().getServer().getClass().getPackage().getName().split("\\.")[3];
Class<?> CraftFurnace = Class.forName("org.bukkit.craftbukkit." + version + ".block.CraftFurnace");
Method CraftFurnaceGetTileEntity = null;
Class<?> TileEntityFurnace = Class.forName("net.minecraft.server." + version + ".TileEntityFurnace");
Field TileEntityFurnace_cook_time_total = TileEntityFurnace.getDeclaredField("cookTimeTotal");
TileEntityFurnace_cook_time_total.setAccessible(true);
for (Class<?> clazz = CraftFurnace; clazz != null; clazz = clazz.getSuperclass()) {
for (Method method : clazz.getDeclaredMethods()) {
if (!method.getName().equals("getTileEntity") || method.getParameterTypes().length != 0) continue;
CraftFurnaceGetTileEntity = method;
CraftFurnaceGetTileEntity.setAccessible(true);
}
}
if (!CraftFurnace.isAssignableFrom(block.getState().getClass())) {
return;
}
Object tileEntityFurnace = CraftFurnaceGetTileEntity.invoke(block.getState());
if (tileEntityFurnace == null || !TileEntityFurnace.isAssignableFrom(tileEntityFurnace.getClass())) {
return;
}
TileEntityFurnace_cook_time_total.set(tileEntityFurnace, Math.max(0, duration));
}
catch (Exception e) {
e.printStackTrace();
}
}
public static int getCappedTicks(int baseTicks, int baseModifier, double fractionModifier) {
return Math.max(1, Math.min(32767, Furnaces.getModifiedTicks(baseTicks, baseModifier, fractionModifier)));
}
public static int getModifiedTicks(int baseTicks, int baseModifier, double fractionModifier) {
if (baseModifier == 0) {
return baseTicks;
}
if (baseModifier > 0) {
return (int)((double)baseTicks / (1.0 + (double)baseModifier * fractionModifier));
}
return (int)((double)baseTicks * (1.0 + (double)(-baseModifier) * fractionModifier));
}
}