ModernLifePatch/src-source/main/java/com/dairymoose/entity/BicycleEntity.java
2024-10-26 09:40:21 +08:00

466 lines
18 KiB
Java

package com.dairymoose.entity;
import com.dairymoose.modernlife.core.CustomBlocks;
import com.dairymoose.modernlife.core.ModernLifeCommon;
import com.dairymoose.modernlife.core.ModernLifeNetwork;
import com.dairymoose.modernlife.network.play.client.ServerboundBikeDismountPacket;
import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.tags.FluidTags;
import net.minecraft.util.Mth;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityDimensions;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.entity.MoverType;
import net.minecraft.world.entity.Pose;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.HorseArmorItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.GameRules;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Fluids;
import net.minecraft.world.level.pathfinder.PathComputationType;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.network.NetworkHooks;
/* loaded from: outputsrg.jar:com/dairymoose/entity/BicycleEntity.class */
public class BicycleEntity extends Entity {
private float velocity;
private float downward_velocity;
public static final float MAX_SPEED = 0.42f;
public static final float MIN_SPEED = 0.05f;
public static final float REVERSE_MAX_SPEED = -0.14f;
public static final int TICKS_PER_JUMP = 6;
public static final float MAX_ANGLE_DELTA = 10.0f;
public static final float SPEED_INCREASE_CONSTANT = 0.0085f;
public float maxSpeedIncrease;
public Vec3 lastPos;
private float jumpStep;
public boolean recentDismount;
public float renderWheelRot;
public Vec3 lastRenderPos;
public long lastRenderTime;
public static final EntityType<BicycleEntity> BICYCLE_ENTITY = EntityType.Builder.of(BicycleEntity::new, MobCategory.MISC).sized(0.6f, 1.01f).clientTrackingRange(10).build(new ResourceLocation("modernlife", "bicycle").toString());
private static final EntityDataAccessor<Integer> DATA_ID_HURT = SynchedEntityData.defineId(BicycleEntity.class, EntityDataSerializers.INT);
private static final EntityDataAccessor<Integer> DATA_ID_HURTDIR = SynchedEntityData.defineId(BicycleEntity.class, EntityDataSerializers.INT);
private static final EntityDataAccessor<Float> DATA_ID_DAMAGE = SynchedEntityData.defineId(BicycleEntity.class, EntityDataSerializers.FLOAT);
public void setVelocity(float velocity) {
this.velocity = velocity;
}
public void setSpeedBoost(float speedBoost) {
this.maxSpeedIncrease = speedBoost;
}
public void setDownwardVelocity(float downward_velocity) {
this.downward_velocity = downward_velocity;
}
public void setJumpStep(float jumpStep) {
this.jumpStep = jumpStep;
}
public BicycleEntity(EntityType<? extends BicycleEntity> p_i50238_1_, Level p_i50238_2_) {
super(p_i50238_1_, p_i50238_2_);
this.velocity = 0.0f;
this.downward_velocity = 0.0f;
this.maxSpeedIncrease = 1.0f;
this.lastPos = null;
this.jumpStep = -1.0f;
this.recentDismount = false;
this.renderWheelRot = 0.0f;
this.lastRenderPos = null;
this.lastRenderTime = 0L;
this.maxUpStep = 1.0f;
}
public InteractionResult interact(Player player, InteractionHand hand) {
player.getItemInHand(hand);
if (isVehicle()) {
return super.interact(player, hand);
}
if (!this.level.isClientSide) {
player.setYRot(getYRot());
player.setXRot(getXRot());
player.startRiding(this);
}
return InteractionResult.sidedSuccess(this.level.isClientSide);
}
public void positionRider(Entity p_184232_1_) {
super.positionRider(p_184232_1_);
if (p_184232_1_ instanceof Mob) {
}
float f3 = Mth.sin(getYRot() * 0.017453292f);
float f = Mth.cos(getYRot() * 0.017453292f);
p_184232_1_.setPos(getX() + (0.38f * f3), getY() + getPassengersRidingOffset() + p_184232_1_.getMyRidingOffset() + 0.65f, getZ() - (0.38f * f));
if (p_184232_1_ instanceof LivingEntity) {
}
}
protected boolean canAddPassenger(Entity p_184219_1_) {
return this.velocity == 0.0f && getPassengers().size() < 1;
}
public Entity getControllingPassenger() {
if (getPassengers().isEmpty()) {
return null;
}
return (Entity) getPassengers().get(0);
}
public Vec3 getDismountLocationForPassenger(LivingEntity p_230268_1_) {
return super.getDismountLocationForPassenger(p_230268_1_);
}
protected void removePassenger(Entity p_184225_1_) {
ModernLifeCommon.LOGGER.debug(p_184225_1_.level);
this.lastPos = null;
if (p_184225_1_.level.isClientSide) {
ModernLifeNetwork.INSTANCE.sendToServer(new ServerboundBikeDismountPacket(position(), this.jumpStep, this.velocity, this.downward_velocity, getId()));
}
super.removePassenger(p_184225_1_);
}
protected void addPassenger(Entity p_184200_1_) {
this.lastPos = null;
super.addPassenger(p_184200_1_);
}
protected float getEyeHeight(Pose p_213316_1_, EntityDimensions p_213316_2_) {
return p_213316_2_.height;
}
private float angularDifference(float angle1, float angle2) {
float angle12 = angle1 % 360.0f;
if (angle12 < 0.0f) {
angle12 += 360.0f;
}
float angle22 = angle2 % 360.0f;
if (angle22 < 0.0f) {
angle22 += 360.0f;
}
float diff = angle22 - angle12;
if (diff > 180.0f) {
diff = -(360.0f - diff);
} else if (diff < -180.0f) {
diff = 360.0f + diff;
}
return diff;
}
private void applyNewFacing(float facing) {
setYRot(facing);
setRot(getYRot(), getXRot());
}
protected void clampRotation(Entity p_184454_1_) {
if (p_184454_1_ != null) {
p_184454_1_.setYBodyRot(getYRot());
float f = Mth.wrapDegrees(p_184454_1_.getYRot() - getYRot());
float f1 = Mth.clamp(f, -105.0f, 105.0f);
p_184454_1_.setYRot((p_184454_1_.getYRot() + f1) - f);
p_184454_1_.setYHeadRot(p_184454_1_.getYRot());
}
}
protected void checkFallDamage(double p_184231_1_, boolean p_184231_3_, BlockState p_184231_4_, BlockPos p_184231_5_) {
this.fallDistance *= 0.88f;
super.checkFallDamage(p_184231_1_, p_184231_3_, p_184231_4_, p_184231_5_);
}
public void setDamage(float p_70266_1_) {
this.entityData.set(DATA_ID_DAMAGE, Float.valueOf(p_70266_1_));
}
public float getDamage() {
return ((Float) this.entityData.get(DATA_ID_DAMAGE)).floatValue();
}
public void setHurtTime(int p_70265_1_) {
this.entityData.set(DATA_ID_HURT, Integer.valueOf(p_70265_1_));
}
public int getHurtTime() {
return ((Integer) this.entityData.get(DATA_ID_HURT)).intValue();
}
public int getHurtDir() {
return ((Integer) this.entityData.get(DATA_ID_HURTDIR)).intValue();
}
public void setHurtDir(int p_70269_1_) {
this.entityData.set(DATA_ID_HURTDIR, Integer.valueOf(p_70269_1_));
}
public Item getDropItem() {
return CustomBlocks.ITEM_BICYCLE.get();
}
@OnlyIn(Dist.CLIENT)
public void animateHurt() {
setHurtDir(-getHurtDir());
setHurtTime(10);
setDamage(getDamage() * 11.0f);
}
public boolean hurt(DamageSource p_70097_1_, float p_70097_2_) {
if (isInvulnerableTo(p_70097_1_)) {
return false;
}
if (!this.level.isClientSide && !isRemoved()) {
setHurtDir(-getHurtDir());
setHurtTime(10);
setDamage(getDamage() + (p_70097_2_ * 20.0f));
markHurt();
boolean flag = (p_70097_1_.getEntity() instanceof Player) && p_70097_1_.getEntity().getAbilities().instabuild;
if (flag || getDamage() > 40.0f) {
if (!flag && this.level.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) {
spawnAtLocation(getDropItem());
}
remove(RemovalReason.DISCARDED);
return true;
}
return true;
}
return true;
}
public void advanceMovement(LivingEntity livingEntity, float speed, boolean jumping) {
if (this.lastPos != null) {
double positionDelta = position().distanceTo(this.lastPos);
if (positionDelta <= 0.04d) {
if (this.velocity >= 0.05f) {
this.velocity *= 0.2f;
}
if (positionDelta <= 0.01d) {
this.downward_velocity = 0.0f;
}
}
}
if (this.downward_velocity == 0.0f) {
this.velocity *= 0.985f;
} else {
this.velocity *= 0.998f;
}
if (speed != 0.0d && this.downward_velocity == 0.0f) {
float speedIncrease = 0.0085f;
if (speed < 0.0f) {
speedIncrease = 0.0085f * 0.75f;
}
float increment = speed * speedIncrease;
this.velocity += increment;
if (this.velocity > 0.42f * this.maxSpeedIncrease) {
this.velocity = 0.42f * this.maxSpeedIncrease;
} else if (this.velocity < (-0.14f) * this.maxSpeedIncrease) {
this.velocity = (-0.14f) * this.maxSpeedIncrease;
}
} else if (this.velocity > 0.0f && this.velocity <= 0.05f) {
this.velocity = 0.0f;
} else if (this.velocity < 0.0f && this.velocity >= -0.05f) {
this.velocity = 0.0f;
}
if (this.maxSpeedIncrease > 1.0f) {
this.maxSpeedIncrease = 1.0f;
}
if (this.level.getFluidState(blockPosition()).getType() != Fluids.EMPTY) {
this.velocity = (float) (this.velocity * 0.9d);
}
if (isEyeInFluid(FluidTags.WATER) || isEyeInFluid(FluidTags.LAVA)) {
this.downward_velocity = (float) (this.downward_velocity * 0.2d);
}
if (this.velocity != 0.0f && livingEntity != null && this.downward_velocity == 0.0f) {
float facingAngle = livingEntity.getYRot();
float livingYRot = livingEntity.getYRot();
float bikeYRot = getYRot();
float angleDelta = angularDifference(bikeYRot, livingYRot);
if (Math.abs(angleDelta) > 10.0f) {
if (angleDelta > 0.0f) {
facingAngle = bikeYRot + Math.min(Math.abs(angleDelta), 10.0f);
} else {
facingAngle = bikeYRot - Math.min(Math.abs(angleDelta), 10.0f);
}
}
applyNewFacing(facingAngle);
}
BlockState currentState = this.level.getBlockState(blockPosition());
BlockState currentBelowState = this.level.getBlockState(blockPosition().below());
float friction = currentBelowState.getFriction(this.level, blockPosition().below(), this);
float frictionPercent = (friction - 0.6f) / 0.4f;
float frictionSlowdownFactor = 1.0f - (0.012f * frictionPercent);
this.velocity *= frictionSlowdownFactor;
setDeltaMovement(this.velocity * Math.cos(Math.toRadians(getYRot() + 90.0f)), -this.downward_velocity, this.velocity * Math.sin(Math.toRadians(getYRot() + 90.0f)));
if (isPushedByFluid()) {
Vec3 fluidFlow = this.level.getFluidState(blockPosition()).getFlow(this.level, blockPosition());
setDeltaMovement(getDeltaMovement().add(fluidFlow.scale(0.01d)));
}
Vec3 moveToVec = position().add(new Vec3(getDeltaMovement().x, 0.0d, getDeltaMovement().z).scale(2.0d));
BlockPos moveToPos = new BlockPos(moveToVec.x, moveToVec.y, moveToVec.z);
BlockState moveToState = this.level.getBlockState(moveToPos);
BlockState moveToAboveState = this.level.getBlockState(moveToPos.above());
this.level.getBlockState(moveToPos.below());
moveToState.getBlock().isPathfindable(moveToState, this.level, moveToPos, PathComputationType.LAND);
moveToAboveState.getBlock().isPathfindable(moveToAboveState, this.level, moveToPos.above(), PathComputationType.LAND);
BlockState stateToCheck = currentState;
BlockPos posToCheck = blockPosition();
if (stateToCheck.isAir()) {
stateToCheck = currentBelowState;
posToCheck = posToCheck.below();
}
double currentHeight = 0.0d;
VoxelShape groundShape = stateToCheck.getBlock().getCollisionShape(stateToCheck, this.level, posToCheck, CollisionContext.empty());
if (!groundShape.equals(Shapes.empty())) {
currentHeight = groundShape.max(Direction.Axis.Y);
}
double moveToHeight = 0.0d;
VoxelShape moveToShape = moveToState.getBlock().getCollisionShape(moveToState, this.level, moveToPos, CollisionContext.empty());
if (!moveToShape.equals(Shapes.empty())) {
moveToHeight = moveToShape.max(Direction.Axis.Y);
}
double jumpHeight = 0.0d;
if (jumping && this.downward_velocity == 0.0f && this.jumpStep < 0.0f) {
this.jumpStep = 0.0f;
}
if (this.jumpStep >= 0.0f) {
jumpHeight = 0.4d * (this.velocity / 0.42f) * Math.sin(Math.toRadians(this.jumpStep));
this.jumpStep += 30.0f;
}
if (this.jumpStep >= 180.0f) {
this.jumpStep = -1.0f;
}
double d = moveToHeight - currentHeight;
double groundY = posToCheck.getY() + currentHeight;
if (!currentState.isAir()) {
}
if (currentBelowState.isAir() || position().y > groundY) {
this.downward_velocity += 0.03f;
} else {
if (this.downward_velocity != 0.0f && currentBelowState.getFluidState().isEmpty()) {
if (livingEntity != null) {
applyNewFacing(livingEntity.getYRot());
}
float damageDone = this.downward_velocity * 1.12f;
if (damageDone <= 1.0f || livingEntity != null) {
}
if (livingEntity instanceof Player) {
Player Player = (Player) livingEntity;
if (damageDone >= 1.0d) {
this.level.playSound(Player, blockPosition(), SoundEvents.GENERIC_BIG_FALL, SoundSource.PLAYERS, 0.25f, 1.0f);
} else if (damageDone > 0.2d) {
this.level.playSound(Player, blockPosition(), SoundEvents.GENERIC_SMALL_FALL, SoundSource.PLAYERS, 0.25f, 1.0f);
}
}
}
this.downward_velocity = 0.0f;
}
setDeltaMovement(getDeltaMovement().x, (-this.downward_velocity) + jumpHeight, getDeltaMovement().z);
this.lastPos = position();
if ((this.level instanceof ServerLevel) || (isVehicle() && isControlledByLocalInstance())) {
getDeltaMovement();
if (this.downward_velocity == 0.0f) {
Vec3 mov = getDeltaMovement();
setDeltaMovement(mov.x, mov.y - 0.01d, mov.z);
}
move(MoverType.SELF, getDeltaMovement());
}
setPacketCoordinates(getX(), getY(), getZ());
}
public void tick() {
boolean jumping = false;
float speed = 0.0f;
if (getHurtTime() > 0) {
setHurtTime(getHurtTime() - 1);
}
if (getDamage() > 0.0f) {
setDamage(getDamage() - 1.0f);
}
if (this.level.isClientSide) {
LivingEntity livingEntity = (LivingEntity) getControllingPassenger();
if (isVehicle() && isControlledByLocalInstance()) {
float f = livingEntity.xxa;
float zDelta = livingEntity.zza;
if (Minecraft.getInstance().options.keyJump.isDown()) {
jumping = true;
}
speed = (0.0f * 0.0f) + (zDelta * zDelta);
double headingDegrees = Math.toDegrees(Math.atan2(zDelta, 0.0f));
if (headingDegrees < 0.0d) {
speed = -speed;
}
}
advanceMovement(livingEntity, speed, jumping);
} else if (this.velocity > 0.0f || this.downward_velocity > 0.0f) {
advanceMovement(null, 0.0f, false);
if (this.velocity == 0.0f && this.recentDismount) {
this.recentDismount = false;
}
}
super.tick();
}
public boolean canBeCollidedWith() {
return true;
}
public boolean isPushable() {
return true;
}
public double getPassengersRidingOffset() {
return -0.15d;
}
public boolean isPickable() {
return !isRemoved();
}
public boolean canWearArmor() {
return true;
}
public boolean isArmor(ItemStack p_190682_1_) {
return p_190682_1_.getItem() instanceof HorseArmorItem;
}
public Packet<?> getAddEntityPacket() {
return NetworkHooks.getEntitySpawningPacket(this);
}
protected void defineSynchedData() {
this.entityData.define(DATA_ID_HURT, 0);
this.entityData.define(DATA_ID_HURTDIR, 1);
this.entityData.define(DATA_ID_DAMAGE, Float.valueOf(0.0f));
}
protected void readAdditionalSaveData(CompoundTag var1) {
}
protected void addAdditionalSaveData(CompoundTag var1) {
}
}