diff --git a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java index 6468efa3d..2ac304955 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java +++ b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java @@ -56,6 +56,12 @@ public class OverdriveThatMatters { MinecraftForge.EVENT_BUS.register(AndroidCapabilityPlayer.class); MinecraftForge.EVENT_BUS.register(AndroidCapability.class); MinecraftForge.EVENT_BUS.register(MatterGrid.class); + MinecraftForge.EVENT_BUS.register(MatterRegistry.class); + + FMLJavaModLoadingContext.get().getModEventBus().register(Registry.Items.class); + FMLJavaModLoadingContext.get().getModEventBus().register(Registry.Blocks.class); + FMLJavaModLoadingContext.get().getModEventBus().register(Registry.BlockEntities.class); + FMLJavaModLoadingContext.get().getModEventBus().register(Registry.Menus.class); // LOGGER.info("Registered event handlers"); @@ -80,9 +86,6 @@ public class OverdriveThatMatters { private void setupClient(final FMLClientSetupEvent event) { ANDROID_GUI = new AndroidGui(); MinecraftForge.EVENT_BUS.register(ANDROID_GUI); - MinecraftForge.EVENT_BUS.register(MatterRegistry.class); - - Registry.Menus.registerScreens(event); } private void enqueueIMC(final InterModEnqueueEvent event) { @@ -96,33 +99,4 @@ public class OverdriveThatMatters { map(m->m.messageSupplier().get()). collect(Collectors.toList())); } - - // You can use SubscribeEvent and let the Event Bus discover methods to call - @SubscribeEvent - public void onServerStarting(FMLServerStartedEvent event) { - // do something when the server starts - } - - @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) - public static class RegistryEventSubscriber { - @SubscribeEvent - public static void blocks(final RegistryEvent.Register event) { - Registry.Blocks.register(event); - } - - @SubscribeEvent - public static void items(final RegistryEvent.Register event) { - Registry.Items.register(event); - } - - @SubscribeEvent - public static void tiles(final RegistryEvent.Register> event) { - Registry.BlockEntities.register(event); - } - - @SubscribeEvent - public static void menus(final RegistryEvent.Register> event) { - Registry.Menus.register(event); - } - } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/Registry.java b/src/main/java/ru/dbotthepony/mc/otm/Registry.java index e231ed35a..d067e4d3e 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/Registry.java +++ b/src/main/java/ru/dbotthepony/mc/otm/Registry.java @@ -10,6 +10,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import ru.dbotthepony.mc.otm.block.*; import ru.dbotthepony.mc.otm.block.entity.*; @@ -84,6 +85,7 @@ public class Registry { MATTER_REPLICATOR.setRegistryName(Names.MATTER_REPLICATOR); } + @SubscribeEvent public static void register(final RegistryEvent.Register event) { event.getRegistry().register(ANDROID_STATION); event.getRegistry().register(BATTERY_BANK); @@ -153,6 +155,7 @@ public class Registry { PATTERN_DRIVE_CREATIVE.setRegistryName(Names.PATTERN_DRIVE_CREATIVE); } + @SubscribeEvent public static void register(final RegistryEvent.Register event) { event.getRegistry().register(ANDROID_STATION); event.getRegistry().register(BATTERY_BANK); @@ -206,6 +209,7 @@ public class Registry { MATTER_REPLICATOR.setRegistryName(Names.MATTER_REPLICATOR); } + @SubscribeEvent public static void register(final RegistryEvent.Register> event) { event.getRegistry().register(ANDROID_STATION); event.getRegistry().register(BATTERY_BANK); @@ -242,6 +246,7 @@ public class Registry { MATTER_REPLICATOR.setRegistryName(Names.MATTER_REPLICATOR); } + @SubscribeEvent public static void register(final RegistryEvent.Register> event) { event.getRegistry().register(ANDROID_STATION); event.getRegistry().register(BATTERY_BANK); @@ -255,6 +260,7 @@ public class Registry { // OverdriveThatMatters.LOGGER.info("Registered menus"); } + @SubscribeEvent public static void registerScreens(final FMLClientSetupEvent event) { MenuScreens.register(ANDROID_STATION, AndroidStationScreen::new); MenuScreens.register(BATTERY_BANK, BatteryBankScreen::new); diff --git a/src/main/java/ru/dbotthepony/mc/otm/matter/MatterRegistry.java b/src/main/java/ru/dbotthepony/mc/otm/matter/MatterRegistry.java index 2506cbea8..fbe9f3e68 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/matter/MatterRegistry.java +++ b/src/main/java/ru/dbotthepony/mc/otm/matter/MatterRegistry.java @@ -3,6 +3,8 @@ package ru.dbotthepony.mc.otm.matter; import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; +import net.minecraft.server.dedicated.DedicatedServer; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -10,11 +12,17 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeType; import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fmllegacy.network.PacketDistributor; +import net.minecraftforge.fmlserverevents.FMLServerAboutToStartEvent; import net.minecraftforge.fmlserverevents.FMLServerStartedEvent; +import net.minecraftforge.fmlserverevents.FMLServerStartingEvent; import ru.dbotthepony.mc.otm.OverdriveThatMatters; import ru.dbotthepony.mc.otm.capability.MatteryCapability; import ru.dbotthepony.mc.otm.menu.FormattingHelper; +import ru.dbotthepony.mc.otm.network.MatterRegistryPacket; +import ru.dbotthepony.mc.otm.network.MatteryNetworking; import javax.annotation.Nullable; import java.math.BigDecimal; @@ -286,27 +294,31 @@ public class MatterRegistry { registerPostItem(Items.DAMAGED_ANVIL, Items.ANVIL, new BigDecimal("0.5")); } + public static final MathContext ROUND_RULES = MatteryCapability.ROUND_RULES; + private static final HashMap>> usages = new HashMap<>(); private static final HashMap>> results = new HashMap<>(); private static final HashMap seen_items = new HashMap<>(); private static final HashMap seen_items_child = new HashMap<>(); - public static final MathContext ROUND_RULES = MatteryCapability.ROUND_RULES; - private static boolean solve_occured = false; - private static Set defered_items = new HashSet<>(); + private static final Set defered_items = new HashSet<>(); private static int stack_index = 0; - private static Item[] scan_stack = new Item[1000]; + private static final Item[] scan_stack = new Item[1000]; @Nullable private static BigDecimal determineValue(Item item) { - if (ITEMS.containsKey(item)) { - return ITEMS.get(item); + BigDecimal _get = ITEMS.get(item); + + if (_get != null) { + return _get; } - if (INITIAL_ITEMS.containsKey(item)) { - return INITIAL_ITEMS.get(item); + _get = INITIAL_ITEMS.get(item); + + if (_get != null) { + return _get; } if (defered_items.contains(item)) { @@ -372,6 +384,7 @@ public class MatterRegistry { OverdriveThatMatters.LOGGER.debug("Cannot determine matter value for {} because value of {} is unknown", item, stack.getItem()); seen_items_child.put(item, stack.getItem()); scan_stack[stack_index] = null; + stack_index--; return BigDecimal.ZERO; } @@ -408,17 +421,21 @@ public class MatterRegistry { // ez ITEMS.put(item, smallest_possible_total); scan_stack[stack_index] = null; + stack_index--; solve_occured = true; return smallest_possible_total; } if (defer_occured) { defered_items.add(item); + scan_stack[stack_index] = null; + stack_index--; OverdriveThatMatters.LOGGER.debug("Matter value for {} is defered completely until next iteration", item); return null; } scan_stack[stack_index] = null; + stack_index--; return BigDecimal.ZERO; } @@ -452,18 +469,26 @@ public class MatterRegistry { } } - private static boolean started_once = false; + private static boolean should_network = false; @SubscribeEvent - public static void serverStarted(FMLServerStartedEvent event) { - if (started_once) + public static void onClientLogin(PlayerEvent.PlayerLoggedInEvent event) { + if (!should_network) return; - started_once = true; + MatteryNetworking.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) event.getPlayer()), new MatterRegistryPacket(ITEMS)); + } + + @SubscribeEvent + public static void onServerStarted(FMLServerStartedEvent event) { + should_network = event.getServer() instanceof DedicatedServer; ITEMS.clear(); usages.clear(); results.clear(); + defered_items.clear(); + seen_items.clear(); + seen_items_child.clear(); // scan for recipes and build linked tables flood(event.getServer().getRecipeManager().getAllRecipesFor(RecipeType.CRAFTING)); @@ -471,6 +496,8 @@ public class MatterRegistry { flood(event.getServer().getRecipeManager().getAllRecipesFor(RecipeType.STONECUTTING)); flood(event.getServer().getRecipeManager().getAllRecipesFor(RecipeType.SMITHING)); + OverdriveThatMatters.LOGGER.info("{} {} {}", ITEMS.size(), usages.size(), results.size()); + // expand the recipe tree and find references // just scan entire known tree solve_occured = true; @@ -483,6 +510,8 @@ public class MatterRegistry { determineValue(item); } + OverdriveThatMatters.LOGGER.info("{} {} {}", ITEMS.size(), usages.size(), results.size()); + // clean up garbage usages.clear(); results.clear(); @@ -500,12 +529,6 @@ public class MatterRegistry { seen_items.clear(); seen_items_child.clear(); - /* - for (Map.Entry entry : ITEMS.entrySet()) { - OverdriveThatMatters.LOGGER.debug("{} -> {}", entry.getKey(), entry.getValue()); - } - */ - registerPostItems(); } diff --git a/src/main/java/ru/dbotthepony/mc/otm/network/MatterRegistryPacket.java b/src/main/java/ru/dbotthepony/mc/otm/network/MatterRegistryPacket.java new file mode 100644 index 000000000..bd9990646 --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/network/MatterRegistryPacket.java @@ -0,0 +1,53 @@ +package ru.dbotthepony.mc.otm.network; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.Item; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fmllegacy.network.NetworkEvent; +import net.minecraftforge.registries.ForgeRegistry; +import net.minecraftforge.registries.RegistryManager; +import ru.dbotthepony.mc.otm.OverdriveThatMatters; +import ru.dbotthepony.mc.otm.matter.MatterRegistry; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +public record MatterRegistryPacket(Map list) { + public void write(FriendlyByteBuf buffer) { + buffer.writeInt(list.size()); + var registry = (ForgeRegistry) RegistryManager.ACTIVE.getRegistry(Item.class); + + for (var entry : list.entrySet()) { + buffer.writeInt(registry.getID(entry.getKey())); + NetworkHelper.writeDecimal(buffer, entry.getValue()); + } + } + + public static MatterRegistryPacket read(FriendlyByteBuf buffer) { + var size = buffer.readInt(); + var registry = (ForgeRegistry) RegistryManager.ACTIVE.getRegistry(Item.class); + + var map = new HashMap(); + + for (int i = 0; i < size; i++) { + map.put(registry.getValue(buffer.readInt()), NetworkHelper.readDecimal(buffer)); + } + + return new MatterRegistryPacket(map); + } + + public void playClient() { + MatterRegistry.ITEMS.clear(); + MatterRegistry.ITEMS.putAll(list); + } + + public void play(Supplier context) { + context.get().setPacketHandled(true); + + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::playClient); + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java b/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java index 24f392de1..e7758c12e 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java +++ b/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java @@ -65,5 +65,14 @@ public class MatteryNetworking { PatternReplicationRequestPacket::play, Optional.of(NetworkDirection.PLAY_TO_SERVER) ); + + CHANNEL.registerMessage( + next_network_id++, + MatterRegistryPacket.class, + MatterRegistryPacket::write, + MatterRegistryPacket::read, + MatterRegistryPacket::play, + Optional.of(NetworkDirection.PLAY_TO_CLIENT) + ); } }