77 lines
2.1 KiB
C#

// Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
using System;
using OpenTK;
namespace ClassicalSharp.Entities.Mobs {
public class MobEntity : Entity {
LocalInterpComponent interp;
CollisionsComponent collisions;
PhysicsComponent physics;
static HacksComponent hacks = new HacksComponent(null, null);
AI ai;
int climbCooldown;
public MobEntity(Game game, string model) : base(game) {
StepSize = 0.5f;
SetModel(model);
interp = new LocalInterpComponent(game, this);
collisions = new CollisionsComponent(game, this);
physics = new PhysicsComponent(game, this);
physics.hacks = hacks;
physics.collisions = collisions;
if (Utils.CaselessEquals(model, "pig") || Utils.CaselessEquals(model, "sheep")) {
ai = new FleeAI(game, this);
} else {
ai = new HostileAI(game, this);
}
}
public override void Despawn() { }
public override void RenderName() { }
// TODO: this is just so the entities do something, remove later
static Random rand = new Random();
public override void Tick(double delta) {
if (game.World.IsNotLoaded) return;
interp.AdvanceState();
physics.UpdateVelocityState();
ai.Tick(game.LocalPlayer);
physics.PhysicsTick(ai.MoveVelocity);
DoWallClimb();
physics.DoEntityPush();
interp.next.Pos = Position; Position = interp.prev.Pos;
anim.UpdateAnimState(interp.prev.Pos, interp.next.Pos, delta);
}
void DoWallClimb() {
if (climbCooldown > 0) { climbCooldown--; }
if (!physics.collisions.HorizontalCollision) return;
if (this.ModelName == "spider") {
if (climbCooldown == 4)
physics.DoNormalJump();
} else {
if (this.onGround) { physics.DoNormalJump(); }
}
climbCooldown = 5;
}
public override void SetLocation(LocationUpdate update, bool interpolate) {
interp.SetLocation(update, interpolate);
}
public override void RenderModel(double deltaTime, float t) {
Position = Vector3.Lerp(interp.prev.Pos, interp.next.Pos, t);
interp.LerpAngles(t);
anim.GetCurrentAnimState(t);
Model.Render(this);
}
}
}