mirror of
https://github.com/neoStudiosLCE/neoLegacy.git
synced 2026-06-08 23:13:00 +00:00
fix armor stands no gravity field
This commit is contained in:
parent
a465d22390
commit
76000424e1
|
|
@ -16,6 +16,7 @@
|
|||
#include "ParticleTypes.h"
|
||||
#include "Random.h"
|
||||
#include "AABB.h"
|
||||
#include "../Minecraft.World/LevelChunk.h"
|
||||
|
||||
const Rotations ArmorStand::DEFAULT_HEAD_POSE (0.0f, 0.0f, 0.0f);
|
||||
const Rotations ArmorStand::DEFAULT_BODY_POSE (0.0f, 0.0f, 0.0f);
|
||||
|
|
@ -192,11 +193,98 @@ void ArmorStand::updateInvisibilityStatus()
|
|||
setInvisible(invisible);
|
||||
}
|
||||
|
||||
void ArmorStand::travel(float xa, float ya)
|
||||
{
|
||||
if (hasPhysics()) {
|
||||
float friction = 0.91f;
|
||||
int frictionTile = 0;
|
||||
if (onGround)
|
||||
{
|
||||
frictionTile = level->getTile(Mth::floor(x), Mth::floor(bb->y0) - 1, Mth::floor(z));
|
||||
friction = 0.6f * 0.91f;
|
||||
if (frictionTile > 0)
|
||||
{
|
||||
friction = Tile::tiles[frictionTile]->friction * 0.91f;
|
||||
}
|
||||
}
|
||||
|
||||
float friction2 = (0.6f * 0.6f * 0.91f * 0.91f * 0.6f * 0.91f) / (friction * friction * friction);
|
||||
|
||||
float speed;
|
||||
if (onGround)
|
||||
{
|
||||
speed = getSpeed() * friction2;
|
||||
}
|
||||
else
|
||||
{
|
||||
speed = flyingSpeed;
|
||||
}
|
||||
|
||||
moveRelative(xa, ya, speed);
|
||||
|
||||
friction = 0.91f;
|
||||
if (onGround)
|
||||
{
|
||||
friction = 0.6f * 0.91f;
|
||||
if (frictionTile > 0)
|
||||
{
|
||||
friction = Tile::tiles[frictionTile]->friction * 0.91f;
|
||||
}
|
||||
}
|
||||
if (onLadder())
|
||||
{
|
||||
float max = 0.15f;
|
||||
if (xd < -max) xd = -max;
|
||||
if (xd > max) xd = max;
|
||||
if (zd < -max) zd = -max;
|
||||
if (zd > max) zd = max;
|
||||
fallDistance = 0;
|
||||
if (yd < -0.15) yd = -0.15;
|
||||
bool playerSneaking = isSneaking() && this->instanceof(eTYPE_PLAYER);
|
||||
if (playerSneaking && yd < 0) yd = 0;
|
||||
}
|
||||
|
||||
move(xd, yd, zd);
|
||||
|
||||
if (horizontalCollision && onLadder())
|
||||
{
|
||||
yd = 0.2;
|
||||
}
|
||||
|
||||
if (!level->isClientSide || (level->hasChunkAt(static_cast<int>(x), 0, static_cast<int>(z)) && level->getChunkAt(static_cast<int>(x), static_cast<int>(z))->loaded))
|
||||
{
|
||||
yd -= 0.08;
|
||||
}
|
||||
else if (y > 0)
|
||||
{
|
||||
yd = -0.1;
|
||||
}
|
||||
else
|
||||
{
|
||||
yd = 0;
|
||||
}
|
||||
|
||||
yd *= 0.98f;
|
||||
xd *= friction;
|
||||
zd *= friction;
|
||||
|
||||
walkAnimSpeedO = walkAnimSpeed;
|
||||
double xxd = x - xo;
|
||||
double zzd = z - zo;
|
||||
float wst = Mth::sqrt(xxd * xxd + zzd * zzd) * 4;
|
||||
if (wst > 1) wst = 1;
|
||||
walkAnimSpeed += (wst - walkAnimSpeed) * 0.4f;
|
||||
walkAnimPos += walkAnimSpeed;
|
||||
} else {
|
||||
move(xd, yd, zd);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ArmorStand::tick()
|
||||
{
|
||||
float lockedRot = this->yRot;
|
||||
if (hasPhysics()) LivingEntity::tick();
|
||||
LivingEntity::tick();
|
||||
if (onGround)
|
||||
{
|
||||
BlockPos pos((int)floorf(x), (int)floorf(y) - 1, (int)floorf(z));
|
||||
|
|
|
|||
|
|
@ -147,6 +147,8 @@ public:
|
|||
void updateBoundingBox(bool markerMode);
|
||||
void updateInvisibilityStatus();
|
||||
|
||||
virtual void travel(float xz, float ya);
|
||||
|
||||
virtual shared_ptr<ItemInstance> getCarriedItem() override;
|
||||
virtual shared_ptr<ItemInstance> getCarried(int slot) override;
|
||||
virtual shared_ptr<ItemInstance> getArmor(int pos) override;
|
||||
|
|
|
|||
|
|
@ -51,9 +51,10 @@ public:
|
|||
static const int DATA_ARROW_COUNT_ID = 9;
|
||||
|
||||
private:
|
||||
BaseAttributeMap* attributes;
|
||||
CombatTracker* combatTracker;
|
||||
unordered_map<int, MobEffectInstance*> activeEffects;
|
||||
protected:
|
||||
BaseAttributeMap* attributes;
|
||||
ItemInstanceArray lastEquipment;
|
||||
|
||||
public:
|
||||
|
|
|
|||
Loading…
Reference in a new issue