public GateModel(string entityModel, Vector3 closedPosition, GateMovement openingMotion, string[] permissions, float heading = -1f, float accessRange = 1f, float maxTravelDistance = -1, bool isLocked = true) { ModelName = entityModel; Hash = Game.GenerateHash(ModelName); ClosedPosition = closedPosition; OpeningMovement = openingMotion; Heading = heading; AccessRange = accessRange; Permissions = permissions; IsLocked = isLocked; IsBreached = false; if (maxTravelDistance < 0) { var minDimensions = Vector3.Zero; var maxDimensions = Vector3.Zero; API.GetModelDimensions((uint)API.GetHashKey(ModelName), ref minDimensions, ref maxDimensions); GateLength = maxDimensions.X < 2 ? 5.75f : maxDimensions.X; } else { GateLength = maxTravelDistance; } }
/// <summary> /// Return gate offset position when moving /// </summary> /// <param name="currentGate"></param> /// <param name="currentPosition"></param> /// <param name="distance">distance from current position</param> /// <param name="openingMotion">direction from current position</param> private static Vector3 GetGateOffsetPosition(GateModel currentGate, Vector3 currentPosition, float distance, GateMovement openingMotion) { try { if (currentGate == null) { return(Vector3.One); } var heading = currentGate.Heading + 180f; var cosx = Math.Cos(heading * (Math.PI / 180f)); var siny = Math.Sin(heading * (Math.PI / 180f)); var deltax = distance * cosx * (int)openingMotion; var deltay = distance * siny * (int)openingMotion; var newX = (float)(currentPosition.X + deltax); var newY = (float)(currentPosition.Y + deltay); return(new Vector3(newX, newY, currentPosition.Z)); } catch (Exception ex) { Log.Error(ex); } return(Vector3.One); }