mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-23 04:32:50 -04:00
Stare AI accounts for eyeheight and scale now
This commit is contained in:
parent
87b8441037
commit
485be4a3af
@ -153,7 +153,7 @@ namespace MCGalaxy.Bots {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void FaceTowards(PlayerBot bot, Player p) {
|
static void FaceTowards(PlayerBot bot, Player p) {
|
||||||
int dx = p.Pos.X - bot.Pos.X, dy = p.Pos.Y - bot.Pos.Y, dz = p.Pos.Z - bot.Pos.Z;
|
int dx = p.Pos.X - bot.Pos.X, dy = (p.Pos.Y + AABB.EyeHeight(p.Model)) - (bot.Pos.Y + AABB.EyeHeight(bot.Model)), dz = p.Pos.Z - bot.Pos.Z;
|
||||||
Vec3F32 dir = new Vec3F32(dx, dy, dz);
|
Vec3F32 dir = new Vec3F32(dx, dy, dz);
|
||||||
dir = Vec3F32.Normalise(dir);
|
dir = Vec3F32.Normalise(dir);
|
||||||
|
|
||||||
|
@ -120,7 +120,8 @@ namespace MCGalaxy.Maths {
|
|||||||
return bb;
|
return bb;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static float GetScaleFrom(ref string model) {
|
internal static float GetScaleFrom(ref string model, bool unlimitedScaleAllowed = false) {
|
||||||
|
if (model.CaselessEq("giant")) { return 2; }
|
||||||
int sep = model.IndexOf('|');
|
int sep = model.IndexOf('|');
|
||||||
string scaleStr = sep == -1 ? null : model.Substring(sep + 1);
|
string scaleStr = sep == -1 ? null : model.Substring(sep + 1);
|
||||||
model = sep == -1 ? model : model.Substring(0, sep);
|
model = sep == -1 ? model : model.Substring(0, sep);
|
||||||
@ -129,7 +130,7 @@ namespace MCGalaxy.Maths {
|
|||||||
if (!Utils.TryParseSingle(scaleStr, out scale)) scale = 1.0f;
|
if (!Utils.TryParseSingle(scaleStr, out scale)) scale = 1.0f;
|
||||||
if (scale < 0.01f) scale = 0.01f;
|
if (scale < 0.01f) scale = 0.01f;
|
||||||
|
|
||||||
float max = model.CaselessEq("chibi") ? 3 : 2;
|
float max = unlimitedScaleAllowed ? int.MaxValue : (model.CaselessEq("chibi") ? 3 : 2);
|
||||||
return Math.Min(scale, max);
|
return Math.Min(scale, max);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,6 +147,33 @@ namespace MCGalaxy.Maths {
|
|||||||
return new Vec3S32(18, 56, 18); // default humanoid size
|
return new Vec3S32(18, 56, 18); // default humanoid size
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary> Gives distance (in half-pixel world units)
|
||||||
|
/// from feet to camera height </summary>
|
||||||
|
public static int EyeHeight(string model) {
|
||||||
|
float scale = GetScaleFrom(ref model, true);
|
||||||
|
int blockID = -1;
|
||||||
|
if (Int32.TryParse(model, out blockID)) { return 16; } //lazily return middle of full block if it thinks it's a block ID.
|
||||||
|
model = model.ToLower();
|
||||||
|
|
||||||
|
//clientside camera height for humanoid is 26 pixels, but 28 gives us the actual middle of the head, which is really what we want.
|
||||||
|
float eyeHeight = 28;
|
||||||
|
const float sitOffset = 10;
|
||||||
|
|
||||||
|
if (model == "chibi") { eyeHeight = 14; }
|
||||||
|
else if (model == "sit") { eyeHeight -= sitOffset; }
|
||||||
|
else if (model == "head") { eyeHeight = 4; } //clientside is 6 but we want center of head
|
||||||
|
else if (model == "chicken") { eyeHeight = 12; } //clientside is 14, but we want center of head
|
||||||
|
else if (model == "creeper") { eyeHeight = 22; }
|
||||||
|
else if (model == "pig") { eyeHeight = 12; }
|
||||||
|
else if (model == "sheep") { eyeHeight = 19; } //clientside is 20, but we want center of head
|
||||||
|
else if (model == "sheep_nofur") { eyeHeight = 19; }
|
||||||
|
else if (model == "spider") { eyeHeight = 8; }
|
||||||
|
|
||||||
|
eyeHeight *= scale;
|
||||||
|
eyeHeight *= 2f; //multiply by two because world positions are measured in half-pixels
|
||||||
|
return (int)eyeHeight;
|
||||||
|
}
|
||||||
|
|
||||||
public static bool IntersectsSolidBlocks(AABB bb, Level lvl) {
|
public static bool IntersectsSolidBlocks(AABB bb, Level lvl) {
|
||||||
Vec3S32 min = bb.BlockMin, max = bb.BlockMax;
|
Vec3S32 min = bb.BlockMin, max = bb.BlockMax;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user