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 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 DATA_ID_HURT = SynchedEntityData.defineId(BicycleEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_ID_HURTDIR = SynchedEntityData.defineId(BicycleEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor 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 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) { } }