From 10d91c16b782b4c845b340b59000dcf0e3b73153 Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Mon, 20 May 2024 14:02:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=82=AE=E5=BC=B9=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mcreator/target/entity/MortarEntity.java | 7 +-- .../target/entity/MortarShellEntity.java | 54 +++++++------------ .../target/init/TargetModEntities.java | 2 +- 3 files changed, 21 insertions(+), 42 deletions(-) diff --git a/src/main/java/net/mcreator/target/entity/MortarEntity.java b/src/main/java/net/mcreator/target/entity/MortarEntity.java index fb0e8519f..079b308fd 100644 --- a/src/main/java/net/mcreator/target/entity/MortarEntity.java +++ b/src/main/java/net/mcreator/target/entity/MortarEntity.java @@ -34,7 +34,6 @@ import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.ThrownPotion; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; @@ -202,11 +201,7 @@ public class MortarEntity extends PathfinderMob implements GeoEntity, AnimatedEn TargetMod.queueServerWork(20, () -> { Level level = this.level(); if (level instanceof ServerLevel server) { - AbstractArrow entityToSpawn = new MortarShellEntity(TargetModEntities.MORTAR_SHELL.get(), level); - entityToSpawn.setOwner(player); - entityToSpawn.setBaseDamage(100); - entityToSpawn.setKnockback(0); - entityToSpawn.setSilent(true); + MortarShellEntity entityToSpawn = new MortarShellEntity(TargetModEntities.MORTAR_SHELL.get(), player, level); entityToSpawn.setPos(this.getX(), this.getEyeY(), this.getZ()); entityToSpawn.shoot(this.getLookAngle().x, this.getLookAngle().y, this.getLookAngle().z, 8, (float) 0.5); level.addFreshEntity(entityToSpawn); diff --git a/src/main/java/net/mcreator/target/entity/MortarShellEntity.java b/src/main/java/net/mcreator/target/entity/MortarShellEntity.java index e13b82c8f..e59c73d27 100644 --- a/src/main/java/net/mcreator/target/entity/MortarShellEntity.java +++ b/src/main/java/net/mcreator/target/entity/MortarShellEntity.java @@ -1,6 +1,6 @@ package net.mcreator.target.entity; -import net.mcreator.target.init.TargetModEntities; +import net.mcreator.target.init.TargetModItems; import net.mcreator.target.tools.ParticleTool; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.protocol.Packet; @@ -9,26 +9,15 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.projectile.AbstractArrow; -import net.minecraft.world.entity.projectile.ItemSupplier; -import net.minecraft.world.item.ItemStack; +import net.minecraft.world.entity.projectile.ThrowableItemProjectile; +import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.network.NetworkHooks; -import net.minecraftforge.network.PlayMessages; -// TODO 父类改为Projectile -@OnlyIn(value = Dist.CLIENT, _interface = ItemSupplier.class) -public class MortarShellEntity extends AbstractArrow implements ItemSupplier { - public static final ItemStack PROJECTILE_ITEM = new ItemStack(Blocks.AIR); - - public MortarShellEntity(PlayMessages.SpawnEntity packet, Level world) { - super(TargetModEntities.MORTAR_SHELL.get(), world); - } +public class MortarShellEntity extends ThrowableItemProjectile { + private float damage = 100f; public MortarShellEntity(EntityType type, Level world) { super(type, world); @@ -42,33 +31,28 @@ public class MortarShellEntity extends AbstractArrow implements ItemSupplier { super(type, entity, world); } + public MortarShellEntity(EntityType type, LivingEntity entity, Level world, float damage) { + super(type, entity, world); + this.damage = damage; + } + @Override public Packet getAddEntityPacket() { return NetworkHooks.getEntitySpawningPacket(this); } @Override - @OnlyIn(Dist.CLIENT) - public ItemStack getItem() { - return PROJECTILE_ITEM; + protected Item getDefaultItem() { + return TargetModItems.MORTAR_SHELLS.get(); } - @Override - protected ItemStack getPickupItem() { - return PROJECTILE_ITEM; - } - - @Override - protected void doPostHurtEffects(LivingEntity entity) { - super.doPostHurtEffects(entity); - entity.setArrowCount(entity.getArrowCount() - 1); - } @Override public void onHitEntity(EntityHitResult entityHitResult) { - super.onHitEntity(entityHitResult); Entity entity = entityHitResult.getEntity(); + entity.hurt(this.level().damageSources().thrown(this, this.getOwner()), this.damage); + if (this.level() instanceof ServerLevel level) { level.explode(this, (this.getX()), (this.getY()), (this.getZ()), 10, Level.ExplosionInteraction.NONE); if (!entity.level().isClientSide() && entity.getServer() != null) { @@ -81,9 +65,11 @@ public class MortarShellEntity extends AbstractArrow implements ItemSupplier { @Override public void onHitBlock(BlockHitResult blockHitResult) { super.onHitBlock(blockHitResult); - if (this.level() instanceof ServerLevel level) { + if (!this.level().isClientSide() && this.level() instanceof ServerLevel level) { level.explode(this, this.getX(), this.getY(), this.getZ(), 10, Level.ExplosionInteraction.NONE); + ParticleTool.spawnMediumExplosionParticles(this.level(), this.position()); } + this.discard(); } @Override @@ -93,10 +79,8 @@ public class MortarShellEntity extends AbstractArrow implements ItemSupplier { ParticleTool.sendParticle(serverLevel, ParticleTypes.CAMPFIRE_COSY_SMOKE, this.getX(), this.getY(), this.getZ(), 2, 0, 0, 0, 0.02, true); } - if (this.inGround) { - if (!this.level().isClientSide() && this.getServer() != null) { - ParticleTool.spawnMediumExplosionParticles(this.level(), this.position()); - } + if (this.tickCount >= 600) { + this.level().explode(this, this.getX(), this.getY(), this.getZ(), 10, Level.ExplosionInteraction.NONE); this.discard(); } } diff --git a/src/main/java/net/mcreator/target/init/TargetModEntities.java b/src/main/java/net/mcreator/target/init/TargetModEntities.java index 4e2aac2b7..15fc9388c 100644 --- a/src/main/java/net/mcreator/target/init/TargetModEntities.java +++ b/src/main/java/net/mcreator/target/init/TargetModEntities.java @@ -36,7 +36,7 @@ public class TargetModEntities { public static final RegistryObject> RPG_ROCKET = register("projectile_rpg_rocket", EntityType.Builder.of(RpgRocketEntity::new, MobCategory.MISC).setCustomClientFactory(RpgRocketEntity::new).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); public static final RegistryObject> MORTAR_SHELL = register("projectile_mortar_shell", - EntityType.Builder.of(MortarShellEntity::new, MobCategory.MISC).setCustomClientFactory(MortarShellEntity::new).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); + EntityType.Builder.of(MortarShellEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); public static final RegistryObject> BOCEK_ARROW = register("projectile_bocekarrow", EntityType.Builder.of(BocekArrowEntity::new, MobCategory.MISC).setCustomClientFactory(BocekArrowEntity::new).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(1).sized(0.5f, 0.5f)); public static final RegistryObject> PROJECTILE = register("projectile",