Registry polishing, make matter registry working and being synced in multiplayer

This commit is contained in:
DBotThePony 2021-08-18 20:44:14 +07:00
parent 4668bcc71c
commit 316c30abb8
Signed by: DBot
GPG Key ID: DCC23B5715498507
5 changed files with 115 additions and 50 deletions

View File

@ -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);
}
}
}

View File

@ -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);

View File

@ -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();
}

View File

@ -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);
}
}

View File

@ -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)
);
}
}