/** * Locks the local player to the closest enemy (as the eagle flys) */ public void lockLocalToClosest() { if (localPlayer != null && players != null && players.Count() > 0) { LocatableEntity p = localPlayer.GetClosestEntity(players); localPlayer.LockTarget(p); } }
public static float Get3dDistance(LocatableEntity to, LocatableEntity from, bool foot = false) { float zPosTo = to is Player ? ((Player)to).getZPos(foot) : to.getZPos(); //get the zPos, foot is only relevant to player entities at this time float zPosFrom = from is Player ? ((Player)from).getZPos(foot) : from.getZPos(); //get the zPos, foot is only relevant to player entities at this time return((float)(Math.Sqrt( ((to.xPos - from.xPos) * (to.xPos - from.xPos)) + ((to.yPos - from.yPos) * (to.yPos - from.yPos)) + ((zPosTo - zPosFrom) * (zPosTo - zPosFrom)) ))); }
/* * Locals the Player to an entity */ public void LockTarget(LocatableEntity entity) { if (entity == null) { return; } float[] xy = Calculations.EntityAimCoord(entity, this); pm.WriteFloat(this.baseAddress + this.offsets.yaw, xy[0]); pm.WriteFloat(this.baseAddress + this.offsets.pitch, xy[1]); }
/* * Calculates the closest entity to this entitiy from an array of other Locatable Entities. */ public LocatableEntity GetClosestEntity(LocatableEntity[] entities) { LocatableEntity p = null; float distance = float.MaxValue; for (int i = 0; i < entities.Length; i++) { if (entities[i] != null) { float td = Calculations.Get3dDistance(entities[i], this); if (td < distance) { p = entities[i]; distance = td; } } } return(p); }
public static float PI = (float)(Math.PI); //PI, used in calculations. /** * Converts an entities position to screen co-ordinates. Accepts the matrix(column major), PlayerEntity, Game Window Rect, and a boolean to specify if we are using the zPosFoot or zPosHead * * Mostly "borrowed" from 0XDE57 * * */ public static float[] WorldToScreen(byte[] matrix, LocatableEntity entity, POINTS gameWindow, bool foot = true) { int width = gameWindow.Right - gameWindow.Left; //calculate the width of the game window int height = gameWindow.Bottom - gameWindow.Top; //calculate the height of the game window /* * Read the Matrix into variables for later use - it is column major */ float m11 = BitConverter.ToSingle(matrix, 0), m12 = BitConverter.ToSingle(matrix, 4), m13 = BitConverter.ToSingle(matrix, 8), m14 = BitConverter.ToSingle(matrix, 12); float m21 = BitConverter.ToSingle(matrix, 16), m22 = BitConverter.ToSingle(matrix, 20), m23 = BitConverter.ToSingle(matrix, 24), m24 = BitConverter.ToSingle(matrix, 28); float m31 = BitConverter.ToSingle(matrix, 32), m32 = BitConverter.ToSingle(matrix, 36), m33 = BitConverter.ToSingle(matrix, 40), m34 = BitConverter.ToSingle(matrix, 44); float m41 = BitConverter.ToSingle(matrix, 48), m42 = BitConverter.ToSingle(matrix, 52), m43 = BitConverter.ToSingle(matrix, 56), m44 = BitConverter.ToSingle(matrix, 60); float zPos = entity is Player ? ((Player)entity).getZPos(foot) : entity.getZPos(); //get the zPos, foot is only relevant to player entities at this time //multiply vector against matrix float screenX = (m11 * entity.xPos) + (m21 * entity.yPos) + (m31 * zPos) + m41; float screenY = (m12 * entity.xPos) + (m22 * entity.yPos) + (m32 * zPos) + m42; float screenW = (m14 * entity.xPos) + (m24 * entity.yPos) + (m34 * zPos) + m44; //camera position (eye level/middle of screen) float camX = width / 2f; float camY = height / 2f; //convert to homogeneous position float x = camX + (camX * screenX / screenW); float y = camY - (camY * screenY / screenW); float[] screenPos = { x, y }; //check it is in the bounds to draw if (screenW > 0.001f && //not behind us gameWindow.Left + x > gameWindow.Left && gameWindow.Left + x < gameWindow.Right && //not off the left or right of the window gameWindow.Top + y > gameWindow.Top && gameWindow.Top + y < gameWindow.Bottom) //not off the top of bottom of the window { return(screenPos); } return(null); }
public static float[] EntityAimCoord(LocatableEntity to, LocatableEntity from, bool foot = false) { float zPosTo = to is Player ? ((Player)to).getZPos(foot) : to.getZPos(); //get the zPos, foot is only relevant to player entities at this time float zPosFrom = from is Player ? ((Player)from).getZPos(foot) : from.getZPos(); //get the zPos, foot is only relevant to player entities at this time //calculate Y float pitchY = (float)Math.Atan2(zPosTo - zPosFrom, Get3dDistance(to, from)) * 180 / PI; //calculate X float yawX = -(float)Math.Atan2(to.xPos - from.xPos, to.yPos - from.yPos) / PI * 180 + 180; float[] xy = { yawX, pitchY }; return(xy); }