火炮实现随机散布

This commit is contained in:
Atsuishio 2025-07-12 02:57:39 +08:00 committed by Light_Quanta
parent 04b3c4896b
commit e06d4abb3b
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
7 changed files with 154 additions and 113 deletions

View file

@ -18,10 +18,7 @@ import com.atsuishio.superbwarfare.init.ModTags;
import com.atsuishio.superbwarfare.item.ArtilleryIndicator;
import com.atsuishio.superbwarfare.item.common.ammo.CannonShellItem;
import com.atsuishio.superbwarfare.network.message.receive.ShakeClientMessage;
import com.atsuishio.superbwarfare.tools.CustomExplosion;
import com.atsuishio.superbwarfare.tools.InventoryTool;
import com.atsuishio.superbwarfare.tools.ParticleTool;
import com.atsuishio.superbwarfare.tools.SoundTool;
import com.atsuishio.superbwarfare.tools.*;
import net.minecraft.ChatFormatting;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag;
@ -54,6 +51,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.joml.Math;
import org.joml.Matrix4f;
import org.joml.Vector3f;
import org.joml.Vector4f;
import software.bernie.geckolib.animatable.GeoEntity;
import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
@ -69,6 +67,10 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
public static final EntityDataAccessor<Float> PITCH = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.FLOAT);
public static final EntityDataAccessor<Float> YAW = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.FLOAT);
public static final EntityDataAccessor<Boolean> DEPRESSED = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.BOOLEAN);
public static final EntityDataAccessor<Vector3f> TARGET_POS = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.VECTOR3);
public static final EntityDataAccessor<Integer> RADIUS = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.INT);
private final float shellGravity = 0.1f;
public Mk42Entity(EntityType<Mk42Entity> type, Level world) {
@ -83,7 +85,11 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
super.defineSynchedData(builder);
builder.define(COOL_DOWN, 0)
.define(PITCH, 0F)
.define(YAW, 0F);
.define(YAW, 0F)
.define(DEPRESSED, false)
.define(TARGET_POS, new Vector3f())
.define(RADIUS, 0);
}
@Override
@ -123,6 +129,12 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
compound.putInt("CoolDown", this.entityData.get(COOL_DOWN));
compound.putFloat("Pitch", this.entityData.get(PITCH));
compound.putFloat("Yaw", this.entityData.get(YAW));
compound.putBoolean("Depressed", this.entityData.get(DEPRESSED));
compound.putInt("Radius", this.entityData.get(RADIUS));
compound.putFloat("TargetX", this.entityData.get(TARGET_POS).x);
compound.putFloat("TargetY", this.entityData.get(TARGET_POS).y);
compound.putFloat("TargetZ", this.entityData.get(TARGET_POS).z);
}
@Override
@ -131,6 +143,16 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
this.entityData.set(COOL_DOWN, compound.getInt("CoolDown"));
this.entityData.set(PITCH, compound.getFloat("Pitch"));
this.entityData.set(YAW, compound.getFloat("Yaw"));
if (compound.contains("Depressed")) {
this.entityData.set(DEPRESSED, compound.getBoolean("Depressed"));
}
if (compound.contains("Radius")) {
this.entityData.set(RADIUS, compound.getInt("Radius"));
}
if (compound.contains("TargetX") && compound.contains("TargetY") && compound.contains("TargetZ")) {
this.entityData.set(TARGET_POS, new Vector3f(compound.getFloat("TargetX"), compound.getFloat("TargetX"), compound.getFloat("TargetZ")));
}
}
@Override
@ -211,11 +233,16 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
Matrix4f transform = getVehicleFlatTransform(1);
Vector4f worldPosition = transformPosition(transform, 0f, 2.16f, 0.5175f);
Vec3 shootPos = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z);
double adjust = -1 + 0.004 * new Vec3(targetX, targetY, targetZ).distanceTo(shootPos);
entityData.set(TARGET_POS, new Vector3f((float) targetX, (float) (targetY - adjust), (float) targetZ));
entityData.set(DEPRESSED, isDepressed);
entityData.set(RADIUS, parameters.radius());
Vec3 randomPos = VectorTool.randomPos(new Vec3(entityData.get(TARGET_POS)), entityData.get(RADIUS));
try {
double adjust = -1 + 0.004 * new Vec3(targetX, targetY, targetZ).distanceTo(shootPos);
Vec3 launchVector = calculateLaunchVector(shootPos, new Vec3(targetX, targetY - adjust, targetZ), 15, -shellGravity, isDepressed);
this.look(new Vec3(targetX, targetY, targetZ));
Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 15, -shellGravity, entityData.get(DEPRESSED));
this.look(randomPos);
float angle = (float) -getXRotFromVector(launchVector);
if (angle < -85 || angle > 14.9) {
return false;
@ -227,34 +254,14 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
return true;
}
//TODO 指示器能选择弹道后删掉这个
public boolean setTarget(ItemStack stack, boolean isDepressed) {
var parameters = stack.get(ModDataComponents.FIRING_PARAMETERS);
if (parameters == null) return false;
var pos = parameters.pos();
double targetX = pos.getX();
double targetY = pos.getY();
double targetZ = pos.getZ();
Matrix4f transform = getVehicleFlatTransform(1);
Vector4f worldPosition = transformPosition(transform, 0f, 2.16f, 0.5175f);
Vec3 shootPos = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z);
try {
double adjust = -1 + 0.004 * new Vec3(targetX, targetY, targetZ).distanceTo(shootPos);
Vec3 launchVector = calculateLaunchVector(shootPos, new Vec3(targetX, targetY - adjust, targetZ), 15, -shellGravity, isDepressed);
this.look(new Vec3(targetX, targetY, targetZ));
float angle = (float) -getXRotFromVector(launchVector);
if (angle < -85 || angle > 14.9) {
return false;
}
public void resetTarget() {
Vec3 randomPos = VectorTool.randomPos(new Vec3(entityData.get(TARGET_POS)), entityData.get(RADIUS));
Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 15, -shellGravity, entityData.get(DEPRESSED));
this.look(randomPos);
float angle = (float) -getXRotFromVector(launchVector);
if (angle < -85 || angle > 14.9) {
entityData.set(PITCH, angle);
} catch (Exception e) {
return false;
}
return true;
}
private void look(Vec3 pTarget) {
@ -425,6 +432,8 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
}
ShakeClientMessage.sendToNearbyPlayers(this, 20, 15, 15, 45);
resetTarget();
}
}

