diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/MobileVehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/MobileVehicleEntity.java index 076cc73e9..4284e752e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/MobileVehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/MobileVehicleEntity.java @@ -1,10 +1,16 @@ package com.atsuishio.superbwarfare.entity; +import com.atsuishio.superbwarfare.entity.projectile.ProjectileEntity; +import com.atsuishio.superbwarfare.init.ModDamageTypes; +import com.atsuishio.superbwarfare.init.ModSounds; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.level.Level; +import net.minecraft.world.level.entity.EntityTypeTest; import net.minecraft.world.phys.Vec3; import org.joml.Math; @@ -32,6 +38,16 @@ public class MobileVehicleEntity extends Entity { super(pEntityType, pLevel); } + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + public boolean isPushable() { + return false; + } + @Override public boolean isPickable() { return !this.isRemoved(); @@ -53,6 +69,8 @@ public class MobileVehicleEntity extends Entity { handleClientSync(); + crushEntities(this.getDeltaMovement()); + this.refreshDimensions(); } @@ -76,6 +94,34 @@ public class MobileVehicleEntity extends Entity { --interpolationSteps; } + + /** + * 撞击实体并造成伤害 + * @param velocity 动量 + */ + public void crushEntities(Vec3 velocity) { + var frontBox = getBoundingBox().move(velocity.scale(0.5)); + var velAdd = velocity.add(0, 0, 0).scale(1.5); + for (var entity : level().getEntities(EntityTypeTest.forClass(Entity.class), frontBox, entity -> entity != this && entity != getFirstPassenger() && entity.getVehicle() == null)) { + + double entitySize = entity.getBbWidth() * entity.getBbHeight(); + double thisSize = this.getBbWidth() * this.getBbHeight(); + double f = Math.min(entitySize / thisSize, 2); + double f1 = Math.min(thisSize / entitySize, 4); + if (!(entity instanceof TargetEntity)) { + this.push(-f * velAdd.x, -f * velAdd.y, -f * velAdd.z); + } + + if (velocity.length() > 0.25 && entity.isAlive() && !(entity instanceof ItemEntity || entity instanceof Projectile || entity instanceof ProjectileEntity)) { + if (!this.level().isClientSide) { + this.level().playSound(null, this, ModSounds.VEHICLE_STRIKE.get(), this.getSoundSource(), 1, 1); + } + entity.push(f1 * velAdd.x, f1 * velAdd.y, f1 * velAdd.z); + entity.hurt(ModDamageTypes.causeVehicleStrikeDamage(this.level().registryAccess(), this, this.getFirstPassenger() == null ? this : this.getFirstPassenger()), (float) (20 * velocity.length())); + } + } + } + @Override public void lerpTo(double x, double y, double z, float yaw, float pitch, int interpolationSteps, boolean interpolate) { this.x = x; diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java index dd499241f..c454e5e9b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/SpeedboatEntity.java @@ -19,6 +19,7 @@ import com.atsuishio.superbwarfare.tools.SoundTool; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; @@ -44,7 +45,6 @@ import net.minecraft.world.entity.*; 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.Projectile; import net.minecraft.world.entity.projectile.ThrownPotion; import net.minecraft.world.entity.vehicle.ContainerEntity; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -55,7 +55,6 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.HopperBlockEntity; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.entity.EntityTypeTest; import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; @@ -83,6 +82,8 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import static com.atsuishio.superbwarfare.tools.ParticleTool.sendParticle; + public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, IChargeEntity, IVehicleEntity, HasCustomInventoryScreen, ContainerEntity { public static final EntityDataAccessor FIRE_ANIM = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.INT); @@ -154,29 +155,6 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I ContainerHelper.loadAllItems(compound, this.getItemStacks()); } - @Override - public boolean canCollideWith(Entity pEntity) { - if (this.getDeltaMovement().length() > 0.2) { - return false; - } else { - return canVehicleCollide(this, pEntity); - } - } - - public static boolean canVehicleCollide(Entity pVehicle, Entity pEntity) { - return (pEntity.canBeCollidedWith() || pEntity.isPushable()) && !pVehicle.isPassengerOfSameVehicle(pEntity); - } - - @Override - public boolean canBeCollidedWith() { - return super.canBeCollidedWith(); - } - - @Override - public boolean isPushable() { - return true; - } - @Override public Packet getAddEntityPacket() { return NetworkHooks.getEntitySpawningPacket(this); @@ -198,7 +176,7 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I @Override public boolean hurt(DamageSource source, float amount) { if (this.level() instanceof ServerLevel serverLevel) { - ParticleTool.sendParticle(serverLevel, ModParticleTypes.FIRE_STAR.get(), this.getX(), this.getY() + 2.5, this.getZ(), 4, 0.2, 0.2, 0.2, 0.2, false); + sendParticle(serverLevel, ModParticleTypes.FIRE_STAR.get(), this.getX(), this.getY() + 2.5, this.getZ(), 4, 0.2, 0.2, 0.2, 0.2, false); } if (source.getDirectEntity() instanceof ThrownPotion || source.getDirectEntity() instanceof AreaEffectCloud) @@ -335,8 +313,11 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I destroy(); } - if (this.isVehicle() && this.getDeltaMovement().length() > 0.05) { - crushEntities(this.getDeltaMovement()); + if (this.level() instanceof ServerLevel serverLevel) { + sendParticle(serverLevel, ParticleTypes.CLOUD, this.getX() + 2 * getLookAngle().x, this.getY() + getSubmergedHeight(this), this.getZ() + 2 * getLookAngle().z, 4, 0.5, 0, 0.5, 0.1, true); +// sendParticle(serverLevel, ParticleTypes.CLOUD, x, y + 3, z, 30, 2, 1, 2, 0.01, true); +// sendParticle(serverLevel, ParticleTypes.FALLING_WATER, x, y + 3, z, 50, 1.5, 4, 1.5, 1, true); +// sendParticle(serverLevel, ParticleTypes.BUBBLE_COLUMN_UP, x, y, z, 60, 3, 0.5, 3, 0.1, true); } controlBoat(); @@ -437,33 +418,6 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I this.getItemStacks().stream().filter(stack -> stack.is(ModItems.HEAVY_AMMO.get())).findFirst().ifPresent(stack -> stack.shrink(1)); } - /** - * 撞击实体并造成伤害 - * @param velocity 动量 - */ - public void crushEntities(Vec3 velocity) { - var frontBox = getBoundingBox().move(velocity.scale(0.5)); - var velAdd = velocity.add(0, 0, 0).scale(1.5); - for (var entity : level().getEntities(EntityTypeTest.forClass(Entity.class), frontBox, entity -> entity != this && entity != getFirstPassenger() && entity.getVehicle() == null)) { - - double entitySize = entity.getBbWidth() * entity.getBbHeight(); - double thisSize = this.getBbWidth() * this.getBbHeight(); - double f = Math.min(entitySize / thisSize, 2); - double f1 = Math.min(thisSize / entitySize, 4); - - if (!(entity instanceof TargetEntity)) { - this.push(-f * velAdd.x, -f * velAdd.y, -f * velAdd.z); - } - - if (velocity.length() > 0.2 && entity.isAlive() && !(entity instanceof ItemEntity || entity instanceof Projectile || entity instanceof ProjectileEntity)) { - if (!this.level().isClientSide) { - this.level().playSound(null, this, ModSounds.VEHICLE_STRIKE.get(), this.getSoundSource(), 1, 1); - } - entity.push(f1 * velAdd.x, f1 * velAdd.y, f1 * velAdd.z); - entity.hurt(ModDamageTypes.causeVehicleStrikeDamage(this.level().registryAccess(), this, this.getFirstPassenger() == null ? this : this.getFirstPassenger()), (float) (25 * velocity.length())); - } - } - } /** * 撞掉莲叶和冰块 diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/WheelChairEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/WheelChairEntity.java index 839785d15..a29e80e78 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/WheelChairEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/WheelChairEntity.java @@ -1,7 +1,9 @@ package com.atsuishio.superbwarfare.entity; import com.atsuishio.superbwarfare.init.ModEntities; +import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.item.ContainerBlockItem; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; @@ -20,6 +22,8 @@ import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.entity.*; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.ThrownPotion; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraftforge.network.NetworkHooks; import net.minecraftforge.network.PlayMessages; @@ -75,16 +79,6 @@ public class WheelChairEntity extends MobileVehicleEntity implements GeoEntity, this.entityData.set(ENERGY, compound.getFloat("Energy")); } - @Override - public boolean canBeCollidedWith() { - return true; - } - - @Override - public boolean canCollideWith(Entity pEntity) { - return (pEntity.canBeCollidedWith() || pEntity.isPushable()) && !this.isPassengerOfSameVehicle(pEntity); - } - @Override protected float getEyeHeight(Pose pPose, EntityDimensions pSize) { return 0.75F; @@ -128,11 +122,30 @@ public class WheelChairEntity extends MobileVehicleEntity implements GeoEntity, @Override public InteractionResult interact(Player player, InteractionHand hand) { - if (this.getFirstPassenger() == null) { + if (player.getVehicle() == this) return InteractionResult.PASS; + if (player.isShiftKeyDown() && player.getMainHandItem().is(ModItems.CROWBAR.get())) { + ItemStack stack = ContainerBlockItem.createInstance(this); + if (!player.addItem(stack)) { + player.drop(stack, false); + } + this.remove(RemovalReason.DISCARDED); + this.discard(); + } else { + if (player.getMainHandItem().is(Items.IRON_INGOT)) { + if (this.entityData.get(HEALTH) < MAX_HEALTH) { + this.entityData.set(HEALTH, Math.min(this.entityData.get(HEALTH) + 0.5f * MAX_HEALTH, MAX_HEALTH)); + player.getMainHandItem().shrink(1); + if (!this.level().isClientSide) { + this.level().playSound(null, this, SoundEvents.IRON_GOLEM_REPAIR, this.getSoundSource(), 1, 1); + } + } else { + player.startRiding(this); + } + return InteractionResult.sidedSuccess(this.level().isClientSide()); + } player.startRiding(this); - return InteractionResult.sidedSuccess(this.level().isClientSide()); } - return InteractionResult.PASS; + return InteractionResult.sidedSuccess(this.level().isClientSide()); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java b/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java index 5725ed1a5..7e15593f2 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java @@ -107,6 +107,7 @@ public class ModTabs { output.accept(ContainerBlockItem.createMle1934Instance()); output.accept(ContainerBlockItem.createAnnihilatorInstance()); output.accept(ContainerBlockItem.createSpeedboatInstance()); + output.accept(ContainerBlockItem.createWheelChairInstance()); } else { output.accept(registryObject.get()); if (registryObject.get() == ModItems.ARMOR_PLATE.get()) { diff --git a/src/main/java/com/atsuishio/superbwarfare/item/ContainerBlockItem.java b/src/main/java/com/atsuishio/superbwarfare/item/ContainerBlockItem.java index 4240cd2b6..991fc3789 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/ContainerBlockItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/ContainerBlockItem.java @@ -104,4 +104,7 @@ public class ContainerBlockItem extends BlockItem implements GeoItem { public static ItemStack createSpeedboatInstance() { return createInstance(ModEntities.SPEEDBOAT.get()); } + public static ItemStack createWheelChairInstance() { + return createInstance(ModEntities.WHEEL_CHAIR.get()); + } } diff --git a/src/main/resources/assets/superbwarfare/lang/en_us.json b/src/main/resources/assets/superbwarfare/lang/en_us.json index 6d788aad5..c5e713663 100644 --- a/src/main/resources/assets/superbwarfare/lang/en_us.json +++ b/src/main/resources/assets/superbwarfare/lang/en_us.json @@ -362,6 +362,7 @@ "entity.superbwarfare.drone": "Drone", "entity.superbwarfare.annihilator": "Annihilator Energy Gun", "entity.superbwarfare.speedboat": "Speedboat", + "entity.superbwarfare.wheel_chair": "WheelChair", "key.categories.superbwarfare": "Superb Warfare", "key.superbwarfare.hold_zoom": "Zoom(Hold)", diff --git a/src/main/resources/assets/superbwarfare/lang/zh_cn.json b/src/main/resources/assets/superbwarfare/lang/zh_cn.json index 36154900a..b1cfcbf11 100644 --- a/src/main/resources/assets/superbwarfare/lang/zh_cn.json +++ b/src/main/resources/assets/superbwarfare/lang/zh_cn.json @@ -362,6 +362,7 @@ "entity.superbwarfare.drone": "无人机", "entity.superbwarfare.annihilator": "歼灭者能量炮", "entity.superbwarfare.speedboat": "快艇", + "entity.superbwarfare.wheel_chair": "轮椅", "key.categories.superbwarfare": "卓越前线", "key.superbwarfare.hold_zoom": "瞄准(按住)",