void SearchUnitInBox(List <Unit> targetList) { float extentsX, extentsY, extentsZ; unsafe { extentsX = GetTemplate().BoxDatas.Extents[0]; extentsY = GetTemplate().BoxDatas.Extents[1]; extentsZ = GetTemplate().BoxDatas.Extents[2]; } var check = new AnyUnitInObjectRangeCheck(this, GetTemplate().MaxSearchRadius, false); var searcher = new UnitListSearcher(this, targetList, check); Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius); float halfExtentsX = extentsX / 2.0f; float halfExtentsY = extentsY / 2.0f; float halfExtentsZ = extentsZ / 2.0f; float minX = GetPositionX() - halfExtentsX; float maxX = GetPositionX() + halfExtentsX; float minY = GetPositionY() - halfExtentsY; float maxY = GetPositionY() + halfExtentsY; float minZ = GetPositionZ() - halfExtentsZ; float maxZ = GetPositionZ() + halfExtentsZ; AxisAlignedBox box = new AxisAlignedBox(new Vector3(minX, minY, minZ), new Vector3(maxX, maxY, maxZ)); targetList.RemoveAll(unit => !box.contains(new Vector3(unit.GetPositionX(), unit.GetPositionY(), unit.GetPositionZ()))); }
void SearchUnitInCylinder(List <Unit> targetList) { var check = new AnyUnitInObjectRangeCheck(this, GetTemplate().MaxSearchRadius, false); var searcher = new UnitListSearcher(this, targetList, check); Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius); float height = GetTemplate().CylinderDatas.Height; float minZ = GetPositionZ() - height; float maxZ = GetPositionZ() + height; targetList.RemoveAll(unit => unit.GetPositionZ() < minZ || unit.GetPositionZ() > maxZ); }
void SearchUnits(List <Unit> targetList, float radius, bool check3D) { var check = new AnyUnitInObjectRangeCheck(this, radius, check3D); if (IsServerSide()) { var searcher = new PlayerListSearcher(this, targetList, check); Cell.VisitWorldObjects(this, searcher, GetTemplate().MaxSearchRadius); } else { var searcher = new UnitListSearcher(this, targetList, check); Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius); } }
void SearchUnitInSphere(List <Unit> targetList) { float radius = GetTemplate().SphereDatas.Radius; if (GetTemplate().HasFlag(AreaTriggerFlags.HasDynamicShape)) { if (GetMiscTemplate().MorphCurveId != 0) { radius = MathFunctions.lerp(GetTemplate().SphereDatas.Radius, GetTemplate().SphereDatas.RadiusTarget, Global.DB2Mgr.GetCurveValueAt(GetMiscTemplate().MorphCurveId, GetProgress())); } } var check = new AnyUnitInObjectRangeCheck(this, radius); var searcher = new UnitListSearcher(this, targetList, check); Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius); }
static bool TestArea(StringArguments args, CommandHandler handler) { float radius = 40.0f; WorldObject obj = handler.GetPlayer(); // Get Creatures List <Unit> creatureList = new List <Unit>(); var go_check = new AnyUnitInObjectRangeCheck(obj, radius); var go_search = new UnitListSearcher(obj, creatureList, go_check); Cell.VisitGridObjects(obj, go_search, radius); if (!creatureList.Empty()) { handler.SendSysMessage("Found {0} Creatures.", creatureList.Count); uint paths = 0; uint uStartTime = Time.GetMSTime(); float gx, gy, gz; obj.GetPosition(out gx, out gy, out gz); foreach (var creature in creatureList) { PathGenerator path = new PathGenerator(creature); path.CalculatePath(gx, gy, gz); ++paths; } uint uPathLoadTime = Time.GetMSTimeDiffToNow(uStartTime); handler.SendSysMessage("Generated {0} paths in {1} ms", paths, uPathLoadTime); } else { handler.SendSysMessage("No creatures in {0} yard range.", radius); } return(true); }