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(AndroidCapabilityPlayer.class);
|
||||||
MinecraftForge.EVENT_BUS.register(AndroidCapability.class);
|
MinecraftForge.EVENT_BUS.register(AndroidCapability.class);
|
||||||
MinecraftForge.EVENT_BUS.register(MatterGrid.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");
|
// LOGGER.info("Registered event handlers");
|
||||||
|
|
||||||
@ -80,9 +86,6 @@ public class OverdriveThatMatters {
|
|||||||
private void setupClient(final FMLClientSetupEvent event) {
|
private void setupClient(final FMLClientSetupEvent event) {
|
||||||
ANDROID_GUI = new AndroidGui();
|
ANDROID_GUI = new AndroidGui();
|
||||||
MinecraftForge.EVENT_BUS.register(ANDROID_GUI);
|
MinecraftForge.EVENT_BUS.register(ANDROID_GUI);
|
||||||
MinecraftForge.EVENT_BUS.register(MatterRegistry.class);
|
|
||||||
|
|
||||||
Registry.Menus.registerScreens(event);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void enqueueIMC(final InterModEnqueueEvent event) {
|
private void enqueueIMC(final InterModEnqueueEvent event) {
|
||||||
@ -96,33 +99,4 @@ public class OverdriveThatMatters {
|
|||||||
map(m->m.messageSupplier().get()).
|
map(m->m.messageSupplier().get()).
|
||||||
collect(Collectors.toList()));
|
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.Block;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||||
import net.minecraftforge.event.RegistryEvent;
|
import net.minecraftforge.event.RegistryEvent;
|
||||||
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
|
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
|
||||||
import ru.dbotthepony.mc.otm.block.*;
|
import ru.dbotthepony.mc.otm.block.*;
|
||||||
import ru.dbotthepony.mc.otm.block.entity.*;
|
import ru.dbotthepony.mc.otm.block.entity.*;
|
||||||
@ -84,6 +85,7 @@ public class Registry {
|
|||||||
MATTER_REPLICATOR.setRegistryName(Names.MATTER_REPLICATOR);
|
MATTER_REPLICATOR.setRegistryName(Names.MATTER_REPLICATOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
public static void register(final RegistryEvent.Register<Block> event) {
|
public static void register(final RegistryEvent.Register<Block> event) {
|
||||||
event.getRegistry().register(ANDROID_STATION);
|
event.getRegistry().register(ANDROID_STATION);
|
||||||
event.getRegistry().register(BATTERY_BANK);
|
event.getRegistry().register(BATTERY_BANK);
|
||||||
@ -153,6 +155,7 @@ public class Registry {
|
|||||||
PATTERN_DRIVE_CREATIVE.setRegistryName(Names.PATTERN_DRIVE_CREATIVE);
|
PATTERN_DRIVE_CREATIVE.setRegistryName(Names.PATTERN_DRIVE_CREATIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
public static void register(final RegistryEvent.Register<Item> event) {
|
public static void register(final RegistryEvent.Register<Item> event) {
|
||||||
event.getRegistry().register(ANDROID_STATION);
|
event.getRegistry().register(ANDROID_STATION);
|
||||||
event.getRegistry().register(BATTERY_BANK);
|
event.getRegistry().register(BATTERY_BANK);
|
||||||
@ -206,6 +209,7 @@ public class Registry {
|
|||||||
MATTER_REPLICATOR.setRegistryName(Names.MATTER_REPLICATOR);
|
MATTER_REPLICATOR.setRegistryName(Names.MATTER_REPLICATOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
public static void register(final RegistryEvent.Register<BlockEntityType<?>> event) {
|
public static void register(final RegistryEvent.Register<BlockEntityType<?>> event) {
|
||||||
event.getRegistry().register(ANDROID_STATION);
|
event.getRegistry().register(ANDROID_STATION);
|
||||||
event.getRegistry().register(BATTERY_BANK);
|
event.getRegistry().register(BATTERY_BANK);
|
||||||
@ -242,6 +246,7 @@ public class Registry {
|
|||||||
MATTER_REPLICATOR.setRegistryName(Names.MATTER_REPLICATOR);
|
MATTER_REPLICATOR.setRegistryName(Names.MATTER_REPLICATOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
public static void register(final RegistryEvent.Register<MenuType<?>> event) {
|
public static void register(final RegistryEvent.Register<MenuType<?>> event) {
|
||||||
event.getRegistry().register(ANDROID_STATION);
|
event.getRegistry().register(ANDROID_STATION);
|
||||||
event.getRegistry().register(BATTERY_BANK);
|
event.getRegistry().register(BATTERY_BANK);
|
||||||
@ -255,6 +260,7 @@ public class Registry {
|
|||||||
// OverdriveThatMatters.LOGGER.info("Registered menus");
|
// OverdriveThatMatters.LOGGER.info("Registered menus");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
public static void registerScreens(final FMLClientSetupEvent event) {
|
public static void registerScreens(final FMLClientSetupEvent event) {
|
||||||
MenuScreens.register(ANDROID_STATION, AndroidStationScreen::new);
|
MenuScreens.register(ANDROID_STATION, AndroidStationScreen::new);
|
||||||
MenuScreens.register(BATTERY_BANK, BatteryBankScreen::new);
|
MenuScreens.register(BATTERY_BANK, BatteryBankScreen::new);
|
||||||
|
@ -3,6 +3,8 @@ package ru.dbotthepony.mc.otm.matter;
|
|||||||
import com.mojang.blaze3d.platform.InputConstants;
|
import com.mojang.blaze3d.platform.InputConstants;
|
||||||
import net.minecraft.ChatFormatting;
|
import net.minecraft.ChatFormatting;
|
||||||
import net.minecraft.client.Minecraft;
|
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.Item;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.item.Items;
|
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.Recipe;
|
||||||
import net.minecraft.world.item.crafting.RecipeType;
|
import net.minecraft.world.item.crafting.RecipeType;
|
||||||
import net.minecraftforge.event.entity.player.ItemTooltipEvent;
|
import net.minecraftforge.event.entity.player.ItemTooltipEvent;
|
||||||
|
import net.minecraftforge.event.entity.player.PlayerEvent;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
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.FMLServerStartedEvent;
|
||||||
|
import net.minecraftforge.fmlserverevents.FMLServerStartingEvent;
|
||||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
|
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
|
||||||
import ru.dbotthepony.mc.otm.menu.FormattingHelper;
|
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 javax.annotation.Nullable;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
@ -286,27 +294,31 @@ public class MatterRegistry {
|
|||||||
registerPostItem(Items.DAMAGED_ANVIL, Items.ANVIL, new BigDecimal("0.5"));
|
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<?>>> usages = new HashMap<>();
|
||||||
private static final HashMap<Item, ArrayList<Recipe<?>>> results = 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, Integer> seen_items = new HashMap<>();
|
||||||
private static final HashMap<Item, Item> seen_items_child = 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 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 int stack_index = 0;
|
||||||
private static Item[] scan_stack = new Item[1000];
|
private static final Item[] scan_stack = new Item[1000];
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static BigDecimal determineValue(Item item) {
|
private static BigDecimal determineValue(Item item) {
|
||||||
if (ITEMS.containsKey(item)) {
|
BigDecimal _get = ITEMS.get(item);
|
||||||
return ITEMS.get(item);
|
|
||||||
|
if (_get != null) {
|
||||||
|
return _get;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (INITIAL_ITEMS.containsKey(item)) {
|
_get = INITIAL_ITEMS.get(item);
|
||||||
return INITIAL_ITEMS.get(item);
|
|
||||||
|
if (_get != null) {
|
||||||
|
return _get;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (defered_items.contains(item)) {
|
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());
|
OverdriveThatMatters.LOGGER.debug("Cannot determine matter value for {} because value of {} is unknown", item, stack.getItem());
|
||||||
seen_items_child.put(item, stack.getItem());
|
seen_items_child.put(item, stack.getItem());
|
||||||
scan_stack[stack_index] = null;
|
scan_stack[stack_index] = null;
|
||||||
|
stack_index--;
|
||||||
return BigDecimal.ZERO;
|
return BigDecimal.ZERO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -408,17 +421,21 @@ public class MatterRegistry {
|
|||||||
// ez
|
// ez
|
||||||
ITEMS.put(item, smallest_possible_total);
|
ITEMS.put(item, smallest_possible_total);
|
||||||
scan_stack[stack_index] = null;
|
scan_stack[stack_index] = null;
|
||||||
|
stack_index--;
|
||||||
solve_occured = true;
|
solve_occured = true;
|
||||||
return smallest_possible_total;
|
return smallest_possible_total;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (defer_occured) {
|
if (defer_occured) {
|
||||||
defered_items.add(item);
|
defered_items.add(item);
|
||||||
|
scan_stack[stack_index] = null;
|
||||||
|
stack_index--;
|
||||||
OverdriveThatMatters.LOGGER.debug("Matter value for {} is defered completely until next iteration", item);
|
OverdriveThatMatters.LOGGER.debug("Matter value for {} is defered completely until next iteration", item);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
scan_stack[stack_index] = null;
|
scan_stack[stack_index] = null;
|
||||||
|
stack_index--;
|
||||||
return BigDecimal.ZERO;
|
return BigDecimal.ZERO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -452,18 +469,26 @@ public class MatterRegistry {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean started_once = false;
|
private static boolean should_network = false;
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public static void serverStarted(FMLServerStartedEvent event) {
|
public static void onClientLogin(PlayerEvent.PlayerLoggedInEvent event) {
|
||||||
if (started_once)
|
if (!should_network)
|
||||||
return;
|
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();
|
ITEMS.clear();
|
||||||
usages.clear();
|
usages.clear();
|
||||||
results.clear();
|
results.clear();
|
||||||
|
defered_items.clear();
|
||||||
|
seen_items.clear();
|
||||||
|
seen_items_child.clear();
|
||||||
|
|
||||||
// scan for recipes and build linked tables
|
// scan for recipes and build linked tables
|
||||||
flood(event.getServer().getRecipeManager().getAllRecipesFor(RecipeType.CRAFTING));
|
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.STONECUTTING));
|
||||||
flood(event.getServer().getRecipeManager().getAllRecipesFor(RecipeType.SMITHING));
|
flood(event.getServer().getRecipeManager().getAllRecipesFor(RecipeType.SMITHING));
|
||||||
|
|
||||||
|
OverdriveThatMatters.LOGGER.info("{} {} {}", ITEMS.size(), usages.size(), results.size());
|
||||||
|
|
||||||
// expand the recipe tree and find references
|
// expand the recipe tree and find references
|
||||||
// just scan entire known tree
|
// just scan entire known tree
|
||||||
solve_occured = true;
|
solve_occured = true;
|
||||||
@ -483,6 +510,8 @@ public class MatterRegistry {
|
|||||||
determineValue(item);
|
determineValue(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OverdriveThatMatters.LOGGER.info("{} {} {}", ITEMS.size(), usages.size(), results.size());
|
||||||
|
|
||||||
// clean up garbage
|
// clean up garbage
|
||||||
usages.clear();
|
usages.clear();
|
||||||
results.clear();
|
results.clear();
|
||||||
@ -500,12 +529,6 @@ public class MatterRegistry {
|
|||||||
seen_items.clear();
|
seen_items.clear();
|
||||||
seen_items_child.clear();
|
seen_items_child.clear();
|
||||||
|
|
||||||
/*
|
|
||||||
for (Map.Entry<Item, BigDecimal> entry : ITEMS.entrySet()) {
|
|
||||||
OverdriveThatMatters.LOGGER.debug("{} -> {}", entry.getKey(), entry.getValue());
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
registerPostItems();
|
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,
|
PatternReplicationRequestPacket::play,
|
||||||
Optional.of(NetworkDirection.PLAY_TO_SERVER)
|
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