using System;
using ClassicalSharp.Model;
using OpenTK;
namespace ClassicalSharp {
/// Contains a model, along with position, velocity, and rotation.
/// May also contain other fields and properties.
public abstract partial class Entity {
public Entity( Game game ) {
this.game = game;
info = game.BlockInfo;
}
public IModel Model;
public string ModelName;
public byte ID;
public Vector3 Position;
public Vector3 Velocity;
public float HeadYawDegrees, YawDegrees, PitchDegrees;
protected Game game;
protected BlockInfo info;
protected internal bool onGround;
internal float StepSize;
/// Rotation of the entity's head horizontally (i.e. looking north or east)
public float HeadYawRadians {
get { return HeadYawDegrees * Utils.Deg2Rad; }
set { HeadYawDegrees = value * Utils.Rad2Deg; }
}
/// Rotation of the entity's body horizontally (i.e. looking north or east)
public float YawRadians {
get { return YawDegrees * Utils.Deg2Rad; }
set { YawDegrees = value * Utils.Rad2Deg; }
}
/// Rotation of the entity vertically. (i.e. looking up or down)
public float PitchRadians {
get { return PitchDegrees * Utils.Deg2Rad; }
set { PitchDegrees = value * Utils.Rad2Deg; }
}
/// Returns the size of the model that is used for collision detection.
public Vector3 CollisionSize {
get { UpdateModel(); return Model.CollisionSize; }
}
void UpdateModel() {
BlockModel model = Model as BlockModel;
if( model != null )
model.CalcState( byte.Parse( ModelName ) );
}
public abstract void Tick( double delta );
public abstract void SetLocation( LocationUpdate update, bool interpolate );
public abstract void Despawn();
/// Renders the entity's model, interpolating between the previous and next state.
public abstract void RenderModel( double deltaTime, float t );
/// Renders the entity's name over the top of its model.
/// Assumes that RenderModel was previously called this frame.
public abstract void RenderName();
/// Gets the position of the player's eye in the world.
public Vector3 EyePosition {
get { return new Vector3( Position.X, Position.Y + Model.GetEyeY( this ), Position.Z ); }
}
/// Gets the block just underneath the player's feet position.
public Block BlockUnderFeet {
get { return GetBlock( new Vector3( Position.X, Position.Y - 0.01f, Position.Z ) ); }
}
/// Gets the block at player's eye position.
public Block BlockAtHead {
get { return GetBlock( EyePosition ); }
}
protected Block GetBlock( Vector3 coords ) {
return (Block)game.Map.SafeGetBlock( Vector3I.Floor( coords ) );
}
}
}