View file

@ -18,10 +18,7 @@ import com.atsuishio.superbwarfare.init.ModTags;
import com.atsuishio.superbwarfare.item.ArtilleryIndicator;
import com.atsuishio.superbwarfare.item.common.ammo.CannonShellItem;
import com.atsuishio.superbwarfare.network.message.receive.ShakeClientMessage;
import com.atsuishio.superbwarfare.tools.CustomExplosion;
import com.atsuishio.superbwarfare.tools.InventoryTool;
import com.atsuishio.superbwarfare.tools.ParticleTool;
import com.atsuishio.superbwarfare.tools.SoundTool;
import com.atsuishio.superbwarfare.tools.*;
import net.minecraft.ChatFormatting;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag;
@ -55,6 +52,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.joml.Math;
import org.joml.Matrix4f;
import org.joml.Vector3f;
import org.joml.Vector4f;
import software.bernie.geckolib.animatable.GeoEntity;
import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
@ -69,6 +67,11 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
public static final EntityDataAccessor<Integer> TYPE = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.INT);
public static final EntityDataAccessor<Float> PITCH = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.FLOAT);
public static final EntityDataAccessor<Float> YAW = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.FLOAT);
public static final EntityDataAccessor<Boolean> DEPRESSED = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.BOOLEAN);
public static final EntityDataAccessor<Vector3f> TARGET_POS = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.VECTOR3);
public static final EntityDataAccessor<Integer> RADIUS = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.INT);
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
private final float shellGravity = 0.1f;
@ -117,7 +120,11 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
builder.define(COOL_DOWN, 0)
.define(TYPE, 0)
.define(PITCH, 0f)
.define(YAW, 0f);
.define(YAW, 0f)
.define(DEPRESSED, false)
.define(TARGET_POS, new Vector3f())
.define(RADIUS, 0);
}
@Override
@ -127,6 +134,12 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
compound.putInt("Type", this.entityData.get(TYPE));
compound.putFloat("Pitch", this.entityData.get(PITCH));
compound.putFloat("Yaw", this.entityData.get(YAW));
compound.putBoolean("Depressed", this.entityData.get(DEPRESSED));
compound.putInt("Radius", this.entityData.get(RADIUS));
compound.putFloat("TargetX", this.entityData.get(TARGET_POS).x);
compound.putFloat("TargetY", this.entityData.get(TARGET_POS).y);
compound.putFloat("TargetZ", this.entityData.get(TARGET_POS).z);
}
@Override
@ -136,6 +149,16 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
this.entityData.set(TYPE, compound.getInt("Type"));
this.entityData.set(PITCH, compound.getFloat("Pitch"));
this.entityData.set(YAW, compound.getFloat("Yaw"));
if (compound.contains("Depressed")) {
this.entityData.set(DEPRESSED, compound.getBoolean("Depressed"));
}
if (compound.contains("Radius")) {
this.entityData.set(RADIUS, compound.getInt("Radius"));
}
if (compound.contains("TargetX") && compound.contains("TargetY") && compound.contains("TargetZ")) {
this.entityData.set(TARGET_POS, new Vector3f(compound.getFloat("TargetX"), compound.getFloat("TargetX"), compound.getFloat("TargetZ")));
}
}
@Override
@ -204,6 +227,7 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
return super.interact(player, hand);
}
//这个炮仰角太低只能用低伸弹道
public boolean setTarget(ItemStack stack) {
var parameters = stack.get(ModDataComponents.FIRING_PARAMETERS);
if (parameters == null) return false;
@ -214,15 +238,19 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
int targetZ = pos.getZ();
var isDepressed = parameters.isDepressed();
this.look(new Vec3(targetX, targetY, targetZ));
Matrix4f transform = getVehicleFlatTransform(1);
Vector4f worldPosition = transformPosition(transform, 0, 1.4992625f, 1.52065f);
Vec3 shootPos = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z);
double adjust = -1 + 0.004 * new Vec3(targetX, targetY, targetZ).distanceTo(shootPos);
entityData.set(TARGET_POS, new Vector3f((float) targetX, (float) (targetY - adjust), (float) targetZ));
entityData.set(DEPRESSED, true);
entityData.set(RADIUS, parameters.radius());
Vec3 randomPos = VectorTool.randomPos(new Vec3(entityData.get(TARGET_POS)), entityData.get(RADIUS));
try {
double adjust = -1 + 0.004 * new Vec3(targetX, targetY, targetZ).distanceTo(shootPos);
Vec3 launchVector = calculateLaunchVector(shootPos, new Vec3(targetX, targetY - adjust, targetZ), 15, -shellGravity, isDepressed);
this.look(new Vec3(targetX, targetY, targetZ));
Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 15, -shellGravity, entityData.get(DEPRESSED));
this.look(randomPos);
float angle = (float) -getXRotFromVector(launchVector);
if (angle < -30 || angle > 2.7) {
return false;
@ -231,37 +259,17 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
} catch (Exception e) {
return false;
}
return true;
}
//这个炮仰角太低只能用低伸弹道
public boolean setTarget(ItemStack stack, boolean isDepressed) {
var parameters = stack.get(ModDataComponents.FIRING_PARAMETERS);
if (parameters == null) return false;
var pos = parameters.pos();
double targetX = pos.getX();
double targetY = pos.getY();
double targetZ = pos.getZ();
Matrix4f transform = getVehicleFlatTransform(1);
Vector4f worldPosition = transformPosition(transform, 0f, 2.16f, 0.5175f);
Vec3 shootPos = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z);
try {
double adjust = -1 + 0.004 * new Vec3(targetX, targetY, targetZ).distanceTo(shootPos);
Vec3 launchVector = calculateLaunchVector(shootPos, new Vec3(targetX, targetY - adjust, targetZ), 15, -shellGravity, isDepressed);
this.look(new Vec3(targetX, targetY, targetZ));
float angle = (float) -getXRotFromVector(launchVector);
if (angle < -85 || angle > 14.9) {
return false;
}
public void resetTarget() {
Vec3 randomPos = VectorTool.randomPos(new Vec3(entityData.get(TARGET_POS)), entityData.get(RADIUS));
Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 15, -shellGravity, entityData.get(DEPRESSED));
this.look(randomPos);
float angle = (float) -getXRotFromVector(launchVector);
if (angle < -30 || angle > 2.7) {
entityData.set(PITCH, angle);
} catch (Exception e) {
return false;
}
return true;
}
private void look(Vec3 pTarget) {
@ -492,6 +500,8 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
100, 7, 0.02, 7, 0.005);
ShakeClientMessage.sendToNearbyPlayers(this, 20, 15, 15, 45);
resetTarget();
}
}

