BloodMagic/src/main/java/wayoftime/bloodmagic/BloodMagic.java
WayofTime 3d51f61915 Finished reimplementing the Sigil of Holding
Probably missed a few System.out messages for testing, but ah well.
2021-01-20 12:50:34 -05:00

315 lines
15 KiB
Java

package wayoftime.bloodmagic;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.google.gson.Gson;
import net.minecraft.block.Block;
import net.minecraft.data.DataGenerator;
import net.minecraft.fluid.Fluid;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.potion.Effect;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.ColorHandlerEvent;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoaderRegistry;
import net.minecraftforge.client.model.generators.ItemModelProvider;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.crafting.CraftingHelper;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.config.ModConfig;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent;
import net.minecraftforge.fml.event.lifecycle.GatherDataEvent;
import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent;
import net.minecraftforge.fml.event.lifecycle.InterModProcessEvent;
import net.minecraftforge.fml.event.server.FMLServerStartingEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import wayoftime.bloodmagic.client.ClientEvents;
import wayoftime.bloodmagic.client.hud.Elements;
import wayoftime.bloodmagic.client.key.BloodMagicKeyHandler;
import wayoftime.bloodmagic.client.key.KeyBindings;
import wayoftime.bloodmagic.client.model.MimicModelLoader;
import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
import wayoftime.bloodmagic.common.data.GeneratorBaseRecipes;
import wayoftime.bloodmagic.common.data.GeneratorBlockStates;
import wayoftime.bloodmagic.common.data.GeneratorBlockTags;
import wayoftime.bloodmagic.common.data.GeneratorFluidTags;
import wayoftime.bloodmagic.common.data.GeneratorItemModels;
import wayoftime.bloodmagic.common.data.GeneratorItemTags;
import wayoftime.bloodmagic.common.data.GeneratorLanguage;
import wayoftime.bloodmagic.common.data.GeneratorLootTable;
import wayoftime.bloodmagic.common.data.recipe.BloodMagicRecipeProvider;
import wayoftime.bloodmagic.common.item.BloodMagicItems;
import wayoftime.bloodmagic.common.registries.BloodMagicEntityTypes;
import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers;
import wayoftime.bloodmagic.core.AnointmentRegistrar;
import wayoftime.bloodmagic.core.LivingArmorRegistrar;
import wayoftime.bloodmagic.core.recipe.IngredientBloodOrb;
import wayoftime.bloodmagic.core.registry.AlchemyArrayRegistry;
import wayoftime.bloodmagic.core.registry.OrbRegistry;
import wayoftime.bloodmagic.impl.BloodMagicAPI;
import wayoftime.bloodmagic.impl.BloodMagicCorePlugin;
import wayoftime.bloodmagic.loot.GlobalLootModifier;
import wayoftime.bloodmagic.network.BloodMagicPacketHandler;
import wayoftime.bloodmagic.potion.BloodMagicPotions;
import wayoftime.bloodmagic.ritual.ModRituals;
import wayoftime.bloodmagic.ritual.RitualManager;
import wayoftime.bloodmagic.structures.ModDungeons;
import wayoftime.bloodmagic.tile.TileAlchemicalReactionChamber;
import wayoftime.bloodmagic.tile.TileAlchemyArray;
import wayoftime.bloodmagic.tile.TileAlchemyTable;
import wayoftime.bloodmagic.tile.TileAltar;
import wayoftime.bloodmagic.tile.TileDeforesterCharge;
import wayoftime.bloodmagic.tile.TileDemonCrucible;
import wayoftime.bloodmagic.tile.TileDemonCrystal;
import wayoftime.bloodmagic.tile.TileDemonCrystallizer;
import wayoftime.bloodmagic.tile.TileIncenseAltar;
import wayoftime.bloodmagic.tile.TileMasterRitualStone;
import wayoftime.bloodmagic.tile.TileMimic;
import wayoftime.bloodmagic.tile.TileShapedExplosive;
import wayoftime.bloodmagic.tile.TileSoulForge;
import wayoftime.bloodmagic.util.handler.event.GenericHandler;
import wayoftime.bloodmagic.util.handler.event.WillHandler;
@Mod("bloodmagic")
//@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
public class BloodMagic
{
public static final String MODID = "bloodmagic";
// Directly reference a log4j logger.
public static final Logger LOGGER = LogManager.getLogger();
private static Gson GSON = null;
public static final BloodMagicPacketHandler packetHandler = new BloodMagicPacketHandler();
public static final RitualManager RITUAL_MANAGER = new RitualManager();
public BloodMagic()
{
IEventBus modBus = FMLJavaModLoadingContext.get().getModEventBus();
modBus.addListener(this::setup);
modBus.addListener(this::onLoadComplete);
BloodMagicBlocks.BLOCKS.register(modBus);
BloodMagicItems.ITEMS.register(modBus);
// RegistrarBloodMagic.BLOOD_ORBS.createAndRegister(modBus, "bloodorbs");
BloodMagicItems.BLOOD_ORBS.createAndRegister(modBus, "bloodorbs");
LivingArmorRegistrar.UPGRADES.createAndRegister(modBus, "upgrades");
AnointmentRegistrar.ANOINTMENTS.createAndRegister(modBus, "anointments");
BloodMagicItems.BASICITEMS.register(modBus);
BloodMagicBlocks.BASICBLOCKS.register(modBus);
BloodMagicBlocks.DUNGEONBLOCKS.register(modBus);
BloodMagicBlocks.FLUIDS.register(modBus);
BloodMagicBlocks.CONTAINERS.register(modBus);
BloodMagicEntityTypes.ENTITY_TYPES.register(modBus);
GlobalLootModifier.GLM.register(modBus);
BloodMagicRecipeSerializers.RECIPE_SERIALIZERS.register(modBus);
// Register the setup method for modloading
modBus.addListener(this::setup);
// Register the enqueueIMC method for modloading
modBus.addListener(this::enqueueIMC);
// Register the processIMC method for modloading
modBus.addListener(this::processIMC);
// Register the doClientStuff method for modloading
modBus.addListener(this::doClientStuff);
modBus.addListener(this::loadModels);
modBus.addListener(this::gatherData);
modBus.addGenericListener(Fluid.class, this::registerFluids);
modBus.addGenericListener(TileEntityType.class, this::registerTileEntityTypes);
modBus.addGenericListener(IRecipeSerializer.class, this::registerRecipes);
modBus.addGenericListener(Effect.class, BloodMagicPotions::registerPotions);
MinecraftForge.EVENT_BUS.register(new GenericHandler());
// MinecraftForge.EVENT_BUS.register(new ClientHandler());
modBus.addListener(this::registerColors);
MinecraftForge.EVENT_BUS.register(new WillHandler());
// MinecraftForge.EVENT_BUS.register(new BloodMagicBlocks());
// MinecraftForge.EVENT_BUS.addListener(this::commonSetup);
// Register ourselves for server and other game events we are interested in
MinecraftForge.EVENT_BUS.register(this);
ModLoadingContext context = ModLoadingContext.get();
context.registerConfig(ModConfig.Type.CLIENT, ConfigManager.CLIENT_SPEC);
ModDungeons.init();
}
private void registerRecipes(RegistryEvent.Register<IRecipeSerializer<?>> event)
{
// System.out.println("Registering IngredientBloodOrb Serializer.");
CraftingHelper.register(IngredientBloodOrb.NAME, IngredientBloodOrb.Serializer.INSTANCE);
// event.getRegistry().registerAll(
// new SewingRecipe.Serializer().setRegistryName("sewing")
// );
}
public static ResourceLocation rl(String name)
{
return new ResourceLocation(BloodMagic.MODID, name);
}
public void registerFluids(RegistryEvent.Register<Fluid> event)
{
}
public void onLoadComplete(FMLLoadCompleteEvent event)
{
OrbRegistry.tierMap.put(BloodMagicItems.ORB_WEAK.get().getTier(), new ItemStack(BloodMagicItems.WEAK_BLOOD_ORB.get()));
OrbRegistry.tierMap.put(BloodMagicItems.ORB_APPRENTICE.get().getTier(), new ItemStack(BloodMagicItems.APPRENTICE_BLOOD_ORB.get()));
OrbRegistry.tierMap.put(BloodMagicItems.ORB_MAGICIAN.get().getTier(), new ItemStack(BloodMagicItems.MAGICIAN_BLOOD_ORB.get()));
OrbRegistry.tierMap.put(BloodMagicItems.ORB_MASTER.get().getTier(), new ItemStack(BloodMagicItems.MASTER_BLOOD_ORB.get()));
BloodMagicCorePlugin.INSTANCE.register(BloodMagicAPI.INSTANCE);
RITUAL_MANAGER.discover();
ModRituals.initHarvestHandlers();
LivingArmorRegistrar.register();
AnointmentRegistrar.register();
AlchemyArrayRegistry.registerBaseArrays();
}
public void registerTileEntityTypes(RegistryEvent.Register<TileEntityType<?>> event)
{
LOGGER.info("Attempting to register Tile Entities");
event.getRegistry().register(TileEntityType.Builder.create(TileAltar::new, BloodMagicBlocks.BLOOD_ALTAR.get()).build(null).setRegistryName("altar"));
event.getRegistry().register(TileEntityType.Builder.create(TileAlchemyArray::new, BloodMagicBlocks.ALCHEMY_ARRAY.get()).build(null).setRegistryName("alchemyarray"));
event.getRegistry().register(TileEntityType.Builder.create(TileSoulForge::new, BloodMagicBlocks.SOUL_FORGE.get()).build(null).setRegistryName("soulforge"));
event.getRegistry().register(TileEntityType.Builder.create(TileMasterRitualStone::new, BloodMagicBlocks.MASTER_RITUAL_STONE.get()).build(null).setRegistryName("masterritualstone"));
event.getRegistry().register(TileEntityType.Builder.create(TileAlchemicalReactionChamber::new, BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER.get()).build(null).setRegistryName("alchemicalreactionchamber"));
event.getRegistry().register(TileEntityType.Builder.create(TileAlchemyTable::new, BloodMagicBlocks.ALCHEMY_TABLE.get()).build(null).setRegistryName("alchemytable"));
event.getRegistry().register(TileEntityType.Builder.create(TileDemonCrystal::new, BloodMagicBlocks.RAW_CRYSTAL_BLOCK.get(), BloodMagicBlocks.CORROSIVE_CRYSTAL_BLOCK.get(), BloodMagicBlocks.DESTRUCTIVE_CRYSTAL_BLOCK.get(), BloodMagicBlocks.VENGEFUL_CRYSTAL_BLOCK.get(), BloodMagicBlocks.STEADFAST_CRYSTAL_BLOCK.get()).build(null).setRegistryName("demoncrystal"));
event.getRegistry().register(TileEntityType.Builder.create(TileDemonCrucible::new, BloodMagicBlocks.DEMON_CRUCIBLE.get()).build(null).setRegistryName("demoncrucible"));
event.getRegistry().register(TileEntityType.Builder.create(TileDemonCrystallizer::new, BloodMagicBlocks.DEMON_CRYSTALLIZER.get()).build(null).setRegistryName("demoncrystallizer"));
event.getRegistry().register(TileEntityType.Builder.create(TileIncenseAltar::new, BloodMagicBlocks.INCENSE_ALTAR.get()).build(null).setRegistryName("incensealtar"));
event.getRegistry().register(TileEntityType.Builder.create(TileMimic::new, BloodMagicBlocks.MIMIC.get(), BloodMagicBlocks.ETHEREAL_MIMIC.get()).build(null).setRegistryName("mimic"));
event.getRegistry().register(TileEntityType.Builder.create(TileShapedExplosive::new, BloodMagicBlocks.SHAPED_CHARGE.get()).build(null).setRegistryName("shaped_explosive"));
event.getRegistry().register(TileEntityType.Builder.create(TileDeforesterCharge::new, BloodMagicBlocks.DEFORESTER_CHARGE.get()).build(null).setRegistryName("deforester_charge"));
}
@SubscribeEvent
public void gatherData(GatherDataEvent event)
{
// GSON = new GsonBuilder().registerTypeAdapter(Variant.class, new Variant.Deserializer()).registerTypeAdapter(ItemCameraTransforms.class, new ItemCameraTransforms.Deserializer()).registerTypeAdapter(ItemTransformVec3f.class, new ItemTransformVec3f.Deserializer()).create();
DataGenerator gen = event.getGenerator();
// if(event.includeClient())
{
ItemModelProvider itemModels = new GeneratorItemModels(gen, event.getExistingFileHelper());
gen.addProvider(itemModels);
gen.addProvider(new GeneratorBlockStates(gen, itemModels.existingFileHelper));
gen.addProvider(new GeneratorLanguage(gen));
gen.addProvider(new BloodMagicRecipeProvider(gen));
gen.addProvider(new GeneratorBaseRecipes(gen));
gen.addProvider(new GeneratorLootTable(gen));
GeneratorBlockTags bmBlockTags = new GeneratorBlockTags(gen, event.getExistingFileHelper());
gen.addProvider(bmBlockTags);
gen.addProvider(new GeneratorItemTags(gen, bmBlockTags, event.getExistingFileHelper()));
gen.addProvider(new GeneratorFluidTags(gen, event.getExistingFileHelper()));
}
}
private void loadModels(final ModelRegistryEvent event)
{
ModelLoaderRegistry.registerLoader(BloodMagic.rl("mimicloader"), new MimicModelLoader(BloodMagic.rl("block/solidopaquemimic")));
ModelLoaderRegistry.registerLoader(BloodMagic.rl("mimicloader_ethereal"), new MimicModelLoader(BloodMagic.rl("block/etherealopaquemimic")));
}
private void setup(final FMLCommonSetupEvent event)
{
// some preinit code
// LOGGER.info("HELLO FROM PREINIT");
// LOGGER.info("DIRT BLOCK >> {}", Blocks.DIRT.getRegistryName());
packetHandler.initialize();
}
// @OnlyIn(Dist.CLIENT)
private void doClientStuff(final FMLClientSetupEvent event)
{
// do something that can only be done on the client
// LOGGER.info("Got game settings {}", event.getMinecraftSupplier().get().gameSettings);
ClientEvents.initClientEvents(event);
Elements.registerElements();
MinecraftForge.EVENT_BUS.register(new ClientEvents());
KeyBindings.initializeKeys();
new BloodMagicKeyHandler();
// IEventBus modBus = FMLJavaModLoadingContext.get().getModEventBus();
//
}
private void registerColors(final ColorHandlerEvent event)
{
if (event instanceof ColorHandlerEvent.Item)
ClientEvents.colorHandlerEvent((ColorHandlerEvent.Item) event);
}
private void enqueueIMC(final InterModEnqueueEvent event)
{
// some example code to dispatch IMC to another mod
// InterModComms.sendTo("examplemod", "helloworld", () -> {
// LOGGER.info("Hello world from the MDK");
// return "Hello world";
// });
}
private void processIMC(final InterModProcessEvent event)
{
// some example code to receive and process InterModComms from other mods
// LOGGER.info("Got IMC {}", event.getIMCStream().map(m -> m.getMessageSupplier().get()).collect(Collectors.toList()));
}
// You can use SubscribeEvent and let the Event Bus discover methods to call
@SubscribeEvent
public void onServerStarting(FMLServerStartingEvent event)
{
// do something when the server starts
// LOGGER.info("HELLO from server starting");
}
// You can use EventBusSubscriber to automatically subscribe events on the
// contained class (this is subscribing to the MOD
// Event bus for receiving Registry Events)
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
public static class RegistryEvents
{
@SubscribeEvent
public static void onBlocksRegistry(final RegistryEvent.Register<Block> blockRegistryEvent)
{
// register a new block here
// LOGGER.info("HELLO from Register Block");
}
}
// Custom ItemGroup TAB
public static final ItemGroup TAB = new ItemGroup("bloodmagictab")
{
@Override
public ItemStack createIcon()
{
return new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get());
}
};
public static final String NAME = "Blood Magic: Alchemical Wizardry";
}