From 79ce18ac3e9b89c68f330fe5e805a9a7a7915379 Mon Sep 17 00:00:00 2001 From: Brennan Ward Date: Mon, 16 Sep 2019 17:04:32 -0400 Subject: [PATCH] Update furnace fuels to not recreate it's list every query, and update when tags are reloaded. Add Tag update events. (#6140) --- .../play/ClientPlayNetHandler.java.patch | 14 ++++-- .../tags/NetworkTagManager.java.patch | 10 ++++ .../AbstractFurnaceTileEntity.java.patch | 30 +++++++----- .../client/ForgeHooksClient.java | 5 +- .../client/event/RecipesUpdatedEvent.java | 14 +++++- .../net/minecraftforge/common/ForgeHooks.java | 30 ++++++++++++ .../common/ForgeInternalHandler.java | 7 +++ .../event/TagsUpdatedEvent.java | 46 +++++++++++++++++++ 8 files changed, 138 insertions(+), 18 deletions(-) create mode 100644 patches/minecraft/net/minecraft/tags/NetworkTagManager.java.patch create mode 100644 src/main/java/net/minecraftforge/event/TagsUpdatedEvent.java diff --git a/patches/minecraft/net/minecraft/client/network/play/ClientPlayNetHandler.java.patch b/patches/minecraft/net/minecraft/client/network/play/ClientPlayNetHandler.java.patch index 9cb4755c4..4113b7fcc 100644 --- a/patches/minecraft/net/minecraft/client/network/play/ClientPlayNetHandler.java.patch +++ b/patches/minecraft/net/minecraft/client/network/play/ClientPlayNetHandler.java.patch @@ -64,7 +64,7 @@ clientrecipebook.func_199644_c(); clientrecipebook.func_199642_d().forEach(imutablesearchtree::func_217872_a); imutablesearchtree.func_194040_a(); -+ net.minecraftforge.client.ForgeHooksClient.onRecipesUpdated(); ++ net.minecraftforge.client.ForgeHooksClient.onRecipesUpdated(this.field_199528_o); } public void func_200232_a(SPlayerLookPacket p_200232_1_) { @@ -77,7 +77,15 @@ if (effect != null) { EffectInstance effectinstance = new EffectInstance(effect, p_147260_1_.func_180755_e(), p_147260_1_.func_149428_f(), p_147260_1_.func_186984_g(), p_147260_1_.func_179707_f(), p_147260_1_.func_205527_h()); effectinstance.func_100012_b(p_147260_1_.func_149429_c()); -@@ -1766,10 +1779,12 @@ +@@ -1353,6 +1366,7 @@ + } + + this.field_147299_f.func_213253_a(SearchTreeManager.field_215360_b).func_194040_a(); ++ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.TagsUpdatedEvent(this.field_199725_m)); + } + + public void func_175098_a(SCombatPacket p_175098_1_) { +@@ -1766,10 +1780,12 @@ this.field_147299_f.field_184132_p.field_217741_m.func_217692_a(pointofinterestdebugrenderer$braininfo); } else { @@ -91,7 +99,7 @@ packetbuffer.release(); } -@@ -1909,7 +1924,7 @@ +@@ -1909,7 +1925,7 @@ for(SEntityPropertiesPacket.Snapshot sentitypropertiespacket$snapshot : p_147290_1_.func_149441_d()) { IAttributeInstance iattributeinstance = abstractattributemap.func_111152_a(sentitypropertiespacket$snapshot.func_151409_a()); if (iattributeinstance == null) { diff --git a/patches/minecraft/net/minecraft/tags/NetworkTagManager.java.patch b/patches/minecraft/net/minecraft/tags/NetworkTagManager.java.patch new file mode 100644 index 000000000..d46b98378 --- /dev/null +++ b/patches/minecraft/net/minecraft/tags/NetworkTagManager.java.patch @@ -0,0 +1,10 @@ +--- a/net/minecraft/tags/NetworkTagManager.java ++++ b/net/minecraft/tags/NetworkTagManager.java +@@ -69,6 +69,7 @@ + ItemTags.func_199902_a(this.field_199720_b); + FluidTags.func_206953_a(this.field_205705_c); + EntityTypeTags.func_219759_a(this.field_215299_d); ++ net.minecraftforge.fml.DeferredWorkQueue.runLater(() -> net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.TagsUpdatedEvent(this))); + }, p_215226_6_); + } + diff --git a/patches/minecraft/net/minecraft/tileentity/AbstractFurnaceTileEntity.java.patch b/patches/minecraft/net/minecraft/tileentity/AbstractFurnaceTileEntity.java.patch index 23306cdf0..7aa0de7c6 100644 --- a/patches/minecraft/net/minecraft/tileentity/AbstractFurnaceTileEntity.java.patch +++ b/patches/minecraft/net/minecraft/tileentity/AbstractFurnaceTileEntity.java.patch @@ -1,6 +1,14 @@ --- a/net/minecraft/tileentity/AbstractFurnaceTileEntity.java +++ b/net/minecraft/tileentity/AbstractFurnaceTileEntity.java -@@ -169,9 +169,9 @@ +@@ -85,6 +85,7 @@ + this.field_214014_c = p_i49964_2_; + } + ++ @Deprecated //Forge - get burn times by calling ForgeHooks#getBurnTime(ItemStack) + public static Map func_214001_f() { + Map map = Maps.newLinkedHashMap(); + func_213996_a(map, Items.field_151129_at, 20000); +@@ -169,9 +170,9 @@ super.func_145839_a(p_145839_1_); this.field_214012_a = NonNullList.func_191197_a(this.func_70302_i_(), ItemStack.field_190927_a); ItemStackHelper.func_191283_b(p_145839_1_, this.field_214012_a); @@ -13,7 +21,7 @@ this.field_214019_k = this.func_213997_a(this.field_214012_a.get(1)); int i = p_145839_1_.func_74765_d("RecipesUsedSize"); -@@ -185,9 +185,9 @@ +@@ -185,9 +186,9 @@ public CompoundNBT func_189515_b(CompoundNBT p_189515_1_) { super.func_189515_b(p_189515_1_); @@ -26,7 +34,7 @@ ItemStackHelper.func_191282_a(p_189515_1_, this.field_214012_a); p_189515_1_.func_74777_a("RecipesUsedSize", (short)this.field_214022_n.size()); int i = 0; -@@ -217,12 +217,14 @@ +@@ -217,12 +218,14 @@ this.field_214019_k = this.field_214018_j; if (this.func_214006_r()) { flag1 = true; @@ -43,7 +51,7 @@ } } } -@@ -266,10 +268,10 @@ +@@ -266,10 +269,10 @@ return true; } else if (!itemstack1.func_77969_a(itemstack)) { return false; @@ -56,7 +64,7 @@ } } } else { -@@ -285,7 +287,7 @@ +@@ -285,7 +288,7 @@ if (itemstack2.func_190926_b()) { this.field_214012_a.set(2, itemstack1.func_77946_l()); } else if (itemstack2.func_77973_b() == itemstack1.func_77973_b()) { @@ -65,27 +73,25 @@ } if (!this.field_145850_b.field_72995_K) { -@@ -305,7 +307,8 @@ +@@ -305,7 +308,7 @@ return 0; } else { Item item = p_213997_1_.func_77973_b(); - return func_214001_f().getOrDefault(item, 0); -+ int ret = p_213997_1_.getBurnTime(); -+ return net.minecraftforge.event.ForgeEventFactory.getItemBurnTime(p_213997_1_, ret == -1 ? func_214001_f().getOrDefault(item, 0) : ret); ++ return net.minecraftforge.common.ForgeHooks.getBurnTime(p_213997_1_); } } -@@ -314,7 +317,8 @@ +@@ -314,7 +317,7 @@ } public static boolean func_213991_b(ItemStack p_213991_0_) { - return func_214001_f().containsKey(p_213991_0_.func_77973_b()); -+ int ret = p_213991_0_.getBurnTime(); -+ return net.minecraftforge.event.ForgeEventFactory.getItemBurnTime(p_213991_0_, ret == -1 ? func_214001_f().getOrDefault(p_213991_0_.func_77973_b(), 0) : ret) > 0; ++ return net.minecraftforge.common.ForgeHooks.getBurnTime(p_213991_0_) > 0; } public int[] func_180463_a(Direction p_180463_1_) { -@@ -462,4 +466,27 @@ +@@ -462,4 +465,27 @@ } } diff --git a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java index 89a58b8ed..9a998a6a2 100644 --- a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java +++ b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java @@ -64,6 +64,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.IFluidState; import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.RecipeManager; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.Direction; import net.minecraft.util.Hand; @@ -997,9 +998,9 @@ public class ForgeHooksClient return MinecraftForge.EVENT_BUS.post(event); } - public static void onRecipesUpdated() + public static void onRecipesUpdated(RecipeManager mgr) { - Event event = new RecipesUpdatedEvent(); + Event event = new RecipesUpdatedEvent(mgr); MinecraftForge.EVENT_BUS.post(event); } diff --git a/src/main/java/net/minecraftforge/client/event/RecipesUpdatedEvent.java b/src/main/java/net/minecraftforge/client/event/RecipesUpdatedEvent.java index 5821e7c30..b4b6ef078 100644 --- a/src/main/java/net/minecraftforge/client/event/RecipesUpdatedEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RecipesUpdatedEvent.java @@ -28,7 +28,19 @@ import net.minecraftforge.eventbus.api.Event; */ public class RecipesUpdatedEvent extends Event { - public RecipesUpdatedEvent() + + private final RecipeManager mgr; + + public RecipesUpdatedEvent(RecipeManager mgr) { + this.mgr = mgr; + } + + /** + * @return The newly-updated recipe manager that now contains all the recipes that were just received. + */ + public RecipeManager getRecipeManager() + { + return mgr; } } diff --git a/src/main/java/net/minecraftforge/common/ForgeHooks.java b/src/main/java/net/minecraftforge/common/ForgeHooks.java index 853e447b7..e09b3903b 100644 --- a/src/main/java/net/minecraftforge/common/ForgeHooks.java +++ b/src/main/java/net/minecraftforge/common/ForgeHooks.java @@ -25,6 +25,7 @@ import java.net.URISyntaxException; import java.util.Collection; import java.util.Collections; import java.util.Deque; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -85,6 +86,7 @@ import net.minecraft.potion.PotionUtils; import net.minecraft.stats.Stats; import net.minecraft.tags.Tag; import net.minecraft.world.spawner.AbstractSpawner; +import net.minecraft.tileentity.FurnaceTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.DamageSource; import net.minecraft.util.ActionResultType; @@ -145,6 +147,8 @@ import net.minecraftforge.registries.DataSerializerEntry; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistry; import net.minecraftforge.registries.GameData; +import net.minecraftforge.registries.IRegistryDelegate; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; @@ -1178,4 +1182,30 @@ public class ForgeHooks BlockState state = world.getBlockState(pos); return ForgeEventFactory.getMobGriefingEvent(world, entity) && state.canEntityDestroy(world, pos, entity) && ForgeEventFactory.onEntityDestroyBlock(entity, pos, state); } + + private static final Map, Integer> VANILLA_BURNS = new HashMap<>(); + + /** + * Gets the burn time of this itemstack. + */ + public static int getBurnTime(ItemStack stack) + { + if (stack.isEmpty()) + { + return 0; + } + else + { + Item item = stack.getItem(); + int ret = stack.getBurnTime(); + return ForgeEventFactory.getItemBurnTime(stack, ret == -1 ? VANILLA_BURNS.getOrDefault(item.delegate, 0) : ret); + } + } + + public static synchronized void updateBurns() + { + VANILLA_BURNS.clear(); + FurnaceTileEntity.getBurnTimes().entrySet().forEach(e -> VANILLA_BURNS.put(e.getKey().delegate, e.getValue())); + } + } diff --git a/src/main/java/net/minecraftforge/common/ForgeInternalHandler.java b/src/main/java/net/minecraftforge/common/ForgeInternalHandler.java index 6f2acb3ad..d4e0a986f 100644 --- a/src/main/java/net/minecraftforge/common/ForgeInternalHandler.java +++ b/src/main/java/net/minecraftforge/common/ForgeInternalHandler.java @@ -33,6 +33,7 @@ import net.minecraftforge.event.world.ChunkEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TagsUpdatedEvent; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent.ClientTickEvent; import net.minecraftforge.event.TickEvent.Phase; @@ -101,5 +102,11 @@ public class ForgeInternalHandler { UsernameCache.setUsername(event.getPlayer().getUniqueID(), event.getPlayer().getGameProfile().getName()); } + + @SubscribeEvent + public void tagsUpdated(TagsUpdatedEvent event) + { + ForgeHooks.updateBurns(); + } } diff --git a/src/main/java/net/minecraftforge/event/TagsUpdatedEvent.java b/src/main/java/net/minecraftforge/event/TagsUpdatedEvent.java new file mode 100644 index 000000000..3379c8700 --- /dev/null +++ b/src/main/java/net/minecraftforge/event/TagsUpdatedEvent.java @@ -0,0 +1,46 @@ +/* + * Minecraft Forge + * Copyright (c) 2016-2019. + * + * This library 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 version 2.1 + * of the License. + * + * This library 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 library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package net.minecraftforge.event; + +import net.minecraft.tags.NetworkTagManager; +import net.minecraftforge.eventbus.api.Event; + +/** + * Fired on the client when {@link NetworkTagManager} has all of its tags synced from the server to the client (just after a client has connected). + * Fired on the server when {@link NetworkTagManager} has read all tags from disk (during a data reload). + */ +public class TagsUpdatedEvent extends Event +{ + + private final NetworkTagManager manager; + + public TagsUpdatedEvent(NetworkTagManager manager) + { + this.manager = manager; + } + + /** + * @return The network tag manager that has been updated with newly received tags. + */ + public NetworkTagManager getTagManager() + { + return manager; + } +}