From d862b737b0ebcee577941b4c1bf32d2114d96f34 Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Fri, 16 Jun 2023 13:17:13 -0700 Subject: [PATCH] Add RegionSizeX,RegionSizeY to Simulator class. Add logic to copy region size info (if supplied) into Simulator class on instance creation. Add region size fields to definitions of LoginResponse, EnableSimulator, TeleportFinishMessage, CrossedRegionMessage. Add constants Simulator.DefaultRegionSizeX=256 and Simulator.DefaultRegionSizeY=256 Add display of region size in "RegionInfo" TestClient command --- LibreMetaverse/AgentManager.cs | 10 +++++-- LibreMetaverse/Login.cs | 10 ++++++- LibreMetaverse/Messages/LindenMessages.cs | 30 +++++++++++++++---- LibreMetaverse/NetworkManager.cs | 20 +++++++------ LibreMetaverse/Simulator.cs | 15 ++++++++-- LibreMetaverse/_Packets_.cs | 4 +++ .../Commands/Stats/RegionInfoCommand.cs | 4 +++ 7 files changed, 73 insertions(+), 20 deletions(-) diff --git a/LibreMetaverse/AgentManager.cs b/LibreMetaverse/AgentManager.cs index 0d9e880d..27e65553 100644 --- a/LibreMetaverse/AgentManager.cs +++ b/LibreMetaverse/AgentManager.cs @@ -4317,7 +4317,9 @@ namespace OpenMetaverse SimAccess = (byte) msg.SimAccess, SimIP = Utils.IPToUInt(msg.IP), SimPort = (ushort) msg.Port, - TeleportFlags = (uint) msg.Flags + TeleportFlags = (uint) msg.Flags, + RegionSizeX = msg.RegionSizeX, + RegionSizeY = msg.RegionSizeY } }; // FIXME: Check This @@ -4380,7 +4382,8 @@ namespace OpenMetaverse // Connect to the new sim Client.Network.CurrentSim.AgentMovementComplete = false; // we're not there anymore Simulator newSimulator = Client.Network.Connect(new IPAddress(finish.Info.SimIP), - finish.Info.SimPort, finish.Info.RegionHandle, true, seedcaps); + finish.Info.SimPort, finish.Info.RegionHandle, true, seedcaps, + finish.Info.RegionSizeX, finish.Info.RegionSizeY); if (newSimulator != null) { @@ -4556,7 +4559,8 @@ namespace OpenMetaverse Logger.DebugLog($"Crossed in to new region area, attempting to connect to {endPoint}", Client); Simulator oldSim = Client.Network.CurrentSim; - Simulator newSim = Client.Network.Connect(endPoint, crossed.RegionHandle, true, crossed.SeedCapability); + Simulator newSim = Client.Network.Connect(endPoint, crossed.RegionHandle, true, crossed.SeedCapability, + crossed.RegionSizeX, crossed.RegionSizeY); if (newSim != null) { diff --git a/LibreMetaverse/Login.cs b/LibreMetaverse/Login.cs index de2d5936..bc1abddb 100644 --- a/LibreMetaverse/Login.cs +++ b/LibreMetaverse/Login.cs @@ -369,6 +369,8 @@ namespace OpenMetaverse public int CircuitCode; public uint RegionX; public uint RegionY; + public uint RegionSizeX; + public uint RegionSizeY; public ushort SimPort; public IPAddress SimIP; public string SeedCapability; @@ -488,6 +490,9 @@ namespace OpenMetaverse CircuitCode = (int)ParseUInt("circuit_code", reply); RegionX = ParseUInt("region_x", reply); RegionY = ParseUInt("region_y", reply); + // Region size is returned by OpenSimulator derived systems but not SL + RegionSizeX = reply.ContainsKey("region_size_x") ? ParseUInt("region_size_x", reply) : Simulator.DefaultRegionSizeX; + RegionSizeY = reply.ContainsKey("region_size_y") ? ParseUInt("region_size_y", reply) : Simulator.DefaultRegionSizeY; SimPort = (ushort)ParseUInt("sim_port", reply); var simIP = ParseString("sim_ip", reply); IPAddress.TryParse(simIP, out SimIP); @@ -693,6 +698,9 @@ namespace OpenMetaverse CircuitCode = (int)ParseUInt("circuit_code", reply); RegionX = ParseUInt("region_x", reply); RegionY = ParseUInt("region_y", reply); + // Region size is returned by OpenSimulator derived systems but not SL + RegionSizeX = reply.ContainsKey("region_size_x") ? ParseUInt("region_size_x", reply) : Simulator.DefaultRegionSizeX; + RegionSizeY = reply.ContainsKey("region_size_y") ? ParseUInt("region_size_y", reply) : Simulator.DefaultRegionSizeY; SimPort = (ushort)ParseUInt("sim_port", reply); var simIP = ParseString("sim_ip", reply); IPAddress.TryParse(simIP, out SimIP); @@ -1691,7 +1699,7 @@ namespace OpenMetaverse var handle = Utils.UIntsToLong(regionX, regionY); // Connect to the sim given in the login reply - if (Connect(reply.SimIP, simPort, handle, true, LoginSeedCapability) != null) + if (Connect(reply.SimIP, simPort, handle, true, LoginSeedCapability, reply.RegionSizeX, reply.RegionSizeY) != null) { // Request the economy data right after login SendPacket(new EconomyDataRequestPacket()); diff --git a/LibreMetaverse/Messages/LindenMessages.cs b/LibreMetaverse/Messages/LindenMessages.cs index 26ce20e9..ddd8aabe 100644 --- a/LibreMetaverse/Messages/LindenMessages.cs +++ b/LibreMetaverse/Messages/LindenMessages.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2006-2016, openmetaverse.co * Copyright (c) 2021-2022, Sjofn LLC * All rights reserved. @@ -61,6 +61,10 @@ namespace OpenMetaverse.Messages.Linden /// Status flags indicating the state of the Agent upon arrival, Flying, etc. public TeleportFlags Flags; + /// The size of the region teleporting into + public uint RegionSizeX; + public uint RegionSizeY; + /// /// Serialize the object /// @@ -80,7 +84,9 @@ namespace OpenMetaverse.Messages.Linden {"SimAccess", OSD.FromInteger((byte) SimAccess)}, {"SimIP", MessageUtils.FromIP(IP)}, {"SimPort", OSD.FromInteger(Port)}, - {"TeleportFlags", OSD.FromUInteger((uint) Flags)} + {"TeleportFlags", OSD.FromUInteger((uint) Flags)}, + {"RegionSizeX", OSD.FromUInteger((uint) RegionSizeX)}, + {"RegionSizeY", OSD.FromUInteger((uint) RegionSizeY)} }; // Unused by the client @@ -108,6 +114,8 @@ namespace OpenMetaverse.Messages.Linden IP = MessageUtils.ToIP(blockMap["SimIP"]); Port = blockMap["SimPort"].AsInteger(); Flags = (TeleportFlags)blockMap["TeleportFlags"].AsUInteger(); + RegionSizeX = blockMap.ContainsKey("RegionSizeX") ? blockMap["RegionSizeX"].AsUInteger() : Simulator.DefaultRegionSizeX; + RegionSizeY = blockMap.ContainsKey("RegionSizeY") ? blockMap["RegionSizeY"].AsUInteger() : Simulator.DefaultRegionSizeY; } } @@ -162,6 +170,8 @@ namespace OpenMetaverse.Messages.Linden public Uri SeedCapability; public IPAddress IP; public int Port; + public uint RegionSizeX; + public uint RegionSizeY; /// /// Serialize the object @@ -195,7 +205,9 @@ namespace OpenMetaverse.Messages.Linden ["RegionHandle"] = OSD.FromULong(RegionHandle), ["SeedCapability"] = OSD.FromUri(SeedCapability), ["SimIP"] = MessageUtils.FromIP(IP), - ["SimPort"] = OSD.FromInteger(Port) + ["SimPort"] = OSD.FromInteger(Port), + ["RegionSizeX"] = OSD.FromUInteger(RegionSizeX), + ["RegionSizeY"] = OSD.FromUInteger(RegionSizeY) }; regionDataArray.Add(regionDataMap); map["RegionData"] = regionDataArray; @@ -222,6 +234,8 @@ namespace OpenMetaverse.Messages.Linden SeedCapability = regionDataMap["SeedCapability"].AsUri(); IP = MessageUtils.ToIP(regionDataMap["SimIP"]); Port = regionDataMap["SimPort"].AsInteger(); + RegionSizeX = regionDataMap.ContainsKey("RegionSizeX") ? regionDataMap["RegionSizeX"].AsUInteger() : Simulator.DefaultRegionSizeX; + RegionSizeY = regionDataMap.ContainsKey("RegionSizeY") ? regionDataMap["RegionSizeY"].AsUInteger() : Simulator.DefaultRegionSizeY; } } @@ -232,6 +246,8 @@ namespace OpenMetaverse.Messages.Linden public ulong RegionHandle; public IPAddress IP; public int Port; + public uint RegionSizeX; + public uint RegionSizeY; } public SimulatorInfoBlock[] Simulators; @@ -251,7 +267,9 @@ namespace OpenMetaverse.Messages.Linden { ["Handle"] = OSD.FromULong(block.RegionHandle), ["IP"] = MessageUtils.FromIP(block.IP), - ["Port"] = OSD.FromInteger(block.Port) + ["Port"] = OSD.FromInteger(block.Port), + ["RegionSizeX"] = OSD.FromUInteger(block.RegionSizeX), + ["RegionSizeY"] = OSD.FromUInteger(block.RegionSizeY), }; array.Add(blockMap); } @@ -277,7 +295,9 @@ namespace OpenMetaverse.Messages.Linden { RegionHandle = blockMap["Handle"].AsULong(), IP = MessageUtils.ToIP(blockMap["IP"]), - Port = blockMap["Port"].AsInteger() + Port = blockMap["Port"].AsInteger(), + RegionSizeX = blockMap.ContainsKey("RegionSizeX") ? blockMap["RegionSizeX"].AsUInteger() : Simulator.DefaultRegionSizeX, + RegionSizeY = blockMap.ContainsKey("RegionSizeY") ? blockMap["RegionSizeY"].AsUInteger() : Simulator.DefaultRegionSizeY, }; Simulators[i] = block; } diff --git a/LibreMetaverse/NetworkManager.cs b/LibreMetaverse/NetworkManager.cs index 038364bf..8878c8fc 100644 --- a/LibreMetaverse/NetworkManager.cs +++ b/LibreMetaverse/NetworkManager.cs @@ -538,10 +538,11 @@ namespace OpenMetaverse /// URL of the capabilities server to use for /// this sim connection /// A Simulator object on success, otherwise null - public Simulator Connect(IPAddress ip, ushort port, ulong handle, bool setDefault, Uri seedcaps) + public Simulator Connect(IPAddress ip, ushort port, ulong handle, bool setDefault, Uri seedcaps, + uint sizeX = Simulator.DefaultRegionSizeX, uint sizeY = Simulator.DefaultRegionSizeY) { IPEndPoint endPoint = new IPEndPoint(ip, port); - return Connect(endPoint, handle, setDefault, seedcaps); + return Connect(endPoint, handle, setDefault, seedcaps, sizeX, sizeY); } /// @@ -555,14 +556,15 @@ namespace OpenMetaverse /// URL of the capabilities server to use for /// this sim connection /// A Simulator object on success, otherwise null - public Simulator Connect(IPEndPoint endPoint, ulong handle, bool setDefault, Uri seedcaps) + public Simulator Connect(IPEndPoint endPoint, ulong handle, bool setDefault, Uri seedcaps, + uint sizeX = Simulator.DefaultRegionSizeX, uint sizeY = Simulator.DefaultRegionSizeY) { Simulator simulator = FindSimulator(endPoint); if (simulator == null) { // We're not tracking this sim, create a new Simulator object - simulator = new Simulator(Client, endPoint, handle); + simulator = new Simulator(Client, endPoint, handle, sizeX, sizeY); // Immediately add this simulator to the list of current sims. It will be removed if the // connection fails @@ -1287,11 +1289,11 @@ namespace OpenMetaverse IPEndPoint endPoint = new IPEndPoint(ip, port); if (FindSimulator(endPoint) != null) return; - - if (Connect(ip, port, handle, false, null) == null) - { - Logger.Log($"Unable to connect to new sim {ip}:{port}", - Helpers.LogLevel.Error, Client); + + if (Connect(ip, port, handle, false, null, t.RegionSizeX, t.RegionSizeY) == null) + { + Logger.Log($"Unable to connect to new sim {ip}:{port}", + Helpers.LogLevel.Error, Client); } } } diff --git a/LibreMetaverse/Simulator.cs b/LibreMetaverse/Simulator.cs index 61da9c8e..79438ca0 100644 --- a/LibreMetaverse/Simulator.cs +++ b/LibreMetaverse/Simulator.cs @@ -252,6 +252,11 @@ namespace OpenMetaverse #endregion Structs #region Public Members + + // Default legacy simulator/region size + public const uint DefaultRegionSizeX = 256; + public const uint DefaultRegionSizeY = 256; + /// A public reference to the client that this Simulator object is attached to public GridClient Client; /// A Unique Cache identifier for this simulator @@ -260,6 +265,10 @@ namespace OpenMetaverse public Caps Caps; /// Unique identified for this region generated via it's coordinates on the world map public ulong Handle; + /// Simulator land size in X direction in meters + public uint SizeX; + /// Simulator land size in Y direction in meters + public uint SizeY; /// The current version of software this simulator is running public string SimVersion = String.Empty; /// Human readable name given to the simulator @@ -517,7 +526,7 @@ namespace OpenMetaverse /// Reference to the object /// IPEndPoint of the simulator /// Region handle for the simulator - public Simulator(GridClient client, IPEndPoint address, ulong handle) + public Simulator(GridClient client, IPEndPoint address, ulong handle, uint sizeX = DefaultRegionSizeX, uint sizeY = DefaultRegionSizeY) : base(address) { Client = client; @@ -529,6 +538,8 @@ namespace OpenMetaverse Handle = handle; Network = Client.Network; + SizeX = sizeX; + SizeY = sizeY; PacketArchive = new IncomingPacketIDCollection(Settings.PACKET_ARCHIVE_SIZE); InBytes = new Queue(Client.Settings.STATS_QUEUE_SIZE); OutBytes = new Queue(Client.Settings.STATS_QUEUE_SIZE); @@ -791,7 +802,7 @@ namespace OpenMetaverse /// True if the lookup was successful, otherwise false public bool TerrainHeightAtPoint(int x, int y, out float height) { - if (Terrain != null && x >= 0 && x < 256 && y >= 0 && y < 256) + if (Terrain != null && x >= 0 && x < SizeX && y >= 0 && y < SizeY) { int patchX = x / 16; int patchY = y / 16; diff --git a/LibreMetaverse/_Packets_.cs b/LibreMetaverse/_Packets_.cs index 096c5f37..4c90716d 100644 --- a/LibreMetaverse/_Packets_.cs +++ b/LibreMetaverse/_Packets_.cs @@ -10023,6 +10023,9 @@ namespace OpenMetaverse.Packets public byte[] SeedCapability; public byte SimAccess; public uint TeleportFlags; + // Sim/region size information sent in TeleportFinishMesssage + public uint RegionSizeX = Simulator.DefaultRegionSizeX; + public uint RegionSizeY = Simulator.DefaultRegionSizeY; public override int Length { @@ -10075,6 +10078,7 @@ namespace OpenMetaverse.Packets Buffer.BlockCopy(SeedCapability, 0, bytes, i, SeedCapability.Length); i += SeedCapability.Length; bytes[i++] = SimAccess; Utils.UIntToBytes(TeleportFlags, bytes, i); i += 4; + // size information is not sent in the UDP packet } } diff --git a/Programs/examples/TestClient/Commands/Stats/RegionInfoCommand.cs b/Programs/examples/TestClient/Commands/Stats/RegionInfoCommand.cs index 23ba205c..690d96d3 100644 --- a/Programs/examples/TestClient/Commands/Stats/RegionInfoCommand.cs +++ b/Programs/examples/TestClient/Commands/Stats/RegionInfoCommand.cs @@ -19,9 +19,13 @@ namespace OpenMetaverse.TestClient output.AppendLine(Client.Network.CurrentSim.ToString()); output.Append("UUID: "); output.AppendLine(Client.Network.CurrentSim.ID.ToString()); + uint x, y; Utils.LongToUInts(Client.Network.CurrentSim.Handle, out x, out y); output.AppendLine($"Handle: {Client.Network.CurrentSim.Handle} (X: {x} Y: {y})"); + + output.AppendLine($"Size: X: {Client.Network.CurrentSim.SizeX}, Y: {Client.Network.CurrentSim.SizeY}"); + output.Append("Access: "); output.AppendLine(Client.Network.CurrentSim.Access.ToString()); output.Append("Flags: ");