mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-17 03:25:14 -04:00
Fix skating effect with liquids.
This commit is contained in:
parent
00945a6095
commit
eb73f460ab
@ -51,24 +51,11 @@ namespace ClassicalSharp {
|
|||||||
|
|
||||||
public abstract void Render( double deltaTime, float t );
|
public abstract void Render( double deltaTime, float t );
|
||||||
|
|
||||||
public bool TouchesAnyLava() {
|
|
||||||
return TouchesAny( b => b == (byte)Block.Lava || b == (byte)Block.StillLava );
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool TouchesAnyRope() {
|
|
||||||
return TouchesAny( b => b == (byte)Block.Rope );
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool TouchesAnyWater() {
|
|
||||||
return TouchesAny( b => b == (byte)Block.Water || b == (byte)Block.StillWater );
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool TouchesAnyOf( byte blockType ) {
|
|
||||||
return TouchesAny( b => b == blockType );
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool TouchesAny( Predicate<byte> condition ) {
|
public bool TouchesAny( Predicate<byte> condition ) {
|
||||||
BoundingBox bounds = CollisionBounds;
|
return TouchesAny( CollisionBounds, condition );
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool TouchesAny( BoundingBox bounds, Predicate<byte> condition ) {
|
||||||
Vector3I bbMin = Vector3I.Floor( bounds.Min );
|
Vector3I bbMin = Vector3I.Floor( bounds.Min );
|
||||||
Vector3I bbMax = Vector3I.Floor( bounds.Max );
|
Vector3I bbMax = Vector3I.Floor( bounds.Max );
|
||||||
|
|
||||||
@ -91,5 +78,19 @@ namespace ClassicalSharp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public const float Adjustment = 0.001f;
|
public const float Adjustment = 0.001f;
|
||||||
|
protected bool TouchesAnyLava() {
|
||||||
|
return TouchesAny( CollisionBounds,
|
||||||
|
b => b == (byte)Block.Lava || b == (byte)Block.StillLava );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected bool TouchesAnyRope() {
|
||||||
|
return TouchesAny( CollisionBounds,
|
||||||
|
b => b == (byte)Block.Rope );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected bool TouchesAnyWater() {
|
||||||
|
return TouchesAny( CollisionBounds,
|
||||||
|
b => b == (byte)Block.Water || b == (byte)Block.StillWater );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -123,8 +123,19 @@ namespace ClassicalSharp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( jumping ) {
|
if( jumping ) {
|
||||||
|
Vector3I p = Vector3I.Floor( Position );
|
||||||
|
|
||||||
if( TouchesAnyWater() || TouchesAnyLava() ) {
|
if( TouchesAnyWater() || TouchesAnyLava() ) {
|
||||||
|
BoundingBox bounds = CollisionBounds;
|
||||||
|
bounds.Min.Y += 1;
|
||||||
|
|
||||||
|
bool isAir = !TouchesAny( bounds,
|
||||||
|
b => info.CollideType[b] != BlockCollideType.WalkThrough );
|
||||||
|
bool pastJumpPoint = Position.Y % 1 >= 0.4;
|
||||||
|
if( !isAir || !pastJumpPoint )
|
||||||
Velocity.Y += speeding ? 0.08f : 0.04f;
|
Velocity.Y += speeding ? 0.08f : 0.04f;
|
||||||
|
else if( (collideX || collideZ) && isAir && pastJumpPoint )
|
||||||
|
Velocity.Y += 0.10f;
|
||||||
} else if( useLiquidGravity ) {
|
} else if( useLiquidGravity ) {
|
||||||
Velocity.Y += speeding ? 0.08f : 0.04f;
|
Velocity.Y += speeding ? 0.08f : 0.04f;
|
||||||
} else if( TouchesAnyRope() ) {
|
} else if( TouchesAnyRope() ) {
|
||||||
|
@ -33,8 +33,7 @@ namespace ClassicalSharp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected Block GetBlock( Vector3 coords ) {
|
protected Block GetBlock( Vector3 coords ) {
|
||||||
Vector3I p = Vector3I.Floor( coords );
|
return (Block)game.Map.SafeGetBlock( Vector3I.Floor( coords ) );
|
||||||
return (Block)game.Map.SafeGetBlock( p.X, p.Y, p.Z );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract void Tick( double delta );
|
public abstract void Tick( double delta );
|
||||||
|
@ -195,16 +195,21 @@ namespace ClassicalSharp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public byte GetBlock( int x, int y, int z ) {
|
public byte GetBlock( int x, int y, int z ) {
|
||||||
return mapData[( y * Length + z ) * Width + x];
|
return mapData[(y * Length + z) * Width + x];
|
||||||
}
|
|
||||||
|
|
||||||
public byte SafeGetBlock( int x, int y, int z ) {
|
|
||||||
return IsValidPos( x, y, z ) ? mapData[( y * Length + z ) * Width + x]
|
|
||||||
: (byte)0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte GetBlock( Vector3I p ) {
|
public byte GetBlock( Vector3I p ) {
|
||||||
return mapData[( p.Y * Length + p.Z ) * Width + p.X];
|
return mapData[(p.Y * Length + p.Z) * Width + p.X];
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte SafeGetBlock( int x, int y, int z ) {
|
||||||
|
return IsValidPos( x, y, z ) ?
|
||||||
|
mapData[(y * Length + z) * Width + x] : (byte)0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte SafeGetBlock( Vector3I p ) {
|
||||||
|
return IsValidPos( p.X, p.Y, p.Z ) ?
|
||||||
|
mapData[(p.Y * Length + p.Z) * Width + p.X] : (byte)0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsValidPos( int x, int y, int z ) {
|
public bool IsValidPos( int x, int y, int z ) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user