From 0db7e7072297980a0c4f5f54cf14191af7d7d3e9 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sat, 13 Jun 2020 20:25:00 +0200 Subject: [PATCH] Fix custom item entities not showing on the client Fix crystal growth not syncing --- .../java/appeng/bootstrap/EntityBuilder.java | 18 ++++++++++++++---- src/main/java/appeng/core/AppEng.java | 17 +++++++++-------- src/main/java/appeng/core/Registration.java | 7 ++++++- .../core/api/definitions/ApiBlocks.java | 17 +++++++---------- .../appeng/core/api/definitions/ApiItems.java | 6 ++---- .../core/api/definitions/ApiMaterials.java | 4 ++-- .../java/appeng/entity/AEBaseEntityItem.java | 19 ++++++++++++++++--- .../appeng/entity/EntityChargedQuartz.java | 4 +++- .../appeng/entity/EntityFloatingItem.java | 19 ++++++++++++------- .../appeng/entity/EntityGrowingCrystal.java | 18 +++++++++++++++--- .../java/appeng/entity/EntitySingularity.java | 4 +++- .../appeng/entity/EntityTinyTNTPrimed.java | 2 ++ .../modules/waila/WailaModule.java | 7 +++++++ .../appeng/items/misc/ItemCrystalSeed.java | 9 ++++++--- .../resources/META-INF/accesstransformer.cfg | 3 +++ .../block/crafting/16k_storage_formed.json | 2 +- .../block/crafting/1k_storage_formed.json | 2 +- .../block/crafting/4k_storage_formed.json | 2 +- .../block/crafting/64k_storage_formed.json | 2 +- 19 files changed, 111 insertions(+), 51 deletions(-) diff --git a/src/main/java/appeng/bootstrap/EntityBuilder.java b/src/main/java/appeng/bootstrap/EntityBuilder.java index 01d08fabf..8e2cefcbe 100644 --- a/src/main/java/appeng/bootstrap/EntityBuilder.java +++ b/src/main/java/appeng/bootstrap/EntityBuilder.java @@ -1,11 +1,19 @@ package appeng.bootstrap; import appeng.api.features.AEFeature; +import appeng.bootstrap.components.IClientSetupComponent; import appeng.bootstrap.components.IEntityRegistrationComponent; import appeng.core.AppEng; +import appeng.entity.EntityFloatingItem; +import appeng.entity.EntityTinyTNTPrimed; +import appeng.entity.RenderFloatingItem; +import appeng.entity.RenderTinyTNTPrimed; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityClassification; import net.minecraft.entity.EntityType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.client.registry.RenderingRegistry; import java.util.Collections; import java.util.EnumSet; @@ -27,7 +35,7 @@ public class EntityBuilder { public EntityBuilder(FeatureFactory factory, String id, EntityType.IFactory entityFactory, EntityClassification classification) { this.factory = factory; this.id = id; - this.builder = EntityType.Builder.create(entityFactory, classification); + this.builder = EntityType.Builder.create(entityFactory, classification); } public EntityBuilder features(AEFeature... features) { @@ -46,10 +54,12 @@ public class EntityBuilder { return this; } - public void build() { + public EntityType build() { + EntityType entityType = builder.build("appliedenergistics2:" + id); + entityType.setRegistryName(AppEng.MOD_ID, id); factory.addBootstrapComponent((IEntityRegistrationComponent) r -> { - EntityType entityType = builder.build("appliedenergistics2:" + id); - r.register( entityType.setRegistryName(AppEng.MOD_ID, id) ); + r.register(entityType); }); + return entityType; } } diff --git a/src/main/java/appeng/core/AppEng.java b/src/main/java/appeng/core/AppEng.java index 08ea8a349..060a5ecb5 100644 --- a/src/main/java/appeng/core/AppEng.java +++ b/src/main/java/appeng/core/AppEng.java @@ -40,12 +40,15 @@ import appeng.core.features.registries.PartModels; import appeng.core.stats.AdvancementTriggers; import appeng.core.sync.network.NetworkHandler; import appeng.core.worlddata.WorldData; +import appeng.entity.*; import appeng.hooks.TickHandler; import appeng.parts.PartPlacement; import appeng.parts.automation.PlaneModelLoader; import appeng.server.ServerHelper; import com.google.common.base.Stopwatch; import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.entity.EntityType; import net.minecraft.inventory.container.ContainerType; import net.minecraft.item.Item; @@ -73,6 +76,7 @@ import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.CrashReportExtender; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.ModLoadingContext; +import net.minecraftforge.fml.client.registry.RenderingRegistry; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.config.ModConfig; @@ -180,14 +184,11 @@ public final class AppEng ((ClientHelper) proxy).clientInit(); - // Do not register the Fullbright hacks if Optifine is present or if the Forge lighting is disabled - // FIXME if( !FMLClientHandler.instance().hasOptifine() && ForgeModContainer.forgeLightPipelineEnabled ) - // FIXME { - // FIXME ModelLoaderRegistry.registerLoader( UVLModelLoader.INSTANCE ); - // FIXME } - - // FIXME RenderingRegistry.registerEntityRenderingHandler( EntityTinyTNTPrimed.class, manager -> new RenderTinyTNTPrimed( manager ) ); - // FIXME RenderingRegistry.registerEntityRenderingHandler( EntityFloatingItem.class, manager -> new RenderFloatingItem( manager ) ); + RenderingRegistry.registerEntityRenderingHandler(EntityTinyTNTPrimed.TYPE, RenderTinyTNTPrimed::new); + RenderingRegistry.registerEntityRenderingHandler(EntityFloatingItem.TYPE, RenderFloatingItem::new); + RenderingRegistry.registerEntityRenderingHandler(EntitySingularity.TYPE, m -> new ItemRenderer(m, Minecraft.getInstance().getItemRenderer())); + RenderingRegistry.registerEntityRenderingHandler(EntityGrowingCrystal.TYPE, m -> new ItemRenderer(m, Minecraft.getInstance().getItemRenderer())); + RenderingRegistry.registerEntityRenderingHandler(EntityChargedQuartz.TYPE, m -> new ItemRenderer(m, Minecraft.getInstance().getItemRenderer())); // TODO: Do not use the internal API final ApiDefinitions definitions = Api.INSTANCE.definitions(); diff --git a/src/main/java/appeng/core/Registration.java b/src/main/java/appeng/core/Registration.java index 09853d107..213fc15ad 100644 --- a/src/main/java/appeng/core/Registration.java +++ b/src/main/java/appeng/core/Registration.java @@ -56,6 +56,7 @@ import appeng.core.features.registries.cell.CreativeCellHandler; import appeng.core.stats.AdvancementTriggers; import appeng.core.stats.AeStats; import appeng.core.stats.PartItemPredicate; +import appeng.entity.EntityFloatingItem; import appeng.fluids.client.gui.*; import appeng.fluids.container.*; import appeng.fluids.registries.BasicFluidCellGuiHandler; @@ -76,6 +77,7 @@ import appeng.worldgen.MeteoriteWorldGen; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScreenManager; +import net.minecraft.entity.EntityClassification; import net.minecraft.entity.EntityType; import net.minecraft.inventory.container.ContainerType; import net.minecraft.item.Item; @@ -527,9 +529,12 @@ final class Registration CraftingHelper.register( FeaturesEnabled.Serializer.INSTANCE ); } - public void registerEntities( RegistryEvent.Register> event ) { + // Special case only used on the client-side + EntityFloatingItem.TYPE = EntityType.Builder.create(EntityFloatingItem::new, EntityClassification.MISC) + .build("appliedenergistics2:floating_item"); + final IForgeRegistry> registry = event.getRegistry(); // TODO: Do not use the internal API final ApiDefinitions definitions = Api.INSTANCE.definitions(); diff --git a/src/main/java/appeng/core/api/definitions/ApiBlocks.java b/src/main/java/appeng/core/api/definitions/ApiBlocks.java index 50e7434da..e2bc7dd9b 100644 --- a/src/main/java/appeng/core/api/definitions/ApiBlocks.java +++ b/src/main/java/appeng/core/api/definitions/ApiBlocks.java @@ -318,20 +318,17 @@ public final class ApiBlocks implements IBlocks } ) .build() ) .build(); + + EntityTinyTNTPrimed.TYPE = registry.entity("tiny_tnt_primed", EntityTinyTNTPrimed::new, EntityClassification.MISC) + .customize(p -> p.setTrackingRange(16) + .setUpdateInterval(4) + .setShouldReceiveVelocityUpdates(true)) + .build(); + this.tinyTNT = registry.block( "tiny_tnt", BlockTinyTNT::new ) .features( AEFeature.TINY_TNT ) .bootstrap( ( block, item ) -> (IInitComponent) () -> DispenserBlock.registerDispenseBehavior( item, new DispenserBehaviorTinyTNT() ) ) - .bootstrap( ( block, item ) -> (IEntityRegistrationComponent) r -> - { - r.register(EntityType.Builder.create(EntityTinyTNTPrimed::new, EntityClassification.MISC) - .setTrackingRange(16) - .setUpdateInterval(4) - .setShouldReceiveVelocityUpdates(true) - .build(AppEng.MOD_ID + ":tiny_tnt_primed") - .setRegistryName(AppEng.MOD_ID + ":tiny_tnt_primed") - ); - } ) .build(); this.securityStation = registry.block( "security_station", BlockSecurityStation::new ) .features( AEFeature.SECURITY ) diff --git a/src/main/java/appeng/core/api/definitions/ApiItems.java b/src/main/java/appeng/core/api/definitions/ApiItems.java index 7c717da0f..4c6ee7377 100644 --- a/src/main/java/appeng/core/api/definitions/ApiItems.java +++ b/src/main/java/appeng/core/api/definitions/ApiItems.java @@ -282,10 +282,8 @@ public final class ApiItems implements IItems .features( AEFeature.CRYSTAL_SEEDS ) .build(); - registry.entity("growing_crystal", EntityGrowingCrystal::new, EntityClassification.MISC) - .customize(builder -> builder.setTrackingRange(16) - .setUpdateInterval(4) - .setShouldReceiveVelocityUpdates(true)) + EntityGrowingCrystal.TYPE = registry.entity("growing_crystal", EntityGrowingCrystal::new, EntityClassification.MISC) + .customize(builder -> builder.size(0.25F, 0.25F)) .build(); // rv1 diff --git a/src/main/java/appeng/core/api/definitions/ApiMaterials.java b/src/main/java/appeng/core/api/definitions/ApiMaterials.java index 6d9921c21..2b9fd5d2f 100644 --- a/src/main/java/appeng/core/api/definitions/ApiMaterials.java +++ b/src/main/java/appeng/core/api/definitions/ApiMaterials.java @@ -120,11 +120,11 @@ public final class ApiMaterials implements IMaterials { this.registry = registry; - registry.entity("singularity", EntitySingularity::new, EntityClassification.MISC) + EntitySingularity.TYPE = registry.entity("singularity", EntitySingularity::new, EntityClassification.MISC) .customize(builder -> builder.setTrackingRange(16).setUpdateInterval(4).setShouldReceiveVelocityUpdates(true)) .build(); - registry.entity("charged_quartz", EntityChargedQuartz::new, EntityClassification.MISC) + EntityChargedQuartz.TYPE = registry.entity("charged_quartz", EntityChargedQuartz::new, EntityClassification.MISC) .customize(builder -> builder.setTrackingRange(16).setUpdateInterval(4).setShouldReceiveVelocityUpdates(true)) .build(); diff --git a/src/main/java/appeng/entity/AEBaseEntityItem.java b/src/main/java/appeng/entity/AEBaseEntityItem.java index abd7fca88..47a1aadd0 100644 --- a/src/main/java/appeng/entity/AEBaseEntityItem.java +++ b/src/main/java/appeng/entity/AEBaseEntityItem.java @@ -25,25 +25,38 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; +import net.minecraft.network.IPacket; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.world.World; +import net.minecraftforge.fml.network.NetworkHooks; public abstract class AEBaseEntityItem extends ItemEntity { - public AEBaseEntityItem( EntityType entityType, final World world ) + protected AEBaseEntityItem( EntityType entityType, final World world ) { super( entityType, world ); } - public AEBaseEntityItem( final World world, final double x, final double y, final double z, final ItemStack stack ) + protected AEBaseEntityItem( EntityType entityType, final World world, final double x, final double y, final double z, final ItemStack stack ) { - super( world, x, y, z, stack ); + this(entityType, world); + this.setPosition(x, y, z); + this.rotationYaw = this.rand.nextFloat() * 360.0F; + this.setMotion(this.rand.nextDouble() * 0.2D - 0.1D, 0.2D, this.rand.nextDouble() * 0.2D - 0.1D); + this.setItem(stack); + this.lifespan = stack.getEntityLifespan(world); } protected List getCheckedEntitiesWithinAABBExcludingEntity( final AxisAlignedBB region ) { return this.world.getEntitiesWithinAABBExcludingEntity( this, region ); } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + } diff --git a/src/main/java/appeng/entity/EntityChargedQuartz.java b/src/main/java/appeng/entity/EntityChargedQuartz.java index 788633101..ec8c97f48 100644 --- a/src/main/java/appeng/entity/EntityChargedQuartz.java +++ b/src/main/java/appeng/entity/EntityChargedQuartz.java @@ -45,6 +45,8 @@ import appeng.util.Platform; public final class EntityChargedQuartz extends AEBaseEntityItem { + public static EntityType TYPE; + private int delay = 0; private int transformTime = 0; @@ -54,7 +56,7 @@ public final class EntityChargedQuartz extends AEBaseEntityItem public EntityChargedQuartz(final World w, final double x, final double y, final double z, final ItemStack is ) { - super( w, x, y, z, is ); + super( TYPE, w, x, y, z, is ); } @Override diff --git a/src/main/java/appeng/entity/EntityFloatingItem.java b/src/main/java/appeng/entity/EntityFloatingItem.java index da585a26d..d91a6fb08 100644 --- a/src/main/java/appeng/entity/EntityFloatingItem.java +++ b/src/main/java/appeng/entity/EntityFloatingItem.java @@ -19,28 +19,33 @@ package appeng.entity; +import net.minecraft.entity.EntityType; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.world.World; - -public final class EntityFloatingItem extends ItemEntity +// This is not supposed to ever spawn on the server-side +public final class EntityFloatingItem extends AEBaseEntityItem { - private final ICanDie parent; + public static EntityType TYPE; + + private ICanDie parent; private int superDeath = 0; private float progress = 0; - public EntityFloatingItem( final ICanDie parent, final World world, final double x, final double y, final double z, final ItemStack stack ) + public EntityFloatingItem(EntityType entityType, World world) { + super(entityType, world); + } + + public EntityFloatingItem(final ICanDie parent, final World world, final double x, final double y, final double z, final ItemStack stack ) { - super( world, x, y, z, stack ); + super( TYPE, world, x, y, z, stack ); this.setMotion( 0, 0, 0 ); this.rotationYaw = 0; this.parent = parent; } - // public boolean isEntityAlive() - @Override public void tick() { diff --git a/src/main/java/appeng/entity/EntityGrowingCrystal.java b/src/main/java/appeng/entity/EntityGrowingCrystal.java index 7b98b77ea..8933fe710 100644 --- a/src/main/java/appeng/entity/EntityGrowingCrystal.java +++ b/src/main/java/appeng/entity/EntityGrowingCrystal.java @@ -39,9 +39,11 @@ import appeng.api.features.AEFeature; import appeng.util.Platform; -public final class EntityGrowingCrystal extends ItemEntity +public final class EntityGrowingCrystal extends AEBaseEntityItem { + public static EntityType TYPE; + private int progress_1000 = 0; public EntityGrowingCrystal(EntityType type, World world) { @@ -50,7 +52,7 @@ public final class EntityGrowingCrystal extends ItemEntity public EntityGrowingCrystal(final World w, final double x, final double y, final double z, final ItemStack is ) { - super( w, x, y, z, is ); + super( TYPE, w, x, y, z, is ); this.setNoDespawn(); } @@ -143,7 +145,10 @@ public final class EntityGrowingCrystal extends ItemEntity if( this.progress_1000 > 1000 ) { this.progress_1000 -= 1000; - this.setItem( cry.triggerGrowth( is ) ); + // We need to copy the stack or the change detection will not work and not sync + // this new stack to the client + ItemStack newItem = cry.triggerGrowth(is.copy()); + this.setItem(newItem); } } } @@ -195,4 +200,11 @@ public final class EntityGrowingCrystal extends ItemEntity return te instanceof ICrystalGrowthAccelerator && ( (ICrystalGrowthAccelerator) te ).isPowered(); } + + // Don't let seeds "float" on water surface + @Override + protected void applyFloatMotion() { + } + + } diff --git a/src/main/java/appeng/entity/EntitySingularity.java b/src/main/java/appeng/entity/EntitySingularity.java index 2978afec8..fed2dfd98 100644 --- a/src/main/java/appeng/entity/EntitySingularity.java +++ b/src/main/java/appeng/entity/EntitySingularity.java @@ -42,6 +42,8 @@ import appeng.util.Platform; public final class EntitySingularity extends AEBaseEntityItem { + public static EntityType TYPE; + private static int randTickSeed = 0; public EntitySingularity(EntityType entityType, final World w ) @@ -51,7 +53,7 @@ public final class EntitySingularity extends AEBaseEntityItem public EntitySingularity( final World w, final double x, final double y, final double z, final ItemStack is ) { - super( w, x, y, z, is ); + super( TYPE, w, x, y, z, is ); } @Override diff --git a/src/main/java/appeng/entity/EntityTinyTNTPrimed.java b/src/main/java/appeng/entity/EntityTinyTNTPrimed.java index f382c500c..9e47d7499 100644 --- a/src/main/java/appeng/entity/EntityTinyTNTPrimed.java +++ b/src/main/java/appeng/entity/EntityTinyTNTPrimed.java @@ -54,6 +54,8 @@ import appeng.util.Platform; public final class EntityTinyTNTPrimed extends TNTEntity implements IEntityAdditionalSpawnData { + public static EntityType TYPE; + public EntityTinyTNTPrimed( EntityType type, World worldIn ) { super( type, worldIn ); diff --git a/src/main/java/appeng/integration/modules/waila/WailaModule.java b/src/main/java/appeng/integration/modules/waila/WailaModule.java index f0d3ccbac..b14466798 100644 --- a/src/main/java/appeng/integration/modules/waila/WailaModule.java +++ b/src/main/java/appeng/integration/modules/waila/WailaModule.java @@ -19,8 +19,15 @@ package appeng.integration.modules.waila; +import appeng.entity.EntityGrowingCrystal; +import appeng.items.misc.ItemCrystalSeed; import mcp.mobius.waila.api.*; import appeng.tile.AEBaseTile; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.ITextComponent; + +import java.util.List; @WailaPlugin public class WailaModule implements IWailaPlugin diff --git a/src/main/java/appeng/items/misc/ItemCrystalSeed.java b/src/main/java/appeng/items/misc/ItemCrystalSeed.java index af58f2847..378747051 100644 --- a/src/main/java/appeng/items/misc/ItemCrystalSeed.java +++ b/src/main/java/appeng/items/misc/ItemCrystalSeed.java @@ -20,7 +20,6 @@ package appeng.items.misc; import appeng.api.implementations.items.IGrowableCrystal; -import appeng.core.AppEng; import appeng.core.localization.ButtonToolTips; import appeng.entity.EntityGrowingCrystal; import appeng.items.AEBaseItem; @@ -111,12 +110,16 @@ public class ItemCrystalSeed extends AEBaseItem implements IGrowableCrystal public void addInformation(final ItemStack stack, final World world, final List lines, final ITooltipFlag advancedTooltips ) { lines.add( ButtonToolTips.DoesntDespawn.getTranslationKey() ); - final int progress = getGrowthTicks( stack ); - lines.add( new StringTextComponent( Math.round( 100 * progress / (float) GROWTH_TICKS_REQUIRED ) + "%" ) ); + lines.add(getGrowthTooltipItem(stack)); super.addInformation( stack, world, lines, advancedTooltips ); } + public ITextComponent getGrowthTooltipItem(ItemStack stack) { + final int progress = getGrowthTicks( stack ); + return new StringTextComponent( Math.round( 100 * progress / (float) GROWTH_TICKS_REQUIRED ) + "%" ); + } + @Override public int getEntityLifespan( final ItemStack itemStack, final World world ) { diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 0f2bc595c..4fe271e0e 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -13,3 +13,6 @@ public-f net.minecraft.inventory.container.Slot field_75221_f # yPos # For JEI registration public net.minecraft.item.crafting.RecipeManager func_215366_a(Lnet/minecraft/item/crafting/IRecipeType;)Ljava/util/Map; # getRecipes + +# To disable water-bobbing of item entities (for growing crystals) +protected net.minecraft.entity.item.ItemEntity func_203043_v()V # applyFloatMotion diff --git a/src/main/resources/assets/appliedenergistics2/models/block/crafting/16k_storage_formed.json b/src/main/resources/assets/appliedenergistics2/models/block/crafting/16k_storage_formed.json index 2b75a882b..107c51c1a 100644 --- a/src/main/resources/assets/appliedenergistics2/models/block/crafting/16k_storage_formed.json +++ b/src/main/resources/assets/appliedenergistics2/models/block/crafting/16k_storage_formed.json @@ -1,4 +1,4 @@ { "loader": "appliedenergistics2:crafting_cube", - "type": "16k_storage" + "type": "storage_16k" } diff --git a/src/main/resources/assets/appliedenergistics2/models/block/crafting/1k_storage_formed.json b/src/main/resources/assets/appliedenergistics2/models/block/crafting/1k_storage_formed.json index 5c5b859e8..435dc6270 100644 --- a/src/main/resources/assets/appliedenergistics2/models/block/crafting/1k_storage_formed.json +++ b/src/main/resources/assets/appliedenergistics2/models/block/crafting/1k_storage_formed.json @@ -1,4 +1,4 @@ { "loader": "appliedenergistics2:crafting_cube", - "type": "1k_storage" + "type": "storage_1k" } diff --git a/src/main/resources/assets/appliedenergistics2/models/block/crafting/4k_storage_formed.json b/src/main/resources/assets/appliedenergistics2/models/block/crafting/4k_storage_formed.json index e868b43a7..8dffca4e6 100644 --- a/src/main/resources/assets/appliedenergistics2/models/block/crafting/4k_storage_formed.json +++ b/src/main/resources/assets/appliedenergistics2/models/block/crafting/4k_storage_formed.json @@ -1,4 +1,4 @@ { "loader": "appliedenergistics2:crafting_cube", - "type": "4k_storage" + "type": "storage_4k" } diff --git a/src/main/resources/assets/appliedenergistics2/models/block/crafting/64k_storage_formed.json b/src/main/resources/assets/appliedenergistics2/models/block/crafting/64k_storage_formed.json index c79eb5cde..c15110143 100644 --- a/src/main/resources/assets/appliedenergistics2/models/block/crafting/64k_storage_formed.json +++ b/src/main/resources/assets/appliedenergistics2/models/block/crafting/64k_storage_formed.json @@ -1,4 +1,4 @@ { "loader": "appliedenergistics2:crafting_cube", - "type": "64k_storage" + "type": "storage_64k" }