火炮实现随机散布
This commit is contained in:
parent
04b3c4896b
commit
e06d4abb3b
7 changed files with 154 additions and 113 deletions
|
@ -18,10 +18,7 @@ import com.atsuishio.superbwarfare.init.ModTags;
|
||||||
import com.atsuishio.superbwarfare.item.ArtilleryIndicator;
|
import com.atsuishio.superbwarfare.item.ArtilleryIndicator;
|
||||||
import com.atsuishio.superbwarfare.item.common.ammo.CannonShellItem;
|
import com.atsuishio.superbwarfare.item.common.ammo.CannonShellItem;
|
||||||
import com.atsuishio.superbwarfare.network.message.receive.ShakeClientMessage;
|
import com.atsuishio.superbwarfare.network.message.receive.ShakeClientMessage;
|
||||||
import com.atsuishio.superbwarfare.tools.CustomExplosion;
|
import com.atsuishio.superbwarfare.tools.*;
|
||||||
import com.atsuishio.superbwarfare.tools.InventoryTool;
|
|
||||||
import com.atsuishio.superbwarfare.tools.ParticleTool;
|
|
||||||
import com.atsuishio.superbwarfare.tools.SoundTool;
|
|
||||||
import net.minecraft.ChatFormatting;
|
import net.minecraft.ChatFormatting;
|
||||||
import net.minecraft.core.particles.ParticleTypes;
|
import net.minecraft.core.particles.ParticleTypes;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
@ -54,6 +51,7 @@ import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.joml.Math;
|
import org.joml.Math;
|
||||||
import org.joml.Matrix4f;
|
import org.joml.Matrix4f;
|
||||||
|
import org.joml.Vector3f;
|
||||||
import org.joml.Vector4f;
|
import org.joml.Vector4f;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
|
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> PITCH = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.FLOAT);
|
||||||
public static final EntityDataAccessor<Float> YAW = 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;
|
private final float shellGravity = 0.1f;
|
||||||
|
|
||||||
public Mk42Entity(EntityType<Mk42Entity> type, Level world) {
|
public Mk42Entity(EntityType<Mk42Entity> type, Level world) {
|
||||||
|
@ -83,7 +85,11 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
|
||||||
super.defineSynchedData(builder);
|
super.defineSynchedData(builder);
|
||||||
builder.define(COOL_DOWN, 0)
|
builder.define(COOL_DOWN, 0)
|
||||||
.define(PITCH, 0F)
|
.define(PITCH, 0F)
|
||||||
.define(YAW, 0F);
|
.define(YAW, 0F)
|
||||||
|
|
||||||
|
.define(DEPRESSED, false)
|
||||||
|
.define(TARGET_POS, new Vector3f())
|
||||||
|
.define(RADIUS, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -123,6 +129,12 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
|
||||||
compound.putInt("CoolDown", this.entityData.get(COOL_DOWN));
|
compound.putInt("CoolDown", this.entityData.get(COOL_DOWN));
|
||||||
compound.putFloat("Pitch", this.entityData.get(PITCH));
|
compound.putFloat("Pitch", this.entityData.get(PITCH));
|
||||||
compound.putFloat("Yaw", this.entityData.get(YAW));
|
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
|
@Override
|
||||||
|
@ -131,6 +143,16 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
|
||||||
this.entityData.set(COOL_DOWN, compound.getInt("CoolDown"));
|
this.entityData.set(COOL_DOWN, compound.getInt("CoolDown"));
|
||||||
this.entityData.set(PITCH, compound.getFloat("Pitch"));
|
this.entityData.set(PITCH, compound.getFloat("Pitch"));
|
||||||
this.entityData.set(YAW, compound.getFloat("Yaw"));
|
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
|
@Override
|
||||||
|
@ -211,11 +233,16 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
|
||||||
Matrix4f transform = getVehicleFlatTransform(1);
|
Matrix4f transform = getVehicleFlatTransform(1);
|
||||||
Vector4f worldPosition = transformPosition(transform, 0f, 2.16f, 0.5175f);
|
Vector4f worldPosition = transformPosition(transform, 0f, 2.16f, 0.5175f);
|
||||||
Vec3 shootPos = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z);
|
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 {
|
try {
|
||||||
double adjust = -1 + 0.004 * new Vec3(targetX, targetY, targetZ).distanceTo(shootPos);
|
Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 15, -shellGravity, entityData.get(DEPRESSED));
|
||||||
Vec3 launchVector = calculateLaunchVector(shootPos, new Vec3(targetX, targetY - adjust, targetZ), 15, -shellGravity, isDepressed);
|
this.look(randomPos);
|
||||||
this.look(new Vec3(targetX, targetY, targetZ));
|
|
||||||
float angle = (float) -getXRotFromVector(launchVector);
|
float angle = (float) -getXRotFromVector(launchVector);
|
||||||
if (angle < -85 || angle > 14.9) {
|
if (angle < -85 || angle > 14.9) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -227,34 +254,14 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO 指示器能选择弹道后删掉这个
|
public void resetTarget() {
|
||||||
|
Vec3 randomPos = VectorTool.randomPos(new Vec3(entityData.get(TARGET_POS)), entityData.get(RADIUS));
|
||||||
public boolean setTarget(ItemStack stack, boolean isDepressed) {
|
Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 15, -shellGravity, entityData.get(DEPRESSED));
|
||||||
var parameters = stack.get(ModDataComponents.FIRING_PARAMETERS);
|
this.look(randomPos);
|
||||||
if (parameters == null) return false;
|
float angle = (float) -getXRotFromVector(launchVector);
|
||||||
|
if (angle < -85 || angle > 14.9) {
|
||||||
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;
|
|
||||||
}
|
|
||||||
entityData.set(PITCH, angle);
|
entityData.set(PITCH, angle);
|
||||||
} catch (Exception e) {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void look(Vec3 pTarget) {
|
private void look(Vec3 pTarget) {
|
||||||
|
@ -425,6 +432,8 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
|
||||||
}
|
}
|
||||||
|
|
||||||
ShakeClientMessage.sendToNearbyPlayers(this, 20, 15, 15, 45);
|
ShakeClientMessage.sendToNearbyPlayers(this, 20, 15, 15, 45);
|
||||||
|
|
||||||
|
resetTarget();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,10 +18,7 @@ import com.atsuishio.superbwarfare.init.ModTags;
|
||||||
import com.atsuishio.superbwarfare.item.ArtilleryIndicator;
|
import com.atsuishio.superbwarfare.item.ArtilleryIndicator;
|
||||||
import com.atsuishio.superbwarfare.item.common.ammo.CannonShellItem;
|
import com.atsuishio.superbwarfare.item.common.ammo.CannonShellItem;
|
||||||
import com.atsuishio.superbwarfare.network.message.receive.ShakeClientMessage;
|
import com.atsuishio.superbwarfare.network.message.receive.ShakeClientMessage;
|
||||||
import com.atsuishio.superbwarfare.tools.CustomExplosion;
|
import com.atsuishio.superbwarfare.tools.*;
|
||||||
import com.atsuishio.superbwarfare.tools.InventoryTool;
|
|
||||||
import com.atsuishio.superbwarfare.tools.ParticleTool;
|
|
||||||
import com.atsuishio.superbwarfare.tools.SoundTool;
|
|
||||||
import net.minecraft.ChatFormatting;
|
import net.minecraft.ChatFormatting;
|
||||||
import net.minecraft.core.particles.ParticleTypes;
|
import net.minecraft.core.particles.ParticleTypes;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
@ -55,6 +52,7 @@ import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.joml.Math;
|
import org.joml.Math;
|
||||||
import org.joml.Matrix4f;
|
import org.joml.Matrix4f;
|
||||||
|
import org.joml.Vector3f;
|
||||||
import org.joml.Vector4f;
|
import org.joml.Vector4f;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
|
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<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> PITCH = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.FLOAT);
|
||||||
public static final EntityDataAccessor<Float> YAW = 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 AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
|
||||||
|
|
||||||
private final float shellGravity = 0.1f;
|
private final float shellGravity = 0.1f;
|
||||||
|
@ -117,7 +120,11 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
|
||||||
builder.define(COOL_DOWN, 0)
|
builder.define(COOL_DOWN, 0)
|
||||||
.define(TYPE, 0)
|
.define(TYPE, 0)
|
||||||
.define(PITCH, 0f)
|
.define(PITCH, 0f)
|
||||||
.define(YAW, 0f);
|
.define(YAW, 0f)
|
||||||
|
|
||||||
|
.define(DEPRESSED, false)
|
||||||
|
.define(TARGET_POS, new Vector3f())
|
||||||
|
.define(RADIUS, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -127,6 +134,12 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
|
||||||
compound.putInt("Type", this.entityData.get(TYPE));
|
compound.putInt("Type", this.entityData.get(TYPE));
|
||||||
compound.putFloat("Pitch", this.entityData.get(PITCH));
|
compound.putFloat("Pitch", this.entityData.get(PITCH));
|
||||||
compound.putFloat("Yaw", this.entityData.get(YAW));
|
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
|
@Override
|
||||||
|
@ -136,6 +149,16 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
|
||||||
this.entityData.set(TYPE, compound.getInt("Type"));
|
this.entityData.set(TYPE, compound.getInt("Type"));
|
||||||
this.entityData.set(PITCH, compound.getFloat("Pitch"));
|
this.entityData.set(PITCH, compound.getFloat("Pitch"));
|
||||||
this.entityData.set(YAW, compound.getFloat("Yaw"));
|
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
|
@Override
|
||||||
|
@ -204,6 +227,7 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
|
||||||
return super.interact(player, hand);
|
return super.interact(player, hand);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//这个炮仰角太低只能用低伸弹道
|
||||||
public boolean setTarget(ItemStack stack) {
|
public boolean setTarget(ItemStack stack) {
|
||||||
var parameters = stack.get(ModDataComponents.FIRING_PARAMETERS);
|
var parameters = stack.get(ModDataComponents.FIRING_PARAMETERS);
|
||||||
if (parameters == null) return false;
|
if (parameters == null) return false;
|
||||||
|
@ -214,15 +238,19 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
|
||||||
int targetZ = pos.getZ();
|
int targetZ = pos.getZ();
|
||||||
var isDepressed = parameters.isDepressed();
|
var isDepressed = parameters.isDepressed();
|
||||||
|
|
||||||
this.look(new Vec3(targetX, targetY, targetZ));
|
|
||||||
Matrix4f transform = getVehicleFlatTransform(1);
|
Matrix4f transform = getVehicleFlatTransform(1);
|
||||||
Vector4f worldPosition = transformPosition(transform, 0, 1.4992625f, 1.52065f);
|
Vector4f worldPosition = transformPosition(transform, 0, 1.4992625f, 1.52065f);
|
||||||
Vec3 shootPos = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z);
|
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 {
|
try {
|
||||||
double adjust = -1 + 0.004 * new Vec3(targetX, targetY, targetZ).distanceTo(shootPos);
|
Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 15, -shellGravity, entityData.get(DEPRESSED));
|
||||||
Vec3 launchVector = calculateLaunchVector(shootPos, new Vec3(targetX, targetY - adjust, targetZ), 15, -shellGravity, isDepressed);
|
this.look(randomPos);
|
||||||
this.look(new Vec3(targetX, targetY, targetZ));
|
|
||||||
float angle = (float) -getXRotFromVector(launchVector);
|
float angle = (float) -getXRotFromVector(launchVector);
|
||||||
if (angle < -30 || angle > 2.7) {
|
if (angle < -30 || angle > 2.7) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -231,37 +259,17 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//这个炮仰角太低只能用低伸弹道
|
public void resetTarget() {
|
||||||
public boolean setTarget(ItemStack stack, boolean isDepressed) {
|
Vec3 randomPos = VectorTool.randomPos(new Vec3(entityData.get(TARGET_POS)), entityData.get(RADIUS));
|
||||||
var parameters = stack.get(ModDataComponents.FIRING_PARAMETERS);
|
Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 15, -shellGravity, entityData.get(DEPRESSED));
|
||||||
if (parameters == null) return false;
|
this.look(randomPos);
|
||||||
|
float angle = (float) -getXRotFromVector(launchVector);
|
||||||
var pos = parameters.pos();
|
if (angle < -30 || angle > 2.7) {
|
||||||
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;
|
|
||||||
}
|
|
||||||
entityData.set(PITCH, angle);
|
entityData.set(PITCH, angle);
|
||||||
} catch (Exception e) {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void look(Vec3 pTarget) {
|
private void look(Vec3 pTarget) {
|
||||||
|
@ -492,6 +500,8 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
|
||||||
100, 7, 0.02, 7, 0.005);
|
100, 7, 0.02, 7, 0.005);
|
||||||
|
|
||||||
ShakeClientMessage.sendToNearbyPlayers(this, 20, 15, 15, 45);
|
ShakeClientMessage.sendToNearbyPlayers(this, 20, 15, 15, 45);
|
||||||
|
|
||||||
|
resetTarget();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ import com.atsuishio.superbwarfare.init.ModTags;
|
||||||
import com.atsuishio.superbwarfare.item.ArtilleryIndicator;
|
import com.atsuishio.superbwarfare.item.ArtilleryIndicator;
|
||||||
import com.atsuishio.superbwarfare.item.Monitor;
|
import com.atsuishio.superbwarfare.item.Monitor;
|
||||||
import com.atsuishio.superbwarfare.item.common.ammo.MortarShell;
|
import com.atsuishio.superbwarfare.item.common.ammo.MortarShell;
|
||||||
|
import com.atsuishio.superbwarfare.tools.VectorTool;
|
||||||
import net.minecraft.ChatFormatting;
|
import net.minecraft.ChatFormatting;
|
||||||
import net.minecraft.commands.arguments.EntityAnchorArgument;
|
import net.minecraft.commands.arguments.EntityAnchorArgument;
|
||||||
import net.minecraft.core.particles.ParticleTypes;
|
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.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.joml.Math;
|
import org.joml.Math;
|
||||||
|
import org.joml.Vector3f;
|
||||||
import software.bernie.geckolib.animatable.GeoEntity;
|
import software.bernie.geckolib.animatable.GeoEntity;
|
||||||
import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
|
import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
|
||||||
import software.bernie.geckolib.animation.*;
|
import software.bernie.geckolib.animation.*;
|
||||||
|
@ -46,12 +48,15 @@ import software.bernie.geckolib.util.GeckoLibUtil;
|
||||||
import static com.atsuishio.superbwarfare.tools.RangeTool.calculateLaunchVector;
|
import static com.atsuishio.superbwarfare.tools.RangeTool.calculateLaunchVector;
|
||||||
|
|
||||||
public class MortarEntity extends VehicleEntity implements GeoEntity, Container {
|
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<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> PITCH = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.FLOAT);
|
||||||
public static final EntityDataAccessor<Float> YAW = 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> 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 final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
|
||||||
|
|
||||||
private LivingEntity shooter = null;
|
private LivingEntity shooter = null;
|
||||||
|
@ -78,7 +83,13 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container
|
||||||
builder.define(FIRE_TIME, 0)
|
builder.define(FIRE_TIME, 0)
|
||||||
.define(PITCH, -70f)
|
.define(PITCH, -70f)
|
||||||
.define(YAW, this.getYRot())
|
.define(YAW, this.getYRot())
|
||||||
.define(INTELLIGENT, false);
|
|
||||||
|
.define(DEPRESSED, false)
|
||||||
|
.define(INTELLIGENT, false)
|
||||||
|
.define(TARGET_POS, new Vector3f())
|
||||||
|
.define(RADIUS, 0);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -92,6 +103,12 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container
|
||||||
compound.putFloat("Pitch", this.entityData.get(PITCH));
|
compound.putFloat("Pitch", this.entityData.get(PITCH));
|
||||||
compound.putFloat("Yaw", this.entityData.get(YAW));
|
compound.putFloat("Yaw", this.entityData.get(YAW));
|
||||||
compound.putBoolean("Intelligent", this.entityData.get(INTELLIGENT));
|
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
|
@Override
|
||||||
|
@ -106,10 +123,21 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container
|
||||||
if (compound.contains("Intelligent")) {
|
if (compound.contains("Intelligent")) {
|
||||||
this.entityData.set(INTELLIGENT, compound.getBoolean("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) {
|
public void fire(@Nullable LivingEntity shooter) {
|
||||||
if (!(this.stack.getItem() instanceof MortarShell)) return;
|
if (!(this.stack.getItem() instanceof MortarShell)) return;
|
||||||
|
if (entityData.get(FIRE_TIME) != 0) return;
|
||||||
|
|
||||||
this.shooter = shooter;
|
this.shooter = shooter;
|
||||||
this.entityData.set(FIRE_TIME, 25);
|
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 (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);
|
fire(player);
|
||||||
}
|
}
|
||||||
return InteractionResult.SUCCESS;
|
return InteractionResult.SUCCESS;
|
||||||
|
@ -212,9 +240,14 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container
|
||||||
double targetZ = pos.getZ();
|
double targetZ = pos.getZ();
|
||||||
var isDepressed = parameters.isDepressed();
|
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 {
|
try {
|
||||||
Vec3 launchVector = calculateLaunchVector(getEyePosition(), new Vec3(targetX, targetY - 1, targetZ), 13, -0.11, isDepressed);
|
Vec3 launchVector = calculateLaunchVector(getEyePosition(), randomPos, 13, -0.11, entityData.get(DEPRESSED));
|
||||||
this.look(new Vec3(targetX, targetY, targetZ));
|
this.look(randomPos);
|
||||||
float angle = (float) -getXRotFromVector(launchVector);
|
float angle = (float) -getXRotFromVector(launchVector);
|
||||||
if (angle < -89 || angle > -20) {
|
if (angle < -89 || angle > -20) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -223,10 +256,20 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
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) {
|
private void look(Vec3 pTarget) {
|
||||||
Vec3 vec3 = EntityAnchorArgument.Anchor.EYES.apply(this);
|
Vec3 vec3 = EntityAnchorArgument.Anchor.EYES.apply(this);
|
||||||
double d0 = (pTarget.x - vec3.x) * 0.2;
|
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) {
|
if (level instanceof ServerLevel server) {
|
||||||
MortarShellEntity entityToSpawn = MortarShell.createShell(shooter, level, this.stack);
|
MortarShellEntity entityToSpawn = MortarShell.createShell(shooter, level, this.stack);
|
||||||
entityToSpawn.setPos(this.getX(), this.getEyeY(), this.getZ());
|
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);
|
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,
|
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);
|
0.007);
|
||||||
server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, this.getX(), this.getY(), this.getZ(), 50, 2, 0.02, 2, 0.0005);
|
server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, this.getX(), this.getY(), this.getZ(), 50, 2, 0.02, 2, 0.0005);
|
||||||
|
|
||||||
this.stack = ItemStack.EMPTY;
|
this.stack = ItemStack.EMPTY;
|
||||||
|
resetTarget();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,7 @@ public record DroneFireMessage(Vector3f pos) implements CustomPacketPayload {
|
||||||
SoundTool.playLocalSound(player, ModSounds.CANNON_ZOOM_IN.get(), 2, 1);
|
SoundTool.playLocalSound(player, ModSounds.CANNON_ZOOM_IN.get(), 2, 1);
|
||||||
|
|
||||||
if (offStack.is(ModItems.ARTILLERY_INDICATOR.get())) {
|
if (offStack.is(ModItems.ARTILLERY_INDICATOR.get())) {
|
||||||
|
|
||||||
ListTag tags = NBTTool.getTag(offStack).getList(TAG_CANNON, Tag.TAG_COMPOUND);
|
ListTag tags = NBTTool.getTag(offStack).getList(TAG_CANNON, Tag.TAG_COMPOUND);
|
||||||
for (int i = 0; i < tags.size(); i++) {
|
for (int i = 0; i < tags.size(); i++) {
|
||||||
var tag = tags.getCompound(i);
|
var tag = tags.getCompound(i);
|
||||||
|
@ -77,12 +78,12 @@ public record DroneFireMessage(Vector3f pos) implements CustomPacketPayload {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (entity instanceof Mk42Entity mk42Entity) {
|
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);
|
player.displayClientMessage(Component.translatable("tips.superbwarfare.mk_42.warn").withStyle(ChatFormatting.RED), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (entity instanceof Mle1934Entity mle1934Entity) {
|
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);
|
player.displayClientMessage(Component.translatable("tips.superbwarfare.mle_1934.warn").withStyle(ChatFormatting.RED), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,12 +101,12 @@ public enum SetFiringParametersMessage implements CustomPacketPayload {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (entity instanceof Mk42Entity mk42Entity) {
|
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);
|
player.displayClientMessage(Component.translatable("tips.superbwarfare.mk_42.warn").withStyle(ChatFormatting.RED), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (entity instanceof Mle1934Entity mle1934Entity) {
|
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);
|
player.displayClientMessage(Component.translatable("tips.superbwarfare.mle_1934.warn").withStyle(ChatFormatting.RED), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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), 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);
|
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) {
|
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_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_FAR.get(), SoundSource.BLOCKS, 6, 1);
|
||||||
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.EXPLOSION_VERY_FAR.get(), SoundSource.BLOCKS, 12, 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) {
|
if (level instanceof ServerLevel serverLevel) {
|
||||||
|
@ -92,16 +79,9 @@ public class ParticleTool {
|
||||||
if ((level.getBlockState(BlockPos.containing(x, y, z))).getBlock() == Blocks.WATER) {
|
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_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_CLOSE.get(), SoundSource.BLOCKS, 16, 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_FAR.get(), SoundSource.BLOCKS, 48, 1);
|
||||||
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.EXPLOSION_VERY_FAR.get(), SoundSource.BLOCKS, 32, 1);
|
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.EXPLOSION_VERY_FAR.get(), SoundSource.BLOCKS, 128, 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (level instanceof ServerLevel serverLevel) {
|
if (level instanceof ServerLevel serverLevel) {
|
||||||
|
@ -129,16 +109,9 @@ public class ParticleTool {
|
||||||
if ((level.getBlockState(BlockPos.containing(x, y, z))).getBlock() == Blocks.WATER) {
|
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_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_CLOSE.get(), SoundSource.BLOCKS, 24, 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_FAR.get(), SoundSource.BLOCKS, 64, 1);
|
||||||
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.HUGE_EXPLOSION_VERY_FAR.get(), SoundSource.BLOCKS, 32, 1);
|
level.playSound(null, BlockPos.containing(x, y + 1, z), ModSounds.HUGE_EXPLOSION_VERY_FAR.get(), SoundSource.BLOCKS, 160, 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (level instanceof ServerLevel serverLevel) {
|
if (level instanceof ServerLevel serverLevel) {
|
||||||
|
|
|
@ -55,4 +55,8 @@ public class VectorTool {
|
||||||
|
|
||||||
return combined;
|
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())));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue