private void WriteNode(StringBuilder sb, L2Region region, int scale) { sb.Append("<rect x=\""); sb.Append(region.Min.X / scale); sb.Append("\" y=\""); sb.Append(region.Min.Y / scale); sb.Append("\" width=\""); sb.Append((region.Max.X - region.Min.X) / scale); sb.Append("\" height=\""); sb.Append((region.Max.Y - region.Min.Y) / scale); sb.AppendLine("\" fill=\"none\" stroke-width=\"2\" stroke=\"black\" />"); if (region.Children == null) { foreach (L2Object obj in region.Objects.Values) { if (obj is Character && (obj as Character).Controller is GameClient) { sb.Append("<circle cx=\""); sb.Append(obj.Position.X / scale); sb.Append("\" cy=\""); sb.Append(obj.Position.Y / scale); sb.AppendLine("\" r=\"40\" stroke-width=\"0\" fill=\"purple\" />"); sb.Append("<text x=\""); sb.Append((obj.Position.X + 10) / scale); sb.Append("\" y=\""); sb.Append(obj.Position.Y / scale); sb.AppendLine("\" fill=\"purple\">" + (obj as Character).Name + "</text>"); } else { sb.Append("<circle cx=\""); sb.Append(obj.Position.X / scale); sb.Append("\" cy=\""); sb.Append(obj.Position.Y / scale); sb.AppendLine("\" r=\"20\" stroke-width=\"0\" fill=\"red\" />"); } } } else { foreach (var child in region.Children) { WriteNode(sb, child, scale); } } }
public override void Split() { lock (_modifyLock) { Children = new L2Region[] { new L2Region(Level + 1, Min, Center), new L2Region(Level + 1, new Vector3(Min.X, Center.Y, 0), new Vector3(Center.X, Max.Y, 0)), new L2Region(Level + 1, new Vector3(Center.X, Min.Y, 0), new Vector3(Max.X, Center.Y, 0)), new L2Region(Level + 1, Center, Max) }; // Move objects foreach (var obj in Objects.Values) { Vector3 position = obj.Position; int idx = (position.X < Center.X) ? 0 : 2; idx += (position.Y < Center.Y) ? 0 : 1; Children[idx].Insert(position, obj); } Objects.Clear(); } }