Okay, so to my knowledge there is no way to make the items *actually* update in the chests/dispensers/furnaces/etc without modifying core classes, but there is a way to keep this fact hidden from the player, which can be accomplished by hijacking the getIconIndex method. When the GUI is launched for the inventory, render calls are made to getIconIndex(ItemStack stack, int pass) if you set requiresAdditionalRenderPasses() to return true.
Here is a generalized version.
public class Decay extends Item{
...
private long currentTime;
private final static int tickDelay = 5;
...
public boolean requiresMultipleRenderPasses(){
return true;
}
...
public boolean isDecayed(ItemStack stack){
//TODO: Add your final decay check here
if(stack.stackTagCompound!=null)
return stack.stackTagCompound.getInteger("decaySum")>200;
return false;
}
...
public int getIconIndex(ItemStack stack, int pass){
if(Minecraft.getMinecraft().theWorld.getWorldTime()-this.currentTime>Decay.tickDelay){
this.currentTime = Minecraft.getMinecraft().theWorld.getWorldTime();
//TODO: Add code here to handle item decay updates/increments/damage, etc
if(isDecayed(stack))
return ModClass.otherStaticFinalItem.getIconFromDamageForRenderPass(stack.getItemDamage(), pass);
//Special item icon, if needed, until onUpdate() can swap out inventory
}
//Normal item icon
return getIconFromDamageForRenderPass(stack.getItemDamage(), pass);
}
}
As it turns out, getTotalWorldTime() does not change with normal time add/set commands, but getWorldTime() does.