优化无人机的飞控
This commit is contained in:
parent
f4fee211e9
commit
ec88c89e92
6 changed files with 161 additions and 96 deletions
|
@ -71,10 +71,13 @@ public class DroneEntity extends PathfinderMob implements GeoEntity {
|
||||||
public static final EntityDataAccessor<String> CONTROLLER = SynchedEntityData.defineId(DroneEntity.class, EntityDataSerializers.STRING);
|
public static final EntityDataAccessor<String> CONTROLLER = SynchedEntityData.defineId(DroneEntity.class, EntityDataSerializers.STRING);
|
||||||
public static final EntityDataAccessor<Integer> AMMO = SynchedEntityData.defineId(DroneEntity.class, EntityDataSerializers.INT);
|
public static final EntityDataAccessor<Integer> AMMO = SynchedEntityData.defineId(DroneEntity.class, EntityDataSerializers.INT);
|
||||||
public static final EntityDataAccessor<Boolean> KAMIKAZE = SynchedEntityData.defineId(DroneEntity.class, EntityDataSerializers.BOOLEAN);
|
public static final EntityDataAccessor<Boolean> KAMIKAZE = SynchedEntityData.defineId(DroneEntity.class, EntityDataSerializers.BOOLEAN);
|
||||||
|
public static final EntityDataAccessor<Float> MOVEX = SynchedEntityData.defineId(DroneEntity.class, EntityDataSerializers.FLOAT);
|
||||||
|
public static final EntityDataAccessor<Float> MOVEY = SynchedEntityData.defineId(DroneEntity.class, EntityDataSerializers.FLOAT);
|
||||||
|
public static final EntityDataAccessor<Float> MOVEZ = SynchedEntityData.defineId(DroneEntity.class, EntityDataSerializers.FLOAT);
|
||||||
|
|
||||||
|
public static final EntityDataAccessor<Float> ROTX = SynchedEntityData.defineId(DroneEntity.class, EntityDataSerializers.FLOAT);
|
||||||
|
public static final EntityDataAccessor<Float> ROTZ = SynchedEntityData.defineId(DroneEntity.class, EntityDataSerializers.FLOAT);
|
||||||
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
|
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
|
||||||
private float moveX = 0;
|
|
||||||
private float moveY = 0;
|
|
||||||
private float moveZ = 0;
|
|
||||||
private boolean move = false;
|
private boolean move = false;
|
||||||
|
|
||||||
public String animationprocedure = "empty";
|
public String animationprocedure = "empty";
|
||||||
|
@ -92,9 +95,9 @@ public class DroneEntity extends PathfinderMob implements GeoEntity {
|
||||||
|
|
||||||
public DroneEntity(EntityType<? extends DroneEntity> type, Level world, float moveX, float moveY, float moveZ) {
|
public DroneEntity(EntityType<? extends DroneEntity> type, Level world, float moveX, float moveY, float moveZ) {
|
||||||
super(type, world);
|
super(type, world);
|
||||||
this.moveX = moveX;
|
// this.moveX = moveX;
|
||||||
this.moveY = moveY;
|
// this.moveY = moveY;
|
||||||
this.moveZ = moveZ;
|
// this.moveZ = moveZ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -105,6 +108,11 @@ public class DroneEntity extends PathfinderMob implements GeoEntity {
|
||||||
this.entityData.define(LINKED, false);
|
this.entityData.define(LINKED, false);
|
||||||
this.entityData.define(AMMO, 0);
|
this.entityData.define(AMMO, 0);
|
||||||
this.entityData.define(KAMIKAZE, false);
|
this.entityData.define(KAMIKAZE, false);
|
||||||
|
this.entityData.define(MOVEX, 0f);
|
||||||
|
this.entityData.define(MOVEY, 0f);
|
||||||
|
this.entityData.define(MOVEZ, 0f);
|
||||||
|
this.entityData.define(ROTX, 0f);
|
||||||
|
this.entityData.define(ROTZ, 0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -145,6 +153,11 @@ public class DroneEntity extends PathfinderMob implements GeoEntity {
|
||||||
compound.putString("Controller", this.entityData.get(CONTROLLER));
|
compound.putString("Controller", this.entityData.get(CONTROLLER));
|
||||||
compound.putInt("ammo", this.entityData.get(AMMO));
|
compound.putInt("ammo", this.entityData.get(AMMO));
|
||||||
compound.putBoolean("Kamikaze", this.entityData.get(KAMIKAZE));
|
compound.putBoolean("Kamikaze", this.entityData.get(KAMIKAZE));
|
||||||
|
compound.putFloat("moveX", this.entityData.get(MOVEX));
|
||||||
|
compound.putFloat("moveY", this.entityData.get(MOVEY));
|
||||||
|
compound.putFloat("moveZ", this.entityData.get(MOVEZ));
|
||||||
|
compound.putFloat("rotX", this.entityData.get(ROTX));
|
||||||
|
compound.putFloat("rotZ", this.entityData.get(ROTZ));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -159,6 +172,16 @@ public class DroneEntity extends PathfinderMob implements GeoEntity {
|
||||||
this.entityData.set(AMMO, compound.getInt("ammo"));
|
this.entityData.set(AMMO, compound.getInt("ammo"));
|
||||||
if (compound.contains("Kamikaze"))
|
if (compound.contains("Kamikaze"))
|
||||||
this.entityData.set(KAMIKAZE, compound.getBoolean("Kamikaze"));
|
this.entityData.set(KAMIKAZE, compound.getBoolean("Kamikaze"));
|
||||||
|
if (compound.contains("moveX"))
|
||||||
|
this.entityData.set(MOVEX, compound.getFloat("moveX"));
|
||||||
|
if (compound.contains("moveY"))
|
||||||
|
this.entityData.set(MOVEY, compound.getFloat("moveY"));
|
||||||
|
if (compound.contains("moveZ"))
|
||||||
|
this.entityData.set(MOVEZ, compound.getFloat("moveZ"));
|
||||||
|
if (compound.contains("rotX"))
|
||||||
|
this.entityData.set(ROTX, compound.getFloat("rotX"));
|
||||||
|
if (compound.contains("rotZ"))
|
||||||
|
this.entityData.set(ROTZ, compound.getFloat("rotZ"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -166,52 +189,67 @@ public class DroneEntity extends PathfinderMob implements GeoEntity {
|
||||||
super.baseTick();
|
super.baseTick();
|
||||||
|
|
||||||
if (this.getPersistentData().getBoolean("left")) {
|
if (this.getPersistentData().getBoolean("left")) {
|
||||||
this.moveX = -1.5f;
|
this.entityData.set(MOVEX,-1.5f);
|
||||||
|
this.entityData.set(ROTX,this.entityData.get(ROTX) + 0.13f);
|
||||||
}
|
}
|
||||||
if (this.getPersistentData().getBoolean("right")) {
|
if (this.getPersistentData().getBoolean("right")) {
|
||||||
this.moveX = 1.5f;
|
this.entityData.set(MOVEX,1.5f);
|
||||||
|
this.entityData.set(ROTX,this.entityData.get(ROTX) - 0.13f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.entityData.get(ROTX) > 0) {
|
||||||
|
this.entityData.set(ROTX, Mth.clamp(this.entityData.get(ROTX) - 0.55f * (float) Math.pow(this.entityData.get(ROTX),2), 0, 1f));
|
||||||
|
} else {
|
||||||
|
this.entityData.set(ROTX, Mth.clamp(this.entityData.get(ROTX) + 0.55f * (float) Math.pow(this.entityData.get(ROTX),2), -1f, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.getPersistentData().getBoolean("left") && !this.getPersistentData().getBoolean("right")) {
|
if (!this.getPersistentData().getBoolean("left") && !this.getPersistentData().getBoolean("right")) {
|
||||||
if (this.moveX >= 0) {
|
if (this.entityData.get(MOVEX) >= 0) {
|
||||||
this.moveX = Mth.clamp(this.moveX - 0.3f, 0, 1);
|
this.entityData.set(MOVEX,Mth.clamp(this.entityData.get(MOVEX) - 0.3f, 0, 1));
|
||||||
} else {
|
} else {
|
||||||
this.moveX = Mth.clamp(this.moveX + 0.3f, -1, 0);
|
this.entityData.set(MOVEX,Mth.clamp(this.entityData.get(MOVEX) + 0.3f, -1, 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (this.getPersistentData().getBoolean("forward")) {
|
if (this.getPersistentData().getBoolean("forward")) {
|
||||||
this.moveZ = -1.5f;
|
this.entityData.set(MOVEZ,this.entityData.get(MOVEZ) - 0.15f);
|
||||||
|
this.entityData.set(ROTZ,this.entityData.get(ROTZ) - 0.13f);
|
||||||
}
|
}
|
||||||
if (this.getPersistentData().getBoolean("backward")) {
|
if (this.getPersistentData().getBoolean("backward")) {
|
||||||
this.moveZ = 1.5f;
|
this.entityData.set(MOVEZ,this.entityData.get(MOVEZ) + 0.15f);
|
||||||
|
this.entityData.set(ROTZ,this.entityData.get(ROTZ) + 0.13f);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.getPersistentData().getBoolean("forward") && !this.getPersistentData().getBoolean("backward")) {
|
if (this.entityData.get(ROTZ) > 0) {
|
||||||
if (this.moveZ >= 0) {
|
this.entityData.set(ROTZ, Mth.clamp(this.entityData.get(ROTZ) - 0.55f * (float) Math.pow(this.entityData.get(ROTZ),2), 0, 1f));
|
||||||
this.moveZ = Mth.clamp(this.moveZ - 0.3f, 0, 1);
|
|
||||||
} else {
|
} else {
|
||||||
this.moveZ = Mth.clamp(this.moveZ + 0.3f, -1, 0);
|
this.entityData.set(ROTZ, Mth.clamp(this.entityData.get(ROTZ) + 0.55f * (float) Math.pow(this.entityData.get(ROTZ),2), -1f, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.entityData.get(MOVEZ) >= 0) {
|
||||||
|
this.entityData.set(MOVEZ,Mth.clamp(this.entityData.get(MOVEZ) - 0.1f, 0, 1));
|
||||||
|
} else {
|
||||||
|
this.entityData.set(MOVEZ,Mth.clamp(this.entityData.get(MOVEZ) + 0.1f, -1, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.getPersistentData().getBoolean("up")) {
|
if (this.getPersistentData().getBoolean("up")) {
|
||||||
this.moveY = -1.5f;
|
this.entityData.set(MOVEY,-1.5f);
|
||||||
}
|
}
|
||||||
if (this.getPersistentData().getBoolean("down")) {
|
if (this.getPersistentData().getBoolean("down")) {
|
||||||
this.moveY = 1.5f;
|
this.entityData.set(MOVEY,1.5f);
|
||||||
}
|
}
|
||||||
|
if (this.entityData.get(MOVEY) >= 0) {
|
||||||
if (!this.getPersistentData().getBoolean("up") && !this.getPersistentData().getBoolean("down")) {
|
this.entityData.set(MOVEY,Mth.clamp(this.entityData.get(MOVEY) - 0.3f, 0, 1));
|
||||||
if (this.moveY >= 0) {
|
|
||||||
this.moveY = Mth.clamp(this.moveY - 0.3f, 0, 1);
|
|
||||||
} else {
|
} else {
|
||||||
this.moveY = Mth.clamp(this.moveY + 0.3f, -1, 0);
|
this.entityData.set(MOVEY,Mth.clamp(this.entityData.get(MOVEY)+ 0.3f, -1, 0));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LivingEntity control = this.level().getEntitiesOfClass(Player.class, this.getBoundingBox().inflate(512))
|
this.setDeltaMovement(new Vec3(
|
||||||
.stream().filter(e -> e.getStringUUID().equals(this.entityData.get(CONTROLLER))).findFirst().orElse(null);
|
this.getDeltaMovement().x + -this.entityData.get(MOVEZ) * 0.1f * this.getLookAngle().x,
|
||||||
|
this.getDeltaMovement().y + -this.entityData.get(MOVEY) * 0.05f,
|
||||||
|
this.getDeltaMovement().z + -this.entityData.get(MOVEZ) * 0.1f * this.getLookAngle().z
|
||||||
|
));
|
||||||
|
|
||||||
this.move = this.getPersistentData().getBoolean("left")
|
this.move = this.getPersistentData().getBoolean("left")
|
||||||
|| this.getPersistentData().getBoolean("right")
|
|| this.getPersistentData().getBoolean("right")
|
||||||
|
@ -220,6 +258,16 @@ public class DroneEntity extends PathfinderMob implements GeoEntity {
|
||||||
|| this.getPersistentData().getBoolean("up")
|
|| this.getPersistentData().getBoolean("up")
|
||||||
|| this.getPersistentData().getBoolean("down");
|
|| this.getPersistentData().getBoolean("down");
|
||||||
|
|
||||||
|
Vec3 vec = this.getDeltaMovement();
|
||||||
|
if (this.getDeltaMovement().horizontalDistanceSqr() < 0.75) {
|
||||||
|
if (this.move) {
|
||||||
|
this.setDeltaMovement(vec.multiply(1.04, 1, 1.04));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LivingEntity control = this.level().getEntitiesOfClass(Player.class, this.getBoundingBox().inflate(512))
|
||||||
|
.stream().filter(e -> e.getStringUUID().equals(this.entityData.get(CONTROLLER))).findFirst().orElse(null);
|
||||||
|
|
||||||
if (!this.onGround()) {
|
if (!this.onGround()) {
|
||||||
this.level().playSound(null, this.getOnPos(), ModSounds.DRONE_SOUND.get(), SoundSource.AMBIENT, 3, 1);
|
this.level().playSound(null, this.getOnPos(), ModSounds.DRONE_SOUND.get(), SoundSource.AMBIENT, 3, 1);
|
||||||
if (control != null) {
|
if (control != null) {
|
||||||
|
@ -230,12 +278,6 @@ public class DroneEntity extends PathfinderMob implements GeoEntity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec3 vec = this.getDeltaMovement();
|
|
||||||
if (this.getDeltaMovement().horizontalDistanceSqr() < 1) {
|
|
||||||
if (this.move) {
|
|
||||||
this.setDeltaMovement(vec.multiply(1.04, 1, 1.04));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.getPersistentData().getBoolean("firing")) {
|
if (this.getPersistentData().getBoolean("firing")) {
|
||||||
if (control instanceof Player player) {
|
if (control instanceof Player player) {
|
||||||
|
@ -349,23 +391,21 @@ public class DroneEntity extends PathfinderMob implements GeoEntity {
|
||||||
this.setRot(this.getYRot(), this.getXRot());
|
this.setRot(this.getYRot(), this.getXRot());
|
||||||
this.yBodyRot = control.getYRot();
|
this.yBodyRot = control.getYRot();
|
||||||
this.yHeadRot = control.getYRot();
|
this.yHeadRot = control.getYRot();
|
||||||
this.setMaxUpStep(1.0F);
|
this.setSpeed((float) this.getAttributeValue(Attributes.MOVEMENT_SPEED));
|
||||||
this.setSpeed(4 * (float) this.getAttributeValue(Attributes.MOVEMENT_SPEED));
|
float strafe = -this.entityData.get(MOVEX);
|
||||||
float forward = -moveZ;
|
super.travel(new Vec3(2 * strafe, -this.entityData.get(MOVEY), -this.entityData.get(MOVEZ)));
|
||||||
float upDown = -moveY;
|
|
||||||
float strafe = -moveX;
|
|
||||||
super.travel(new Vec3(2 * strafe, 2 * upDown, 2 * forward));
|
|
||||||
Vec3 vec3 = this.getDeltaMovement();
|
Vec3 vec3 = this.getDeltaMovement();
|
||||||
|
if (this.onGround()) {
|
||||||
|
this.setDeltaMovement(vec3.multiply(0.7, 0.98, 0.7));
|
||||||
|
} else {
|
||||||
|
this.setDeltaMovement(vec3.multiply(1.04, 0.98, 1.04));
|
||||||
|
}
|
||||||
if (!this.move) {
|
if (!this.move) {
|
||||||
this.setDeltaMovement(vec3.multiply(0.9, 0.8, 0.9));
|
this.setDeltaMovement(vec3.multiply(0.9, 0.8, 0.9));
|
||||||
} else {
|
|
||||||
this.setDeltaMovement(vec3.multiply(1.05, 0.99, 1.05));
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setMaxUpStep(0.5F);
|
|
||||||
super.travel(dir);
|
super.travel(dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -441,12 +481,12 @@ public class DroneEntity extends PathfinderMob implements GeoEntity {
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
AttributeSupplier.Builder builder = Mob.createMobAttributes();
|
AttributeSupplier.Builder builder = Mob.createMobAttributes();
|
||||||
builder = builder.add(Attributes.MOVEMENT_SPEED, 0.1);
|
builder = builder.add(Attributes.MOVEMENT_SPEED, 0);
|
||||||
builder = builder.add(Attributes.MAX_HEALTH, 4);
|
builder = builder.add(Attributes.MAX_HEALTH, 4);
|
||||||
builder = builder.add(Attributes.ARMOR, 0);
|
builder = builder.add(Attributes.ARMOR, 0);
|
||||||
builder = builder.add(Attributes.ATTACK_DAMAGE, 0);
|
builder = builder.add(Attributes.ATTACK_DAMAGE, 0);
|
||||||
builder = builder.add(Attributes.FOLLOW_RANGE, 64);
|
builder = builder.add(Attributes.FOLLOW_RANGE, 64);
|
||||||
builder = builder.add(Attributes.FLYING_SPEED, 0.1);
|
builder = builder.add(Attributes.FLYING_SPEED, 10);
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,15 +4,12 @@ import net.mcreator.superbwarfare.ModUtils;
|
||||||
import software.bernie.geckolib.core.animatable.model.CoreGeoBone;
|
import software.bernie.geckolib.core.animatable.model.CoreGeoBone;
|
||||||
import software.bernie.geckolib.core.animation.AnimationState;
|
import software.bernie.geckolib.core.animation.AnimationState;
|
||||||
import software.bernie.geckolib.model.GeoModel;
|
import software.bernie.geckolib.model.GeoModel;
|
||||||
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
|
||||||
import net.mcreator.superbwarfare.entity.DroneEntity;
|
import net.mcreator.superbwarfare.entity.DroneEntity;
|
||||||
|
import static net.mcreator.superbwarfare.entity.DroneEntity.*;
|
||||||
import static net.mcreator.superbwarfare.entity.DroneEntity.AMMO;
|
|
||||||
import static net.mcreator.superbwarfare.entity.DroneEntity.KAMIKAZE;
|
|
||||||
|
|
||||||
public class DroneModel extends GeoModel<DroneEntity> {
|
public class DroneModel extends GeoModel<DroneEntity> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResourceLocation getAnimationResource(DroneEntity entity) {
|
public ResourceLocation getAnimationResource(DroneEntity entity) {
|
||||||
return new ResourceLocation(ModUtils.MODID, "animations/drone.animation.json");
|
return new ResourceLocation(ModUtils.MODID, "animations/drone.animation.json");
|
||||||
|
@ -37,6 +34,7 @@ public class DroneModel extends GeoModel<DroneEntity> {
|
||||||
CoreGeoBone ammo5 = getAnimationProcessor().getBone("ammo5");
|
CoreGeoBone ammo5 = getAnimationProcessor().getBone("ammo5");
|
||||||
CoreGeoBone ammo6 = getAnimationProcessor().getBone("ammo6");
|
CoreGeoBone ammo6 = getAnimationProcessor().getBone("ammo6");
|
||||||
CoreGeoBone shell = getAnimationProcessor().getBone("shell");
|
CoreGeoBone shell = getAnimationProcessor().getBone("shell");
|
||||||
|
CoreGeoBone body = getAnimationProcessor().getBone("0");
|
||||||
|
|
||||||
ammo6.setHidden(animatable.getEntityData().get(AMMO) <= 5);
|
ammo6.setHidden(animatable.getEntityData().get(AMMO) <= 5);
|
||||||
ammo5.setHidden(animatable.getEntityData().get(AMMO) <= 4);
|
ammo5.setHidden(animatable.getEntityData().get(AMMO) <= 4);
|
||||||
|
@ -45,5 +43,9 @@ public class DroneModel extends GeoModel<DroneEntity> {
|
||||||
ammo2.setHidden(animatable.getEntityData().get(AMMO) <= 1);
|
ammo2.setHidden(animatable.getEntityData().get(AMMO) <= 1);
|
||||||
ammo1.setHidden(animatable.getEntityData().get(AMMO) <= 0);
|
ammo1.setHidden(animatable.getEntityData().get(AMMO) <= 0);
|
||||||
shell.setHidden(!animatable.getEntityData().get(KAMIKAZE));
|
shell.setHidden(!animatable.getEntityData().get(KAMIKAZE));
|
||||||
|
|
||||||
|
|
||||||
|
body.setRotZ(animatable.getEntityData().get(ROTX));
|
||||||
|
body.setRotX(animatable.getEntityData().get(ROTZ));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,9 @@ import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
import net.minecraftforge.fml.common.Mod;
|
import net.minecraftforge.fml.common.Mod;
|
||||||
|
|
||||||
|
import static net.mcreator.superbwarfare.entity.DroneEntity.ROTX;
|
||||||
|
import static net.mcreator.superbwarfare.entity.DroneEntity.ROTZ;
|
||||||
|
|
||||||
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT)
|
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT)
|
||||||
public class ClientEventHandler {
|
public class ClientEventHandler {
|
||||||
|
|
||||||
|
@ -48,6 +51,9 @@ public class ClientEventHandler {
|
||||||
|
|
||||||
data.putDouble("Cannon_xRot", Mth.clamp(0.2 * xRot, -3, 3));
|
data.putDouble("Cannon_xRot", Mth.clamp(0.2 * xRot, -3, 3));
|
||||||
data.putDouble("Cannon_yRot", Mth.clamp(1 * yRot, -15, 15));
|
data.putDouble("Cannon_yRot", Mth.clamp(1 * yRot, -15, 15));
|
||||||
|
|
||||||
|
data.putDouble("droneCameraRotX", Mth.clamp(0.5f * xRot, -10, 10));
|
||||||
|
data.putDouble("droneCameraRotY", Mth.clamp(0.25f * yRot, -20, 10));
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
|
@ -57,6 +63,12 @@ public class ClientEventHandler {
|
||||||
if (level != null && entity instanceof LivingEntity living && entity.isPassenger() && entity.getVehicle() instanceof Mk42Entity) {
|
if (level != null && entity instanceof LivingEntity living && entity.isPassenger() && entity.getVehicle() instanceof Mk42Entity) {
|
||||||
handleCannonCamera(event, living);
|
handleCannonCamera(event, living);
|
||||||
}
|
}
|
||||||
|
if (level != null && entity instanceof LivingEntity living
|
||||||
|
&& living.getMainHandItem().is(ModItems.MONITOR.get())
|
||||||
|
&& living.getMainHandItem().getOrCreateTag().getBoolean("Using")
|
||||||
|
&& living.getMainHandItem().getOrCreateTag().getBoolean("Linked")) {
|
||||||
|
handleDroneCamera(event, living);
|
||||||
|
}
|
||||||
if (level != null && entity instanceof LivingEntity living && living.getMainHandItem().is(ModTags.Items.GUN)) {
|
if (level != null && entity instanceof LivingEntity living && living.getMainHandItem().is(ModTags.Items.GUN)) {
|
||||||
handleWeaponCrossHair(living);
|
handleWeaponCrossHair(living);
|
||||||
handleWeaponSway(living);
|
handleWeaponSway(living);
|
||||||
|
@ -69,6 +81,36 @@ public class ClientEventHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void handleDroneCamera(ViewportEvent.ComputeCameraAngles event, LivingEntity entity) {
|
||||||
|
var data = entity.getPersistentData();
|
||||||
|
ItemStack stack = entity.getMainHandItem();
|
||||||
|
double pitch = event.getPitch();
|
||||||
|
double roll = event.getRoll();
|
||||||
|
|
||||||
|
DroneEntity drone = entity.level().getEntitiesOfClass(DroneEntity.class, entity.getBoundingBox().inflate(512))
|
||||||
|
.stream().filter(e -> e.getStringUUID().equals(stack.getOrCreateTag().getString("LinkedDrone"))).findFirst().orElse(null);
|
||||||
|
|
||||||
|
if (drone != null) {
|
||||||
|
|
||||||
|
if (data.getDouble("droneRotZ") > drone.getEntityData().get(ROTZ)) {
|
||||||
|
data.putDouble("droneRotZ", Mth.clamp(data.getDouble("droneRotZ") - 0.3 * Math.pow(drone.getEntityData().get(ROTZ) - data.getDouble("droneRotZ"), 2),drone.getEntityData().get(ROTZ),Double.POSITIVE_INFINITY));
|
||||||
|
} else {
|
||||||
|
data.putDouble("droneRotZ", Mth.clamp(data.getDouble("droneRotZ") + 0.3 * Math.pow(drone.getEntityData().get(ROTZ) - data.getDouble("droneRotZ"), 2),Double.NEGATIVE_INFINITY,drone.getEntityData().get(ROTZ)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.getDouble("droneRotX") > drone.getEntityData().get(ROTX)) {
|
||||||
|
data.putDouble("droneRotX", Mth.clamp(data.getDouble("droneRotX") - 0.2 * Math.pow(drone.getEntityData().get(ROTX) - data.getDouble("droneRotX"), 2),drone.getEntityData().get(ROTX),Double.POSITIVE_INFINITY));
|
||||||
|
} else {
|
||||||
|
data.putDouble("droneRotX", Mth.clamp(data.getDouble("droneRotX") + 0.2 * Math.pow(drone.getEntityData().get(ROTX) - data.getDouble("droneRotX"), 2),Double.NEGATIVE_INFINITY,drone.getEntityData().get(ROTX)));
|
||||||
|
}
|
||||||
|
|
||||||
|
event.setPitch((float) (pitch + data.getDouble("droneCameraRotX") - 0.45f * Mth.RAD_TO_DEG * data.getDouble("droneRotZ")));
|
||||||
|
event.setRoll((float) (roll + data.getDouble("droneCameraRotY") - 0.8f * Mth.RAD_TO_DEG * data.getDouble("droneRotX")));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
private static void handleCannonCamera(ViewportEvent.ComputeCameraAngles event, LivingEntity entity) {
|
private static void handleCannonCamera(ViewportEvent.ComputeCameraAngles event, LivingEntity entity) {
|
||||||
var data = entity.getPersistentData();
|
var data = entity.getPersistentData();
|
||||||
double yaw = event.getYaw();
|
double yaw = event.getYaw();
|
||||||
|
|
|
@ -10,42 +10,26 @@
|
||||||
"bones": {
|
"bones": {
|
||||||
"wing": {
|
"wing": {
|
||||||
"rotation": {
|
"rotation": {
|
||||||
"0.0": {
|
"0.0": [0, 0, 0],
|
||||||
"vector": [0, 0, 0]
|
"0.125": [0, 360, 0]
|
||||||
},
|
|
||||||
"0.125": {
|
|
||||||
"vector": [0, 360, 0]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"wing2": {
|
"wing2": {
|
||||||
"rotation": {
|
"rotation": {
|
||||||
"0.0": {
|
"0.0": [0, 0, 0],
|
||||||
"vector": [0, 0, 0]
|
"0.125": [0, -360, 0]
|
||||||
},
|
|
||||||
"0.125": {
|
|
||||||
"vector": [0, -360, 0]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"wing3": {
|
"wing3": {
|
||||||
"rotation": {
|
"rotation": {
|
||||||
"0.0": {
|
"0.0": [0, 0, 0],
|
||||||
"vector": [0, 0, 0]
|
"0.125": [0, -360, 0]
|
||||||
},
|
|
||||||
"0.125": {
|
|
||||||
"vector": [0, -360, 0]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"wing4": {
|
"wing4": {
|
||||||
"rotation": {
|
"rotation": {
|
||||||
"0.0": {
|
"0.0": [0, 0, 0],
|
||||||
"vector": [0, 0, 0]
|
"0.125": [0, 360, 0]
|
||||||
},
|
|
||||||
"0.125": {
|
|
||||||
"vector": [0, 360, 0]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1366,10 +1366,11 @@
|
||||||
"0": {
|
"0": {
|
||||||
"rotation": {
|
"rotation": {
|
||||||
"0.125": {
|
"0.125": {
|
||||||
"vector": [0, 0, 0]
|
"vector": [0, 0, 0],
|
||||||
|
"easing": "easeInOutSine"
|
||||||
},
|
},
|
||||||
"0.2": {
|
"0.225": {
|
||||||
"vector": [2.2309, 1.32745, 5.98455]
|
"vector": [-1.07, -0.74, 6.37]
|
||||||
},
|
},
|
||||||
"0.4": {
|
"0.4": {
|
||||||
"vector": [-21.00421, 2.1987, -9.76969],
|
"vector": [-21.00421, 2.1987, -9.76969],
|
||||||
|
@ -1447,12 +1448,12 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"position": {
|
"position": {
|
||||||
"0.125": {
|
"0.0": {
|
||||||
"vector": [0, 0, 0]
|
"vector": [0, 0, 0]
|
||||||
},
|
},
|
||||||
"0.35": {
|
"0.075": {
|
||||||
"vector": [-1.28, 1.51, 2.08],
|
"vector": [0, 0, -1],
|
||||||
"easing": "easeInElastic"
|
"easing": "easeInOutSine"
|
||||||
},
|
},
|
||||||
"0.425": {
|
"0.425": {
|
||||||
"vector": [-1.36248, 1.69031, 2.10621]
|
"vector": [-1.36248, 1.69031, 2.10621]
|
||||||
|
@ -1534,11 +1535,10 @@
|
||||||
"0.0": {
|
"0.0": {
|
||||||
"vector": [0, 0, 0]
|
"vector": [0, 0, 0]
|
||||||
},
|
},
|
||||||
"0.1": {
|
"0.125": {
|
||||||
"vector": [28.632, -17.75227, 3.13551],
|
"vector": [16.99, -1.98, 2.69]
|
||||||
"easing": "linear"
|
|
||||||
},
|
},
|
||||||
"0.4": {
|
"0.325": {
|
||||||
"vector": [-3.22206, -3.30648, 2.38196],
|
"vector": [-3.22206, -3.30648, 2.38196],
|
||||||
"easing": "linear"
|
"easing": "linear"
|
||||||
},
|
},
|
||||||
|
@ -1572,11 +1572,10 @@
|
||||||
"0.0": {
|
"0.0": {
|
||||||
"vector": [0, 0, 0]
|
"vector": [0, 0, 0]
|
||||||
},
|
},
|
||||||
"0.1": {
|
"0.125": {
|
||||||
"vector": [-0.26, 1.67, 7.31],
|
"vector": [-0.06, 1.39, 2.39]
|
||||||
"easing": "linear"
|
|
||||||
},
|
},
|
||||||
"0.4": {
|
"0.325": {
|
||||||
"vector": [-0.9, -1.5, 4.8],
|
"vector": [-0.9, -1.5, 4.8],
|
||||||
"easing": "linear"
|
"easing": "linear"
|
||||||
},
|
},
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
{
|
{
|
||||||
"name": "0",
|
"name": "0",
|
||||||
"parent": "bone",
|
"parent": "bone",
|
||||||
"pivot": [0, 0.5, 0]
|
"pivot": [0, 2.2, 0]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "body",
|
"name": "body",
|
||||||
|
@ -3320,8 +3320,6 @@
|
||||||
{
|
{
|
||||||
"origin": [-0.15062, -0.11639, 3.50804],
|
"origin": [-0.15062, -0.11639, 3.50804],
|
||||||
"size": [0.30349, 0.9159, 1.97267],
|
"size": [0.30349, 0.9159, 1.97267],
|
||||||
"pivot": [0.00112, 0.34156, 4.49437],
|
|
||||||
"rotation": [0, 0, 0],
|
|
||||||
"uv": {
|
"uv": {
|
||||||
"north": {"uv": [37, 28], "uv_size": [0.25, 1]},
|
"north": {"uv": [37, 28], "uv_size": [0.25, 1]},
|
||||||
"east": {"uv": [18, 13], "uv_size": [2, 1]},
|
"east": {"uv": [18, 13], "uv_size": [2, 1]},
|
||||||
|
|
Loading…
Add table
Reference in a new issue