From c593b8ffdf5446bd049161ff4fe399f723d6de47 Mon Sep 17 00:00:00 2001 From: Atsuihsio <842960157@qq.com> Date: Wed, 31 Jul 2024 04:14:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=90=E5=BC=B9=E6=94=B9=E7=94=A8geo?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/ProjectileEntityRenderer.java | 51 +++++++++++++ .../renderer/entity/ProjectileRenderer.java | 49 ------------- .../entity/ProjectileEntity.java | 41 ++++++++++- .../entity/RgoGrenadeEntity.java | 2 +- .../entity/layer/ProjectileEntityLayer.java | 27 +++++++ .../entity/model/ProjectileEntityModel.java | 33 +++++++++ .../init/ModEntityRenderers.java | 2 +- .../geo/projectile_entity.geo.json | 67 ++++++++++++++++++ .../textures/entity/projectile_entity.png | Bin 0 -> 7589 bytes 9 files changed, 219 insertions(+), 53 deletions(-) create mode 100644 src/main/java/net/mcreator/superbwarfare/client/renderer/entity/ProjectileEntityRenderer.java delete mode 100644 src/main/java/net/mcreator/superbwarfare/client/renderer/entity/ProjectileRenderer.java create mode 100644 src/main/java/net/mcreator/superbwarfare/entity/layer/ProjectileEntityLayer.java create mode 100644 src/main/java/net/mcreator/superbwarfare/entity/model/ProjectileEntityModel.java create mode 100644 src/main/resources/assets/superbwarfare/geo/projectile_entity.geo.json create mode 100644 src/main/resources/assets/superbwarfare/textures/entity/projectile_entity.png diff --git a/src/main/java/net/mcreator/superbwarfare/client/renderer/entity/ProjectileEntityRenderer.java b/src/main/java/net/mcreator/superbwarfare/client/renderer/entity/ProjectileEntityRenderer.java new file mode 100644 index 000000000..11d194d12 --- /dev/null +++ b/src/main/java/net/mcreator/superbwarfare/client/renderer/entity/ProjectileEntityRenderer.java @@ -0,0 +1,51 @@ +package net.mcreator.superbwarfare.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.mcreator.superbwarfare.entity.ProjectileEntity; +import net.mcreator.superbwarfare.entity.layer.ProjectileEntityLayer; +import net.mcreator.superbwarfare.entity.model.ProjectileEntityModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoEntityRenderer; + +public class ProjectileEntityRenderer extends GeoEntityRenderer { + public ProjectileEntityRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new ProjectileEntityModel()); + this.shadowRadius = 0f; + this.addRenderLayer(new ProjectileEntityLayer(this)); + } + + @Override + public RenderType getRenderType(ProjectileEntity animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + @Override + public void preRender(PoseStack poseStack, ProjectileEntity entity, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, + float blue, float alpha) { + float scale = 1f; + this.scaleHeight = scale; + this.scaleWidth = scale; + super.preRender(poseStack, entity, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + } + + @Override + public void render(ProjectileEntity entityIn, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) { + poseStack.pushPose(); + poseStack.mulPose(Axis.YP.rotationDegrees(Mth.lerp(partialTicks, entityIn.yRotO, entityIn.getYRot()) - 90)); + poseStack.mulPose(Axis.ZP.rotationDegrees(90 + Mth.lerp(partialTicks, entityIn.xRotO, entityIn.getXRot()))); + super.render(entityIn, entityYaw, partialTicks, poseStack, bufferIn, packedLightIn); + poseStack.popPose(); + } + + @Override + protected float getDeathMaxRotation(ProjectileEntity entityLivingBaseIn) { + return 0.0F; + } +} diff --git a/src/main/java/net/mcreator/superbwarfare/client/renderer/entity/ProjectileRenderer.java b/src/main/java/net/mcreator/superbwarfare/client/renderer/entity/ProjectileRenderer.java deleted file mode 100644 index b43c8671f..000000000 --- a/src/main/java/net/mcreator/superbwarfare/client/renderer/entity/ProjectileRenderer.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.mcreator.superbwarfare.client.renderer.entity; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Axis; -import net.mcreator.superbwarfare.client.model.entity.ModelBullet; -import net.mcreator.superbwarfare.entity.ProjectileEntity; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.core.BlockPos; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; - -public class ProjectileRenderer extends EntityRenderer { - private static final ResourceLocation texture = new ResourceLocation("superbwarfare:textures/entity/bullet_tex.png"); - private static final ResourceLocation empty_texture = new ResourceLocation("superbwarfare:textures/entity/empty.png"); - private final ModelBullet model; - - public ProjectileRenderer(EntityRendererProvider.Context context) { - super(context); - model = new ModelBullet<>(context.bakeLayer(ModelBullet.LAYER_LOCATION)); - } - - protected int getBlockLightLevel(ProjectileEntity pEntity, BlockPos pPos) { - return 15; - } - - @Override - public void render(ProjectileEntity entityIn, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) { - VertexConsumer vb = bufferIn.getBuffer(RenderType.eyes(this.getTextureLocation(entityIn))); - poseStack.pushPose(); - poseStack.mulPose(Axis.YP.rotationDegrees(Mth.lerp(partialTicks, entityIn.yRotO, entityIn.getYRot()) - 90)); - poseStack.mulPose(Axis.ZP.rotationDegrees(90 + Mth.lerp(partialTicks, entityIn.xRotO, entityIn.getXRot()))); - model.renderToBuffer(poseStack, vb, packedLightIn, OverlayTexture.NO_OVERLAY, 1, 1, 1, 0.0625f); - poseStack.popPose(); - super.render(entityIn, entityYaw, partialTicks, poseStack, bufferIn, packedLightIn); - } - - @Override - public ResourceLocation getTextureLocation(ProjectileEntity entity) { - if (entity.tickCount > 1){ - return texture; - } - return empty_texture; - } -} diff --git a/src/main/java/net/mcreator/superbwarfare/entity/ProjectileEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/ProjectileEntity.java index 64bd3976c..4c1d49cbc 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/ProjectileEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/ProjectileEntity.java @@ -2,7 +2,10 @@ package net.mcreator.superbwarfare.entity; import net.mcreator.superbwarfare.ModUtils; import net.mcreator.superbwarfare.block.BarbedWireBlock; -import net.mcreator.superbwarfare.init.*; +import net.mcreator.superbwarfare.init.ModDamageTypes; +import net.mcreator.superbwarfare.init.ModEntities; +import net.mcreator.superbwarfare.init.ModParticleTypes; +import net.mcreator.superbwarfare.init.ModSounds; import net.mcreator.superbwarfare.network.message.ClientIndicatorMessage; import net.mcreator.superbwarfare.network.message.PlayerGunKillMessage; import net.mcreator.superbwarfare.tools.ExtendedEntityRayTraceResult; @@ -16,6 +19,9 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundSoundPacket; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; @@ -39,6 +45,10 @@ import net.minecraftforge.entity.IEntityAdditionalSpawnData; import net.minecraftforge.entity.PartEntity; import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.network.PlayMessages; +import software.bernie.geckolib.animatable.GeoEntity; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; import java.util.ArrayList; @@ -47,7 +57,12 @@ import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Predicate; -public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnData { +public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnData, GeoEntity, AnimatedEntity { + + public static final EntityDataAccessor ANIMATION = SynchedEntityData.defineId(ProjectileEntity.class, EntityDataSerializers.STRING); + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public String animationProcedure = "empty"; private static final Predicate PROJECTILE_TARGETS = input -> input != null && input.isPickable() && !input.isSpectator() && input.isAlive(); private static final Predicate IGNORE_LEAVES = input -> input != null && (input.getBlock() instanceof LeavesBlock @@ -587,4 +602,26 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa return this.legshot; } } + + public String getSyncedAnimation() { + return this.entityData.get(ANIMATION); + } + + public void setAnimation(String animation) { + this.entityData.set(ANIMATION, animation); + } + + @Override + public void setAnimationProcedure(String procedure) { + this.animationProcedure = procedure; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } } diff --git a/src/main/java/net/mcreator/superbwarfare/entity/RgoGrenadeEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/RgoGrenadeEntity.java index ed7a2aa36..13619b807 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/RgoGrenadeEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/RgoGrenadeEntity.java @@ -40,7 +40,7 @@ import software.bernie.geckolib.core.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; public class RgoGrenadeEntity extends ThrowableItemProjectile implements GeoEntity, AnimatedEntity{ - public static final EntityDataAccessor ANIMATION = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.STRING); + public static final EntityDataAccessor ANIMATION = SynchedEntityData.defineId(RgoGrenadeEntity.class, EntityDataSerializers.STRING); private int fuse = 80; private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); diff --git a/src/main/java/net/mcreator/superbwarfare/entity/layer/ProjectileEntityLayer.java b/src/main/java/net/mcreator/superbwarfare/entity/layer/ProjectileEntityLayer.java new file mode 100644 index 000000000..26aa1fa71 --- /dev/null +++ b/src/main/java/net/mcreator/superbwarfare/entity/layer/ProjectileEntityLayer.java @@ -0,0 +1,27 @@ +package net.mcreator.superbwarfare.entity.layer; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.mcreator.superbwarfare.ModUtils; +import net.mcreator.superbwarfare.entity.ProjectileEntity; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class ProjectileEntityLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = new ResourceLocation(ModUtils.MODID, "textures/entity/projectile_entity.png"); + + public ProjectileEntityLayer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, ProjectileEntity animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 1, 1, 1, 1); + } +} diff --git a/src/main/java/net/mcreator/superbwarfare/entity/model/ProjectileEntityModel.java b/src/main/java/net/mcreator/superbwarfare/entity/model/ProjectileEntityModel.java new file mode 100644 index 000000000..687a7c15d --- /dev/null +++ b/src/main/java/net/mcreator/superbwarfare/entity/model/ProjectileEntityModel.java @@ -0,0 +1,33 @@ +package net.mcreator.superbwarfare.entity.model; + +import net.mcreator.superbwarfare.ModUtils; +import net.mcreator.superbwarfare.entity.ProjectileEntity; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.core.animatable.model.CoreGeoBone; +import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.model.GeoModel; + +public class ProjectileEntityModel extends GeoModel { + @Override + public ResourceLocation getAnimationResource(ProjectileEntity entity) { + return null; + } + + @Override + public ResourceLocation getModelResource(ProjectileEntity entity) { + return new ResourceLocation(ModUtils.MODID, "geo/projectile_entity.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(ProjectileEntity entity) { + return new ResourceLocation(ModUtils.MODID, "textures/entity/empty.png"); + } + + @Override + public void setCustomAnimations(ProjectileEntity animatable, long instanceId, AnimationState animationState) { + CoreGeoBone bone = getAnimationProcessor().getBone("bone"); + + bone.setHidden(animatable.tickCount <= 1); + + } +} diff --git a/src/main/java/net/mcreator/superbwarfare/init/ModEntityRenderers.java b/src/main/java/net/mcreator/superbwarfare/init/ModEntityRenderers.java index eefb9aa05..fe09f8ff0 100644 --- a/src/main/java/net/mcreator/superbwarfare/init/ModEntityRenderers.java +++ b/src/main/java/net/mcreator/superbwarfare/init/ModEntityRenderers.java @@ -21,7 +21,7 @@ public class ModEntityRenderers { event.registerEntityRenderer(ModEntities.MORTAR_SHELL.get(), MortarShellRenderer::new); event.registerEntityRenderer(ModEntities.CANNON_SHELL.get(), CannonShellRenderer::new); event.registerEntityRenderer(ModEntities.BOCEK_ARROW.get(), BocekArrowRenderer::new); - event.registerEntityRenderer(ModEntities.PROJECTILE.get(), ProjectileRenderer::new); + event.registerEntityRenderer(ModEntities.PROJECTILE.get(), ProjectileEntityRenderer::new); event.registerEntityRenderer(ModEntities.FRAG.get(), FragRenderer::new); event.registerEntityRenderer(ModEntities.MK_42.get(), Mk42Renderer::new); event.registerEntityRenderer(ModEntities.DRONE.get(), DroneRenderer::new); diff --git a/src/main/resources/assets/superbwarfare/geo/projectile_entity.geo.json b/src/main/resources/assets/superbwarfare/geo/projectile_entity.geo.json new file mode 100644 index 000000000..ac4e4df10 --- /dev/null +++ b/src/main/resources/assets/superbwarfare/geo/projectile_entity.geo.json @@ -0,0 +1,67 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 32, + "texture_height": 32, + "visible_bounds_width": 4, + "visible_bounds_height": 6, + "visible_bounds_offset": [0, -1, 0] + }, + "bones": [ + { + "name": "bone", + "pivot": [0, 0, 0] + }, + { + "name": "bone2", + "parent": "bone", + "pivot": [-0.16703, -30.85427, 0], + "rotation": [-90, 0, -3.75], + "cubes": [ + { + "origin": [-1.34303, -32.03027, 10.5525], + "size": [2.352, 2.352, 0], + "uv": { + "north": {"uv": [8, 0], "uv_size": [24, 24]}, + "south": {"uv": [8, 0], "uv_size": [24, 24]} + } + }, + { + "origin": [-0.16703, -62.33427, -4.3575], + "size": [0, 49.96, 1.68], + "pivot": [-0.16703, -30.85427, -3.5175], + "rotation": [-90, 0, 30], + "uv": { + "east": {"uv": [0, 0], "uv_size": [8, 32]}, + "west": {"uv": [0, 0], "uv_size": [8, 32]} + } + }, + { + "origin": [-0.16703, -62.33427, -4.3575], + "size": [0, 49.96, 1.68], + "pivot": [-0.16703, -30.85427, -3.5175], + "rotation": [-90, 0, -30], + "uv": { + "east": {"uv": [0, 0], "uv_size": [8, 32]}, + "west": {"uv": [0, 0], "uv_size": [8, 32]} + } + }, + { + "origin": [-0.16703, -62.33427, -4.3575], + "size": [0, 49.96, 1.68], + "pivot": [-0.16703, -30.85427, -3.5175], + "rotation": [-90, 0, -90], + "uv": { + "east": {"uv": [0, 0], "uv_size": [8, 32]}, + "west": {"uv": [0, 0], "uv_size": [8, 32]} + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/superbwarfare/textures/entity/projectile_entity.png b/src/main/resources/assets/superbwarfare/textures/entity/projectile_entity.png new file mode 100644 index 0000000000000000000000000000000000000000..7493cc3661d974e451c192736775b1384f05b0e0 GIT binary patch literal 7589 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