public void tick() { int newID = contents[0] == null ? 0 : Item.getId(contents[0].getItem()); // Has the item been changed? if (newID != lastID) { // Then reset the progress! myCookTime = 0.0D; lastID = newID; // And, most important: change the melt speed meltSpeed = getMeltSpeed(contents[0]); } // So, can we now finally burn? if (canBurn() && !isBurning() && (getFuelTime(contents[1]) > 0)) { // I have no idea what "ticksForCurrentFuel" is good for, but it // works fine like this burnTime = ticksForCurrentFuel = getFuelTime(contents[1]); // Before we remove the item: how fast does it burn? burnSpeed = getBurnSpeed(contents[1]); // If it's a container item (lava bucket), we only consume its // contents (not like evil Notch!) // If it's not a container, consume it! Om nom nom nom! { contents[1].count--; // Let 0 be null if (contents[1].count <= 0) { contents[1] = null; } } } // Now, burning? if (isBurning()) { // Then move on burnTime--; // I'm using a double here because of the custom recipes. // The faster this fuel burns and the faster the recipe melts, the // faster we're done myCookTime += burnSpeed * meltSpeed; // Finished burning? if (myCookTime >= 200.0D) { myCookTime -= 200.0D; burn(); } } // If it's not burning, we reset the burning progress! else { myCookTime = 0.0D; } // And for the display (I'm using floor rather than round to not cause // the client to do shit when we not really reached 200): cookTime = (int) Math.floor(myCookTime); }
// Accessing packets @SuppressWarnings("deprecation") public static PacketPlayOutSpawnEntityLiving getMobPacket(String text, Location loc) { PacketPlayOutSpawnEntityLiving mobPacket = new PacketPlayOutSpawnEntityLiving(); try { Field a = ReflectionUtil.getDeclaredField(mobPacket.getClass(), "a"); a.setAccessible(true); a.set(mobPacket, (int) ENTITY_ID); Field b = ReflectionUtil.getDeclaredField(mobPacket.getClass(), "b"); b.setAccessible(true); b.set(mobPacket, (byte) EntityType.WITHER.getTypeId()); Field c = ReflectionUtil.getDeclaredField(mobPacket.getClass(), "c"); c.setAccessible(true); c.set(mobPacket, (int) Math.floor(loc.getBlockX() * 32.0D)); Field d = ReflectionUtil.getDeclaredField(mobPacket.getClass(), "d"); d.setAccessible(true); d.set(mobPacket, (int) Math.floor(loc.getBlockY() * 32.0D)); Field e = ReflectionUtil.getDeclaredField(mobPacket.getClass(), "e"); e.setAccessible(true); e.set(mobPacket, (int) Math.floor(loc.getBlockZ() * 32.0D)); Field f = ReflectionUtil.getDeclaredField(mobPacket.getClass(), "f"); f.setAccessible(true); f.set(mobPacket, (byte) 0); Field g = ReflectionUtil.getDeclaredField(mobPacket.getClass(), "g"); g.setAccessible(true); g.set(mobPacket, (byte) 0); Field h = ReflectionUtil.getDeclaredField(mobPacket.getClass(), "h"); h.setAccessible(true); h.set(mobPacket, (byte) 0); Field i = ReflectionUtil.getDeclaredField(mobPacket.getClass(), "i"); i.setAccessible(true); i.set(mobPacket, (byte) 0); Field j = ReflectionUtil.getDeclaredField(mobPacket.getClass(), "j"); j.setAccessible(true); j.set(mobPacket, (byte) 0); Field k = ReflectionUtil.getDeclaredField(mobPacket.getClass(), "k"); k.setAccessible(true); k.set(mobPacket, (byte) 0); } catch (IllegalArgumentException e1) { e1.printStackTrace(); } catch (IllegalAccessException e1) { e1.printStackTrace(); } DataWatcher watcher = getWatcher(text, 300); try { Field t = PacketPlayOutSpawnEntityLiving.class.getDeclaredField("l"); t.setAccessible(true); t.set(mobPacket, watcher); } catch (Exception ex) { ex.printStackTrace(); } return mobPacket; }