Registry polishing, make matter registry working and being synced in multiplayer
This commit is contained in:
parent
4668bcc71c
commit
316c30abb8
@ -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<Block> event) {
|
||||
Registry.Blocks.register(event);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void items(final RegistryEvent.Register<Item> event) {
|
||||
Registry.Items.register(event);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void tiles(final RegistryEvent.Register<BlockEntityType<?>> event) {
|
||||
Registry.BlockEntities.register(event);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void menus(final RegistryEvent.Register<MenuType<?>> event) {
|
||||
Registry.Menus.register(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<Block> 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<Item> 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<BlockEntityType<?>> 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<MenuType<?>> 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);
|
||||
|
@ -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<Item, ArrayList<Recipe<?>>> usages = new HashMap<>();
|
||||
private static final HashMap<Item, ArrayList<Recipe<?>>> results = new HashMap<>();
|
||||
private static final HashMap<Item, Integer> seen_items = new HashMap<>();
|
||||
private static final HashMap<Item, Item> seen_items_child = new HashMap<>();
|
||||
|
||||
public static final MathContext ROUND_RULES = MatteryCapability.ROUND_RULES;
|
||||
|
||||
private static boolean solve_occured = false;
|
||||
private static Set<Item> defered_items = new HashSet<>();
|
||||
private static final Set<Item> 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<Item, BigDecimal> entry : ITEMS.entrySet()) {
|
||||
OverdriveThatMatters.LOGGER.debug("{} -> {}", entry.getKey(), entry.getValue());
|
||||
}
|
||||
*/
|
||||
|
||||
registerPostItems();
|
||||
}
|
||||
|
||||
|
@ -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<Item, BigDecimal> list) {
|
||||
public void write(FriendlyByteBuf buffer) {
|
||||
buffer.writeInt(list.size());
|
||||
var registry = (ForgeRegistry<Item>) 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<Item>) RegistryManager.ACTIVE.getRegistry(Item.class);
|
||||
|
||||
var map = new HashMap<Item, BigDecimal>();
|
||||
|
||||
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<NetworkEvent.Context> context) {
|
||||
context.get().setPacketHandled(true);
|
||||
|
||||
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::playClient);
|
||||
}
|
||||
}
|
@ -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)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user