From 644db1e5400504ec70b22c3e928873948f1247c3 Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 17 Aug 2009 09:40:38 +0100 Subject: Add System.Xml reference to the console project --- .../Region/ClientStack/LindenUDP/LLClientView.cs | 77 +++++++++++++++------- 1 file changed, 55 insertions(+), 22 deletions(-) (limited to 'OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs') diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 12c2d86..e1d6f1b 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -1435,6 +1435,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// heightmap public virtual void SendLayerData(float[] map) { + DoSendLayerData((object)map); ThreadPool.QueueUserWorkItem(DoSendLayerData, map); } @@ -1450,16 +1451,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP { for (int y = 0; y < 16; y++) { - // For some terrains, sending more than one terrain patch at once results in a libsecondlife exception - // see http://opensimulator.org/mantis/view.php?id=1662 - //for (int x = 0; x < 16; x += 4) - //{ - // SendLayerPacket(map, y, x); - // Thread.Sleep(150); - //} - for (int x = 0; x < 16; x++) - { - SendLayerData(x, y, LLHeightFieldMoronize(map)); + for (int x = 0; x < 16; x += 4) + { + SendLayerPacket(LLHeightFieldMoronize(map), y, x); Thread.Sleep(35); } } @@ -1476,17 +1470,54 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// heightmap /// X coordinate for patches 0..12 /// Y coordinate for patches 0..15 - // private void SendLayerPacket(float[] map, int y, int x) - // { - // int[] patches = new int[4]; - // patches[0] = x + 0 + y * 16; - // patches[1] = x + 1 + y * 16; - // patches[2] = x + 2 + y * 16; - // patches[3] = x + 3 + y * 16; - - // Packet layerpack = LLClientView.TerrainManager.CreateLandPacket(map, patches); - // OutPacket(layerpack, ThrottleOutPacketType.Land); - // } + private void SendLayerPacket(float[] map, int y, int x) + { + int[] patches = new int[4]; + patches[0] = x + 0 + y * 16; + patches[1] = x + 1 + y * 16; + patches[2] = x + 2 + y * 16; + patches[3] = x + 3 + y * 16; + + LayerDataPacket layerpack; + try + { + layerpack = TerrainCompressor.CreateLandPacket(map, patches); + layerpack.Header.Zerocoded = true; + layerpack.Header.Reliable = true; + + if (layerpack.Length > 1000) // Oversize packet was created + { + for (int xa = 0 ; xa < 4 ; xa++) + { + // Send oversize packet in individual patches + // + SendLayerData(x+xa, y, map); + } + } + else + { + OutPacket(layerpack, ThrottleOutPacketType.Land); + } + } + catch (OverflowException e) + { + for (int xa = 0 ; xa < 4 ; xa++) + { + // Send oversize packet in individual patches + // + SendLayerData(x+xa, y, map); + } + } + catch (IndexOutOfRangeException e) + { + for (int xa = 0 ; xa < 4 ; xa++) + { + // Bad terrain, send individual chunks + // + SendLayerData(x+xa, y, map); + } + } + } /// /// Sends a specified patch to a client @@ -1507,6 +1538,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP LayerDataPacket layerpack = TerrainCompressor.CreateLandPacket(((map.Length==65536)? map : LLHeightFieldMoronize(map)), patches); layerpack.Header.Zerocoded = true; + layerpack.Header.Reliable = true; OutPacket(layerpack, ThrottleOutPacketType.Land); @@ -1556,7 +1588,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// 16x16 array of wind speeds public virtual void SendWindData(Vector2[] windSpeeds) { - ThreadPool.QueueUserWorkItem(new WaitCallback(DoSendWindData), (object)windSpeeds); + DoSendWindData((object)windSpeeds); + // ThreadPool.QueueUserWorkItem(new WaitCallback(DoSendWindData), (object)windSpeeds); } /// -- cgit v1.1