mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-11-05 04:05:05 -05:00
77 lines
2.1 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|