diff options
author | UbitUmarov | 2012-03-11 03:57:59 +0000 |
---|---|---|
committer | UbitUmarov | 2012-03-11 03:57:59 +0000 |
commit | b0f01cec98c8ac97cee27f16c5f38c06f5a068b3 (patch) | |
tree | 27fe2b38ce192938a72a1d036dc7d96d55b3478e | |
parent | cleanup + comments (diff) | |
parent | Merge branch 'master' of ssh://3dhosting.de/var/git/careminster (diff) | |
download | opensim-SC_OLD-b0f01cec98c8ac97cee27f16c5f38c06f5a068b3.zip opensim-SC_OLD-b0f01cec98c8ac97cee27f16c5f38c06f5a068b3.tar.gz opensim-SC_OLD-b0f01cec98c8ac97cee27f16c5f38c06f5a068b3.tar.bz2 opensim-SC_OLD-b0f01cec98c8ac97cee27f16c5f38c06f5a068b3.tar.xz |
Merge branch 'master' of ssh://3dhosting.de/var/git/careminster into ubitwork
Diffstat (limited to '')
-rw-r--r-- | CONTRIBUTORS.txt | 2 | ||||
-rw-r--r-- | OpenSim/Framework/SLUtil.cs | 52 | ||||
-rw-r--r-- | OpenSim/Framework/WebUtil.cs | 41 | ||||
-rw-r--r-- | OpenSim/Region/Application/OpenSimBase.cs | 219 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 27 | ||||
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs | 5 | ||||
-rw-r--r-- | OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs | 15 | ||||
-rw-r--r-- | OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs | 15 | ||||
-rw-r--r-- | OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs | 10 | ||||
-rw-r--r-- | OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs | 36 | ||||
-rw-r--r-- | OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs | 2 | ||||
-rwxr-xr-x | bin/OpenSim.ini.example | 22 |
12 files changed, 296 insertions, 150 deletions
diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index e0a96e7..de5a6fc 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt | |||
@@ -86,6 +86,7 @@ what it is today. | |||
86 | * Grumly57 | 86 | * Grumly57 |
87 | * GuduleLapointe | 87 | * GuduleLapointe |
88 | * Ewe Loon | 88 | * Ewe Loon |
89 | * Fernando Oliveira | ||
89 | * Fly-Man | 90 | * Fly-Man |
90 | * Flyte Xevious | 91 | * Flyte Xevious |
91 | * Imaze Rhiano | 92 | * Imaze Rhiano |
@@ -135,6 +136,7 @@ what it is today. | |||
135 | * Ruud Lathorp | 136 | * Ruud Lathorp |
136 | * SachaMagne | 137 | * SachaMagne |
137 | * Salahzar Stenvaag | 138 | * Salahzar Stenvaag |
139 | * satguru p srivastava | ||
138 | * sempuki | 140 | * sempuki |
139 | * SignpostMarv | 141 | * SignpostMarv |
140 | * SpotOn3D | 142 | * SpotOn3D |
diff --git a/OpenSim/Framework/SLUtil.cs b/OpenSim/Framework/SLUtil.cs index b337e03..f9cb851 100644 --- a/OpenSim/Framework/SLUtil.cs +++ b/OpenSim/Framework/SLUtil.cs | |||
@@ -28,6 +28,7 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Reflection; | 30 | using System.Reflection; |
31 | using System.Xml; | ||
31 | using log4net; | 32 | using log4net; |
32 | using OpenMetaverse; | 33 | using OpenMetaverse; |
33 | 34 | ||
@@ -39,6 +40,13 @@ namespace OpenSim.Framework | |||
39 | 40 | ||
40 | #region SL / file extension / content-type conversions | 41 | #region SL / file extension / content-type conversions |
41 | 42 | ||
43 | public static Dictionary<string, UUID> DefaultAvatarAnimations = new Dictionary<string, UUID>(); | ||
44 | |||
45 | static SLUtil() | ||
46 | { | ||
47 | DefaultAvatarAnimations = LoadDefaultAvatarAnimations("data/avataranimations.xml"); | ||
48 | } | ||
49 | |||
42 | public static string SLAssetTypeToContentType(int assetType) | 50 | public static string SLAssetTypeToContentType(int assetType) |
43 | { | 51 | { |
44 | switch ((AssetType)assetType) | 52 | switch ((AssetType)assetType) |
@@ -374,5 +382,47 @@ namespace OpenSim.Framework | |||
374 | 382 | ||
375 | return output; | 383 | return output; |
376 | } | 384 | } |
385 | |||
386 | /// <summary> | ||
387 | /// Load the default SL avatar animations. | ||
388 | /// </summary> | ||
389 | /// <returns></returns> | ||
390 | public static Dictionary<string, UUID> LoadDefaultAvatarAnimations(string path) | ||
391 | { | ||
392 | Dictionary<string, UUID> animations = new Dictionary<string, UUID>(); | ||
393 | |||
394 | using (XmlTextReader reader = new XmlTextReader(path)) | ||
395 | { | ||
396 | XmlDocument doc = new XmlDocument(); | ||
397 | doc.Load(reader); | ||
398 | if (doc.DocumentElement != null) | ||
399 | { | ||
400 | foreach (XmlNode nod in doc.DocumentElement.ChildNodes) | ||
401 | { | ||
402 | if (nod.Attributes["name"] != null) | ||
403 | { | ||
404 | string name = nod.Attributes["name"].Value.ToLower(); | ||
405 | string id = nod.InnerText; | ||
406 | animations.Add(name, (UUID)id); | ||
407 | } | ||
408 | } | ||
409 | } | ||
410 | } | ||
411 | |||
412 | return animations; | ||
413 | } | ||
414 | |||
415 | /// <summary> | ||
416 | /// Get the default SL avatar animation with the given name. | ||
417 | /// </summary> | ||
418 | /// <param name="name"></param> | ||
419 | /// <returns></returns> | ||
420 | public static UUID GetDefaultAvatarAnimation(string name) | ||
421 | { | ||
422 | if (DefaultAvatarAnimations.ContainsKey(name)) | ||
423 | return DefaultAvatarAnimations[name]; | ||
424 | |||
425 | return UUID.Zero; | ||
426 | } | ||
377 | } | 427 | } |
378 | } | 428 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index f90df12..71a56e5 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs | |||
@@ -63,6 +63,31 @@ namespace OpenSim.Framework | |||
63 | // a "long" call for warning & debugging purposes | 63 | // a "long" call for warning & debugging purposes |
64 | public const int LongCallTime = 500; | 64 | public const int LongCallTime = 500; |
65 | 65 | ||
66 | // dictionary of end points | ||
67 | private static Dictionary<string,object> m_endpointSerializer = new Dictionary<string,object>(); | ||
68 | |||
69 | |||
70 | private static object EndPointLock(string url) | ||
71 | { | ||
72 | System.Uri uri = new System.Uri(url); | ||
73 | string endpoint = string.Format("{0}:{1}",uri.Host,uri.Port); | ||
74 | |||
75 | lock (m_endpointSerializer) | ||
76 | { | ||
77 | object eplock = null; | ||
78 | |||
79 | if (! m_endpointSerializer.TryGetValue(endpoint,out eplock)) | ||
80 | { | ||
81 | eplock = new object(); | ||
82 | m_endpointSerializer.Add(endpoint,eplock); | ||
83 | // m_log.WarnFormat("[WEB UTIL] add a new host to end point serializer {0}",endpoint); | ||
84 | } | ||
85 | |||
86 | return eplock; | ||
87 | } | ||
88 | } | ||
89 | |||
90 | |||
66 | #region JSONRequest | 91 | #region JSONRequest |
67 | 92 | ||
68 | /// <summary> | 93 | /// <summary> |
@@ -96,6 +121,14 @@ namespace OpenSim.Framework | |||
96 | 121 | ||
97 | public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout, bool compressed) | 122 | public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout, bool compressed) |
98 | { | 123 | { |
124 | lock (EndPointLock(url)) | ||
125 | { | ||
126 | return ServiceOSDRequestWorker(url,data,method,timeout,compressed); | ||
127 | } | ||
128 | } | ||
129 | |||
130 | private static OSDMap ServiceOSDRequestWorker(string url, OSDMap data, string method, int timeout, bool compressed) | ||
131 | { | ||
99 | int reqnum = m_requestNumber++; | 132 | int reqnum = m_requestNumber++; |
100 | // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); | 133 | // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); |
101 | 134 | ||
@@ -249,6 +282,14 @@ namespace OpenSim.Framework | |||
249 | 282 | ||
250 | public static OSDMap ServiceFormRequest(string url, NameValueCollection data, int timeout) | 283 | public static OSDMap ServiceFormRequest(string url, NameValueCollection data, int timeout) |
251 | { | 284 | { |
285 | lock (EndPointLock(url)) | ||
286 | { | ||
287 | return ServiceFormRequestWorker(url,data,timeout); | ||
288 | } | ||
289 | } | ||
290 | |||
291 | private static OSDMap ServiceFormRequestWorker(string url, NameValueCollection data, int timeout) | ||
292 | { | ||
252 | int reqnum = m_requestNumber++; | 293 | int reqnum = m_requestNumber++; |
253 | string method = (data != null && data["RequestMethod"] != null) ? data["RequestMethod"] : "unknown"; | 294 | string method = (data != null && data["RequestMethod"] != null) ? data["RequestMethod"] : "unknown"; |
254 | // m_log.DebugFormat("[WEB UTIL]: <{0}> start form request for {1}, method {2}",reqnum,url,method); | 295 | // m_log.DebugFormat("[WEB UTIL]: <{0}> start form request for {1}, method {2}",reqnum,url,method); |
diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 34f513d..b304403 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs | |||
@@ -28,6 +28,7 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.IO; | 30 | using System.IO; |
31 | using System.Linq; | ||
31 | using System.Net; | 32 | using System.Net; |
32 | using System.Reflection; | 33 | using System.Reflection; |
33 | using System.Text; | 34 | using System.Text; |
@@ -67,6 +68,9 @@ namespace OpenSim | |||
67 | private const string PLUGIN_ASSET_CACHE = "/OpenSim/AssetCache"; | 68 | private const string PLUGIN_ASSET_CACHE = "/OpenSim/AssetCache"; |
68 | private const string PLUGIN_ASSET_SERVER_CLIENT = "/OpenSim/AssetClient"; | 69 | private const string PLUGIN_ASSET_SERVER_CLIENT = "/OpenSim/AssetClient"; |
69 | 70 | ||
71 | // OpenSim.ini Section name for ESTATES Settings | ||
72 | public const string ESTATE_SECTION_NAME = "Estates"; | ||
73 | |||
70 | protected string proxyUrl; | 74 | protected string proxyUrl; |
71 | protected int proxyOffset = 0; | 75 | protected int proxyOffset = 0; |
72 | 76 | ||
@@ -524,12 +528,42 @@ namespace OpenSim | |||
524 | { | 528 | { |
525 | RegionInfo regionInfo = scene.RegionInfo; | 529 | RegionInfo regionInfo = scene.RegionInfo; |
526 | 530 | ||
531 | string estateOwnerFirstName = null; | ||
532 | string estateOwnerLastName = null; | ||
533 | string estateOwnerEMail = null; | ||
534 | string estateOwnerPassword = null; | ||
535 | string rawEstateOwnerUuid = null; | ||
536 | |||
537 | if (m_config.Source.Configs[ESTATE_SECTION_NAME] != null) | ||
538 | { | ||
539 | string defaultEstateOwnerName | ||
540 | = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerName", "").Trim(); | ||
541 | string[] ownerNames = defaultEstateOwnerName.Split(' '); | ||
542 | |||
543 | if (ownerNames.Length >= 2) | ||
544 | { | ||
545 | estateOwnerFirstName = ownerNames[0]; | ||
546 | estateOwnerLastName = ownerNames[1]; | ||
547 | } | ||
548 | |||
549 | // Info to be used only on Standalone Mode | ||
550 | rawEstateOwnerUuid = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerUUID", null); | ||
551 | estateOwnerEMail = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerEMail", null); | ||
552 | estateOwnerPassword = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerPassword", null); | ||
553 | } | ||
554 | |||
527 | MainConsole.Instance.OutputFormat("Estate {0} has no owner set.", regionInfo.EstateSettings.EstateName); | 555 | MainConsole.Instance.OutputFormat("Estate {0} has no owner set.", regionInfo.EstateSettings.EstateName); |
528 | List<char> excluded = new List<char>(new char[1]{' '}); | 556 | List<char> excluded = new List<char>(new char[1]{' '}); |
529 | string first = MainConsole.Instance.CmdPrompt("Estate owner first name", "Test", excluded); | ||
530 | string last = MainConsole.Instance.CmdPrompt("Estate owner last name", "User", excluded); | ||
531 | 557 | ||
532 | UserAccount account = scene.UserAccountService.GetUserAccount(regionInfo.ScopeID, first, last); | 558 | |
559 | if (estateOwnerFirstName == null || estateOwnerLastName == null) | ||
560 | { | ||
561 | estateOwnerFirstName = MainConsole.Instance.CmdPrompt("Estate owner first name", "Test", excluded); | ||
562 | estateOwnerLastName = MainConsole.Instance.CmdPrompt("Estate owner last name", "User", excluded); | ||
563 | } | ||
564 | |||
565 | UserAccount account | ||
566 | = scene.UserAccountService.GetUserAccount(regionInfo.ScopeID, estateOwnerFirstName, estateOwnerLastName); | ||
533 | 567 | ||
534 | if (account == null) | 568 | if (account == null) |
535 | { | 569 | { |
@@ -548,23 +582,35 @@ namespace OpenSim | |||
548 | 582 | ||
549 | if (scene.UserAccountService is UserAccountService) | 583 | if (scene.UserAccountService is UserAccountService) |
550 | { | 584 | { |
551 | string password = MainConsole.Instance.PasswdPrompt("Password"); | 585 | if (estateOwnerPassword == null) |
552 | string email = MainConsole.Instance.CmdPrompt("Email", ""); | 586 | estateOwnerPassword = MainConsole.Instance.PasswdPrompt("Password"); |
587 | |||
588 | if (estateOwnerEMail == null) | ||
589 | estateOwnerEMail = MainConsole.Instance.CmdPrompt("Email"); | ||
553 | 590 | ||
554 | string rawPrincipalId = MainConsole.Instance.CmdPrompt("User ID", UUID.Random().ToString()); | 591 | if (rawEstateOwnerUuid == null) |
592 | rawEstateOwnerUuid = MainConsole.Instance.CmdPrompt("User ID", UUID.Random().ToString()); | ||
555 | 593 | ||
556 | UUID principalId = UUID.Zero; | 594 | UUID estateOwnerUuid = UUID.Zero; |
557 | if (!UUID.TryParse(rawPrincipalId, out principalId)) | 595 | if (!UUID.TryParse(rawEstateOwnerUuid, out estateOwnerUuid)) |
558 | { | 596 | { |
559 | m_log.ErrorFormat("[OPENSIM]: ID {0} is not a valid UUID", rawPrincipalId); | 597 | m_log.ErrorFormat("[OPENSIM]: ID {0} is not a valid UUID", rawEstateOwnerUuid); |
560 | return; | 598 | return; |
561 | } | 599 | } |
562 | 600 | ||
601 | // If we've been given a zero uuid then this signals that we should use a random user id | ||
602 | if (estateOwnerUuid == UUID.Zero) | ||
603 | estateOwnerUuid = UUID.Random(); | ||
604 | |||
563 | account | 605 | account |
564 | = ((UserAccountService)scene.UserAccountService).CreateUser( | 606 | = ((UserAccountService)scene.UserAccountService).CreateUser( |
565 | regionInfo.ScopeID, principalId, first, last, password, email); | 607 | regionInfo.ScopeID, |
608 | estateOwnerUuid, | ||
609 | estateOwnerFirstName, | ||
610 | estateOwnerLastName, | ||
611 | estateOwnerPassword, | ||
612 | estateOwnerEMail); | ||
566 | } | 613 | } |
567 | // } | ||
568 | } | 614 | } |
569 | 615 | ||
570 | if (account == null) | 616 | if (account == null) |
@@ -969,15 +1015,21 @@ namespace OpenSim | |||
969 | /// This method doesn't allow an estate to be created with the same name as existing estates. | 1015 | /// This method doesn't allow an estate to be created with the same name as existing estates. |
970 | /// </remarks> | 1016 | /// </remarks> |
971 | /// <param name="regInfo"></param> | 1017 | /// <param name="regInfo"></param> |
972 | /// <param name="existingName">A list of estate names that already exist.</param> | 1018 | /// <param name="estatesByName">A list of estate names that already exist.</param> |
1019 | /// <param name="estateName">Estate name to create if already known</param> | ||
973 | /// <returns>true if the estate was created, false otherwise</returns> | 1020 | /// <returns>true if the estate was created, false otherwise</returns> |
974 | public bool CreateEstate(RegionInfo regInfo, List<string> existingNames) | 1021 | public bool CreateEstate(RegionInfo regInfo, Dictionary<string, EstateSettings> estatesByName, string estateName) |
975 | { | 1022 | { |
976 | // Create a new estate | 1023 | // Create a new estate |
977 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, true); | 1024 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, true); |
978 | string newName = MainConsole.Instance.CmdPrompt("New estate name", regInfo.EstateSettings.EstateName); | ||
979 | 1025 | ||
980 | if (existingNames.Contains(newName)) | 1026 | string newName; |
1027 | if (estateName != null && estateName != "") | ||
1028 | newName = estateName; | ||
1029 | else | ||
1030 | newName = MainConsole.Instance.CmdPrompt("New estate name", regInfo.EstateSettings.EstateName); | ||
1031 | |||
1032 | if (estatesByName.ContainsKey(newName)) | ||
981 | { | 1033 | { |
982 | MainConsole.Instance.OutputFormat("An estate named {0} already exists. Please try again.", newName); | 1034 | MainConsole.Instance.OutputFormat("An estate named {0} already exists. Please try again.", newName); |
983 | return false; | 1035 | return false; |
@@ -1004,69 +1056,102 @@ namespace OpenSim | |||
1004 | if (EstateDataService != null) | 1056 | if (EstateDataService != null) |
1005 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, false); | 1057 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, false); |
1006 | 1058 | ||
1007 | if (regInfo.EstateSettings.EstateID == 0) // No record at all | 1059 | if (regInfo.EstateSettings.EstateID != 0) |
1060 | return; | ||
1061 | |||
1062 | m_log.WarnFormat("[ESTATE] Region {0} is not part of an estate.", regInfo.RegionName); | ||
1063 | |||
1064 | List<EstateSettings> estates = EstateDataService.LoadEstateSettingsAll(); | ||
1065 | Dictionary<string, EstateSettings> estatesByName = new Dictionary<string, EstateSettings>(); | ||
1066 | |||
1067 | foreach (EstateSettings estate in estates) | ||
1068 | estatesByName[estate.EstateName] = estate; | ||
1069 | |||
1070 | string defaultEstateName = null; | ||
1071 | |||
1072 | if (m_config.Source.Configs[ESTATE_SECTION_NAME] != null) | ||
1008 | { | 1073 | { |
1009 | m_log.WarnFormat("[ESTATE] Region {0} is not part of an estate.", regInfo.RegionName); | 1074 | defaultEstateName = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateName", null); |
1010 | 1075 | ||
1011 | List<EstateSettings> estates = EstateDataService.LoadEstateSettingsAll(); | 1076 | if (defaultEstateName != null) |
1012 | List<string> estateNames = new List<string>(); | ||
1013 | foreach (EstateSettings estate in estates) | ||
1014 | estateNames.Add(estate.EstateName); | ||
1015 | |||
1016 | while (true) | ||
1017 | { | 1077 | { |
1018 | if (estates.Count == 0) | 1078 | EstateSettings defaultEstate; |
1019 | { | 1079 | bool defaultEstateJoined = false; |
1020 | m_log.Info("[ESTATE] No existing estates found. You must create a new one."); | 1080 | |
1021 | 1081 | if (estatesByName.ContainsKey(defaultEstateName)) | |
1022 | if (CreateEstate(regInfo, estateNames)) | 1082 | { |
1023 | break; | 1083 | defaultEstate = estatesByName[defaultEstateName]; |
1084 | |||
1085 | if (EstateDataService.LinkRegion(regInfo.RegionID, (int)defaultEstate.EstateID)) | ||
1086 | defaultEstateJoined = true; | ||
1087 | } | ||
1088 | else | ||
1089 | { | ||
1090 | if (CreateEstate(regInfo, estatesByName, defaultEstateName)) | ||
1091 | defaultEstateJoined = true; | ||
1092 | } | ||
1093 | |||
1094 | if (defaultEstateJoined) | ||
1095 | return; | ||
1096 | else | ||
1097 | m_log.ErrorFormat( | ||
1098 | "[OPENSIM BASE]: Joining default estate {0} failed", defaultEstateName); | ||
1099 | } | ||
1100 | } | ||
1101 | |||
1102 | // If we have no default estate or creation of the default estate failed then ask the user. | ||
1103 | while (true) | ||
1104 | { | ||
1105 | if (estates.Count == 0) | ||
1106 | { | ||
1107 | m_log.Info("[ESTATE]: No existing estates found. You must create a new one."); | ||
1108 | |||
1109 | if (CreateEstate(regInfo, estatesByName, null)) | ||
1110 | break; | ||
1111 | else | ||
1112 | continue; | ||
1113 | } | ||
1114 | else | ||
1115 | { | ||
1116 | string response | ||
1117 | = MainConsole.Instance.CmdPrompt( | ||
1118 | string.Format( | ||
1119 | "Do you wish to join region {0} to an existing estate (yes/no)?", regInfo.RegionName), | ||
1120 | "yes", | ||
1121 | new List<string>() { "yes", "no" }); | ||
1122 | |||
1123 | if (response == "no") | ||
1124 | { | ||
1125 | if (CreateEstate(regInfo, estatesByName, null)) | ||
1126 | break; | ||
1024 | else | 1127 | else |
1025 | continue; | 1128 | continue; |
1026 | } | 1129 | } |
1027 | else | 1130 | else |
1028 | { | 1131 | { |
1029 | string response | 1132 | string[] estateNames = estatesByName.Keys.ToArray(); |
1133 | response | ||
1030 | = MainConsole.Instance.CmdPrompt( | 1134 | = MainConsole.Instance.CmdPrompt( |
1031 | string.Format( | 1135 | string.Format( |
1032 | "Do you wish to join region {0} to an existing estate (yes/no)?", regInfo.RegionName), | 1136 | "Name of estate to join. Existing estate names are ({0})", |
1033 | "no", | 1137 | string.Join(", ", estateNames)), |
1034 | new List<string>() { "yes", "no" }); | 1138 | estateNames[0]); |
1035 | 1139 | ||
1036 | if (response == "no") | 1140 | List<int> estateIDs = EstateDataService.GetEstates(response); |
1141 | if (estateIDs.Count < 1) | ||
1037 | { | 1142 | { |
1038 | if (CreateEstate(regInfo, estateNames)) | 1143 | MainConsole.Instance.Output("The name you have entered matches no known estate. Please try again."); |
1039 | break; | 1144 | continue; |
1040 | else | ||
1041 | continue; | ||
1042 | } | ||
1043 | else | ||
1044 | { | ||
1045 | response | ||
1046 | = MainConsole.Instance.CmdPrompt( | ||
1047 | string.Format( | ||
1048 | "Name of estate to join. Existing estate names are ({0})", string.Join(", ", estateNames.ToArray())), | ||
1049 | "None"); | ||
1050 | |||
1051 | if (response == "None") | ||
1052 | continue; | ||
1053 | |||
1054 | List<int> estateIDs = EstateDataService.GetEstates(response); | ||
1055 | if (estateIDs.Count < 1) | ||
1056 | { | ||
1057 | MainConsole.Instance.Output("The name you have entered matches no known estate. Please try again."); | ||
1058 | continue; | ||
1059 | } | ||
1060 | |||
1061 | int estateID = estateIDs[0]; | ||
1062 | |||
1063 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(estateID); | ||
1064 | |||
1065 | if (EstateDataService.LinkRegion(regInfo.RegionID, estateID)) | ||
1066 | break; | ||
1067 | |||
1068 | MainConsole.Instance.Output("Joining the estate failed. Please try again."); | ||
1069 | } | 1145 | } |
1146 | |||
1147 | int estateID = estateIDs[0]; | ||
1148 | |||
1149 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(estateID); | ||
1150 | |||
1151 | if (EstateDataService.LinkRegion(regInfo.RegionID, estateID)) | ||
1152 | break; | ||
1153 | |||
1154 | MainConsole.Instance.Output("Joining the estate failed. Please try again."); | ||
1070 | } | 1155 | } |
1071 | } | 1156 | } |
1072 | } | 1157 | } |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 7935222..4c43c10 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -320,7 +320,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
320 | protected readonly UUID m_agentId; | 320 | protected readonly UUID m_agentId; |
321 | private readonly uint m_circuitCode; | 321 | private readonly uint m_circuitCode; |
322 | private readonly byte[] m_channelVersion = Utils.EmptyBytes; | 322 | private readonly byte[] m_channelVersion = Utils.EmptyBytes; |
323 | private readonly Dictionary<string, UUID> m_defaultAnimations = new Dictionary<string, UUID>(); | ||
324 | private readonly IGroupsModule m_GroupsModule; | 323 | private readonly IGroupsModule m_GroupsModule; |
325 | 324 | ||
326 | private int m_cachedTextureSerial; | 325 | private int m_cachedTextureSerial; |
@@ -464,10 +463,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
464 | RegisterInterface<IClientChat>(this); | 463 | RegisterInterface<IClientChat>(this); |
465 | RegisterInterface<IClientIPEndpoint>(this); | 464 | RegisterInterface<IClientIPEndpoint>(this); |
466 | 465 | ||
467 | InitDefaultAnimations(); | ||
468 | |||
469 | m_scene = scene; | 466 | m_scene = scene; |
470 | |||
471 | m_entityUpdates = new PriorityQueue(m_scene.Entities.Count); | 467 | m_entityUpdates = new PriorityQueue(m_scene.Entities.Count); |
472 | m_entityProps = new PriorityQueue(m_scene.Entities.Count); | 468 | m_entityProps = new PriorityQueue(m_scene.Entities.Count); |
473 | m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>(); | 469 | m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>(); |
@@ -11374,30 +11370,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11374 | OutPacket(scriptQuestion, ThrottleOutPacketType.Task); | 11370 | OutPacket(scriptQuestion, ThrottleOutPacketType.Task); |
11375 | } | 11371 | } |
11376 | 11372 | ||
11377 | private void InitDefaultAnimations() | ||
11378 | { | ||
11379 | using (XmlTextReader reader = new XmlTextReader("data/avataranimations.xml")) | ||
11380 | { | ||
11381 | XmlDocument doc = new XmlDocument(); | ||
11382 | doc.Load(reader); | ||
11383 | if (doc.DocumentElement != null) | ||
11384 | foreach (XmlNode nod in doc.DocumentElement.ChildNodes) | ||
11385 | { | ||
11386 | if (nod.Attributes["name"] != null) | ||
11387 | { | ||
11388 | string name = nod.Attributes["name"].Value.ToLower(); | ||
11389 | string id = nod.InnerText; | ||
11390 | m_defaultAnimations.Add(name, (UUID)id); | ||
11391 | } | ||
11392 | } | ||
11393 | } | ||
11394 | } | ||
11395 | |||
11396 | public UUID GetDefaultAnimation(string name) | 11373 | public UUID GetDefaultAnimation(string name) |
11397 | { | 11374 | { |
11398 | if (m_defaultAnimations.ContainsKey(name)) | 11375 | return SLUtil.GetDefaultAvatarAnimation(name); |
11399 | return m_defaultAnimations[name]; | ||
11400 | return UUID.Zero; | ||
11401 | } | 11376 | } |
11402 | 11377 | ||
11403 | /// <summary> | 11378 | /// <summary> |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs index c6e9964..8560c73 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs | |||
@@ -267,12 +267,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
267 | 267 | ||
268 | m_archiveWriter = new TarArchiveWriter(m_saveStream); | 268 | m_archiveWriter = new TarArchiveWriter(m_saveStream); |
269 | 269 | ||
270 | m_log.InfoFormat("[INVENTORY ARCHIVER]: Adding control file to archive."); | ||
271 | |||
270 | // Write out control file. This has to be done first so that subsequent loaders will see this file first | 272 | // Write out control file. This has to be done first so that subsequent loaders will see this file first |
271 | // XXX: I know this is a weak way of doing it since external non-OAR aware tar executables will not do this | 273 | // XXX: I know this is a weak way of doing it since external non-OAR aware tar executables will not do this |
272 | // not sure how to fix this though, short of going with a completely different file format. | 274 | // not sure how to fix this though, short of going with a completely different file format. |
273 | m_archiveWriter.WriteFile(ArchiveConstants.CONTROL_FILE_PATH, CreateControlFile(options)); | 275 | m_archiveWriter.WriteFile(ArchiveConstants.CONTROL_FILE_PATH, CreateControlFile(options)); |
274 | m_log.InfoFormat("[INVENTORY ARCHIVER]: Added control file to archive."); | 276 | |
275 | |||
276 | if (inventoryFolder != null) | 277 | if (inventoryFolder != null) |
277 | { | 278 | { |
278 | m_log.DebugFormat( | 279 | m_log.DebugFormat( |
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs index 9ec4ebe..c179a34 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs | |||
@@ -108,12 +108,14 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
108 | // "[ARCHIVER]: Received {0} of {1} assets requested", | 108 | // "[ARCHIVER]: Received {0} of {1} assets requested", |
109 | // assetsFoundUuids.Count, assetsFoundUuids.Count + assetsNotFoundUuids.Count); | 109 | // assetsFoundUuids.Count, assetsFoundUuids.Count + assetsNotFoundUuids.Count); |
110 | 110 | ||
111 | m_log.InfoFormat("[ARCHIVER]: Adding region settings to archive."); | ||
112 | |||
111 | // Write out region settings | 113 | // Write out region settings |
112 | string settingsPath | 114 | string settingsPath |
113 | = String.Format("{0}{1}.xml", ArchiveConstants.SETTINGS_PATH, m_scene.RegionInfo.RegionName); | 115 | = String.Format("{0}{1}.xml", ArchiveConstants.SETTINGS_PATH, m_scene.RegionInfo.RegionName); |
114 | m_archiveWriter.WriteFile(settingsPath, RegionSettingsSerializer.Serialize(m_scene.RegionInfo.RegionSettings)); | 116 | m_archiveWriter.WriteFile(settingsPath, RegionSettingsSerializer.Serialize(m_scene.RegionInfo.RegionSettings)); |
115 | 117 | ||
116 | m_log.InfoFormat("[ARCHIVER]: Added region settings to archive."); | 118 | m_log.InfoFormat("[ARCHIVER]: Adding parcel settings to archive."); |
117 | 119 | ||
118 | // Write out land data (aka parcel) settings | 120 | // Write out land data (aka parcel) settings |
119 | List<ILandObject>landObjects = m_scene.LandChannel.AllParcels(); | 121 | List<ILandObject>landObjects = m_scene.LandChannel.AllParcels(); |
@@ -124,7 +126,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
124 | landData.GlobalID.ToString()); | 126 | landData.GlobalID.ToString()); |
125 | m_archiveWriter.WriteFile(landDataPath, LandDataSerializer.Serialize(landData)); | 127 | m_archiveWriter.WriteFile(landDataPath, LandDataSerializer.Serialize(landData)); |
126 | } | 128 | } |
127 | m_log.InfoFormat("[ARCHIVER]: Added parcel settings to archive."); | 129 | |
130 | m_log.InfoFormat("[ARCHIVER]: Adding terrain information to archive."); | ||
128 | 131 | ||
129 | // Write out terrain | 132 | // Write out terrain |
130 | string terrainPath | 133 | string terrainPath |
@@ -135,7 +138,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
135 | m_archiveWriter.WriteFile(terrainPath, ms.ToArray()); | 138 | m_archiveWriter.WriteFile(terrainPath, ms.ToArray()); |
136 | ms.Close(); | 139 | ms.Close(); |
137 | 140 | ||
138 | m_log.InfoFormat("[ARCHIVER]: Added terrain information to archive."); | 141 | m_log.InfoFormat("[ARCHIVER]: Adding scene objects to archive."); |
139 | 142 | ||
140 | // Write out scene object metadata | 143 | // Write out scene object metadata |
141 | foreach (SceneObjectGroup sceneObject in m_sceneObjects) | 144 | foreach (SceneObjectGroup sceneObject in m_sceneObjects) |
@@ -145,10 +148,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
145 | string serializedObject = m_serialiser.SerializeGroupToXml2(sceneObject, m_options); | 148 | string serializedObject = m_serialiser.SerializeGroupToXml2(sceneObject, m_options); |
146 | m_archiveWriter.WriteFile(ArchiveHelpers.CreateObjectPath(sceneObject), serializedObject); | 149 | m_archiveWriter.WriteFile(ArchiveHelpers.CreateObjectPath(sceneObject), serializedObject); |
147 | } | 150 | } |
148 | |||
149 | m_log.InfoFormat("[ARCHIVER]: Added scene objects to archive."); | ||
150 | } | 151 | } |
151 | |||
152 | |||
153 | } | 152 | } |
154 | } | 153 | } \ No newline at end of file |
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index ffcf063..4d459bf 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs | |||
@@ -219,12 +219,19 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
219 | m_log.InfoFormat("[ARCHIVER]: Added control file to archive."); | 219 | m_log.InfoFormat("[ARCHIVER]: Added control file to archive."); |
220 | 220 | ||
221 | if (SaveAssets) | 221 | if (SaveAssets) |
222 | new AssetsRequest( | 222 | { |
223 | new AssetsArchiver(archiveWriter), assetUuids, | 223 | AssetsRequest ar |
224 | m_scene.AssetService, m_scene.UserAccountService, | 224 | = new AssetsRequest( |
225 | m_scene.RegionInfo.ScopeID, options, awre.ReceivedAllAssets).Execute(); | 225 | new AssetsArchiver(archiveWriter), assetUuids, |
226 | m_scene.AssetService, m_scene.UserAccountService, | ||
227 | m_scene.RegionInfo.ScopeID, options, awre.ReceivedAllAssets); | ||
228 | |||
229 | Util.FireAndForget(o => ar.Execute()); | ||
230 | } | ||
226 | else | 231 | else |
232 | { | ||
227 | awre.ReceivedAllAssets(new List<UUID>(), new List<UUID>()); | 233 | awre.ReceivedAllAssets(new List<UUID>(), new List<UUID>()); |
234 | } | ||
228 | } | 235 | } |
229 | catch (Exception) | 236 | catch (Exception) |
230 | { | 237 | { |
diff --git a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs index 7b872b9..1eb641d 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs | |||
@@ -141,13 +141,15 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
141 | PerformAssetsRequestCallback(null); | 141 | PerformAssetsRequestCallback(null); |
142 | return; | 142 | return; |
143 | } | 143 | } |
144 | 144 | ||
145 | m_requestCallbackTimer.Enabled = true; | ||
146 | |||
145 | foreach (KeyValuePair<UUID, AssetType> kvp in m_uuids) | 147 | foreach (KeyValuePair<UUID, AssetType> kvp in m_uuids) |
146 | { | 148 | { |
147 | m_assetService.Get(kvp.Key.ToString(), kvp.Value, PreAssetRequestCallback); | 149 | // m_assetService.Get(kvp.Key.ToString(), kvp.Value, PreAssetRequestCallback); |
150 | AssetBase asset = m_assetService.Get(kvp.Key.ToString()); | ||
151 | PreAssetRequestCallback(kvp.Key.ToString(), kvp.Value, asset); | ||
148 | } | 152 | } |
149 | |||
150 | m_requestCallbackTimer.Enabled = true; | ||
151 | } | 153 | } |
152 | 154 | ||
153 | protected void OnRequestCallbackTimeout(object source, ElapsedEventArgs args) | 155 | protected void OnRequestCallbackTimeout(object source, ElapsedEventArgs args) |
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index cdb6efe..5b9b071 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs | |||
@@ -42,9 +42,8 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
42 | { | 42 | { |
43 | public class NPCAvatar : IClientAPI, INPC | 43 | public class NPCAvatar : IClientAPI, INPC |
44 | { | 44 | { |
45 | private static readonly Dictionary<string, UUID> m_defaultAnimations = new Dictionary<string, UUID>(); | ||
46 | |||
47 | public bool SenseAsAgent { get; set; } | 45 | public bool SenseAsAgent { get; set; } |
46 | |||
48 | private readonly string m_firstname; | 47 | private readonly string m_firstname; |
49 | private readonly string m_lastname; | 48 | private readonly string m_lastname; |
50 | private readonly Vector3 m_startPos; | 49 | private readonly Vector3 m_startPos; |
@@ -61,16 +60,8 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
61 | m_scene = scene; | 60 | m_scene = scene; |
62 | m_ownerID = ownerID; | 61 | m_ownerID = ownerID; |
63 | SenseAsAgent = senseAsAgent; | 62 | SenseAsAgent = senseAsAgent; |
64 | |||
65 | } | 63 | } |
66 | 64 | ||
67 | static NPCAvatar() | ||
68 | { | ||
69 | InitDefaultAnimations(); | ||
70 | } | ||
71 | |||
72 | |||
73 | |||
74 | public IScene Scene | 65 | public IScene Scene |
75 | { | 66 | { |
76 | get { return m_scene; } | 67 | get { return m_scene; } |
@@ -142,32 +133,9 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
142 | 133 | ||
143 | } | 134 | } |
144 | 135 | ||
145 | private static void InitDefaultAnimations() | ||
146 | { | ||
147 | using (XmlTextReader reader = new XmlTextReader("data/avataranimations.xml")) | ||
148 | { | ||
149 | XmlDocument doc = new XmlDocument(); | ||
150 | doc.Load(reader); | ||
151 | if (doc.DocumentElement != null) | ||
152 | foreach (XmlNode nod in doc.DocumentElement.ChildNodes) | ||
153 | { | ||
154 | if (nod.Attributes["name"] != null) | ||
155 | { | ||
156 | string name = nod.Attributes["name"].Value.ToLower(); | ||
157 | string id = nod.InnerText; | ||
158 | m_defaultAnimations.Add(name, (UUID)id); | ||
159 | } | ||
160 | } | ||
161 | } | ||
162 | } | ||
163 | |||
164 | public UUID GetDefaultAnimation(string name) | 136 | public UUID GetDefaultAnimation(string name) |
165 | { | 137 | { |
166 | if (m_defaultAnimations.ContainsKey(name)) | 138 | return SLUtil.GetDefaultAvatarAnimation(name); |
167 | { | ||
168 | return m_defaultAnimations[name]; | ||
169 | } | ||
170 | return UUID.Zero; | ||
171 | } | 139 | } |
172 | 140 | ||
173 | public Vector3 Position | 141 | public Vector3 Position |
diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs index 9d52a8f..d8d9554 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs | |||
@@ -630,7 +630,7 @@ namespace OpenSim.Region.RegionCombinerModule | |||
630 | 630 | ||
631 | List<Vector3> CoarseLocations = new List<Vector3>(); | 631 | List<Vector3> CoarseLocations = new List<Vector3>(); |
632 | List<UUID> AvatarUUIDs = new List<UUID>(); | 632 | List<UUID> AvatarUUIDs = new List<UUID>(); |
633 | 633 | ||
634 | connectiondata.RegionScene.ForEachRootScenePresence(delegate(ScenePresence sp) | 634 | connectiondata.RegionScene.ForEachRootScenePresence(delegate(ScenePresence sp) |
635 | { | 635 | { |
636 | if (sp.UUID != presence.UUID) | 636 | if (sp.UUID != presence.UUID) |
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index a820ddf..08a6194 100755 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example | |||
@@ -36,7 +36,6 @@ | |||
36 | 36 | ||
37 | 37 | ||
38 | [Startup] | 38 | [Startup] |
39 | |||
40 | ;# {ConsolePrompt} {} {ConsolePrompt} {} "Region (\R) " | 39 | ;# {ConsolePrompt} {} {ConsolePrompt} {} "Region (\R) " |
41 | ;; Console prompt | 40 | ;; Console prompt |
42 | ;; Certain special characters can be used to customize the prompt | 41 | ;; Certain special characters can be used to customize the prompt |
@@ -232,6 +231,24 @@ | |||
232 | ;; server to send mail through. | 231 | ;; server to send mail through. |
233 | ; emailmodule = DefaultEmailModule | 232 | ; emailmodule = DefaultEmailModule |
234 | 233 | ||
234 | [Estates] | ||
235 | ; If these values are commented out then the user will be asked for estate details when required (this is the normal case). | ||
236 | ; If these values are uncommented then they will be used to create a default estate as necessary. | ||
237 | ; New regions will be automatically assigned to that default estate. | ||
238 | |||
239 | ; DefaultEstateName = My Estate | ||
240 | ; DefaultEstateOwnerName = FirstName LastName | ||
241 | |||
242 | ; The following parameters will only be used on a standalone system to create an estate owner that does not already exist | ||
243 | |||
244 | ; If DefaultEstateOwnerUUID is left at UUID.Zero (as below) then a random UUID will be assigned. | ||
245 | ; This is normally what you want | ||
246 | ; DefaultEstateOwnerUUID = 00000000-0000-0000-0000-000000000000 | ||
247 | |||
248 | ; DefaultEstateOwnerEMail = owner@domain.com | ||
249 | ; DefaultEstateOwnerPassword = password | ||
250 | |||
251 | |||
235 | [SMTP] | 252 | [SMTP] |
236 | ;; The SMTP server enabled the email module to send email to external | 253 | ;; The SMTP server enabled the email module to send email to external |
237 | ;; destinations. | 254 | ;; destinations. |
@@ -753,8 +770,7 @@ | |||
753 | ;; groups service if the service is using these keys | 770 | ;; groups service if the service is using these keys |
754 | ; XmlRpcServiceReadKey = 1234 | 771 | ; XmlRpcServiceReadKey = 1234 |
755 | ; XmlRpcServiceWriteKey = 1234 | 772 | ; XmlRpcServiceWriteKey = 1234 |
756 | 773 | ||
757 | |||
758 | [InterestManagement] | 774 | [InterestManagement] |
759 | ;# {UpdatePrioritizationScheme} {} {Update prioritization scheme?} {BestAvatarResponsiveness Time Distance SimpleAngularDistance FrontBack} BestAvatarResponsiveness | 775 | ;# {UpdatePrioritizationScheme} {} {Update prioritization scheme?} {BestAvatarResponsiveness Time Distance SimpleAngularDistance FrontBack} BestAvatarResponsiveness |
760 | ;; This section controls how state updates are prioritized for each client | 776 | ;; This section controls how state updates are prioritized for each client |