View file

@ -10,6 +10,7 @@ import com.atsuishio.superbwarfare.init.ModTags;
import com.atsuishio.superbwarfare.item.ArtilleryIndicator;
import com.atsuishio.superbwarfare.item.Monitor;
import com.atsuishio.superbwarfare.item.common.ammo.MortarShell;
import com.atsuishio.superbwarfare.tools.VectorTool;
import net.minecraft.ChatFormatting;
import net.minecraft.commands.arguments.EntityAnchorArgument;
import net.minecraft.core.particles.ParticleTypes;
@ -38,6 +39,7 @@ import net.neoforged.neoforge.items.ItemHandlerHelper;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.joml.Math;
import org.joml.Vector3f;
import software.bernie.geckolib.animatable.GeoEntity;
import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
import software.bernie.geckolib.animation.*;
@ -46,12 +48,15 @@ import software.bernie.geckolib.util.GeckoLibUtil;
import static com.atsuishio.superbwarfare.tools.RangeTool.calculateLaunchVector;
public class MortarEntity extends VehicleEntity implements GeoEntity, Container {
public static final EntityDataAccessor<Integer> FIRE_TIME = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.INT);
public static final EntityDataAccessor<Float> PITCH = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.FLOAT);
public static final EntityDataAccessor<Float> YAW = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.FLOAT);
public static final EntityDataAccessor<Boolean> INTELLIGENT = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.BOOLEAN);
public static final EntityDataAccessor<Boolean> DEPRESSED = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.BOOLEAN);
public static final EntityDataAccessor<Vector3f> TARGET_POS = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.VECTOR3);
public static final EntityDataAccessor<Integer> RADIUS = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.INT);
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
private LivingEntity shooter = null;
@ -78,7 +83,13 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container
builder.define(FIRE_TIME, 0)
.define(PITCH, -70f)
.define(YAW, this.getYRot())
.define(INTELLIGENT, false);
.define(DEPRESSED, false)
.define(INTELLIGENT, false)
.define(TARGET_POS, new Vector3f())
.define(RADIUS, 0);
}
@Override
@ -92,6 +103,12 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container
compound.putFloat("Pitch", this.entityData.get(PITCH));
compound.putFloat("Yaw", this.entityData.get(YAW));
compound.putBoolean("Intelligent", this.entityData.get(INTELLIGENT));
compound.putBoolean("Depressed", this.entityData.get(DEPRESSED));
compound.putInt("Radius", this.entityData.get(RADIUS));
compound.putFloat("TargetX", this.entityData.get(TARGET_POS).x);
compound.putFloat("TargetY", this.entityData.get(TARGET_POS).y);
compound.putFloat("TargetZ", this.entityData.get(TARGET_POS).z);
}
@Override
@ -106,10 +123,21 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container
if (compound.contains("Intelligent")) {
this.entityData.set(INTELLIGENT, compound.getBoolean("Intelligent"));
}
if (compound.contains("Depressed")) {
this.entityData.set(DEPRESSED, compound.getBoolean("Depressed"));
}
if (compound.contains("Radius")) {
this.entityData.set(RADIUS, compound.getInt("Radius"));
}
if (compound.contains("TargetX") && compound.contains("TargetY") && compound.contains("TargetZ")) {
this.entityData.set(TARGET_POS, new Vector3f(compound.getFloat("TargetX"), compound.getFloat("TargetX"), compound.getFloat("TargetZ")));
}
}
public void fire(@Nullable LivingEntity shooter) {
if (!(this.stack.getItem() instanceof MortarShell)) return;
if (entityData.get(FIRE_TIME) != 0) return;
this.shooter = shooter;
this.entityData.set(FIRE_TIME, 25);
@ -154,7 +182,7 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container
}
if (mainHandItem.is(ModTags.Items.CROWBAR) && !player.isShiftKeyDown()) {
if (this.stack.getItem() instanceof MortarShell) {
if (this.stack.getItem() instanceof MortarShell && this.entityData.get(FIRE_TIME) == 0) {
fire(player);
}
return InteractionResult.SUCCESS;
@ -212,9 +240,14 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container
double targetZ = pos.getZ();
var isDepressed = parameters.isDepressed();
entityData.set(TARGET_POS, new Vector3f((float) targetX, (float) targetY, (float) targetZ));
entityData.set(DEPRESSED, isDepressed);
entityData.set(RADIUS, parameters.radius());
Vec3 randomPos = VectorTool.randomPos(new Vec3(entityData.get(TARGET_POS)), entityData.get(RADIUS));
try {
Vec3 launchVector = calculateLaunchVector(getEyePosition(), new Vec3(targetX, targetY - 1, targetZ), 13, -0.11, isDepressed);
this.look(new Vec3(targetX, targetY, targetZ));
Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 13, -0.11, entityData.get(DEPRESSED));
this.look(randomPos);
float angle = (float) -getXRotFromVector(launchVector);
if (angle < -89 || angle > -20) {
return false;
@ -223,10 +256,20 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container
} catch (Exception e) {
return false;
}
return true;
}
public void resetTarget() {
Vec3 randomPos = VectorTool.randomPos(new Vec3(entityData.get(TARGET_POS)), entityData.get(RADIUS));
Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 13, -0.11, entityData.get(DEPRESSED));
this.look(randomPos);
float angle = (float) -getXRotFromVector(launchVector);
if (angle > -89 && angle < -20) {
entityData.set(PITCH, angle);
}
}
private void look(Vec3 pTarget) {
Vec3 vec3 = EntityAnchorArgument.Anchor.EYES.apply(this);
double d0 = (pTarget.x - vec3.x) * 0.2;
@ -252,13 +295,14 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container
if (level instanceof ServerLevel server) {
MortarShellEntity entityToSpawn = MortarShell.createShell(shooter, level, this.stack);
entityToSpawn.setPos(this.getX(), this.getEyeY(), this.getZ());
entityToSpawn.shoot(this.getLookAngle().x, this.getLookAngle().y, this.getLookAngle().z, 13f, (float) 0.4);
entityToSpawn.shoot(this.getLookAngle().x, this.getLookAngle().y, this.getLookAngle().z, 13f, (float) 0.1);
level.addFreshEntity(entityToSpawn);
server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, (this.getX() + 3 * this.getLookAngle().x), (this.getY() + 0.1 + 3 * this.getLookAngle().y), (this.getZ() + 3 * this.getLookAngle().z), 8, 0.4, 0.4, 0.4,
0.007);
server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, this.getX(), this.getY(), this.getZ(), 50, 2, 0.02, 2, 0.0005);
this.stack = ItemStack.EMPTY;
resetTarget();
}
}

View file

@ -67,6 +67,7 @@ public record DroneFireMessage(Vector3f pos) implements CustomPacketPayload {
SoundTool.playLocalSound(player, ModSounds.CANNON_ZOOM_IN.get(), 2, 1);
if (offStack.is(ModItems.ARTILLERY_INDICATOR.get())) {
ListTag tags = NBTTool.getTag(offStack).getList(TAG_CANNON, Tag.TAG_COMPOUND);
for (int i = 0; i < tags.size(); i++) {
var tag = tags.getCompound(i);
@ -77,12 +78,12 @@ public record DroneFireMessage(Vector3f pos) implements CustomPacketPayload {
}
}
if (entity instanceof Mk42Entity mk42Entity) {
if (!mk42Entity.setTarget(offStack, true)) {
if (!mk42Entity.setTarget(offStack)) {
player.displayClientMessage(Component.translatable("tips.superbwarfare.mk_42.warn").withStyle(ChatFormatting.RED), true);
}
}
if (entity instanceof Mle1934Entity mle1934Entity) {
if (!mle1934Entity.setTarget(offStack, true)) {
if (!mle1934Entity.setTarget(offStack)) {
player.displayClientMessage(Component.translatable("tips.superbwarfare.mle_1934.warn").withStyle(ChatFormatting.RED), true);
}
}

View file

@ -101,12 +101,12 @@ public enum SetFiringParametersMessage implements CustomPacketPayload {
}
}
if (entity instanceof Mk42Entity mk42Entity) {
if (!mk42Entity.setTarget(mainStack, true)) {
if (!mk42Entity.setTarget(mainStack)) {
player.displayClientMessage(Component.translatable("tips.superbwarfare.mk_42.warn").withStyle(ChatFormatting.RED), true);
}
}
if (entity instanceof Mle1934Entity mle1934Entity) {
if (!mle1934Entity.setTarget(mainStack, true)) {
if (!mle1934Entity.setTarget(mainStack)) {
player.displayClientMessage(Component.translatable("tips.superbwarfare.mle_1934.warn").withStyle(ChatFormatting.RED), true);
}
}

View file

@ -37,11 +37,6 @@ public class ParticleTool {
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.EXPLOSION_WATER.get(), SoundSource.BLOCKS, 2, 1);
}
level.playSound(null, BlockPos.containing(x, y + 1, z), SoundEvents.FIREWORK_ROCKET_BLAST, SoundSource.BLOCKS, 4, 1);
} else {
if ((level.getBlockState(BlockPos.containing(x, y, z))).getBlock() == Blocks.WATER) {
level.playLocalSound(x, (y + 1), z, ModSounds.EXPLOSION_WATER.get(), SoundSource.BLOCKS, 1, 1, false);
}
level.playLocalSound(x, (y + 1), z, SoundEvents.FIREWORK_ROCKET_BLAST, SoundSource.BLOCKS, 2, 1, false);
}
if (level instanceof ServerLevel serverLevel) {
@ -64,14 +59,6 @@ public class ParticleTool {
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.EXPLOSION_CLOSE.get(), SoundSource.BLOCKS, 3, 1);
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.EXPLOSION_FAR.get(), SoundSource.BLOCKS, 6, 1);
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.EXPLOSION_VERY_FAR.get(), SoundSource.BLOCKS, 12, 1);
} else {
if ((level.getBlockState(BlockPos.containing(x, y, z))).getBlock() == Blocks.WATER) {
level.playLocalSound(x, (y + 1), z, ModSounds.EXPLOSION_WATER.get(), SoundSource.BLOCKS, 1, 1, false);
}
level.playLocalSound(x, (y + 1), z, SoundEvents.FIREWORK_ROCKET_BLAST, SoundSource.BLOCKS, 2, 1, false);
level.playLocalSound(x, (y + 1), z, ModSounds.EXPLOSION_CLOSE.get(), SoundSource.BLOCKS, 1, 1, false);
level.playLocalSound(x, (y + 1), z, ModSounds.EXPLOSION_FAR.get(), SoundSource.BLOCKS, 1, 1, false);
level.playLocalSound(x, (y + 1), z, ModSounds.EXPLOSION_VERY_FAR.get(), SoundSource.BLOCKS, 1, 1, false);
}
if (level instanceof ServerLevel serverLevel) {
@ -92,16 +79,9 @@ public class ParticleTool {
if ((level.getBlockState(BlockPos.containing(x, y, z))).getBlock() == Blocks.WATER) {
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.EXPLOSION_WATER.get(), SoundSource.BLOCKS, 3, 1);
}
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.EXPLOSION_CLOSE.get(), SoundSource.BLOCKS, 6, 1);
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.EXPLOSION_FAR.get(), SoundSource.BLOCKS, 12, 1);
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.EXPLOSION_VERY_FAR.get(), SoundSource.BLOCKS, 32, 1);
} else {
if ((level.getBlockState(BlockPos.containing(x, y, z))).getBlock() == Blocks.WATER) {
level.playLocalSound(x, (y + 1), z, ModSounds.EXPLOSION_WATER.get(), SoundSource.BLOCKS, 1, 1, false);
}
level.playLocalSound(x, (y + 1), z, ModSounds.EXPLOSION_CLOSE.get(), SoundSource.BLOCKS, 1, 1, false);
level.playLocalSound(x, (y + 1), z, ModSounds.EXPLOSION_FAR.get(), SoundSource.BLOCKS, 1, 1, false);
level.playLocalSound(x, (y + 1), z, ModSounds.EXPLOSION_VERY_FAR.get(), SoundSource.BLOCKS, 1, 1, false);
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.EXPLOSION_CLOSE.get(), SoundSource.BLOCKS, 16, 1);
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.EXPLOSION_FAR.get(), SoundSource.BLOCKS, 48, 1);
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.EXPLOSION_VERY_FAR.get(), SoundSource.BLOCKS, 128, 1);
}
if (level instanceof ServerLevel serverLevel) {
@ -129,16 +109,9 @@ public class ParticleTool {
if ((level.getBlockState(BlockPos.containing(x, y, z))).getBlock() == Blocks.WATER) {
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.EXPLOSION_WATER.get(), SoundSource.BLOCKS, 3, 1);
}
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.HUGE_EXPLOSION_CLOSE.get(), SoundSource.BLOCKS, 8, 1);
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.HUGE_EXPLOSION_FAR.get(), SoundSource.BLOCKS, 16, 1);
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.HUGE_EXPLOSION_VERY_FAR.get(), SoundSource.BLOCKS, 32, 1);
} else {
if ((level.getBlockState(BlockPos.containing(x, y, z))).getBlock() == Blocks.WATER) {
level.playLocalSound(x, (y + 1), z, ModSounds.EXPLOSION_WATER.get(), SoundSource.BLOCKS, 1, 1, false);
}
level.playLocalSound(x, (y + 1), z, ModSounds.HUGE_EXPLOSION_CLOSE.get(), SoundSource.BLOCKS, 1, 1, false);
level.playLocalSound(x, (y + 1), z, ModSounds.HUGE_EXPLOSION_FAR.get(), SoundSource.BLOCKS, 1, 1, false);
level.playLocalSound(x, (y + 1), z, ModSounds.HUGE_EXPLOSION_VERY_FAR.get(), SoundSource.BLOCKS, 1, 1, false);
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.HUGE_EXPLOSION_CLOSE.get(), SoundSource.BLOCKS, 24, 1);
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.HUGE_EXPLOSION_FAR.get(), SoundSource.BLOCKS, 64, 1);
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.HUGE_EXPLOSION_VERY_FAR.get(), SoundSource.BLOCKS, 160, 1);
}
if (level instanceof ServerLevel serverLevel) {

View file

@ -55,4 +55,8 @@ public class VectorTool {
return combined;
}
public static Vec3 randomPos(Vec3 originPos, int radius) {
return originPos.add(new Vec3(Math.random() * radius, 0, 0).yRot((float) (360 * Math.random())));
}
}