2018-06-21 19:37:32 +00:00
/ *
* Minecraft Forge
2020-07-02 17:49:11 +00:00
* Copyright ( c ) 2016 - 2020 .
2018-06-21 19:37:32 +00:00
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2 . 1
* of the License .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
* /
package net.minecraftforge.common ;
2020-11-10 20:24:25 +00:00
import net.minecraft.command.arguments.ArgumentSerializer ;
import net.minecraft.command.arguments.ArgumentTypes ;
import net.minecraft.command.arguments.IArgumentSerializer ;
2020-06-24 00:56:24 +00:00
import net.minecraft.entity.ai.attributes.Attribute ;
import net.minecraft.entity.ai.attributes.RangedAttribute ;
2019-12-19 05:02:20 +00:00
import net.minecraft.util.SoundEvent ;
2020-06-19 14:58:45 +00:00
import net.minecraft.world.storage.IServerConfiguration ;
import net.minecraft.world.storage.SaveFormat ;
2020-11-27 23:57:15 +00:00
import net.minecraftforge.api.distmarker.Dist ;
import net.minecraftforge.client.ForgeHooksClient ;
2019-02-14 03:13:59 +00:00
import net.minecraftforge.eventbus.api.IEventBus ;
2020-07-28 23:17:35 +00:00
import net.minecraftforge.eventbus.api.SubscribeEvent ;
2019-07-01 03:48:54 +00:00
import net.minecraftforge.fml.* ;
2019-02-10 21:38:14 +00:00
import net.minecraftforge.fml.config.ModConfig ;
2020-11-27 23:57:15 +00:00
import net.minecraftforge.fml.event.lifecycle.* ;
2019-01-15 03:32:43 +00:00
import net.minecraftforge.fml.event.server.FMLServerStoppingEvent ;
2019-02-14 03:13:59 +00:00
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext ;
2020-11-27 23:57:15 +00:00
import net.minecraftforge.fml.loading.FMLEnvironment ;
2019-10-05 21:02:54 +00:00
import net.minecraftforge.fml.loading.progress.StartupMessageManager ;
2020-06-24 00:56:24 +00:00
import net.minecraftforge.registries.DeferredRegister ;
2020-11-10 20:24:25 +00:00
import net.minecraftforge.server.command.EnumArgument ;
import net.minecraftforge.server.command.ModIdArgument ;
2018-10-04 23:28:45 +00:00
import net.minecraftforge.versions.forge.ForgeVersion ;
2019-01-02 02:35:23 +00:00
import net.minecraftforge.versions.mcp.MCPVersion ;
2019-02-05 02:23:58 +00:00
2019-03-31 20:36:49 +00:00
import org.apache.commons.lang3.tuple.Pair ;
2018-06-21 19:37:32 +00:00
import org.apache.logging.log4j.LogManager ;
import org.apache.logging.log4j.Logger ;
2019-06-14 03:58:03 +00:00
import net.minecraft.data.DataGenerator ;
2019-08-03 17:25:41 +00:00
import net.minecraft.item.crafting.IRecipe ;
import net.minecraft.item.crafting.IRecipeSerializer ;
2019-05-23 23:02:15 +00:00
import net.minecraft.nbt.CompoundNBT ;
2019-08-03 17:25:41 +00:00
import net.minecraft.util.ResourceLocation ;
import net.minecraftforge.common.crafting.CompoundIngredient ;
import net.minecraftforge.common.crafting.ConditionalRecipe ;
import net.minecraftforge.common.crafting.CraftingHelper ;
2019-12-19 04:39:41 +00:00
import net.minecraftforge.common.crafting.NBTIngredient ;
2019-08-03 17:25:41 +00:00
import net.minecraftforge.common.crafting.VanillaIngredientSerializer ;
import net.minecraftforge.common.crafting.conditions.AndCondition ;
import net.minecraftforge.common.crafting.conditions.FalseCondition ;
import net.minecraftforge.common.crafting.conditions.ItemExistsCondition ;
import net.minecraftforge.common.crafting.conditions.ModLoadedCondition ;
import net.minecraftforge.common.crafting.conditions.NotCondition ;
import net.minecraftforge.common.crafting.conditions.OrCondition ;
import net.minecraftforge.common.crafting.conditions.TagEmptyCondition ;
import net.minecraftforge.common.crafting.conditions.TrueCondition ;
2019-06-14 03:58:03 +00:00
import net.minecraftforge.common.data.ForgeBlockTagsProvider ;
import net.minecraftforge.common.data.ForgeItemTagsProvider ;
2020-06-25 16:31:09 +00:00
import net.minecraftforge.common.data.ForgeLootTableProvider ;
2019-06-28 00:23:07 +00:00
import net.minecraftforge.common.data.ForgeRecipeProvider ;
2018-06-21 19:37:32 +00:00
import net.minecraftforge.common.model.animation.CapabilityAnimation ;
import net.minecraftforge.energy.CapabilityEnergy ;
2019-08-03 17:25:41 +00:00
import net.minecraftforge.event.RegistryEvent ;
2018-06-21 19:37:32 +00:00
import net.minecraftforge.fluids.capability.CapabilityFluidHandler ;
import net.minecraftforge.items.CapabilityItemHandler ;
2018-12-22 00:07:39 +00:00
import net.minecraftforge.fml.common.Mod ;
2018-06-22 04:43:25 +00:00
import org.apache.logging.log4j.Marker ;
import org.apache.logging.log4j.MarkerManager ;
2018-06-21 19:37:32 +00:00
2019-12-19 05:02:20 +00:00
import java.util.Arrays ;
import java.util.List ;
2020-10-04 20:40:38 +00:00
import java.util.UUID ;
2019-12-19 05:02:20 +00:00
2018-12-22 00:07:39 +00:00
@Mod ( " forge " )
2018-06-21 19:37:32 +00:00
public class ForgeMod implements WorldPersistenceHooks . WorldPersistenceHook
{
public static final String VERSION_CHECK_CAT = " version_checking " ;
2018-08-27 17:10:07 +00:00
private static final Logger LOGGER = LogManager . getLogger ( ) ;
2018-06-22 04:43:25 +00:00
private static final Marker FORGEMOD = MarkerManager . getMarker ( " FORGEMOD " ) ;
2018-06-21 19:37:32 +00:00
2020-06-24 00:56:24 +00:00
private static final DeferredRegister < Attribute > ATTRIBUTES = DeferredRegister . create ( Attribute . class , " forge " ) ;
2020-10-29 00:11:57 +00:00
public static final RegistryObject < Attribute > SWIM_SPEED = ATTRIBUTES . register ( " swim_speed " , ( ) - > new RangedAttribute ( " forge.swimSpeed " , 1 . 0D , 0 . 0D , 1024 . 0D ) . setShouldWatch ( true ) ) ;
public static final RegistryObject < Attribute > NAMETAG_DISTANCE = ATTRIBUTES . register ( " nametag_distance " , ( ) - > new RangedAttribute ( " forge.nameTagDistance " , 64 . 0D , 0 . 0D , 64 . 0 ) . setShouldWatch ( true ) ) ;
public static final RegistryObject < Attribute > ENTITY_GRAVITY = ATTRIBUTES . register ( " entity_gravity " , ( ) - > new RangedAttribute ( " forge.entity_gravity " , 0 . 08D , - 8 . 0D , 8 . 0D ) . setShouldWatch ( true ) ) ;
2020-06-24 00:56:24 +00:00
2020-10-29 00:11:57 +00:00
public static final RegistryObject < Attribute > REACH_DISTANCE = ATTRIBUTES . register ( " reach_distance " , ( ) - > new RangedAttribute ( " generic.reachDistance " , 5 . 0D , 0 . 0D , 1024 . 0D ) . setShouldWatch ( true ) ) ;
2020-06-24 09:44:47 +00:00
2018-06-21 19:37:32 +00:00
private static ForgeMod INSTANCE ;
public static ForgeMod getInstance ( )
{
return INSTANCE ;
}
public ForgeMod ( )
{
2019-01-27 05:06:57 +00:00
LOGGER . info ( FORGEMOD , " Forge mod loading, version {}, for MC {} with MCP {} " , ForgeVersion . getVersion ( ) , MCPVersion . getMCVersion ( ) , MCPVersion . getMCPVersion ( ) ) ;
2018-06-21 19:37:32 +00:00
INSTANCE = this ;
2019-02-19 17:33:37 +00:00
MinecraftForge . initialize ( ) ;
2020-10-04 20:40:38 +00:00
CrashReportExtender . registerCrashCallable ( " Crash Report UUID " , ( ) - > {
final UUID uuid = UUID . randomUUID ( ) ;
LOGGER . fatal ( " Preparing crash report with UUID {} " , uuid ) ;
return uuid . toString ( ) ;
} ) ;
2018-12-22 00:07:39 +00:00
WorldPersistenceHooks . addHook ( this ) ;
WorldPersistenceHooks . addHook ( new FMLWorldPersistenceHook ( ) ) ;
2019-02-14 03:13:59 +00:00
final IEventBus modEventBus = FMLJavaModLoadingContext . get ( ) . getModEventBus ( ) ;
modEventBus . addListener ( this : : preInit ) ;
2019-06-14 03:58:03 +00:00
modEventBus . addListener ( this : : gatherData ) ;
2020-11-27 23:57:15 +00:00
modEventBus . addListener ( this : : loadComplete ) ;
2020-07-28 23:17:35 +00:00
modEventBus . register ( this ) ;
2020-06-24 00:56:24 +00:00
ATTRIBUTES . register ( modEventBus ) ;
2018-06-22 04:43:25 +00:00
MinecraftForge . EVENT_BUS . addListener ( this : : serverStopping ) ;
2019-12-19 05:02:20 +00:00
MinecraftForge . EVENT_BUS . addGenericListener ( SoundEvent . class , this : : missingSoundMapping ) ;
2019-02-14 03:13:59 +00:00
ModLoadingContext . get ( ) . registerConfig ( ModConfig . Type . CLIENT , ForgeConfig . clientSpec ) ;
ModLoadingContext . get ( ) . registerConfig ( ModConfig . Type . SERVER , ForgeConfig . serverSpec ) ;
2020-11-27 23:57:15 +00:00
ModLoadingContext . get ( ) . registerConfig ( ModConfig . Type . COMMON , ForgeConfig . commonSpec ) ;
2019-02-14 03:13:59 +00:00
modEventBus . register ( ForgeConfig . class ) ;
2019-03-31 20:36:49 +00:00
// Forge does not display problems when the remote is not matching.
ModLoadingContext . get ( ) . registerExtensionPoint ( ExtensionPoint . DISPLAYTEST , ( ) - > Pair . of ( ( ) - > " ANY " , ( remote , isServer ) - > true ) ) ;
2019-07-01 03:48:54 +00:00
StartupMessageManager . addModMessage ( " Forge version " + ForgeVersion . getVersion ( ) ) ;
2020-06-28 22:08:03 +00:00
MinecraftForge . EVENT_BUS . addListener ( VillagerTradingManager : : loadTrades ) ;
MinecraftForge . EVENT_BUS . register ( MinecraftForge . INTERNAL_HANDLER ) ;
2020-07-28 23:17:35 +00:00
MinecraftForge . EVENT_BUS . register ( this ) ;
2020-10-15 19:43:18 +00:00
BiomeDictionary . init ( ) ;
2018-06-21 19:37:32 +00:00
}
2019-01-15 03:32:43 +00:00
public void preInit ( FMLCommonSetupEvent evt )
2018-06-21 19:37:32 +00:00
{
CapabilityItemHandler . register ( ) ;
CapabilityFluidHandler . register ( ) ;
CapabilityAnimation . register ( ) ;
CapabilityEnergy . register ( ) ;
2019-10-15 21:54:47 +00:00
VersionChecker . startVersionCheck ( ) ;
2019-08-20 22:29:26 +00:00
2020-11-10 20:24:25 +00:00
registerArgumentTypes ( ) ;
}
@SuppressWarnings ( { " unchecked " , " rawtypes " } )
private void registerArgumentTypes ( )
{
ArgumentTypes . register ( " forge:enum " , EnumArgument . class , ( IArgumentSerializer ) new EnumArgument . Serializer ( ) ) ;
2019-09-10 23:02:07 +00:00
ArgumentTypes . register ( " forge:modid " , ModIdArgument . class , new ArgumentSerializer < > ( ModIdArgument : : modIdArgument ) ) ;
2018-06-21 19:37:32 +00:00
}
2020-11-27 23:57:15 +00:00
public void loadComplete ( FMLLoadCompleteEvent event )
{
if ( FMLEnvironment . dist = = Dist . CLIENT )
ForgeHooksClient . registerForgeWorldTypeScreens ( ) ;
}
2018-06-21 19:37:32 +00:00
public void serverStopping ( FMLServerStoppingEvent evt )
{
WorldWorkerManager . clear ( ) ;
}
@Override
2020-06-19 14:58:45 +00:00
public CompoundNBT getDataForWriting ( SaveFormat . LevelSave levelSave , IServerConfiguration serverInfo )
2018-06-21 19:37:32 +00:00
{
2019-05-23 23:02:15 +00:00
CompoundNBT forgeData = new CompoundNBT ( ) ;
CompoundNBT dims = new CompoundNBT ( ) ;
2020-06-19 14:58:45 +00:00
//TODO Dimensions
// DimensionManager.writeRegistry(dims);
2019-02-14 23:08:53 +00:00
if ( ! dims . isEmpty ( ) )
2019-06-08 14:45:28 +00:00
forgeData . put ( " dims " , dims ) ;
2018-06-21 19:37:32 +00:00
return forgeData ;
}
@Override
2020-06-19 14:58:45 +00:00
public void readData ( SaveFormat . LevelSave levelSave , IServerConfiguration serverInfo , CompoundNBT tag )
2018-06-21 19:37:32 +00:00
{
2020-06-19 14:58:45 +00:00
//TODO Dimensions
// if (tag.contains("dims", 10))
// DimensionManager.readRegistry(tag.getCompound("dims"));
// DimensionManager.processScheduledDeletions(levelSave);
2018-06-21 19:37:32 +00:00
}
public void mappingChanged ( FMLModIdMappingEvent evt )
{
}
@Override
public String getModId ( )
{
return ForgeVersion . MOD_ID ;
}
2019-06-14 03:58:03 +00:00
public void gatherData ( GatherDataEvent event )
{
DataGenerator gen = event . getGenerator ( ) ;
if ( event . includeServer ( ) )
{
2020-09-03 03:18:22 +00:00
ForgeBlockTagsProvider blockTags = new ForgeBlockTagsProvider ( gen , event . getExistingFileHelper ( ) ) ;
2020-07-22 00:34:23 +00:00
gen . addProvider ( blockTags ) ;
2020-09-03 03:18:22 +00:00
gen . addProvider ( new ForgeItemTagsProvider ( gen , blockTags , event . getExistingFileHelper ( ) ) ) ;
2019-06-28 00:23:07 +00:00
gen . addProvider ( new ForgeRecipeProvider ( gen ) ) ;
2020-06-25 16:31:09 +00:00
gen . addProvider ( new ForgeLootTableProvider ( gen ) ) ;
2019-06-14 03:58:03 +00:00
}
}
2019-08-03 17:25:41 +00:00
2019-12-19 05:02:20 +00:00
public void missingSoundMapping ( RegistryEvent . MissingMappings < SoundEvent > event )
{
//Removed in 1.15, see https://minecraft.gamepedia.com/Parrot#History
List < String > removedSounds = Arrays . asList ( " entity.parrot.imitate.panda " , " entity.parrot.imitate.zombie_pigman " , " entity.parrot.imitate.enderman " , " entity.parrot.imitate.polar_bear " , " entity.parrot.imitate.wolf " ) ;
for ( RegistryEvent . MissingMappings . Mapping < SoundEvent > mapping : event . getAllMappings ( ) )
{
ResourceLocation regName = mapping . key ;
if ( regName ! = null & & regName . getNamespace ( ) . equals ( " minecraft " ) )
{
String path = regName . getPath ( ) ;
if ( removedSounds . stream ( ) . anyMatch ( s - > s . equals ( path ) ) )
{
LOGGER . info ( " Ignoring removed minecraft sound {} " , regName ) ;
mapping . ignore ( ) ;
}
}
}
}
2020-07-28 23:17:35 +00:00
@SubscribeEvent //ModBus, can't use addListener due to nested genetics.
2019-08-03 17:25:41 +00:00
public void registerRecipeSerialziers ( RegistryEvent . Register < IRecipeSerializer < ? > > event )
{
CraftingHelper . register ( AndCondition . Serializer . INSTANCE ) ;
CraftingHelper . register ( FalseCondition . Serializer . INSTANCE ) ;
CraftingHelper . register ( ItemExistsCondition . Serializer . INSTANCE ) ;
CraftingHelper . register ( ModLoadedCondition . Serializer . INSTANCE ) ;
CraftingHelper . register ( NotCondition . Serializer . INSTANCE ) ;
CraftingHelper . register ( OrCondition . Serializer . INSTANCE ) ;
CraftingHelper . register ( TrueCondition . Serializer . INSTANCE ) ;
CraftingHelper . register ( TagEmptyCondition . Serializer . INSTANCE ) ;
CraftingHelper . register ( new ResourceLocation ( " forge " , " compound " ) , CompoundIngredient . Serializer . INSTANCE ) ;
2019-12-19 04:39:41 +00:00
CraftingHelper . register ( new ResourceLocation ( " forge " , " nbt " ) , NBTIngredient . Serializer . INSTANCE ) ;
2019-08-03 17:25:41 +00:00
CraftingHelper . register ( new ResourceLocation ( " minecraft " , " item " ) , VanillaIngredientSerializer . INSTANCE ) ;
event . getRegistry ( ) . register ( new ConditionalRecipe . Serializer < IRecipe < ? > > ( ) . setRegistryName ( new ResourceLocation ( " forge " , " conditional " ) ) ) ;
}
2018-06-21 19:37:32 +00:00
}